* [Qemu-devel] [PATCH v3 0/8] Interactive Boot Menu for DASD and SCSI Guests on s390x
@ 2018-01-15 16:44 Collin L. Walling
2018-01-15 16:44 ` [Qemu-devel] [PATCH v3 1/8] s390-ccw: update libc Collin L. Walling
` (8 more replies)
0 siblings, 9 replies; 32+ messages in thread
From: Collin L. Walling @ 2018-01-15 16:44 UTC (permalink / raw)
To: qemu-s390x, qemu-devel; +Cc: borntraeger, frankja, cohuck, thuth, david, alifm
--- [v3] ---
In an effort to make review less overwhelming, I've split up the larger commit
into 4 patches. It should be obvious how they all relate. This is for review
purposes unless it makes sense to keep them this way.
Patch "read input" contains the original commit message.
bootmap.c
In an effort to protect ourselves from the possible expansion of stage2 in
the future, I've changed the way that we read stage2 (described below). This
took some experimentation to find a somewhat efficient and easiest-to-read
approach without having to start from the beginning.
Previous Versions:
- define a scratch space to be as large as the current stage2 size (3 blks)
- load stage2 entirely in the defined space and parse it
- con: if stage2 expands, we'd have to update the Qemu code to accomodate
the new size (gross!)
Now:
- define a scratch space to be 4 blocks large (same size as "sec")
- load stage2 one-block-at-a-time, and parse each individual block
- if found, load the previous and next blocks (if possible)
- pro: we will be prepared to find the boot menu data if the stage2
bootloader expands toward its 24 block limit
Why load the previous block?
- the "flag" and "timeout" values that are stored by the zipl tool are
found at offsets prior to the boot menu banner
Why load the next block?
- this is a "just in case" measure when the boot menu entries span
multiple blocks (it *should not* span more than two)
menu.c
- separated some things into separate functions and added a few comments
menu.h
- defined offsets for the zipl flag and timeout values
libc.c
- created a wrapper for itostr that throws an assertion if provided array
is too small
ipl.c
- timeout is now stored as big endian
- set_boot_menu function is passed the iplb and now has a single
invocation (instead of one for each device type)
- loadparm interpretation is reverted to a similar design in v1. i.e.
we compare its value in pc-bios. This makes the most sense when
compared to the design in v2.
--- [Summary] ---
These patches implement a boot menu for ECKD DASD and SCSI guests on s390x.
The menu will only appear if the disk has been configured for IPL with the
zIPL tool and with the following QEMU command line options:
-boot menu=on[,splash-time=X] and/or -machine loadparm='prompt'
or via the following libvirt domain xml:
<os>
<bootmenu enable='yes' timeout='X'/>
</os>
or
<disk>
...
<boot order='1' loadparm='PROMPT'/>
</disk>
Where X is some positive integer representing time in milliseconds.
A loadparm other than 'prompt' will disable the menu and just boot
the specified entry.
If no boot options are specified, we will attempt to use the values
provided by zipl (ECKD DASD only).
Collin L. Walling (8):
s390-ccw: update libc
s390-ccw: ipl structs for eckd cdl/ldl
s390-ccw: parse and set boot menu options
s390-ccw: interactive boot menu for eckd dasd (menu setup)
s390-ccw: interactive boot menu for eckd dasd (read stage2 data)
s390-ccw: interactive boot menu for eckd dasd (print menu)
s390-ccw: interactive boot menu for eckd dasd (read input)
s390-ccw: interactive boot menu for scsi
hw/s390x/ipl.c | 54 ++++++++++
hw/s390x/ipl.h | 11 +-
pc-bios/s390-ccw/Makefile | 2 +-
pc-bios/s390-ccw/bootmap.c | 145 ++++++++++++++++++++++----
pc-bios/s390-ccw/bootmap.h | 72 +++++++------
pc-bios/s390-ccw/iplb.h | 11 +-
pc-bios/s390-ccw/libc.c | 83 +++++++++++++++
pc-bios/s390-ccw/libc.h | 31 ++++++
pc-bios/s390-ccw/main.c | 41 +++++---
pc-bios/s390-ccw/menu.c | 240 ++++++++++++++++++++++++++++++++++++++++++++
pc-bios/s390-ccw/menu.h | 35 +++++++
pc-bios/s390-ccw/s390-ccw.h | 2 +
pc-bios/s390-ccw/sclp.c | 30 ++++--
pc-bios/s390-ccw/virtio.c | 2 +-
14 files changed, 679 insertions(+), 80 deletions(-)
create mode 100644 pc-bios/s390-ccw/libc.c
create mode 100644 pc-bios/s390-ccw/menu.c
create mode 100644 pc-bios/s390-ccw/menu.h
--
2.7.4
^ permalink raw reply [flat|nested] 32+ messages in thread
* [Qemu-devel] [PATCH v3 1/8] s390-ccw: update libc
2018-01-15 16:44 [Qemu-devel] [PATCH v3 0/8] Interactive Boot Menu for DASD and SCSI Guests on s390x Collin L. Walling
@ 2018-01-15 16:44 ` Collin L. Walling
2018-01-15 17:05 ` Eric Blake
2018-01-15 16:44 ` [Qemu-devel] [PATCH v3 2/8] s390-ccw: ipl structs for eckd cdl/ldl Collin L. Walling
` (7 subsequent siblings)
8 siblings, 1 reply; 32+ messages in thread
From: Collin L. Walling @ 2018-01-15 16:44 UTC (permalink / raw)
To: qemu-s390x, qemu-devel; +Cc: borntraeger, frankja, cohuck, thuth, david, alifm
Moved:
memcmp from bootmap.h to libc.h (renamed from _memcmp)
strlen from sclp.c to libc.h (renamed from _strlen)
Added C standard functions:
isdigit
atoi
Added non-C standard function:
itostr
Signed-off-by: Collin L. Walling <walling@linux.vnet.ibm.com>
Acked-by: Christian Borntraeger <borntraeger@de.ibm.com>
Reviewed-by: Janosch Frank <frankja@linux.vnet.ibm.com>
---
pc-bios/s390-ccw/Makefile | 2 +-
pc-bios/s390-ccw/bootmap.c | 4 +--
pc-bios/s390-ccw/bootmap.h | 16 +--------
pc-bios/s390-ccw/libc.c | 83 ++++++++++++++++++++++++++++++++++++++++++++++
pc-bios/s390-ccw/libc.h | 31 +++++++++++++++++
pc-bios/s390-ccw/main.c | 17 +---------
pc-bios/s390-ccw/sclp.c | 10 +-----
7 files changed, 120 insertions(+), 43 deletions(-)
create mode 100644 pc-bios/s390-ccw/libc.c
diff --git a/pc-bios/s390-ccw/Makefile b/pc-bios/s390-ccw/Makefile
index 6d0c2ee..9f7904f 100644
--- a/pc-bios/s390-ccw/Makefile
+++ b/pc-bios/s390-ccw/Makefile
@@ -9,7 +9,7 @@ $(call set-vpath, $(SRC_PATH)/pc-bios/s390-ccw)
.PHONY : all clean build-all
-OBJECTS = start.o main.o bootmap.o sclp.o virtio.o virtio-scsi.o virtio-blkdev.o
+OBJECTS = start.o main.o bootmap.o sclp.o virtio.o virtio-scsi.o virtio-blkdev.o libc.o
QEMU_CFLAGS := $(filter -W%, $(QEMU_CFLAGS))
QEMU_CFLAGS += -ffreestanding -fno-delete-null-pointer-checks -msoft-float
QEMU_CFLAGS += -march=z900 -fPIE -fno-strict-aliasing
diff --git a/pc-bios/s390-ccw/bootmap.c b/pc-bios/s390-ccw/bootmap.c
index 67a6123..6f8e30f 100644
--- a/pc-bios/s390-ccw/bootmap.c
+++ b/pc-bios/s390-ccw/bootmap.c
@@ -512,7 +512,7 @@ static bool is_iso_bc_entry_compatible(IsoBcSection *s)
"Failed to read image sector 0");
/* Checking bytes 8 - 32 for S390 Linux magic */
- return !_memcmp(magic_sec + 8, linux_s390_magic, 24);
+ return !memcmp(magic_sec + 8, linux_s390_magic, 24);
}
/* Location of the current sector of the directory */
@@ -641,7 +641,7 @@ static uint32_t find_iso_bc(void)
if (vd->type == VOL_DESC_TYPE_BOOT) {
IsoVdElTorito *et = &vd->vd.boot;
- if (!_memcmp(&et->el_torito[0], el_torito_magic, 32)) {
+ if (!memcmp(&et->el_torito[0], el_torito_magic, 32)) {
return bswap32(et->bc_offset);
}
}
diff --git a/pc-bios/s390-ccw/bootmap.h b/pc-bios/s390-ccw/bootmap.h
index cf99a4c..4980838 100644
--- a/pc-bios/s390-ccw/bootmap.h
+++ b/pc-bios/s390-ccw/bootmap.h
@@ -310,20 +310,6 @@ static inline bool magic_match(const void *data, const void *magic)
return *((uint32_t *)data) == *((uint32_t *)magic);
}
-static inline int _memcmp(const void *s1, const void *s2, size_t n)
-{
- int i;
- const uint8_t *p1 = s1, *p2 = s2;
-
- for (i = 0; i < n; i++) {
- if (p1[i] != p2[i]) {
- return p1[i] > p2[i] ? 1 : -1;
- }
- }
-
- return 0;
-}
-
static inline uint32_t iso_733_to_u32(uint64_t x)
{
return (uint32_t)x;
@@ -416,7 +402,7 @@ const uint8_t vol_desc_magic[] = "CD001";
static inline bool is_iso_vd_valid(IsoVolDesc *vd)
{
- return !_memcmp(&vd->ident[0], vol_desc_magic, 5) &&
+ return !memcmp(&vd->ident[0], vol_desc_magic, 5) &&
vd->version == 0x1 &&
vd->type <= VOL_DESC_TYPE_PARTITION;
}
diff --git a/pc-bios/s390-ccw/libc.c b/pc-bios/s390-ccw/libc.c
new file mode 100644
index 0000000..3ce0fb7
--- /dev/null
+++ b/pc-bios/s390-ccw/libc.c
@@ -0,0 +1,83 @@
+/*
+ * libc-style definitions and functions
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ */
+
+#include "libc.h"
+#include "s390-ccw.h"
+
+/**
+ * atoi:
+ * @str: the string to be converted.
+ *
+ * Given a string @str, convert it to an integer. Any non-numerical value
+ * will terminate the conversion.
+ *
+ * Returns: an integer converted from the string @str.
+ */
+int atoi(const char *str)
+{
+ int i;
+ int val = 0;
+
+ for (i = 0; str[i]; i++) {
+ char c = str[i];
+ if (!isdigit(c)) {
+ break;
+ }
+ val *= 10;
+ val += c - '0';
+ }
+
+ return val;
+}
+
+/**
+ * itostr:
+ * @num: the integer to be converted.
+ * @str: a pointer to a string to store the conversion.
+ * @len: the length of the passed string.
+ *
+ * Given an integer @num, convert it to a string. The string @str must be
+ * allocated beforehand. The resulting string will be null terminated and
+ * returned.
+ *
+ * Returns: the string @str of the converted integer @num.
+ */
+static char *_itostr(int num, char *str, size_t len)
+{
+ long num_len = 1;
+ int tmp = num;
+ int i;
+
+ /* Count length of num */
+ while ((tmp /= 10) > 0) {
+ num_len++;
+ }
+
+ /* Check if we have enough space for num and null */
+ if (len <= num_len) {
+ return 0;
+ }
+
+ /* Convert int to string */
+ for (i = num_len - 1; i >= 0; i--) {
+ str[i] = num % 10 + '0';
+ num /= 10;
+ }
+
+ str[num_len] = '\0';
+
+ return str;
+}
+
+char *itostr(int num, char *str, size_t len)
+{
+ char *tmp = _itostr(num, str, len);
+ IPL_assert(tmp != 0, "array too small for itostr conversion");
+ return tmp;
+}
diff --git a/pc-bios/s390-ccw/libc.h b/pc-bios/s390-ccw/libc.h
index 0142ea8..00268e3 100644
--- a/pc-bios/s390-ccw/libc.h
+++ b/pc-bios/s390-ccw/libc.h
@@ -42,4 +42,35 @@ static inline void *memcpy(void *s1, const void *s2, size_t n)
return s1;
}
+static inline int memcmp(const void *s1, const void *s2, size_t n)
+{
+ int i;
+ const uint8_t *p1 = s1, *p2 = s2;
+
+ for (i = 0; i < n; i++) {
+ if (p1[i] != p2[i]) {
+ return p1[i] > p2[i] ? 1 : -1;
+ }
+ }
+
+ return 0;
+}
+
+static inline size_t strlen(const char *str)
+{
+ size_t i;
+ for (i = 0; *str; i++) {
+ str++;
+ }
+ return i;
+}
+
+static inline int isdigit(int c)
+{
+ return (c >= '0') && (c <= '9');
+}
+
+int atoi(const char *str);
+char *itostr(int num, char *str, size_t len);
+
#endif
diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c
index 401e9db..a8ef120 100644
--- a/pc-bios/s390-ccw/main.c
+++ b/pc-bios/s390-ccw/main.c
@@ -40,22 +40,7 @@ void panic(const char *string)
unsigned int get_loadparm_index(void)
{
- const char *lp = loadparm;
- int i;
- unsigned int idx = 0;
-
- for (i = 0; i < 8; i++) {
- char c = lp[i];
-
- if (c < '0' || c > '9') {
- break;
- }
-
- idx *= 10;
- idx += c - '0';
- }
-
- return idx;
+ return atoi(loadparm);
}
static bool find_dev(Schib *schib, int dev_no)
diff --git a/pc-bios/s390-ccw/sclp.c b/pc-bios/s390-ccw/sclp.c
index b1fc8ff..486fce1 100644
--- a/pc-bios/s390-ccw/sclp.c
+++ b/pc-bios/s390-ccw/sclp.c
@@ -65,14 +65,6 @@ void sclp_setup(void)
sclp_set_write_mask();
}
-static int _strlen(const char *str)
-{
- int i;
- for (i = 0; *str; i++)
- str++;
- return i;
-}
-
long write(int fd, const void *str, size_t len)
{
WriteEventData *sccb = (void *)_sccb;
@@ -95,7 +87,7 @@ long write(int fd, const void *str, size_t len)
void sclp_print(const char *str)
{
- write(1, str, _strlen(str));
+ write(1, str, strlen(str));
}
void sclp_get_loadparm_ascii(char *loadparm)
--
2.7.4
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [Qemu-devel] [PATCH v3 2/8] s390-ccw: ipl structs for eckd cdl/ldl
2018-01-15 16:44 [Qemu-devel] [PATCH v3 0/8] Interactive Boot Menu for DASD and SCSI Guests on s390x Collin L. Walling
2018-01-15 16:44 ` [Qemu-devel] [PATCH v3 1/8] s390-ccw: update libc Collin L. Walling
@ 2018-01-15 16:44 ` Collin L. Walling
2018-01-16 12:32 ` Thomas Huth
2018-01-15 16:44 ` [Qemu-devel] [PATCH v3 3/8] s390-ccw: parse and set boot menu options Collin L. Walling
` (6 subsequent siblings)
8 siblings, 1 reply; 32+ messages in thread
From: Collin L. Walling @ 2018-01-15 16:44 UTC (permalink / raw)
To: qemu-s390x, qemu-devel; +Cc: borntraeger, frankja, cohuck, thuth, david, alifm
ECKD DASDs have different IPL structures for CDL and LDL
formats. The current Ipl1 and Ipl2 structs follow the CDL
format, so we prepend "EckdCdl" to them. Boot info for LDL
has been moved to a new struct: EckdLdlIpl1.
Also introduce structs for IPL stages 1 and 1b and for
disk geometry.
Signed-off-by: Collin L. Walling <walling@linux.vnet.ibm.com>
Acked-by: Janosch Frank <frankja@linux.vnet.ibm.com>
---
pc-bios/s390-ccw/bootmap.c | 29 +++++++++++++-----------
pc-bios/s390-ccw/bootmap.h | 55 +++++++++++++++++++++++++++++++++-------------
2 files changed, 56 insertions(+), 28 deletions(-)
diff --git a/pc-bios/s390-ccw/bootmap.c b/pc-bios/s390-ccw/bootmap.c
index 6f8e30f..29915e4 100644
--- a/pc-bios/s390-ccw/bootmap.c
+++ b/pc-bios/s390-ccw/bootmap.c
@@ -221,9 +221,9 @@ static void run_eckd_boot_script(block_number_t mbr_block_nr)
static void ipl_eckd_cdl(void)
{
XEckdMbr *mbr;
- Ipl2 *ipl2 = (void *)sec;
+ EckdCdlIpl2 *ipl2 = (void *)sec;
IplVolumeLabel *vlbl = (void *)sec;
- block_number_t block_nr;
+ block_number_t mbr_block_nr;
/* we have just read the block #0 and recognized it as "IPL1" */
sclp_print("CDL\n");
@@ -231,16 +231,13 @@ static void ipl_eckd_cdl(void)
memset(sec, FREE_SPACE_FILLER, sizeof(sec));
read_block(1, ipl2, "Cannot read IPL2 record at block 1");
- mbr = &ipl2->u.x.mbr;
+ mbr = &ipl2->mbr;
IPL_assert(magic_match(mbr, ZIPL_MAGIC), "No zIPL section in IPL2 record.");
IPL_assert(block_size_ok(mbr->blockptr.xeckd.bptr.size),
"Bad block size in zIPL section of IPL2 record.");
IPL_assert(mbr->dev_type == DEV_TYPE_ECKD,
"Non-ECKD device type in zIPL section of IPL2 record.");
- /* save pointer to Boot Script */
- block_nr = eckd_block_num((void *)&(mbr->blockptr));
-
memset(sec, FREE_SPACE_FILLER, sizeof(sec));
read_block(2, vlbl, "Cannot read Volume Label at block 2");
IPL_assert(magic_match(vlbl->key, VOL1_MAGIC),
@@ -249,7 +246,10 @@ static void ipl_eckd_cdl(void)
"Invalid magic of volser block");
print_volser(vlbl->f.volser);
- run_eckd_boot_script(block_nr);
+ /* save pointer to Boot Script */
+ mbr_block_nr = eckd_block_num((void *)&mbr->blockptr);
+
+ run_eckd_boot_script(mbr_block_nr);
/* no return */
}
@@ -280,8 +280,8 @@ static void print_eckd_ldl_msg(ECKD_IPL_mode_t mode)
static void ipl_eckd_ldl(ECKD_IPL_mode_t mode)
{
- block_number_t block_nr;
- BootInfo *bip = (void *)(sec + 0x70); /* BootInfo is MBR for LDL */
+ block_number_t mbr_block_nr;
+ EckdLdlIpl1 *ipl1 = (void *)sec;
if (mode != ECKD_LDL_UNLABELED) {
print_eckd_ldl_msg(mode);
@@ -292,15 +292,18 @@ static void ipl_eckd_ldl(ECKD_IPL_mode_t mode)
memset(sec, FREE_SPACE_FILLER, sizeof(sec));
read_block(0, sec, "Cannot read block 0 to grab boot info.");
if (mode == ECKD_LDL_UNLABELED) {
- if (!magic_match(bip->magic, ZIPL_MAGIC)) {
+ if (!magic_match(ipl1->boot_info.magic, ZIPL_MAGIC)) {
return; /* not applicable layout */
}
sclp_print("unlabeled LDL.\n");
}
- verify_boot_info(bip);
+ verify_boot_info(&ipl1->boot_info);
+
+ /* save pointer to Boot Script */
+ mbr_block_nr =
+ eckd_block_num((void *)&ipl1->boot_info.bp.ipl.bm_ptr.eckd.bptr);
- block_nr = eckd_block_num((void *)&(bip->bp.ipl.bm_ptr.eckd.bptr));
- run_eckd_boot_script(block_nr);
+ run_eckd_boot_script(mbr_block_nr);
/* no return */
}
diff --git a/pc-bios/s390-ccw/bootmap.h b/pc-bios/s390-ccw/bootmap.h
index 4980838..df956f2 100644
--- a/pc-bios/s390-ccw/bootmap.h
+++ b/pc-bios/s390-ccw/bootmap.h
@@ -226,22 +226,47 @@ typedef struct BootInfo { /* @ 0x70, record #0 */
} bp;
} __attribute__ ((packed)) BootInfo; /* see also XEckdMbr */
-typedef struct Ipl1 {
- unsigned char key[4]; /* == "IPL1" */
- unsigned char data[24];
-} __attribute__((packed)) Ipl1;
+/*
+ * Structs for IPL
+ */
+#define STAGE2_BLK_CNT_MAX 24 /* Stage 1b can load up to 24 blocks */
-typedef struct Ipl2 {
- unsigned char key[4]; /* == "IPL2" */
- union {
- unsigned char data[144];
- struct {
- unsigned char reserved1[92-4];
- XEckdMbr mbr;
- unsigned char reserved2[144-(92-4)-sizeof(XEckdMbr)];
- } x;
- } u;
-} __attribute__((packed)) Ipl2;
+typedef struct EckdCdlIpl1 {
+ uint8_t key[4]; /* == "IPL1" */
+ uint8_t data[24];
+} __attribute__((packed)) EckdCdlIpl1;
+
+typedef struct EckdSeekArg {
+ uint16_t pad;
+ uint16_t cyl;
+ uint16_t head;
+ uint8_t sec;
+ uint8_t pad2;
+} __attribute__ ((packed)) EckdSeekArg;
+
+typedef struct EckdStage1b {
+ uint8_t reserved[32 * STAGE2_BLK_CNT_MAX];
+ struct EckdSeekArg seek[STAGE2_BLK_CNT_MAX];
+ uint8_t unused[64];
+} __attribute__ ((packed)) EckdStage1b;
+
+typedef struct EckdStage1 {
+ uint8_t reserved[72];
+ struct EckdSeekArg seek[2];
+} __attribute__ ((packed)) EckdStage1;
+
+typedef struct EckdCdlIpl2 {
+ uint8_t key[4]; /* == "IPL2" */
+ struct EckdStage1 stage1;
+ XEckdMbr mbr;
+ uint8_t reserved[24];
+} __attribute__((packed)) EckdCdlIpl2;
+
+typedef struct EckdLdlIpl1 {
+ uint8_t reserved[24];
+ struct EckdStage1 stage1;
+ BootInfo boot_info; /* BootInfo is MBR for LDL */
+} __attribute__((packed)) EckdLdlIpl1;
typedef struct IplVolumeLabel {
unsigned char key[4]; /* == "VOL1" */
--
2.7.4
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [Qemu-devel] [PATCH v3 3/8] s390-ccw: parse and set boot menu options
2018-01-15 16:44 [Qemu-devel] [PATCH v3 0/8] Interactive Boot Menu for DASD and SCSI Guests on s390x Collin L. Walling
2018-01-15 16:44 ` [Qemu-devel] [PATCH v3 1/8] s390-ccw: update libc Collin L. Walling
2018-01-15 16:44 ` [Qemu-devel] [PATCH v3 2/8] s390-ccw: ipl structs for eckd cdl/ldl Collin L. Walling
@ 2018-01-15 16:44 ` Collin L. Walling
2018-01-16 12:44 ` Thomas Huth
2018-01-15 16:44 ` [Qemu-devel] [PATCH v3 4/8] s390-ccw: interactive boot menu for eckd dasd (menu setup) Collin L. Walling
` (5 subsequent siblings)
8 siblings, 1 reply; 32+ messages in thread
From: Collin L. Walling @ 2018-01-15 16:44 UTC (permalink / raw)
To: qemu-s390x, qemu-devel; +Cc: borntraeger, frankja, cohuck, thuth, david, alifm
Set boot menu options for an s390 guest and store them in
the iplb. These options are set via the QEMU command line
option:
-boot menu=on|off[,splash-time=X]
or via the libvirt domain xml:
<os>
<bootmenu enable='yes|no' timeout='X'/>
</os>
Where X represents some positive integer representing
milliseconds.
A loadparm other than 'prompt' will disable the menu and
just boot the specified entry.
Signed-off-by: Collin L. Walling <walling@linux.vnet.ibm.com>
Reviewed-by: Janosch Frank <frankja@linux.vnet.ibm.com>
---
hw/s390x/ipl.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++++
hw/s390x/ipl.h | 11 ++++++++--
pc-bios/s390-ccw/iplb.h | 8 ++++++--
3 files changed, 69 insertions(+), 4 deletions(-)
diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c
index 0d06fc1..81ba9ed 100644
--- a/hw/s390x/ipl.c
+++ b/hw/s390x/ipl.c
@@ -23,6 +23,8 @@
#include "hw/s390x/ebcdic.h"
#include "ipl.h"
#include "qemu/error-report.h"
+#include "qemu/config-file.h"
+#include "qemu/cutils.h"
#define KERN_IMAGE_START 0x010000UL
#define KERN_PARM_AREA 0x010480UL
@@ -219,6 +221,55 @@ static Property s390_ipl_properties[] = {
DEFINE_PROP_END_OF_LIST(),
};
+static void s390_ipl_set_boot_menu(IplParameterBlock *iplb)
+{
+ QemuOptsList *plist = qemu_find_opts("boot-opts");
+ QemuOpts *opts = QTAILQ_FIRST(&plist->head);
+ uint8_t *flags;
+ uint16_t *timeout;
+ const char *tmp;
+ unsigned long result = 0;
+
+ switch (iplb->pbt) {
+ case S390_IPL_TYPE_CCW:
+ flags = &iplb->ccw.boot_menu_flags;
+ timeout = &iplb->ccw.boot_menu_timeout;
+ break;
+ case S390_IPL_TYPE_QEMU_SCSI:
+ flags = &iplb->scsi.boot_menu_flags;
+ timeout = &iplb->scsi.boot_menu_timeout;
+ break;
+ default:
+ error_report("boot menu is not supported for this device type.");
+ return;
+ }
+
+ /* In the absence of -boot menu, use zipl parameters */
+ if (!qemu_opt_get(opts, "menu")) {
+ *flags = BOOT_MENU_FLAG_ZIPL_OPTS;
+ } else if (boot_menu) {
+ *flags = BOOT_MENU_FLAG_BOOT_OPTS;
+
+ tmp = qemu_opt_get(opts, "splash-time");
+
+ if (tmp && qemu_strtoul(tmp, NULL, 10, &result)) {
+ error_report("splash-time value is invalid, forcing it to 0.");
+ return;
+ }
+
+ result /= 1000; /* Store timeout value as seconds */
+
+ if (result > 0xffff) {
+ error_report("splash-time value is greater than 65535000,"
+ " forcing it to 65535000.");
+ *timeout = 0xffff;
+ return;
+ }
+
+ *timeout = cpu_to_be16(result);
+ }
+}
+
static bool s390_gen_initial_iplb(S390IPLState *ipl)
{
DeviceState *dev_st;
@@ -273,6 +324,9 @@ static bool s390_gen_initial_iplb(S390IPLState *ipl)
if (!s390_ipl_set_loadparm(ipl->iplb.loadparm)) {
ipl->iplb.flags |= DIAG308_FLAGS_LP_VALID;
}
+
+ s390_ipl_set_boot_menu(&ipl->iplb);
+
return true;
}
diff --git a/hw/s390x/ipl.h b/hw/s390x/ipl.h
index 8a705e0..48e82cf 100644
--- a/hw/s390x/ipl.h
+++ b/hw/s390x/ipl.h
@@ -15,9 +15,14 @@
#include "hw/qdev.h"
#include "cpu.h"
+#define BOOT_MENU_FLAG_BOOT_OPTS 0x80
+#define BOOT_MENU_FLAG_ZIPL_OPTS 0x40
+
struct IplBlockCcw {
uint64_t netboot_start_addr;
- uint8_t reserved0[77];
+ uint8_t reserved0[74];
+ uint16_t boot_menu_timeout;
+ uint8_t boot_menu_flags;
uint8_t ssid;
uint16_t devno;
uint8_t vm_flags;
@@ -51,7 +56,9 @@ struct IplBlockQemuScsi {
uint32_t lun;
uint16_t target;
uint16_t channel;
- uint8_t reserved0[77];
+ uint8_t reserved0[74];
+ uint16_t boot_menu_timeout;
+ uint8_t boot_menu_flags;
uint8_t ssid;
uint16_t devno;
} QEMU_PACKED;
diff --git a/pc-bios/s390-ccw/iplb.h b/pc-bios/s390-ccw/iplb.h
index 890aed9..fe909d2 100644
--- a/pc-bios/s390-ccw/iplb.h
+++ b/pc-bios/s390-ccw/iplb.h
@@ -14,7 +14,9 @@
struct IplBlockCcw {
uint64_t netboot_start_addr;
- uint8_t reserved0[77];
+ uint8_t reserved0[74];
+ uint16_t boot_menu_timeout;
+ uint8_t boot_menu_flags;
uint8_t ssid;
uint16_t devno;
uint8_t vm_flags;
@@ -48,7 +50,9 @@ struct IplBlockQemuScsi {
uint32_t lun;
uint16_t target;
uint16_t channel;
- uint8_t reserved0[77];
+ uint8_t reserved0[74];
+ uint16_t boot_menu_timeout;
+ uint8_t boot_menu_flags;
uint8_t ssid;
uint16_t devno;
} __attribute__ ((packed));
--
2.7.4
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [Qemu-devel] [PATCH v3 4/8] s390-ccw: interactive boot menu for eckd dasd (menu setup)
2018-01-15 16:44 [Qemu-devel] [PATCH v3 0/8] Interactive Boot Menu for DASD and SCSI Guests on s390x Collin L. Walling
` (2 preceding siblings ...)
2018-01-15 16:44 ` [Qemu-devel] [PATCH v3 3/8] s390-ccw: parse and set boot menu options Collin L. Walling
@ 2018-01-15 16:44 ` Collin L. Walling
2018-01-16 18:23 ` Thomas Huth
2018-01-15 16:44 ` [Qemu-devel] [PATCH v3 5/8] s390-ccw: interactive boot menu for eckd dasd (read stage2 data) Collin L. Walling
` (4 subsequent siblings)
8 siblings, 1 reply; 32+ messages in thread
From: Collin L. Walling @ 2018-01-15 16:44 UTC (permalink / raw)
To: qemu-s390x, qemu-devel; +Cc: borntraeger, frankja, cohuck, thuth, david, alifm
Reads boot menu flag and timeout values from the iplb and
sets the respective fields for the menu.
Signed-off-by: Collin L. Walling <walling@linux.vnet.ibm.com>
---
pc-bios/s390-ccw/Makefile | 2 +-
pc-bios/s390-ccw/iplb.h | 3 +++
pc-bios/s390-ccw/main.c | 21 +++++++++++++++++++++
| 26 ++++++++++++++++++++++++++
| 23 +++++++++++++++++++++++
5 files changed, 74 insertions(+), 1 deletion(-)
create mode 100644 pc-bios/s390-ccw/menu.c
create mode 100644 pc-bios/s390-ccw/menu.h
diff --git a/pc-bios/s390-ccw/Makefile b/pc-bios/s390-ccw/Makefile
index 9f7904f..1712c2d 100644
--- a/pc-bios/s390-ccw/Makefile
+++ b/pc-bios/s390-ccw/Makefile
@@ -9,7 +9,7 @@ $(call set-vpath, $(SRC_PATH)/pc-bios/s390-ccw)
.PHONY : all clean build-all
-OBJECTS = start.o main.o bootmap.o sclp.o virtio.o virtio-scsi.o virtio-blkdev.o libc.o
+OBJECTS = start.o main.o bootmap.o sclp.o virtio.o virtio-scsi.o virtio-blkdev.o libc.o menu.o
QEMU_CFLAGS := $(filter -W%, $(QEMU_CFLAGS))
QEMU_CFLAGS += -ffreestanding -fno-delete-null-pointer-checks -msoft-float
QEMU_CFLAGS += -march=z900 -fPIE -fno-strict-aliasing
diff --git a/pc-bios/s390-ccw/iplb.h b/pc-bios/s390-ccw/iplb.h
index fe909d2..da29e6e 100644
--- a/pc-bios/s390-ccw/iplb.h
+++ b/pc-bios/s390-ccw/iplb.h
@@ -81,6 +81,9 @@ extern IplParameterBlock iplb __attribute__((__aligned__(PAGE_SIZE)));
#define S390_IPL_TYPE_CCW 0x02
#define S390_IPL_TYPE_QEMU_SCSI 0xff
+#define LOADPARM_PROMPT "PROMPT "
+#define LOADPARM_EMPTY "........"
+
static inline bool store_iplb(IplParameterBlock *iplb)
{
register unsigned long addr asm("0") = (unsigned long) iplb;
diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c
index a8ef120..709e5ef 100644
--- a/pc-bios/s390-ccw/main.c
+++ b/pc-bios/s390-ccw/main.c
@@ -11,6 +11,7 @@
#include "libc.h"
#include "s390-ccw.h"
#include "virtio.h"
+#include "menu.h"
char stack[PAGE_SIZE * 8] __attribute__((__aligned__(PAGE_SIZE)));
static SubChannelId blk_schid = { .one = 1 };
@@ -73,6 +74,25 @@ static bool find_dev(Schib *schib, int dev_no)
return false;
}
+static void menu_setup(void)
+{
+ if (memcmp(loadparm, LOADPARM_PROMPT, 8) == 0) {
+ menu_set_parms(BOOT_MENU_FLAG_BOOT_OPTS, 0);
+ return;
+ }
+
+ /* If loadparm was set to any other value, then do not enable menu */
+ if (memcmp(loadparm, LOADPARM_EMPTY, 8) != 0) {
+ return;
+ }
+
+ switch (iplb.pbt) {
+ case S390_IPL_TYPE_CCW:
+ menu_set_parms(iplb.ccw.boot_menu_flags, iplb.ccw.boot_menu_timeout);
+ return;
+ }
+}
+
static void virtio_setup(void)
{
Schib schib;
@@ -113,6 +133,7 @@ static void virtio_setup(void)
default:
panic("List-directed IPL not supported yet!\n");
}
+ menu_setup();
} else {
for (ssid = 0; ssid < 0x3; ssid++) {
blk_schid.ssid = ssid;
--git a/pc-bios/s390-ccw/menu.c b/pc-bios/s390-ccw/menu.c
new file mode 100644
index 0000000..e15a7f2
--- /dev/null
+++ b/pc-bios/s390-ccw/menu.c
@@ -0,0 +1,26 @@
+/*
+ * QEMU S390 Interactive Boot Menu
+ *
+ * Copyright 2017 IBM Corp.
+ * Author: Collin L. Walling <walling@linux.vnet.ibm.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or (at
+ * your option) any later version. See the COPYING file in the top-level
+ * directory.
+ */
+
+#include "menu.h"
+
+static uint8_t flags;
+static uint64_t timeout;
+
+void menu_set_parms(uint8_t boot_menu_flag, uint16_t boot_menu_timeout)
+{
+ flags = boot_menu_flag;
+ timeout = boot_menu_timeout;
+}
+
+int menu_check_flags(uint8_t check_flags)
+{
+ return flags & check_flags;
+}
--git a/pc-bios/s390-ccw/menu.h b/pc-bios/s390-ccw/menu.h
new file mode 100644
index 0000000..04b1db1
--- /dev/null
+++ b/pc-bios/s390-ccw/menu.h
@@ -0,0 +1,23 @@
+/*
+ * QEMU S390 Interactive Boot Menu
+ *
+ * Copyright 2017 IBM Corp.
+ * Author: Collin L. Walling <walling@linux.vnet.ibm.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or (at
+ * your option) any later version. See the COPYING file in the top-level
+ * directory.
+ */
+
+#ifndef MENU_H
+#define MENU_H
+
+#include "libc.h"
+
+#define BOOT_MENU_FLAG_BOOT_OPTS 0x80
+#define BOOT_MENU_FLAG_ZIPL_OPTS 0x40
+
+void menu_set_parms(uint8_t boot_menu_flags, uint16_t boot_menu_timeout);
+bool menu_check_flags(uint8_t check_flags);
+
+#endif /* MENU_H */
--
2.7.4
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [Qemu-devel] [PATCH v3 5/8] s390-ccw: interactive boot menu for eckd dasd (read stage2 data)
2018-01-15 16:44 [Qemu-devel] [PATCH v3 0/8] Interactive Boot Menu for DASD and SCSI Guests on s390x Collin L. Walling
` (3 preceding siblings ...)
2018-01-15 16:44 ` [Qemu-devel] [PATCH v3 4/8] s390-ccw: interactive boot menu for eckd dasd (menu setup) Collin L. Walling
@ 2018-01-15 16:44 ` Collin L. Walling
2018-01-17 8:38 ` Thomas Huth
2018-01-15 16:44 ` [Qemu-devel] [PATCH v3 6/8] s390-ccw: interactive boot menu for eckd dasd (print menu) Collin L. Walling
` (3 subsequent siblings)
8 siblings, 1 reply; 32+ messages in thread
From: Collin L. Walling @ 2018-01-15 16:44 UTC (permalink / raw)
To: qemu-s390x, qemu-devel; +Cc: borntraeger, frankja, cohuck, thuth, david, alifm
Read the stage2 boot loader data block-by-block. We scan the
current block for the string "zIPL" to detect the start of the
boot menu banner. We then load the adjacent blocks (previous
block and next block) to account for the possibility of menu
data spanning multiple blocks.
Signed-off-by: Collin L. Walling <walling@linux.vnet.ibm.com>
---
pc-bios/s390-ccw/bootmap.c | 112 +++++++++++++++++++++++++++++++++++++++++++--
pc-bios/s390-ccw/bootmap.h | 1 +
| 10 ++++
3 files changed, 118 insertions(+), 5 deletions(-)
diff --git a/pc-bios/s390-ccw/bootmap.c b/pc-bios/s390-ccw/bootmap.c
index 29915e4..fb8ff80 100644
--- a/pc-bios/s390-ccw/bootmap.c
+++ b/pc-bios/s390-ccw/bootmap.c
@@ -13,6 +13,7 @@
#include "bootmap.h"
#include "virtio.h"
#include "bswap.h"
+#include "menu.h"
#ifdef DEBUG
/* #define DEBUG_FALLBACK */
@@ -83,6 +84,10 @@ static void jump_to_IPL_code(uint64_t address)
static unsigned char _bprs[8*1024]; /* guessed "max" ECKD sector size */
static const int max_bprs_entries = sizeof(_bprs) / sizeof(ExtEckdBlockPtr);
+static uint8_t _s2[MAX_SECTOR_SIZE * 4] __attribute__((__aligned__(PAGE_SIZE)));
+static void *s2_prev_blk = _s2;
+static void *s2_cur_blk = _s2 + MAX_SECTOR_SIZE;
+static void *s2_next_blk = _s2 + MAX_SECTOR_SIZE * 2;
static inline void verify_boot_info(BootInfo *bip)
{
@@ -182,7 +187,94 @@ static block_number_t load_eckd_segments(block_number_t blk, uint64_t *address)
return block_nr;
}
-static void run_eckd_boot_script(block_number_t mbr_block_nr)
+static ZiplParms get_zipl_parms(int offset)
+{
+ ZiplParms zipl_parms = {
+ .flag = *(uint16_t *)(s2_cur_blk + offset - ZIPL_FLAG_OFFSET),
+ .timeout = *(uint16_t *)(s2_cur_blk + offset - ZIPL_TIMEOUT_OFFSET),
+ .menu_start = offset,
+ };
+
+ return zipl_parms;
+}
+
+static bool find_zipl_boot_menu_banner(int *offset)
+{
+ int i;
+
+ /* Menu banner starts with "zIPL" */
+ for (i = 0; i < virtio_get_block_size() - 4; i++) {
+ if (magic_match(s2_cur_blk + i, ZIPL_MAGIC_EBCDIC)) {
+ *offset = i;
+ return true;
+ }
+ }
+
+ return false;
+}
+
+static int eckd_get_boot_menu_index(block_number_t s1b_block_nr)
+{
+ block_number_t cur_block_nr, prev_block_nr, next_block_nr;
+ EckdStage1b *s1b = (void *)sec;
+ ZiplParms zipl_parms;
+ bool found = false;
+ int offset;
+ int i;
+
+ /* Get Stage1b data */
+ memset(sec, FREE_SPACE_FILLER, sizeof(sec));
+ read_block(s1b_block_nr, s1b, "Cannot read stage1b boot loader");
+
+ memset(_s2, FREE_SPACE_FILLER, sizeof(_s2));
+
+ /* Get Stage2 data */
+ for (i = 0; i < STAGE2_BLK_CNT_MAX; i++) {
+ cur_block_nr = eckd_block_num((void *)&s1b->seek[i].cyl);
+
+ if (!cur_block_nr) {
+ break;
+ }
+
+ read_block(cur_block_nr, s2_cur_blk, "Cannot read stage2 boot loader");
+
+ if (find_zipl_boot_menu_banner(&offset)) {
+ /* Load the adjacent blocks to account for the
+ * possibility of menu data spanning multiple blocks.
+ */
+ if (prev_block_nr) {
+ read_block(prev_block_nr, s2_prev_blk,
+ "Cannot read stage2 boot loader");
+ }
+
+ if (i + 1 < STAGE2_BLK_CNT_MAX) {
+ next_block_nr = eckd_block_num((void *)&s1b->seek[i + 1].cyl);
+ }
+
+ if (next_block_nr) {
+ read_block(next_block_nr, s2_next_blk,
+ "Cannot read stage2 boot loader");
+ }
+
+ zipl_parms = get_zipl_parms(offset);
+ found = true;
+ break;
+ }
+
+ prev_block_nr = cur_block_nr;
+ }
+
+ if (!found) {
+ sclp_print("No zipl boot menu data found. Booting default entry.");
+ return 0;
+ }
+
+ zipl_parms.menu_start++; /* make compiler happy -- does nothing vital */
+ return 0; /* implemented next patch */
+}
+
+static void run_eckd_boot_script(block_number_t mbr_block_nr,
+ block_number_t s1b_block_nr)
{
int i;
unsigned int loadparm = get_loadparm_index();
@@ -191,6 +283,10 @@ static void run_eckd_boot_script(block_number_t mbr_block_nr)
ScsiMbr *bte = (void *)sec; /* Eckd bootmap table entry */
BootMapScript *bms = (void *)sec;
+ if (menu_check_flags(BOOT_MENU_FLAG_BOOT_OPTS | BOOT_MENU_FLAG_ZIPL_OPTS)) {
+ loadparm = eckd_get_boot_menu_index(s1b_block_nr);
+ }
+
debug_print_int("loadparm", loadparm);
IPL_assert(loadparm < 31, "loadparm value greater than"
" maximum number of boot entries allowed");
@@ -223,7 +319,7 @@ static void ipl_eckd_cdl(void)
XEckdMbr *mbr;
EckdCdlIpl2 *ipl2 = (void *)sec;
IplVolumeLabel *vlbl = (void *)sec;
- block_number_t mbr_block_nr;
+ block_number_t mbr_block_nr, s1b_block_nr;
/* we have just read the block #0 and recognized it as "IPL1" */
sclp_print("CDL\n");
@@ -249,7 +345,10 @@ static void ipl_eckd_cdl(void)
/* save pointer to Boot Script */
mbr_block_nr = eckd_block_num((void *)&mbr->blockptr);
- run_eckd_boot_script(mbr_block_nr);
+ /* save pointer to Stage1b Data */
+ s1b_block_nr = eckd_block_num((void *)&ipl2->stage1.seek[0].cyl);
+
+ run_eckd_boot_script(mbr_block_nr, s1b_block_nr);
/* no return */
}
@@ -280,7 +379,7 @@ static void print_eckd_ldl_msg(ECKD_IPL_mode_t mode)
static void ipl_eckd_ldl(ECKD_IPL_mode_t mode)
{
- block_number_t mbr_block_nr;
+ block_number_t mbr_block_nr, s1b_block_nr;
EckdLdlIpl1 *ipl1 = (void *)sec;
if (mode != ECKD_LDL_UNLABELED) {
@@ -303,7 +402,10 @@ static void ipl_eckd_ldl(ECKD_IPL_mode_t mode)
mbr_block_nr =
eckd_block_num((void *)&ipl1->boot_info.bp.ipl.bm_ptr.eckd.bptr);
- run_eckd_boot_script(mbr_block_nr);
+ /* save pointer to Stage1b Data */
+ s1b_block_nr = eckd_block_num((void *)&ipl1->stage1.seek[0].cyl);
+
+ run_eckd_boot_script(mbr_block_nr, s1b_block_nr);
/* no return */
}
diff --git a/pc-bios/s390-ccw/bootmap.h b/pc-bios/s390-ccw/bootmap.h
index df956f2..56445f2 100644
--- a/pc-bios/s390-ccw/bootmap.h
+++ b/pc-bios/s390-ccw/bootmap.h
@@ -74,6 +74,7 @@ typedef struct ScsiMbr {
} __attribute__ ((packed)) ScsiMbr;
#define ZIPL_MAGIC "zIPL"
+#define ZIPL_MAGIC_EBCDIC "\xa9\xc9\xd7\xd3"
#define IPL1_MAGIC "\xc9\xd7\xd3\xf1" /* == "IPL1" in EBCDIC */
#define IPL2_MAGIC "\xc9\xd7\xd3\xf2" /* == "IPL2" in EBCDIC */
#define VOL1_MAGIC "\xe5\xd6\xd3\xf1" /* == "VOL1" in EBCDIC */
--git a/pc-bios/s390-ccw/menu.h b/pc-bios/s390-ccw/menu.h
index 04b1db1..3a8a487 100644
--- a/pc-bios/s390-ccw/menu.h
+++ b/pc-bios/s390-ccw/menu.h
@@ -17,6 +17,16 @@
#define BOOT_MENU_FLAG_BOOT_OPTS 0x80
#define BOOT_MENU_FLAG_ZIPL_OPTS 0x40
+/* Offsets from zipl fields to zipl banner start */
+#define ZIPL_TIMEOUT_OFFSET 138
+#define ZIPL_FLAG_OFFSET 140
+
+typedef struct ZiplParms {
+ uint16_t flag;
+ uint16_t timeout;
+ uint64_t menu_start;
+} ZiplParms;
+
void menu_set_parms(uint8_t boot_menu_flags, uint16_t boot_menu_timeout);
bool menu_check_flags(uint8_t check_flags);
--
2.7.4
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [Qemu-devel] [PATCH v3 6/8] s390-ccw: interactive boot menu for eckd dasd (print menu)
2018-01-15 16:44 [Qemu-devel] [PATCH v3 0/8] Interactive Boot Menu for DASD and SCSI Guests on s390x Collin L. Walling
` (4 preceding siblings ...)
2018-01-15 16:44 ` [Qemu-devel] [PATCH v3 5/8] s390-ccw: interactive boot menu for eckd dasd (read stage2 data) Collin L. Walling
@ 2018-01-15 16:44 ` Collin L. Walling
2018-01-17 8:58 ` Thomas Huth
2018-01-15 16:44 ` [Qemu-devel] [PATCH v3 7/8] s390-ccw: interactive boot menu for eckd dasd (read input) Collin L. Walling
` (2 subsequent siblings)
8 siblings, 1 reply; 32+ messages in thread
From: Collin L. Walling @ 2018-01-15 16:44 UTC (permalink / raw)
To: qemu-s390x, qemu-devel; +Cc: borntraeger, frankja, cohuck, thuth, david, alifm
Prints the menu data starting from the zIPL menu banner.
Signed-off-by: Collin L. Walling <walling@linux.vnet.ibm.com>
---
pc-bios/s390-ccw/bootmap.c | 3 +--
| 42 ++++++++++++++++++++++++++++++++++++++++++
| 1 +
3 files changed, 44 insertions(+), 2 deletions(-)
diff --git a/pc-bios/s390-ccw/bootmap.c b/pc-bios/s390-ccw/bootmap.c
index fb8ff80..f894760 100644
--- a/pc-bios/s390-ccw/bootmap.c
+++ b/pc-bios/s390-ccw/bootmap.c
@@ -269,8 +269,7 @@ static int eckd_get_boot_menu_index(block_number_t s1b_block_nr)
return 0;
}
- zipl_parms.menu_start++; /* make compiler happy -- does nothing vital */
- return 0; /* implemented next patch */
+ return menu_get_zipl_boot_index(s2_cur_blk, zipl_parms);
}
static void run_eckd_boot_script(block_number_t mbr_block_nr,
--git a/pc-bios/s390-ccw/menu.c b/pc-bios/s390-ccw/menu.c
index e15a7f2..30470b3 100644
--- a/pc-bios/s390-ccw/menu.c
+++ b/pc-bios/s390-ccw/menu.c
@@ -10,10 +10,52 @@
*/
#include "menu.h"
+#include "s390-ccw.h"
static uint8_t flags;
static uint64_t timeout;
+static void zipl_println(const char *data, size_t len)
+{
+ char buf[len + 1];
+
+ ebcdic_to_ascii(data, buf, len);
+ buf[len] = '\n';
+ buf[len + 1] = '\0';
+
+ sclp_print(buf);
+}
+
+int menu_get_zipl_boot_index(const void *stage2, ZiplParms zipl_parms)
+{
+ const char *data = stage2 + zipl_parms.menu_start;
+ size_t len;
+ int ct;
+
+ if (flags & BOOT_MENU_FLAG_ZIPL_OPTS) {
+ if (zipl_parms.flag) {
+ timeout = zipl_parms.timeout;
+ } else {
+ return 0; /* Boot default */
+ }
+ }
+
+ /* Print and count all menu items, including the banner */
+ for (ct = 0; *data; ct++) {
+ len = strlen(data);
+ zipl_println(data, len);
+ data += len + 1;
+
+ if (ct < 2) {
+ sclp_print("\n");
+ }
+ }
+
+ sclp_print("\n");
+
+ return 0; /* return user input next patch */
+}
+
void menu_set_parms(uint8_t boot_menu_flag, uint16_t boot_menu_timeout)
{
flags = boot_menu_flag;
--git a/pc-bios/s390-ccw/menu.h b/pc-bios/s390-ccw/menu.h
index 3a8a487..c6615aa 100644
--- a/pc-bios/s390-ccw/menu.h
+++ b/pc-bios/s390-ccw/menu.h
@@ -27,6 +27,7 @@ typedef struct ZiplParms {
uint64_t menu_start;
} ZiplParms;
+int menu_get_zipl_boot_index(const void *stage2, ZiplParms zipl_parms);
void menu_set_parms(uint8_t boot_menu_flags, uint16_t boot_menu_timeout);
bool menu_check_flags(uint8_t check_flags);
--
2.7.4
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [Qemu-devel] [PATCH v3 7/8] s390-ccw: interactive boot menu for eckd dasd (read input)
2018-01-15 16:44 [Qemu-devel] [PATCH v3 0/8] Interactive Boot Menu for DASD and SCSI Guests on s390x Collin L. Walling
` (5 preceding siblings ...)
2018-01-15 16:44 ` [Qemu-devel] [PATCH v3 6/8] s390-ccw: interactive boot menu for eckd dasd (print menu) Collin L. Walling
@ 2018-01-15 16:44 ` Collin L. Walling
2018-01-17 10:10 ` Thomas Huth
2018-01-15 16:44 ` [Qemu-devel] [PATCH v3 8/8] s390-ccw: interactive boot menu for scsi Collin L. Walling
2018-01-15 16:58 ` [Qemu-devel] [PATCH v3 0/8] Interactive Boot Menu for DASD and SCSI Guests on s390x no-reply
8 siblings, 1 reply; 32+ messages in thread
From: Collin L. Walling @ 2018-01-15 16:44 UTC (permalink / raw)
To: qemu-s390x, qemu-devel; +Cc: borntraeger, frankja, cohuck, thuth, david, alifm
When the boot menu options are present and the guest's
disk has been configured by the zipl tool, then the user
will be presented with an interactive boot menu with
labeled entries. An example of what the menu might look
like:
zIPL v1.37.1-build-20170714 interactive boot menu.
0. default (linux-4.13.0)
1. linux-4.13.0
2. performance
3. kvm
Please choose (default will boot in 10 seconds):
If the user's input is empty or 0, the default zipl entry will
be chosen. If the input is within the range presented by the
menu, then the selection will be booted. Any erroneous input
will cancel the timeout and prompt the user until correct
input is given.
Any value set for loadparm will override all boot menu options.
If loadparm=PROMPT, then the menu prompt will continuously wait
until correct user input is given.
The absence of any boot options on the command line will attempt
to use the zipl loader values.
--- Specific notes regarding this patch ---
Implements an sclp_read function to capture input from the
console, and a wrapper function in that handles parsing
certain characters and adding input to a buffer. The input
is checked for any erroneous values and is handled
appropriately. A correct value will boot the respective
boot menu entry.
Signed-off-by: Collin L. Walling <walling@linux.vnet.ibm.com>
---
| 160 +++++++++++++++++++++++++++++++++++++++++++-
pc-bios/s390-ccw/s390-ccw.h | 2 +
pc-bios/s390-ccw/sclp.c | 20 ++++++
pc-bios/s390-ccw/virtio.c | 2 +-
4 files changed, 182 insertions(+), 2 deletions(-)
--git a/pc-bios/s390-ccw/menu.c b/pc-bios/s390-ccw/menu.c
index 30470b3..c219b7f 100644
--- a/pc-bios/s390-ccw/menu.c
+++ b/pc-bios/s390-ccw/menu.c
@@ -12,9 +12,167 @@
#include "menu.h"
#include "s390-ccw.h"
+#define KEYCODE_NO_INP '\0'
+#define KEYCODE_ESCAPE '\033'
+#define KEYCODE_BACKSP '\177'
+#define KEYCODE_ENTER '\r'
+
static uint8_t flags;
static uint64_t timeout;
+static inline void enable_clock_int(void)
+{
+ uint64_t tmp = 0;
+
+ asm volatile(
+ "stctg 0,0,%0\n"
+ "oi 6+%0, 0x8\n"
+ "lctlg 0,0,%0"
+ : : "Q" (tmp) : "memory"
+ );
+}
+
+static inline void disable_clock_int(void)
+{
+ uint64_t tmp = 0;
+
+ asm volatile(
+ "stctg 0,0,%0\n"
+ "ni 6+%0, 0xf7\n"
+ "lctlg 0,0,%0"
+ : : "Q" (tmp) : "memory"
+ );
+}
+
+static inline void set_clock_comparator(uint64_t time)
+{
+ asm volatile("sckc %0" : : "Q" (time));
+}
+
+static inline bool check_clock_int(void)
+{
+ uint16_t *code = (uint16_t *)0x86;
+
+ consume_sclp_int();
+
+ return *code == 0x1004;
+}
+
+static int read_prompt(char *buf, size_t len)
+{
+ char inp[2] = {};
+ uint8_t idx = 0;
+ uint64_t time;
+
+ if (timeout) {
+ time = get_clock() + (timeout << 32);
+ set_clock_comparator(time);
+ enable_clock_int();
+ timeout = 0;
+ }
+
+ while (!check_clock_int()) {
+
+ /* Process only one character at a time */
+ sclp_read(inp, 1);
+
+ switch (inp[0]) {
+ case KEYCODE_NO_INP:
+ case KEYCODE_ESCAPE:
+ continue;
+ case KEYCODE_BACKSP:
+ if (idx > 0) {
+ /* Remove last character */
+ buf[idx - 1] = ' ';
+ sclp_print("\r");
+ sclp_print(buf);
+
+ idx--;
+
+ /* Reset cursor */
+ buf[idx] = 0;
+ sclp_print("\r");
+ sclp_print(buf);
+ }
+ continue;
+ case KEYCODE_ENTER:
+ disable_clock_int();
+ return idx;
+ }
+
+ /* Echo input and add to buffer */
+ if (idx < len) {
+ buf[idx] = inp[0];
+ sclp_print(inp);
+ idx++;
+ }
+ }
+
+ disable_clock_int();
+ *buf = 0;
+
+ return 0;
+}
+
+static int get_index(void)
+{
+ char buf[10];
+ int len;
+ int i;
+
+ memset(buf, 0, sizeof(buf));
+
+ len = read_prompt(buf, sizeof(buf));
+
+ /* If no input, boot default */
+ if (len == 0) {
+ return 0;
+ }
+
+ /* Check for erroneous input */
+ for (i = 0; i < len; i++) {
+ if (!isdigit(buf[i])) {
+ return -1;
+ }
+ }
+
+ return atoi(buf);
+}
+
+static void boot_menu_prompt(bool retry)
+{
+ char tmp[6];
+
+ if (retry) {
+ sclp_print("\nError: undefined configuration"
+ "\nPlease choose:\n");
+ } else if (timeout > 0) {
+ sclp_print("Please choose (default will boot in ");
+ sclp_print(itostr(timeout, tmp, sizeof(tmp)));
+ sclp_print(" seconds):\n");
+ } else {
+ sclp_print("Please choose:\n");
+ }
+}
+
+static int get_boot_index(int entries)
+{
+ int boot_index;
+ bool retry = false;
+ char tmp[5];
+
+ do {
+ boot_menu_prompt(retry);
+ boot_index = get_index();
+ retry = true;
+ } while (boot_index < 0 || boot_index >= entries);
+
+ sclp_print("\nBooting entry #");
+ sclp_print(itostr(boot_index, tmp, sizeof(tmp)));
+
+ return boot_index;
+}
+
static void zipl_println(const char *data, size_t len)
{
char buf[len + 1];
@@ -53,7 +211,7 @@ int menu_get_zipl_boot_index(const void *stage2, ZiplParms zipl_parms)
sclp_print("\n");
- return 0; /* return user input next patch */
+ return get_boot_index(ct - 1);
}
void menu_set_parms(uint8_t boot_menu_flag, uint16_t boot_menu_timeout)
diff --git a/pc-bios/s390-ccw/s390-ccw.h b/pc-bios/s390-ccw/s390-ccw.h
index 25d4d21..df4bc88 100644
--- a/pc-bios/s390-ccw/s390-ccw.h
+++ b/pc-bios/s390-ccw/s390-ccw.h
@@ -71,6 +71,7 @@ unsigned int get_loadparm_index(void);
void sclp_print(const char *string);
void sclp_setup(void);
void sclp_get_loadparm_ascii(char *loadparm);
+void sclp_read(char *str, size_t len);
/* virtio.c */
unsigned long virtio_load_direct(ulong rec_list1, ulong rec_list2,
@@ -79,6 +80,7 @@ bool virtio_is_supported(SubChannelId schid);
void virtio_blk_setup_device(SubChannelId schid);
int virtio_read(ulong sector, void *load_addr);
int enable_mss_facility(void);
+u64 get_clock(void);
ulong get_second(void);
/* bootmap.c */
diff --git a/pc-bios/s390-ccw/sclp.c b/pc-bios/s390-ccw/sclp.c
index 486fce1..5e4a78b 100644
--- a/pc-bios/s390-ccw/sclp.c
+++ b/pc-bios/s390-ccw/sclp.c
@@ -101,3 +101,23 @@ void sclp_get_loadparm_ascii(char *loadparm)
ebcdic_to_ascii((char *) sccb->loadparm, loadparm, 8);
}
}
+
+void sclp_read(char *str, size_t len)
+{
+ ReadEventData *sccb = (void *)_sccb;
+ char *buf = (char *)(&sccb->ebh) + 7;
+
+ /* Len should not exceed the maximum size of the event buffer */
+ if (len > SCCB_SIZE - 8) {
+ len = SCCB_SIZE - 8;
+ }
+
+ sccb->h.length = SCCB_SIZE;
+ sccb->h.function_code = SCLP_UNCONDITIONAL_READ;
+ sccb->ebh.length = sizeof(EventBufferHeader);
+ sccb->ebh.type = SCLP_EVENT_ASCII_CONSOLE_DATA;
+ sccb->ebh.flags = 0;
+
+ sclp_service_call(SCLP_CMD_READ_EVENT_DATA, sccb);
+ memcpy(str, buf, len);
+}
diff --git a/pc-bios/s390-ccw/virtio.c b/pc-bios/s390-ccw/virtio.c
index c890a03..817e7f5 100644
--- a/pc-bios/s390-ccw/virtio.c
+++ b/pc-bios/s390-ccw/virtio.c
@@ -176,7 +176,7 @@ void vring_send_buf(VRing *vr, void *p, int len, int flags)
}
}
-static u64 get_clock(void)
+u64 get_clock(void)
{
u64 r;
--
2.7.4
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [Qemu-devel] [PATCH v3 8/8] s390-ccw: interactive boot menu for scsi
2018-01-15 16:44 [Qemu-devel] [PATCH v3 0/8] Interactive Boot Menu for DASD and SCSI Guests on s390x Collin L. Walling
` (6 preceding siblings ...)
2018-01-15 16:44 ` [Qemu-devel] [PATCH v3 7/8] s390-ccw: interactive boot menu for eckd dasd (read input) Collin L. Walling
@ 2018-01-15 16:44 ` Collin L. Walling
2018-01-17 10:16 ` Thomas Huth
2018-01-15 16:58 ` [Qemu-devel] [PATCH v3 0/8] Interactive Boot Menu for DASD and SCSI Guests on s390x no-reply
8 siblings, 1 reply; 32+ messages in thread
From: Collin L. Walling @ 2018-01-15 16:44 UTC (permalink / raw)
To: qemu-s390x, qemu-devel; +Cc: borntraeger, frankja, cohuck, thuth, david, alifm
Interactive boot menu for scsi. This follows the same procedure
as the interactive menu for eckd dasd. An example follows:
s390x Enumerated Boot Menu.
3 entries detected. Select from index 0 to 2.
Please choose:
Signed-off-by: Collin L. Walling <walling@linux.vnet.ibm.com>
---
pc-bios/s390-ccw/bootmap.c | 9 ++++++---
pc-bios/s390-ccw/main.c | 3 +++
| 14 ++++++++++++++
| 1 +
4 files changed, 24 insertions(+), 3 deletions(-)
diff --git a/pc-bios/s390-ccw/bootmap.c b/pc-bios/s390-ccw/bootmap.c
index f894760..5b622de 100644
--- a/pc-bios/s390-ccw/bootmap.c
+++ b/pc-bios/s390-ccw/bootmap.c
@@ -589,15 +589,18 @@ static void ipl_scsi(void)
}
program_table_entries++;
- if (program_table_entries == loadparm + 1) {
- break; /* selected entry found */
- }
}
debug_print_int("program table entries", program_table_entries);
IPL_assert(program_table_entries != 0, "Empty Program Table");
+ if (menu_check_flags(BOOT_MENU_FLAG_BOOT_OPTS)) {
+ loadparm = menu_get_enum_boot_index(program_table_entries);
+ }
+
+ prog_table_entry = (ScsiBlockPtr *)(sec + pte_len * (loadparm + 1));
+
zipl_run(prog_table_entry); /* no return */
}
diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c
index 709e5ef..808d111 100644
--- a/pc-bios/s390-ccw/main.c
+++ b/pc-bios/s390-ccw/main.c
@@ -90,6 +90,9 @@ static void menu_setup(void)
case S390_IPL_TYPE_CCW:
menu_set_parms(iplb.ccw.boot_menu_flags, iplb.ccw.boot_menu_timeout);
return;
+ case S390_IPL_TYPE_QEMU_SCSI:
+ menu_set_parms(iplb.scsi.boot_menu_flags, iplb.scsi.boot_menu_timeout);
+ return;
}
}
--git a/pc-bios/s390-ccw/menu.c b/pc-bios/s390-ccw/menu.c
index c219b7f..007d96f 100644
--- a/pc-bios/s390-ccw/menu.c
+++ b/pc-bios/s390-ccw/menu.c
@@ -214,6 +214,20 @@ int menu_get_zipl_boot_index(const void *stage2, ZiplParms zipl_parms)
return get_boot_index(ct - 1);
}
+int menu_get_enum_boot_index(int entries)
+{
+ char tmp[4];
+
+ sclp_print("s390x Enumerated Boot Menu.\n\n");
+
+ sclp_print(itostr(entries, tmp, sizeof(tmp)));
+ sclp_print(" entries detected. Select from boot index 0 to ");
+ sclp_print(itostr(entries - 1, tmp, sizeof(tmp)));
+ sclp_print(".\n\n");
+
+ return get_boot_index(entries);
+}
+
void menu_set_parms(uint8_t boot_menu_flag, uint16_t boot_menu_timeout)
{
flags = boot_menu_flag;
--git a/pc-bios/s390-ccw/menu.h b/pc-bios/s390-ccw/menu.h
index c6615aa..0c65009 100644
--- a/pc-bios/s390-ccw/menu.h
+++ b/pc-bios/s390-ccw/menu.h
@@ -28,6 +28,7 @@ typedef struct ZiplParms {
} ZiplParms;
int menu_get_zipl_boot_index(const void *stage2, ZiplParms zipl_parms);
+int menu_get_enum_boot_index(int entries);
void menu_set_parms(uint8_t boot_menu_flags, uint16_t boot_menu_timeout);
bool menu_check_flags(uint8_t check_flags);
--
2.7.4
^ permalink raw reply related [flat|nested] 32+ messages in thread
* Re: [Qemu-devel] [PATCH v3 0/8] Interactive Boot Menu for DASD and SCSI Guests on s390x
2018-01-15 16:44 [Qemu-devel] [PATCH v3 0/8] Interactive Boot Menu for DASD and SCSI Guests on s390x Collin L. Walling
` (7 preceding siblings ...)
2018-01-15 16:44 ` [Qemu-devel] [PATCH v3 8/8] s390-ccw: interactive boot menu for scsi Collin L. Walling
@ 2018-01-15 16:58 ` no-reply
8 siblings, 0 replies; 32+ messages in thread
From: no-reply @ 2018-01-15 16:58 UTC (permalink / raw)
To: walling
Cc: famz, qemu-s390x, qemu-devel, frankja, thuth, cohuck, david,
alifm, borntraeger
Hi,
This series failed build test on s390x host. Please find the details below.
Type: series
Message-id: 1516034665-27606-1-git-send-email-walling@linux.vnet.ibm.com
Subject: [Qemu-devel] [PATCH v3 0/8] Interactive Boot Menu for DASD and SCSI Guests on s390x
=== TEST SCRIPT BEGIN ===
#!/bin/bash
# Testing script will be invoked under the git checkout with
# HEAD pointing to a commit that has the patches applied on top of "base"
# branch
set -e
echo "=== ENV ==="
env
echo "=== PACKAGES ==="
rpm -qa
echo "=== TEST BEGIN ==="
CC=$HOME/bin/cc
INSTALL=$PWD/install
BUILD=$PWD/build
echo -n "Using CC: "
realpath $CC
mkdir -p $BUILD $INSTALL
SRC=$PWD
cd $BUILD
$SRC/configure --cc=$CC --prefix=$INSTALL
make -j4
# XXX: we need reliable clean up
# make check -j4 V=1
make install
=== TEST SCRIPT END ===
Updating 3c8cf5a9c21ff8782164d1def7f44bd888713384
From https://github.com/patchew-project/qemu
fd06527b80..f521eeee3b master -> master
* [new tag] patchew/1516034665-27606-1-git-send-email-walling@linux.vnet.ibm.com -> patchew/1516034665-27606-1-git-send-email-walling@linux.vnet.ibm.com
t [tag update] patchew/20180110190909.20652-1-marcel@redhat.com -> patchew/20180110190909.20652-1-marcel@redhat.com
Switched to a new branch 'test'
a3b25a952e s390-ccw: interactive boot menu for scsi
81f4827065 s390-ccw: interactive boot menu for eckd dasd (read input)
2c4bd336eb s390-ccw: interactive boot menu for eckd dasd (print menu)
d981ce36d7 s390-ccw: interactive boot menu for eckd dasd (read stage2 data)
4e2643b20a s390-ccw: interactive boot menu for eckd dasd (menu setup)
9aa47e57bf s390-ccw: parse and set boot menu options
0173a010a8 s390-ccw: ipl structs for eckd cdl/ldl
48db1aca6d s390-ccw: update libc
=== OUTPUT BEGIN ===
=== ENV ===
LANG=en_US.UTF-8
XDG_SESSION_ID=11344
USER=fam
PWD=/var/tmp/patchew-tester-tmp-dep3o2js/src
HOME=/home/fam
SHELL=/bin/sh
SHLVL=2
PATCHEW=/home/fam/patchew/patchew-cli -s http://patchew.org --nodebug
LOGNAME=fam
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1012/bus
XDG_RUNTIME_DIR=/run/user/1012
PATH=/usr/bin:/bin
_=/usr/bin/env
=== PACKAGES ===
gpg-pubkey-873529b8-54e386ff
glibc-debuginfo-common-2.24-10.fc25.s390x
fedora-release-26-1.noarch
dejavu-sans-mono-fonts-2.35-4.fc26.noarch
xemacs-filesystem-21.5.34-22.20170124hgf412e9f093d4.fc26.noarch
bash-4.4.12-7.fc26.s390x
freetype-2.7.1-9.fc26.s390x
libSM-1.2.2-5.fc26.s390x
libmpc-1.0.2-6.fc26.s390x
libaio-0.3.110-7.fc26.s390x
libverto-0.2.6-7.fc26.s390x
perl-Scalar-List-Utils-1.48-1.fc26.s390x
iptables-libs-1.6.1-2.fc26.s390x
perl-threads-shared-1.57-1.fc26.s390x
p11-kit-trust-0.23.9-2.fc26.s390x
tcl-8.6.6-2.fc26.s390x
libxshmfence-1.2-4.fc26.s390x
expect-5.45-23.fc26.s390x
perl-Thread-Queue-3.12-1.fc26.noarch
perl-encoding-2.19-6.fc26.s390x
keyutils-1.5.10-1.fc26.s390x
gmp-devel-6.1.2-4.fc26.s390x
enchant-1.6.0-16.fc26.s390x
net-snmp-libs-5.7.3-17.fc26.s390x
python-gobject-base-3.24.1-1.fc26.s390x
python3-distro-1.0.3-1.fc26.noarch
python3-enchant-1.6.10-1.fc26.noarch
python-lockfile-0.11.0-6.fc26.noarch
python2-pyparsing-2.1.10-3.fc26.noarch
python2-lxml-4.1.1-1.fc26.s390x
librados2-10.2.7-2.fc26.s390x
trousers-lib-0.3.13-7.fc26.s390x
libpaper-1.1.24-14.fc26.s390x
libdatrie-0.2.9-4.fc26.s390x
libsoup-2.58.2-1.fc26.s390x
passwd-0.79-9.fc26.s390x
bind99-libs-9.9.10-3.P3.fc26.s390x
python3-rpm-4.13.0.2-1.fc26.s390x
mock-core-configs-27.4-1.fc26.noarch
systemd-233-7.fc26.s390x
virglrenderer-0.6.0-1.20170210git76b3da97b.fc26.s390x
s390utils-ziomon-1.36.1-3.fc26.s390x
s390utils-osasnmpd-1.36.1-3.fc26.s390x
libXrandr-1.5.1-2.fc26.s390x
libglvnd-glx-1.0.0-1.fc26.s390x
texlive-ifxetex-svn19685.0.5-33.fc26.2.noarch
texlive-psnfss-svn33946.9.2a-33.fc26.2.noarch
texlive-dvipdfmx-def-svn40328-33.fc26.2.noarch
texlive-natbib-svn20668.8.31b-33.fc26.2.noarch
texlive-xdvi-bin-svn40750-33.20160520.fc26.2.s390x
texlive-cm-svn32865.0-33.fc26.2.noarch
texlive-beton-svn15878.0-33.fc26.2.noarch
texlive-fpl-svn15878.1.002-33.fc26.2.noarch
texlive-mflogo-svn38628-33.fc26.2.noarch
texlive-texlive-docindex-svn41430-33.fc26.2.noarch
texlive-luaotfload-bin-svn34647.0-33.20160520.fc26.2.noarch
texlive-koma-script-svn41508-33.fc26.2.noarch
texlive-pst-tree-svn24142.1.12-33.fc26.2.noarch
texlive-breqn-svn38099.0.98d-33.fc26.2.noarch
texlive-xetex-svn41438-33.fc26.2.noarch
gstreamer1-plugins-bad-free-1.12.3-1.fc26.s390x
xorg-x11-font-utils-7.5-33.fc26.s390x
ghostscript-fonts-5.50-36.fc26.noarch
libXext-devel-1.3.3-5.fc26.s390x
libusbx-devel-1.0.21-2.fc26.s390x
libglvnd-devel-1.0.0-1.fc26.s390x
emacs-25.3-3.fc26.s390x
alsa-lib-devel-1.1.4.1-1.fc26.s390x
kbd-2.0.4-2.fc26.s390x
dconf-0.26.0-2.fc26.s390x
ccache-3.3.4-1.fc26.s390x
glibc-static-2.25-12.fc26.s390x
mc-4.8.19-5.fc26.s390x
doxygen-1.8.13-9.fc26.s390x
dpkg-1.18.24-1.fc26.s390x
libtdb-1.3.13-1.fc26.s390x
python2-pynacl-1.1.1-1.fc26.s390x
nss-sysinit-3.34.0-1.0.fc26.s390x
kernel-4.13.16-202.fc26.s390x
perl-Filter-1.58-1.fc26.s390x
python2-pip-9.0.1-11.fc26.noarch
dnf-2.7.5-2.fc26.noarch
pcre2-utf16-10.23-11.fc26.s390x
glusterfs-devel-3.10.8-1.fc26.s390x
sssd-common-1.16.0-4.fc26.s390x
python2-sssdconfig-1.16.0-4.fc26.noarch
acpica-tools-20171110-1.fc26.s390x
glibc-debuginfo-2.24-10.fc25.s390x
fedora-repos-26-1.noarch
dejavu-fonts-common-2.35-4.fc26.noarch
bind99-license-9.9.10-3.P3.fc26.noarch
ncurses-libs-6.0-8.20170212.fc26.s390x
libpng-1.6.28-2.fc26.s390x
libICE-1.0.9-9.fc26.s390x
kmod-24-1.fc26.s390x
libseccomp-2.3.2-1.fc26.s390x
perl-Text-ParseWords-3.30-366.fc26.noarch
libtool-ltdl-2.4.6-17.fc26.s390x
perl-threads-2.16-1.fc26.s390x
libselinux-utils-2.6-7.fc26.s390x
userspace-rcu-0.9.3-2.fc26.s390x
libXfont-1.5.2-5.fc26.s390x
perl-Class-Inspector-1.31-3.fc26.noarch
perl-open-1.10-395.fc26.noarch
keyutils-libs-devel-1.5.10-1.fc26.s390x
isl-0.16.1-1.fc26.s390x
libsecret-0.18.5-3.fc26.s390x
compat-openssl10-1.0.2m-1.fc26.s390x
python3-iniparse-0.4-24.fc26.noarch
python3-dateutil-2.6.0-3.fc26.noarch
python3-firewall-0.4.4.5-1.fc26.noarch
python-enum34-1.1.6-1.fc26.noarch
python2-pygments-2.2.0-7.fc26.noarch
python2-dockerfile-parse-0.0.7-1.fc26.noarch
perl-Net-SSLeay-1.81-1.fc26.s390x
hostname-3.18-2.fc26.s390x
libtirpc-1.0.2-0.fc26.s390x
rpm-build-libs-4.13.0.2-1.fc26.s390x
libutempter-1.1.6-9.fc26.s390x
systemd-pam-233-7.fc26.s390x
pcre-utf16-8.41-3.fc26.s390x
libXinerama-1.1.3-7.fc26.s390x
mesa-libGL-17.2.4-2.fc26.s390x
texlive-amsfonts-svn29208.3.04-33.fc26.2.noarch
texlive-caption-svn41409-33.fc26.2.noarch
texlive-enumitem-svn24146.3.5.2-33.fc26.2.noarch
texlive-pdftex-def-svn22653.0.06d-33.fc26.2.noarch
texlive-xdvi-svn40768-33.fc26.2.noarch
texlive-courier-svn35058.0-33.fc26.2.noarch
texlive-charter-svn15878.0-33.fc26.2.noarch
texlive-graphics-def-svn41879-33.fc26.2.noarch
texlive-mfnfss-svn19410.0-33.fc26.2.noarch
texlive-texlive-en-svn41185-33.fc26.2.noarch
texlive-ifplatform-svn21156.0.4-33.fc26.2.noarch
texlive-ms-svn29849.0-33.fc26.2.noarch
texlive-pst-tools-svn34067.0.05-33.fc26.2.noarch
texlive-powerdot-svn38984-33.fc26.2.noarch
texlive-xetexconfig-svn41133-33.fc26.2.noarch
libvdpau-1.1.1-4.fc26.s390x
zlib-devel-1.2.11-2.fc26.s390x
gdk-pixbuf2-devel-2.36.9-1.fc26.s390x
libX11-devel-1.6.5-2.fc26.s390x
libtasn1-devel-4.12-1.fc26.s390x
libglvnd-core-devel-1.0.0-1.fc26.s390x
SDL2-devel-2.0.7-2.fc26.s390x
webkitgtk3-2.4.11-5.fc26.s390x
grubby-8.40-4.fc26.s390x
uboot-tools-2017.05-4.fc26.s390x
cracklib-dicts-2.9.6-5.fc26.s390x
texinfo-6.3-3.fc26.s390x
time-1.7-52.fc26.s390x
python2-deltarpm-3.6-19.fc26.s390x
nss-3.34.0-1.0.fc26.s390x
webkitgtk4-2.18.3-1.fc26.s390x
net-tools-2.0-0.43.20160912git.fc26.s390x
python2-setuptools-37.0.0-1.fc26.noarch
python2-dnf-2.7.5-2.fc26.noarch
pcre2-10.23-11.fc26.s390x
groff-base-1.22.3-10.fc26.s390x
python2-devel-2.7.14-4.fc26.s390x
python2-GitPython-2.1.7-2.fc26.noarch
boost-iostreams-1.63.0-10.fc26.s390x
gpg-pubkey-efe550f5-5220ba41
gpg-pubkey-81b46521-55b3ca9a
filesystem-3.2-40.fc26.s390x
basesystem-11-3.fc26.noarch
js-jquery-3.2.1-1.fc26.noarch
pcre-8.41-3.fc26.s390x
elfutils-libelf-0.169-1.fc26.s390x
libidn-1.33-2.fc26.s390x
libogg-1.3.2-6.fc26.s390x
slang-2.3.1a-2.fc26.s390x
apr-1.6.3-1.fc26.s390x
libxkbcommon-0.7.1-3.fc26.s390x
perl-IO-1.36-395.fc26.s390x
libvorbis-1.3.5-2.fc26.s390x
less-487-3.fc26.s390x
lttng-ust-2.9.0-2.fc26.s390x
OpenEXR-libs-2.2.0-6.fc26.s390x
ipset-libs-6.29-3.fc26.s390x
perl-XML-XPath-1.42-1.fc26.noarch
lua-filesystem-1.6.3-3.fc24.s390x
sqlite-3.20.1-1.fc26.s390x
gstreamer1-1.12.3-1.fc26.s390x
libpwquality-1.3.0-8.fc26.s390x
gettext-libs-0.19.8.1-9.fc26.s390x
python3-chardet-2.3.0-3.fc26.noarch
python3-slip-dbus-0.6.4-6.fc26.noarch
python-chardet-2.3.0-3.fc26.noarch
python2-pyasn1-0.2.3-1.fc26.noarch
python-slip-dbus-0.6.4-6.fc26.noarch
libarchive-3.2.2-4.fc26.s390x
libbabeltrace-1.5.2-2.fc26.s390x
cdparanoia-libs-10.2-22.fc26.s390x
krb5-workstation-1.15.2-4.fc26.s390x
python3-requests-kerberos-0.10.0-4.fc26.noarch
gpgme-1.8.0-12.fc26.s390x
python2-gpg-1.8.0-12.fc26.s390x
shadow-utils-4.3.1-3.fc26.s390x
cryptsetup-libs-1.7.5-1.fc26.s390x
kpartx-0.4.9-88.fc26.s390x
net-snmp-agent-libs-5.7.3-17.fc26.s390x
libXi-1.7.9-2.fc26.s390x
texlive-tetex-svn41059-33.fc26.2.noarch
texlive-tools-svn40934-33.fc26.2.noarch
texlive-bibtex-bin-svn40473-33.20160520.fc26.2.s390x
texlive-mfware-bin-svn40473-33.20160520.fc26.2.s390x
texlive-underscore-svn18261.0-33.fc26.2.noarch
texlive-avantgar-svn31835.0-33.fc26.2.noarch
texlive-anysize-svn15878.0-33.fc26.2.noarch
texlive-lineno-svn21442.4.41-33.fc26.2.noarch
texlive-mathpazo-svn15878.1.003-33.fc26.2.noarch
texlive-soul-svn15878.2.4-33.fc26.2.noarch
texlive-luatexbase-svn38550-33.fc26.2.noarch
texlive-listings-svn37534.1.6-33.fc26.2.noarch
texlive-pstricks-svn41321-33.fc26.2.noarch
texlive-metalogo-svn18611.0.12-33.fc26.2.noarch
texlive-dvipdfmx-svn41149-33.fc26.2.noarch
kbd-legacy-2.0.4-2.fc26.noarch
nspr-devel-4.17.0-1.fc26.s390x
ghostscript-x11-9.20-10.fc26.s390x
libXrender-devel-0.9.10-2.fc26.s390x
libxkbcommon-devel-0.7.1-3.fc26.s390x
mesa-libGL-devel-17.2.4-2.fc26.s390x
sqlite-devel-3.20.1-1.fc26.s390x
usbredir-devel-0.7.1-3.fc26.s390x
libcap-devel-2.25-5.fc26.s390x
brlapi-devel-0.6.6-5.fc26.s390x
fedora-upgrade-27.1-1.fc26.noarch
python3-pygpgme-0.3-22.fc26.s390x
pinentry-0.9.7-3.fc26.s390x
perl-Test-Harness-3.39-1.fc26.noarch
qemu-sanity-check-nodeps-1.1.5-6.fc26.s390x
libldb-1.1.29-5.fc26.s390x
python-libxml2-2.9.4-2.fc26.s390x
nss-util-devel-3.34.0-1.0.fc26.s390x
vim-filesystem-8.0.1360-1.fc26.s390x
webkitgtk4-plugin-process-gtk2-2.18.3-1.fc26.s390x
python2-2.7.14-4.fc26.s390x
libwayland-cursor-1.13.0-3.fc26.s390x
mariadb-config-10.1.29-1.fc26.s390x
gdb-headless-8.0.1-33.fc26.s390x
pulseaudio-libs-devel-11.1-7.fc26.s390x
curl-7.53.1-13.fc26.s390x
json-c-0.12.1-5.fc26.s390x
gpg-pubkey-34ec9cba-54e38751
gpg-pubkey-030d5aed-55b577f0
setup-2.10.5-2.fc26.noarch
lato-fonts-2.015-3.fc26.noarch
web-assets-filesystem-5-5.fc26.noarch
libsepol-2.6-2.fc26.s390x
libcap-2.25-5.fc26.s390x
tcp_wrappers-libs-7.6-85.fc26.s390x
libnl3-3.3.0-1.fc26.s390x
pixman-0.34.0-3.fc26.s390x
lzo-2.08-9.fc26.s390x
perl-5.24.3-395.fc26.s390x
libnl3-cli-3.3.0-1.fc26.s390x
gpm-libs-1.20.7-10.fc26.s390x
libgo-7.2.1-2.fc26.s390x
iso-codes-3.74-2.fc26.noarch
ipset-6.29-3.fc26.s390x
lua-term-0.07-1.fc25.s390x
libdb-utils-5.3.28-24.fc26.s390x
system-python-libs-3.6.3-2.fc26.s390x
dbus-glib-0.108-2.fc26.s390x
pam-1.3.0-2.fc26.s390x
avahi-glib-0.6.32-7.fc26.s390x
python2-dateutil-2.6.0-3.fc26.noarch
python3-asn1crypto-0.23.0-1.fc26.noarch
python3-slip-0.6.4-6.fc26.noarch
python-backports-ssl_match_hostname-3.5.0.1-4.fc26.noarch
python2-pyOpenSSL-16.2.0-6.fc26.noarch
python-slip-0.6.4-6.fc26.noarch
nss-pem-1.0.3-3.fc26.s390x
fipscheck-1.5.0-1.fc26.s390x
elfutils-0.169-1.fc26.s390x
cyrus-sasl-lib-2.1.26-32.fc26.s390x
libkadm5-1.15.2-4.fc26.s390x
python3-kerberos-1.2.5-3.fc26.s390x
rpmconf-1.0.19-1.fc26.noarch
libsemanage-2.6-4.fc26.s390x
device-mapper-libs-1.02.137-6.fc26.s390x
yum-3.4.3-512.fc26.noarch
device-mapper-multipath-0.4.9-88.fc26.s390x
net-snmp-5.7.3-17.fc26.s390x
libXtst-1.2.3-2.fc26.s390x
libXxf86vm-1.1.4-4.fc26.s390x
texlive-amsmath-svn41561-33.fc26.2.noarch
texlive-xkeyval-svn35741.2.7a-33.fc26.2.noarch
texlive-bibtex-svn40768-33.fc26.2.noarch
texlive-mfware-svn40768-33.fc26.2.noarch
texlive-wasy-svn35831.0-33.fc26.2.noarch
texlive-bookman-svn31835.0-33.fc26.2.noarch
texlive-babel-english-svn30264.3.3p-33.fc26.2.noarch
texlive-fix2col-svn38770-33.fc26.2.noarch
texlive-mdwtools-svn15878.1.05.4-33.fc26.2.noarch
texlive-tex-gyre-math-svn41264-33.fc26.2.noarch
texlive-luaotfload-svn40902-33.fc26.2.noarch
texlive-showexpl-svn32737.v0.3l-33.fc26.2.noarch
texlive-pstricks-add-svn40744-33.fc26.2.noarch
texlive-l3experimental-svn41163-33.fc26.2.noarch
texlive-xetex-bin-svn41091-33.20160520.fc26.2.s390x
kbd-misc-2.0.4-2.fc26.noarch
libpng-devel-1.6.28-2.fc26.s390x
ghostscript-core-9.20-10.fc26.s390x
libXfixes-devel-5.0.3-2.fc26.s390x
libverto-devel-0.2.6-7.fc26.s390x
mesa-libEGL-devel-17.2.4-2.fc26.s390x
popt-devel-1.16-12.fc26.s390x
readline-devel-7.0-5.fc26.s390x
cyrus-sasl-devel-2.1.26-32.fc26.s390x
sendmail-8.15.2-19.fc26.s390x
systemd-bootchart-231-3.fc26.s390x
perl-IO-Socket-SSL-2.049-1.fc26.noarch
python2-enchant-1.6.10-1.fc26.noarch
perl-generators-1.10-2.fc26.noarch
createrepo-0.10.3-11.fc26.noarch
webkitgtk4-jsc-2.18.3-1.fc26.s390x
vim-common-8.0.1360-1.fc26.s390x
nss-tools-3.34.0-1.0.fc26.s390x
glusterfs-api-3.10.8-1.fc26.s390x
pulseaudio-libs-glib2-11.1-7.fc26.s390x
mariadb-common-10.1.29-1.fc26.s390x
dhcp-libs-4.3.5-10.fc26.s390x
pcre2-devel-10.23-11.fc26.s390x
libtiff-4.0.9-1.fc26.s390x
kernel-headers-4.14.8-200.fc26.s390x
fontpackages-filesystem-1.44-18.fc26.noarch
vte-profile-0.48.4-1.fc26.s390x
texlive-kpathsea-doc-svn41139-33.fc26.2.noarch
zlib-1.2.11-2.fc26.s390x
readline-7.0-5.fc26.s390x
libattr-2.4.47-18.fc26.s390x
libgomp-7.2.1-2.fc26.s390x
libglvnd-1.0.0-1.fc26.s390x
lz4-libs-1.8.0-1.fc26.s390x
libcrypt-nss-2.25-12.fc26.s390x
jansson-2.10-2.fc26.s390x
perl-File-Path-2.12-367.fc26.noarch
perl-Unicode-EastAsianWidth-1.33-9.fc26.noarch
hunspell-1.5.4-2.fc26.s390x
libasyncns-0.8-11.fc26.s390x
libnetfilter_conntrack-1.0.6-2.fc26.s390x
perl-Storable-2.56-368.fc26.s390x
autoconf-2.69-24.fc26.noarch
device-mapper-persistent-data-0.6.3-5.fc26.s390x
quota-4.03-9.fc26.s390x
crypto-policies-20170606-1.git7c32281.fc26.noarch
glib2-2.52.3-2.fc26.s390x
python2-idna-2.5-1.fc26.noarch
python2-libcomps-0.1.8-3.fc26.s390x
gsettings-desktop-schemas-3.24.1-1.fc26.s390x
javapackages-tools-4.7.0-17.fc26.noarch
libselinux-python3-2.6-7.fc26.s390x
python-backports-1.0-9.fc26.s390x
python2-cryptography-2.0.2-2.fc26.s390x
libselinux-python-2.6-7.fc26.s390x
Lmod-7.5.3-1.fc26.s390x
fipscheck-lib-1.5.0-1.fc26.s390x
elfutils-libs-0.169-1.fc26.s390x
krb5-libs-1.15.2-4.fc26.s390x
libuser-0.62-6.fc26.s390x
python2-requests-kerberos-0.10.0-4.fc26.noarch
npth-1.5-1.fc26.s390x
packagedb-cli-2.14.1-2.fc26.noarch
ustr-1.0.4-22.fc26.s390x
device-mapper-1.02.137-6.fc26.s390x
polkit-pkla-compat-0.1-8.fc26.s390x
fakeroot-1.22-1.fc26.s390x
libXmu-1.1.2-5.fc26.s390x
cairo-gobject-1.14.10-1.fc26.s390x
texlive-booktabs-svn40846-33.fc26.2.noarch
texlive-dvips-bin-svn40987-33.20160520.fc26.2.s390x
texlive-float-svn15878.1.3d-33.fc26.2.noarch
texlive-tex-svn40793-33.fc26.2.noarch
texlive-fancyref-svn15878.0.9c-33.fc26.2.noarch
texlive-manfnt-font-svn35799.0-33.fc26.2.noarch
texlive-cmap-svn41168-33.fc26.2.noarch
texlive-hyph-utf8-svn41189-33.fc26.2.noarch
texlive-paralist-svn39247-33.fc26.2.noarch
texlive-trimspaces-svn15878.1.1-33.fc26.2.noarch
texlive-tipa-svn29349.1.3-33.fc26.2.noarch
texlive-l3packages-svn41246-33.fc26.2.noarch
texlive-pst-pdf-svn31660.1.1v-33.fc26.2.noarch
texlive-tex-gyre-svn18651.2.004-33.fc26.2.noarch
texlive-beamer-svn36461.3.36-33.fc26.2.noarch
gd-2.2.5-1.fc26.s390x
elfutils-libelf-devel-0.169-1.fc26.s390x
gc-devel-7.6.0-2.fc26.s390x
libXft-devel-2.3.2-5.fc26.s390x
krb5-devel-1.15.2-4.fc26.s390x
rpm-devel-4.13.0.2-1.fc26.s390x
pcre-static-8.41-3.fc26.s390x
bluez-libs-devel-5.46-6.fc26.s390x
systemtap-3.2-2.fc26.s390x
trousers-0.3.13-7.fc26.s390x
iproute-tc-4.11.0-1.fc26.s390x
python2-sphinx-1.5.5-1.fc26.noarch
libgnome-keyring-3.12.0-8.fc26.s390x
perl-File-ShareDir-1.102-8.fc26.noarch
python2-paramiko-2.2.1-1.fc26.noarch
python2-openidc-client-0.4.0-1.20171113git54dee6e.fc26.noarch
openssh-server-7.5p1-4.fc26.s390x
pulseaudio-libs-11.1-7.fc26.s390x
python2-bodhi-2.12.2-3.fc26.noarch
lua-libs-5.3.4-7.fc26.s390x
dhcp-common-4.3.5-10.fc26.noarch
python3-pip-9.0.1-11.fc26.noarch
python3-sssdconfig-1.16.0-4.fc26.noarch
gpg-pubkey-95a43f54-5284415a
gpg-pubkey-fdb19c98-56fd6333
gpg-pubkey-64dab85d-57d33e22
tzdata-2017c-1.fc26.noarch
firewalld-filesystem-0.4.4.5-1.fc26.noarch
xkeyboard-config-2.21-3.fc26.noarch
texlive-texlive-common-doc-svn40682-33.fc26.2.noarch
ncurses-base-6.0-8.20170212.fc26.noarch
libselinux-2.6-7.fc26.s390x
bzip2-libs-1.0.6-22.fc26.s390x
libdb-5.3.28-24.fc26.s390x
mpfr-3.1.5-3.fc26.s390x
file-libs-5.30-11.fc26.s390x
libunistring-0.9.7-1.fc26.s390x
libxslt-1.1.29-1.fc26.s390x
libtasn1-4.12-1.fc26.s390x
gdbm-1.13-1.fc26.s390x
libepoxy-1.4.3-1.fc26.s390x
libpsl-0.18.0-1.fc26.s390x
perl-Carp-1.40-366.fc26.noarch
e2fsprogs-libs-1.43.4-2.fc26.s390x
libmnl-1.0.4-2.fc26.s390x
openjpeg2-2.2.0-3.fc26.s390x
perl-PathTools-3.63-367.fc26.s390x
perl-File-Temp-0.230.400-2.fc26.noarch
perl-XML-Parser-2.44-6.fc26.s390x
libss-1.43.4-2.fc26.s390x
ilmbase-2.2.0-8.fc26.s390x
fuse-libs-2.9.7-2.fc26.s390x
libdaemon-0.14-11.fc26.s390x
libbasicobjects-0.1.1-34.fc26.s390x
iptables-1.6.1-2.fc26.s390x
perl-TermReadKey-2.37-2.fc26.s390x
perl-Term-ANSIColor-4.06-2.fc26.noarch
perl-libintl-perl-1.26-2.fc26.s390x
usbredir-0.7.1-3.fc26.s390x
fftw-libs-double-3.3.5-4.fc26.s390x
rsync-3.1.2-5.fc26.s390x
libiscsi-1.15.0-3.fc26.s390x
ttmkfdir-3.0.9-49.fc26.s390x
texlive-base-2016-33.20160520.fc26.1.noarch
python2-six-1.10.0-9.fc26.noarch
atk-2.24.0-1.fc26.s390x
python2-kitchen-1.2.4-6.fc26.noarch
guile-2.0.14-1.fc26.s390x
desktop-file-utils-0.23-3.fc26.s390x
pyxattr-0.5.3-10.fc26.s390x
shared-mime-info-1.8-2.fc26.s390x
libyaml-0.1.7-2.fc26.s390x
python3-PyYAML-3.12-3.fc26.s390x
openssh-7.5p1-4.fc26.s390x
kernel-core-4.13.16-202.fc26.s390x
perl-Git-2.13.6-2.fc26.noarch
python3-dnf-plugins-extras-common-2.0.4-1.fc26.noarch
openssl-1.1.0g-1.fc26.s390x
gawk-4.1.4-6.fc26.s390x
gnutls-3.5.16-4.fc26.s390x
openldap-2.4.45-2.fc26.s390x
bind-license-9.11.1-4.P3.fc26.noarch
python2-gluster-3.10.8-1.fc26.s390x
selinux-policy-3.13.1-260.17.fc26.noarch
linux-firmware-20171215-81.git2451bb22.fc26.noarch
libpkgconf-1.3.12-1.fc26.s390x
NetworkManager-libnm-1.8.2-4.fc26.s390x
gnutls-devel-3.5.16-4.fc26.s390x
mariadb-libs-10.1.29-1.fc26.s390x
python2-urllib3-1.20-2.fc26.noarch
sssd-nfs-idmap-1.16.0-4.fc26.s390x
libsss_sudo-1.16.0-4.fc26.s390x
libgudev-232-1.fc26.s390x
python3-libs-3.6.3-2.fc26.s390x
python3-javapackages-4.7.0-17.fc26.noarch
python3-ply-3.9-3.fc26.noarch
python3-systemd-234-1.fc26.s390x
python3-requests-2.13.0-1.fc26.noarch
blktrace-1.1.0-4.fc26.s390x
python2-asn1crypto-0.23.0-1.fc26.noarch
python2-cffi-1.9.1-2.fc26.s390x
python2-sphinx_rtd_theme-0.2.4-1.fc26.noarch
lua-json-1.3.2-7.fc26.noarch
libcephfs1-10.2.7-2.fc26.s390x
glib-networking-2.50.0-2.fc26.s390x
elfutils-default-yama-scope-0.169-1.fc26.noarch
GeoIP-GeoLite-data-2017.10-1.fc26.noarch
libedit-3.1-17.20160618cvs.fc26.s390x
libverto-libev-0.2.6-7.fc26.s390x
libserf-1.3.9-3.fc26.s390x
createrepo_c-0.10.0-9.fc26.s390x
python2-kerberos-1.2.5-3.fc26.s390x
libsrtp-1.5.4-4.fc26.s390x
lzo-minilzo-2.08-9.fc26.s390x
librepo-1.8.0-1.fc26.s390x
koji-1.14.0-1.fc26.noarch
sg3_utils-1.42-1.fc26.s390x
libobjc-7.2.1-2.fc26.s390x
policycoreutils-2.6-6.fc26.s390x
libdrm-2.4.88-1.fc26.s390x
kernel-core-4.13.13-200.fc26.s390x
systemtap-client-3.2-2.fc26.s390x
lvm2-2.02.168-6.fc26.s390x
device-mapper-multipath-libs-0.4.9-88.fc26.s390x
libfdt-1.4.5-1.fc26.s390x
s390utils-cmsfs-1.36.1-3.fc26.s390x
libXdamage-1.1.4-9.fc26.s390x
libXaw-1.0.13-5.fc26.s390x
brltty-5.5-5.fc26.s390x
librsvg2-2.40.18-1.fc26.s390x
texlive-tetex-bin-svn36770.0-33.20160520.fc26.2.noarch
texlive-etex-pkg-svn39355-33.fc26.2.noarch
texlive-graphics-svn41015-33.fc26.2.noarch
texlive-dvips-svn41149-33.fc26.2.noarch
texlive-zapfding-svn31835.0-33.fc26.2.noarch
texlive-footmisc-svn23330.5.5b-33.fc26.2.noarch
texlive-makeindex-svn40768-33.fc26.2.noarch
texlive-pst-ovl-svn40873-33.fc26.2.noarch
texlive-texlive-scripts-svn41433-33.fc26.2.noarch
texlive-ltabptch-svn17533.1.74d-33.fc26.2.noarch
texlive-euro-svn22191.1.1-33.fc26.2.noarch
texlive-mflogo-font-svn36898.1.002-33.fc26.2.noarch
texlive-zapfchan-svn31835.0-33.fc26.2.noarch
texlive-cmextra-svn32831.0-33.fc26.2.noarch
texlive-finstrut-svn21719.0.5-33.fc26.2.noarch
texlive-hyphen-base-svn41138-33.fc26.2.noarch
texlive-marginnote-svn41382-33.fc26.2.noarch
texlive-parallel-svn15878.0-33.fc26.2.noarch
texlive-sepnum-svn20186.2.0-33.fc26.2.noarch
texlive-environ-svn33821.0.3-33.fc26.2.noarch
texlive-type1cm-svn21820.0-33.fc26.2.noarch
texlive-xunicode-svn30466.0.981-33.fc26.2.noarch
texlive-attachfile-svn38830-33.fc26.2.noarch
texlive-fontspec-svn41262-33.fc26.2.noarch
texlive-fancyvrb-svn18492.2.8-33.fc26.2.noarch
texlive-pst-pdf-bin-svn7838.0-33.20160520.fc26.2.noarch
texlive-xcolor-svn41044-33.fc26.2.noarch
texlive-pdfpages-svn40638-33.fc26.2.noarch
texlive-sansmathaccent-svn30187.0-33.fc26.2.noarch
texlive-ucs-svn35853.2.2-33.fc26.2.noarch
texlive-dvipdfmx-bin-svn40273-33.20160520.fc26.2.s390x
libotf-0.9.13-8.fc26.s390x
go-srpm-macros-2-8.fc26.noarch
pcre-devel-8.41-3.fc26.s390x
mesa-libwayland-egl-devel-17.2.4-2.fc26.s390x
ghostscript-9.20-10.fc26.s390x
libcephfs_jni-devel-10.2.7-2.fc26.s390x
libXdamage-devel-1.1.4-9.fc26.s390x
freetype-devel-2.7.1-9.fc26.s390x
ncurses-devel-6.0-8.20170212.fc26.s390x
fontconfig-devel-2.12.6-4.fc26.s390x
cairo-devel-1.14.10-1.fc26.s390x
libselinux-devel-2.6-7.fc26.s390x
guile-devel-2.0.14-1.fc26.s390x
libcap-ng-devel-0.7.8-3.fc26.s390x
bash-completion-2.6-1.fc26.noarch
libXevie-1.0.3-12.fc26.s390x
kernel-4.13.13-200.fc26.s390x
audit-2.8.1-1.fc26.s390x
gcc-objc-7.2.1-2.fc26.s390x
gcc-go-7.2.1-2.fc26.s390x
python-firewall-0.4.4.5-1.fc26.noarch
python3-html5lib-0.999-13.fc26.noarch
python2-simplejson-3.10.0-3.fc26.s390x
flex-2.6.1-3.fc26.s390x
telnet-0.17-69.fc26.s390x
gpg-pubkey-8e1431d5-53bcbac7
emacs-filesystem-25.3-3.fc26.noarch
fontawesome-fonts-4.7.0-2.fc26.noarch
fontawesome-fonts-web-4.7.0-2.fc26.noarch
tzdata-java-2017c-1.fc26.noarch
rpmconf-base-1.0.19-1.fc26.noarch
glibc-2.25-12.fc26.s390x
info-6.3-3.fc26.s390x
sqlite-libs-3.20.1-1.fc26.s390x
texlive-lib-2016-33.20160520.fc26.1.s390x
sed-4.4-1.fc26.s390x
libicu-57.1-7.fc26.s390x
libcap-ng-0.7.8-3.fc26.s390x
nettle-3.3-2.fc26.s390x
libidn2-2.0.4-1.fc26.s390x
lcms2-2.8-3.fc26.s390x
dbus-libs-1.11.18-1.fc26.s390x
perl-Exporter-5.72-367.fc26.noarch
unzip-6.0-34.fc26.s390x
iproute-4.11.0-1.fc26.s390x
zip-3.0-18.fc26.s390x
perl-constant-1.33-368.fc26.noarch
perl-MIME-Base64-3.15-366.fc26.s390x
lua-posix-33.3.1-4.fc26.s390x
bzip2-1.0.6-22.fc26.s390x
libstdc++-devel-7.2.1-2.fc26.s390x
hyphen-2.8.8-6.fc26.s390x
libdvdread-5.0.3-4.fc26.s390x
libcollection-0.7.0-34.fc26.s390x
libdvdnav-5.0.3-5.fc26.s390x
perl-version-0.99.18-1.fc26.s390x
perl-Encode-2.88-6.fc26.s390x
automake-1.15-9.fc26.noarch
plymouth-core-libs-0.9.3-0.7.20160620git0e65b86c.fc26.s390x
hesiod-3.2.1-7.fc26.s390x
jasper-libs-2.0.14-1.fc26.s390x
mozjs17-17.0.0-18.fc26.s390x
fontconfig-2.12.6-4.fc26.s390x
harfbuzz-1.4.4-1.fc26.s390x
alsa-lib-1.1.4.1-1.fc26.s390x
make-4.2.1-2.fc26.s390x
gobject-introspection-1.52.1-1.fc26.s390x
hicolor-icon-theme-0.15-5.fc26.noarch
gdk-pixbuf2-2.36.9-1.fc26.s390x
libgusb-0.2.11-1.fc26.s390x
libtalloc-2.1.10-2.fc26.s390x
libdhash-0.5.0-34.fc26.s390x
python2-bcrypt-3.1.4-2.fc26.s390x
PyYAML-3.12-3.fc26.s390x
nss-softokn-freebl-3.34.0-1.0.fc26.s390x
kernel-modules-4.13.16-202.fc26.s390x
git-2.13.6-2.fc26.s390x
gnupg2-smime-2.2.3-1.fc26.s390x
openssl-devel-1.1.0g-1.fc26.s390x
python2-dnf-plugins-extras-common-2.0.4-1.fc26.noarch
copy-jdk-configs-3.3-2.fc26.noarch
glusterfs-client-xlators-3.10.8-1.fc26.s390x
libcurl-7.53.1-13.fc26.s390x
bind-libs-lite-9.11.1-4.P3.fc26.s390x
glusterfs-extra-xlators-3.10.8-1.fc26.s390x
python3-setuptools-37.0.0-1.fc26.noarch
kernel-core-4.14.8-200.fc26.s390x
pkgconf-1.3.12-1.fc26.s390x
NetworkManager-1.8.2-4.fc26.s390x
libjpeg-turbo-devel-1.5.3-1.fc26.s390x
lua-5.3.4-7.fc26.s390x
boost-thread-1.63.0-10.fc26.s390x
wget-1.19.2-2.fc26.s390x
libwebp-0.6.1-1.fc26.s390x
kernel-devel-4.14.8-200.fc26.s390x
python3-lxml-4.1.1-1.fc26.s390x
python3-ordered-set-2.0.0-6.fc26.noarch
python3-rpmconf-1.0.19-1.fc26.noarch
python-offtrac-0.1.0-9.fc26.noarch
python2-pycparser-2.14-10.fc26.noarch
python2-sphinx-theme-alabaster-0.7.9-3.fc26.noarch
python2-pysocks-1.6.7-1.fc26.noarch
lua-lpeg-1.0.1-2.fc26.s390x
poppler-0.52.0-10.fc26.s390x
libproxy-0.4.15-2.fc26.s390x
crontabs-1.11-14.20150630git.fc26.noarch
java-1.8.0-openjdk-headless-1.8.0.151-1.b12.fc26.s390x
libev-4.24-2.fc26.s390x
libsigsegv-2.11-1.fc26.s390x
fedora-cert-0.6.0.1-2.fc26.noarch
drpm-0.3.0-6.fc26.s390x
createrepo_c-libs-0.10.0-9.fc26.s390x
python2-cccolutils-1.5-3.fc26.s390x
m17n-lib-1.7.0-6.fc26.s390x
lsscsi-0.28-4.fc26.s390x
python2-koji-1.14.0-1.fc26.noarch
python3-koji-1.14.0-1.fc26.noarch
python3-gpg-1.8.0-12.fc26.s390x
sg3_utils-libs-1.42-1.fc26.s390x
SDL2-2.0.7-2.fc26.s390x
util-linux-2.30.2-1.fc26.s390x
rpcbind-0.2.4-8.rc2.fc26.s390x
s390utils-mon_statd-1.36.1-3.fc26.s390x
GConf2-3.2.6-17.fc26.s390x
systemd-container-233-7.fc26.s390x
usermode-1.111-9.fc26.s390x
pcre-utf32-8.41-3.fc26.s390x
libXt-1.1.5-4.fc26.s390x
libXpm-3.5.12-2.fc26.s390x
at-spi2-core-2.24.1-1.fc26.s390x
cairo-1.14.10-1.fc26.s390x
texlive-kpathsea-bin-svn40473-33.20160520.fc26.2.s390x
texlive-ifluatex-svn41346-33.fc26.2.noarch
texlive-babel-svn40706-33.fc26.2.noarch
texlive-colortbl-svn29803.v1.0a-33.fc26.2.noarch
texlive-marvosym-svn29349.2.2a-33.fc26.2.noarch
texlive-euler-svn17261.2.5-33.fc26.2.noarch
texlive-latexconfig-svn40274-33.fc26.2.noarch
texlive-plain-svn40274-33.fc26.2.noarch
texlive-texconfig-bin-svn29741.0-33.20160520.fc26.2.noarch
giflib-4.1.6-16.fc26.s390x
texlive-microtype-svn41127-33.fc26.2.noarch
texlive-eurosym-svn17265.1.4_subrfix-33.fc26.2.noarch
texlive-symbol-svn31835.0-33.fc26.2.noarch
texlive-chngcntr-svn17157.1.0a-33.fc26.2.noarch
texlive-euenc-svn19795.0.1h-33.fc26.2.noarch
texlive-luatex-svn40963-33.fc26.2.noarch
texlive-knuth-local-svn38627-33.fc26.2.noarch
texlive-mparhack-svn15878.1.4-33.fc26.2.noarch
texlive-rcs-svn15878.0-33.fc26.2.noarch
texlive-texlive-msg-translations-svn41431-33.fc26.2.noarch
texlive-updmap-map-svn41159-33.fc26.2.noarch
texlive-geometry-svn19716.5.6-33.fc26.2.noarch
texlive-memoir-svn41203-33.fc26.2.noarch
texlive-l3kernel-svn41246-33.fc26.2.noarch
texlive-pst-eps-svn15878.1.0-33.fc26.2.noarch
texlive-pst-text-svn15878.1.00-33.fc26.2.noarch
texlive-amscls-svn36804.0-33.fc26.2.noarch
texlive-pst-slpe-svn24391.1.31-33.fc26.2.noarch
texlive-extsizes-svn17263.1.4a-33.fc26.2.noarch
texlive-xetex-def-svn40327-33.fc26.2.noarch
texlive-collection-latex-svn41011-33.20160520.fc26.2.noarch
gstreamer1-plugins-base-1.12.3-1.fc26.s390x
fpc-srpm-macros-1.1-2.fc26.noarch
xorg-x11-proto-devel-7.7-22.fc26.noarch
urw-fonts-2.4-23.fc26.noarch
atk-devel-2.24.0-1.fc26.s390x
ImageMagick-libs-6.9.9.22-1.fc26.s390x
libxcb-devel-1.12-3.fc26.s390x
libXrandr-devel-1.5.1-2.fc26.s390x
libcom_err-devel-1.43.4-2.fc26.s390x
dbus-devel-1.11.18-1.fc26.s390x
libepoxy-devel-1.4.3-1.fc26.s390x
libicu-devel-57.1-7.fc26.s390x
p11-kit-devel-0.23.9-2.fc26.s390x
rpm-build-4.13.0.2-1.fc26.s390x
libssh2-devel-1.8.0-5.fc26.s390x
graphviz-2.40.1-4.fc26.s390x
zlib-static-1.2.11-2.fc26.s390x
mesa-libgbm-devel-17.2.4-2.fc26.s390x
dracut-config-rescue-046-3.1.fc26.s390x
screen-4.6.2-1.fc26.s390x
python-osbs-client-0.39.1-1.fc26.noarch
gcc-gdb-plugin-7.2.1-2.fc26.s390x
pyparsing-2.1.10-3.fc26.noarch
python3-pyasn1-0.2.3-1.fc26.noarch
python2-html5lib-0.999-13.fc26.noarch
teamd-1.27-1.fc26.s390x
hardlink-1.3-1.fc26.s390x
chrpath-0.16-4.fc26.s390x
libgcc-7.2.1-2.fc26.s390x
python-rpm-macros-3-20.fc26.noarch
texlive-pdftex-doc-svn41149-33.fc26.2.noarch
glibc-common-2.25-12.fc26.s390x
libstdc++-7.2.1-2.fc26.s390x
nspr-4.17.0-1.fc26.s390x
grep-3.1-1.fc26.s390x
libgcrypt-1.7.9-1.fc26.s390x
libacl-2.2.52-15.fc26.s390x
cpio-2.12-4.fc26.s390x
libatomic_ops-7.4.4-2.fc26.s390x
p11-kit-0.23.9-2.fc26.s390x
gc-7.6.0-2.fc26.s390x
psmisc-22.21-9.fc26.s390x
systemd-libs-233-7.fc26.s390x
xz-5.2.3-2.fc26.s390x
perl-libs-5.24.3-395.fc26.s390x
kmod-libs-24-1.fc26.s390x
libpcap-1.8.1-3.fc26.s390x
perl-macros-5.24.3-395.fc26.s390x
perl-parent-0.236-2.fc26.noarch
perl-Text-Unidecode-1.30-2.fc26.noarch
newt-0.52.20-1.fc26.s390x
libcomps-0.1.8-3.fc26.s390x
libfontenc-1.1.3-4.fc26.s390x
ipcalc-0.2.0-1.fc26.s390x
libnfnetlink-1.0.1-9.fc26.s390x
libref_array-0.1.5-34.fc26.s390x
perl-Term-Cap-1.17-366.fc26.noarch
perl-Digest-1.17-367.fc26.noarch
perl-SelfLoader-1.23-395.fc26.noarch
perl-Pod-Simple-3.35-2.fc26.noarch
perl-URI-1.71-6.fc26.noarch
cpp-7.2.1-2.fc26.s390x
attr-2.4.47-18.fc26.s390x
gmp-c++-6.1.2-4.fc26.s390x
xapian-core-libs-1.4.4-1.fc26.s390x
system-python-3.6.3-2.fc26.s390x
harfbuzz-icu-1.4.4-1.fc26.s390x
libtevent-0.9.34-1.fc26.s390x
http-parser-2.7.1-5.fc26.s390x
libsodium-1.0.14-1.fc26.s390x
python-gssapi-1.2.0-5.fc26.s390x
nss-softokn-3.34.0-1.0.fc26.s390x
gnupg2-2.2.3-1.fc26.s390x
nss-devel-3.34.0-1.0.fc26.s390x
vim-minimal-8.0.1360-1.fc26.s390x
perl-libnet-3.11-1.fc26.noarch
kernel-devel-4.13.16-202.fc26.s390x
python2-libs-2.7.14-4.fc26.s390x
libwayland-client-1.13.0-3.fc26.s390x
python3-dnf-2.7.5-2.fc26.noarch
glusterfs-fuse-3.10.8-1.fc26.s390x
pcre2-utf32-10.23-11.fc26.s390x
kernel-modules-4.14.8-200.fc26.s390x
pkgconf-pkg-config-1.3.12-1.fc26.s390x
NetworkManager-ppp-1.8.2-4.fc26.s390x
wayland-devel-1.13.0-3.fc26.s390x
kernel-4.14.8-200.fc26.s390x
boost-random-1.63.0-10.fc26.s390x
libmicrohttpd-0.9.58-1.fc26.s390x
mailx-12.5-24.fc26.s390x
NetworkManager-glib-1.8.2-4.fc26.s390x
libcroco-0.6.12-1.fc26.s390x
libssh2-1.8.0-5.fc26.s390x
json-glib-1.2.6-1.fc26.s390x
libevent-2.0.22-3.fc26.s390x
gdk-pixbuf2-modules-2.36.9-1.fc26.s390x
colord-libs-1.3.5-1.fc26.s390x
python3-magic-5.30-11.fc26.noarch
python3-gobject-base-3.24.1-1.fc26.s390x
python3-pyroute2-0.4.13-1.fc26.noarch
python3-pysocks-1.6.7-1.fc26.noarch
python2-click-6.7-3.fc26.noarch
python-munch-2.1.0-2.fc26.noarch
python2-ply-3.9-3.fc26.noarch
python2-snowballstemmer-1.2.1-3.fc26.noarch
python-magic-5.30-11.fc26.noarch
python-beautifulsoup4-4.6.0-1.fc26.noarch
python2-gitdb-2.0.3-1.fc26.noarch
librados-devel-10.2.7-2.fc26.s390x
libcacard-2.5.3-1.fc26.s390x
libmodman-2.0.1-13.fc26.s390x
zziplib-0.13.62-8.fc26.s390x
lksctp-tools-1.0.16-6.fc26.s390x
procmail-3.22-44.fc26.s390x
libthai-0.1.25-2.fc26.s390x
libpipeline-1.4.1-3.fc26.s390x
python2-pycurl-7.43.0-8.fc26.s390x
deltarpm-3.6-19.fc26.s390x
subversion-libs-1.9.7-1.fc26.s390x
python-krbV-1.0.90-13.fc26.s390x
m17n-db-1.7.0-8.fc26.noarch
linux-atm-libs-2.5.1-17.fc26.s390x
python2-rpm-4.13.0.2-1.fc26.s390x
python2-librepo-1.8.0-1.fc26.s390x
python2-dnf-plugins-core-2.1.5-1.fc26.noarch
qrencode-libs-3.4.4-1.fc26.s390x
s390utils-iucvterm-1.36.1-3.fc26.s390x
libsmartcols-2.30.2-1.fc26.s390x
dbus-1.11.18-1.fc26.s390x
systemd-udev-233-7.fc26.s390x
device-mapper-event-1.02.137-6.fc26.s390x
polkit-0.113-8.fc26.s390x
mock-1.4.7-2.fc26.noarch
libwmf-lite-0.2.8.4-53.fc26.s390x
libXcomposite-0.4.4-9.fc26.s390x
libXcursor-1.1.14-8.fc26.s390x
at-spi2-atk-2.24.1-1.fc26.s390x
pango-1.40.12-1.fc26.s390x
texlive-metafont-bin-svn40987-33.20160520.fc26.2.s390x
texlive-url-svn32528.3.4-33.fc26.2.noarch
texlive-fp-svn15878.0-33.fc26.2.noarch
texlive-latex-fonts-svn28888.0-33.fc26.2.noarch
texlive-mptopdf-bin-svn18674.0-33.20160520.fc26.2.noarch
texlive-fancybox-svn18304.1.4-33.fc26.2.noarch
texlive-lua-alt-getopt-svn29349.0.7.0-33.fc26.2.noarch
texlive-tex-bin-svn40987-33.20160520.fc26.2.s390x
texlive-texconfig-svn40768-33.fc26.2.noarch
texlive-wasy2-ps-svn35830.0-33.fc26.2.noarch
texlive-psfrag-svn15878.3.04-33.fc26.2.noarch
texlive-helvetic-svn31835.0-33.fc26.2.noarch
texlive-times-svn35058.0-33.fc26.2.noarch
texlive-cite-svn36428.5.5-33.fc26.2.noarch
texlive-fancyhdr-svn15878.3.1-33.fc26.2.noarch
texlive-luatex-bin-svn41091-33.20160520.fc26.2.s390x
texlive-lm-math-svn36915.1.959-33.fc26.2.noarch
texlive-ntgclass-svn15878.2.1a-33.fc26.2.noarch
texlive-sansmath-svn17997.1.1-33.fc26.2.noarch
texlive-textcase-svn15878.0-33.fc26.2.noarch
texlive-unicode-data-svn39808-33.fc26.2.noarch
texlive-breakurl-svn29901.1.40-33.fc26.2.noarch
texlive-latex-svn40218-33.fc26.2.noarch
texlive-lualatex-math-svn40621-33.fc26.2.noarch
texlive-pst-coil-svn37377.1.07-33.fc26.2.noarch
texlive-pst-plot-svn41242-33.fc26.2.noarch
texlive-unicode-math-svn38462-33.fc26.2.noarch
texlive-pst-blur-svn15878.2.0-33.fc26.2.noarch
texlive-cm-super-svn15878.0-33.fc26.2.noarch
texlive-wasysym-svn15878.2.0-33.fc26.2.noarch
texlive-collection-fontsrecommended-svn35830.0-33.20160520.fc26.2.noarch
libXv-1.0.11-2.fc26.s390x
ghc-srpm-macros-1.4.2-5.fc26.noarch
latex2html-2017.2-2.fc26.noarch
libXau-devel-1.0.8-7.fc26.s390x
libXcursor-devel-1.1.14-8.fc26.s390x
graphite2-devel-1.3.10-1.fc26.s390x
pixman-devel-0.34.0-3.fc26.s390x
wayland-protocols-devel-1.9-1.fc26.noarch
mesa-libGLES-devel-17.2.4-2.fc26.s390x
redhat-rpm-config-63-1.fc26.noarch
vte291-devel-0.48.4-1.fc26.s390x
ceph-devel-compat-10.2.7-2.fc26.s390x
lzo-devel-2.08-9.fc26.s390x
libiscsi-devel-1.15.0-3.fc26.s390x
libfdt-devel-1.4.5-1.fc26.s390x
dnsmasq-2.76-5.fc26.s390x
avahi-autoipd-0.6.32-7.fc26.s390x
rpm-plugin-systemd-inhibit-4.13.0.2-1.fc26.s390x
gcc-c++-7.2.1-2.fc26.s390x
python2-ndg_httpsclient-0.4.0-7.fc26.noarch
gettext-0.19.8.1-9.fc26.s390x
btrfs-progs-4.9.1-2.fc26.s390x
fedora-logos-26.0.1-1.fc26.s390x
dejagnu-1.6-2.fc26.noarch
libaio-devel-0.3.110-7.fc26.s390x
dos2unix-7.3.4-2.fc26.s390x
distribution-gpg-keys-1.15-1.fc26.noarch
python-sphinx-locale-1.5.5-1.fc26.noarch
python2-rpm-macros-3-20.fc26.noarch
libxml2-2.9.4-2.fc26.s390x
popt-1.16-12.fc26.s390x
tar-1.29-5.fc26.s390x
avahi-libs-0.6.32-7.fc26.s390x
m4-1.4.18-3.fc26.s390x
perl-Socket-2.024-2.fc26.s390x
perl-Time-Local-1.250-2.fc26.noarch
libmetalink-0.1.3-2.fc26.s390x
jbigkit-libs-2.1-6.fc26.s390x
netpbm-10.80.00-2.fc26.s390x
perl-Digest-MD5-2.55-3.fc26.s390x
perl-Getopt-Long-2.49.1-2.fc26.noarch
libglvnd-opengl-1.0.0-1.fc26.s390x
libattr-devel-2.4.47-18.fc26.s390x
teckit-2.5.1-16.fc26.s390x
python3-six-1.10.0-9.fc26.noarch
python3-libcomps-0.1.8-3.fc26.s390x
gtk-update-icon-cache-3.22.21-2.fc26.s390x
python3-3.6.3-2.fc26.s390x
python3-pyparsing-2.1.10-3.fc26.noarch
python2-markupsafe-0.23-13.fc26.s390x
python2-mock-2.0.0-4.fc26.noarch
python2-yubico-1.3.2-7.fc26.noarch
python2-smmap-2.0.3-1.fc26.noarch
librbd-devel-10.2.7-2.fc26.s390x
pigz-2.3.4-2.fc26.s390x
gcc-7.2.1-2.fc26.s390x
libnghttp2-1.21.1-1.fc26.s390x
cups-libs-2.2.2-7.fc26.s390x
libnfsidmap-0.27-1.fc26.s390x
ykpers-1.18.0-2.fc26.s390x
python3-librepo-1.8.0-1.fc26.s390x
systemtap-runtime-3.2-2.fc26.s390x
geoclue2-2.4.5-4.fc26.s390x
initscripts-9.72-1.fc26.s390x
plymouth-0.9.3-0.7.20160620git0e65b86c.fc26.s390x
ebtables-2.0.10-22.fc26.s390x
gssproxy-0.7.0-9.fc26.s390x
libXext-1.3.3-5.fc26.s390x
mesa-libEGL-17.2.4-2.fc26.s390x
texlive-texlive.infra-bin-svn40312-33.20160520.fc26.2.s390x
texlive-thumbpdf-svn34621.3.16-33.fc26.2.noarch
texlive-carlisle-svn18258.0-33.fc26.2.noarch
texlive-gsftopk-svn40768-33.fc26.2.noarch
texlive-pdftex-svn41149-33.fc26.2.noarch
texlive-crop-svn15878.1.5-33.fc26.2.noarch
texlive-pxfonts-svn15878.0-33.fc26.2.noarch
texlive-enctex-svn34957.0-33.fc26.2.noarch
texlive-kastrup-svn15878.0-33.fc26.2.noarch
texlive-pspicture-svn15878.0-33.fc26.2.noarch
texlive-varwidth-svn24104.0.92-33.fc26.2.noarch
texlive-currfile-svn40725-33.fc26.2.noarch
texlive-pst-grad-svn15878.1.06-33.fc26.2.noarch
texlive-latex-bin-svn41438-33.fc26.2.noarch
texlive-ltxmisc-svn21927.0-33.fc26.2.noarch
lasi-1.1.2-7.fc26.s390x
adwaita-icon-theme-3.24.0-2.fc26.noarch
xz-devel-5.2.3-2.fc26.s390x
xorg-x11-fonts-Type1-7.5-17.fc26.noarch
libXi-devel-1.7.9-2.fc26.s390x
at-spi2-atk-devel-2.24.1-1.fc26.s390x
pango-devel-1.40.12-1.fc26.s390x
libcacard-devel-2.5.3-1.fc26.s390x
libseccomp-devel-2.3.2-1.fc26.s390x
subversion-1.9.7-1.fc26.s390x
sudo-1.8.21p2-1.fc26.s390x
pykickstart-2.35-2.fc26.noarch
e2fsprogs-1.43.4-2.fc26.s390x
libstdc++-static-7.2.1-2.fc26.s390x
libbsd-0.8.3-3.fc26.s390x
c-ares-1.13.0-1.fc26.s390x
python2-pyxdg-0.25-12.fc26.noarch
nss-softokn-freebl-devel-3.34.0-1.0.fc26.s390x
python2-rpkg-1.51-2.fc26.noarch
strace-4.20-1.fc26.s390x
valgrind-3.13.0-12.fc26.s390x
libsss_idmap-1.16.0-4.fc26.s390x
gnutls-c++-3.5.16-4.fc26.s390x
libwayland-server-1.13.0-3.fc26.s390x
dhcp-client-4.3.5-10.fc26.s390x
bind-libs-9.11.1-4.P3.fc26.s390x
man-pages-4.09-4.fc26.noarch
gpg-pubkey-a29cb19c-53bcbba6
quota-nls-4.03-9.fc26.noarch
qt5-srpm-macros-5.8.0-2.fc26.noarch
xz-libs-5.2.3-2.fc26.s390x
gmp-6.1.2-4.fc26.s390x
audit-libs-2.8.1-1.fc26.s390x
file-5.30-11.fc26.s390x
libusbx-1.0.21-2.fc26.s390x
binutils-2.27-28.fc26.s390x
perl-Errno-1.25-395.fc26.s390x
perl-HTTP-Tiny-0.070-2.fc26.noarch
xml-common-0.6.3-45.fc26.noarch
opus-1.2.1-1.fc26.s390x
kernel-devel-4.13.13-200.fc26.s390x
perl-podlators-4.09-2.fc26.noarch
flac-libs-1.3.2-2.fc26.s390x
libacl-devel-2.2.52-15.fc26.s390x
coreutils-common-8.27-7.fc26.s390x
cracklib-2.9.6-5.fc26.s390x
pyliblzma-0.5.3-17.fc26.s390x
libnotify-0.7.7-2.fc26.s390x
python3-idna-2.5-1.fc26.noarch
python3-pyOpenSSL-16.2.0-6.fc26.noarch
python2-pbr-1.10.0-4.fc26.noarch
pyusb-1.0.0-4.fc26.noarch
python2-fedora-0.9.0-6.fc26.noarch
librbd1-10.2.7-2.fc26.s390x
pcre-cpp-8.41-3.fc26.s390x
glibc-devel-2.25-12.fc26.s390x
libnfs-1.9.8-3.fc26.s390x
libsolv-0.6.30-2.fc26.s390x
python3-pycurl-7.43.0-8.fc26.s390x
libyubikey-1.13-3.fc26.s390x
rpmlint-1.10-5.fc26.noarch
python2-pygpgme-0.3-22.fc26.s390x
s390utils-base-1.36.1-3.fc26.s390x
ppp-2.4.7-11.fc26.s390x
s390utils-cpuplugd-1.36.1-3.fc26.s390x
nfs-utils-2.1.1-6.rc6.fc26.s390x
libXrender-0.9.10-2.fc26.s390x
libglvnd-gles-1.0.0-1.fc26.s390x
texlive-texlive.infra-svn41280-33.fc26.2.noarch
texlive-lm-svn28119.2.004-33.fc26.2.noarch
texlive-babelbib-svn25245.1.31-33.fc26.2.noarch
texlive-index-svn24099.4.1beta-33.fc26.2.noarch
texlive-pdftex-bin-svn40987-33.20160520.fc26.2.s390x
texlive-csquotes-svn39538-33.fc26.2.noarch
texlive-rsfs-svn15878.0-33.fc26.2.noarch
texlive-etex-svn37057.0-33.fc26.2.noarch
texlive-knuth-lib-svn35820.0-33.fc26.2.noarch
texlive-pst-math-svn34786.0.63-33.fc26.2.noarch
texlive-utopia-svn15878.0-33.fc26.2.noarch
texlive-eso-pic-svn37925.2.0g-33.fc26.2.noarch
texlive-pst-fill-svn15878.1.01-33.fc26.2.noarch
texlive-latex-bin-bin-svn14050.0-33.20160520.fc26.2.noarch
texlive-jknapltx-svn19440.0-33.fc26.2.noarch
texlive-collection-latexrecommended-svn35765.0-33.20160520.fc26.2.noarch
adwaita-cursor-theme-3.24.0-2.fc26.noarch
xorg-x11-fonts-ISO8859-1-100dpi-7.5-17.fc26.noarch
libXcomposite-devel-0.4.4-9.fc26.s390x
at-spi2-core-devel-2.24.1-1.fc26.s390x
harfbuzz-devel-1.4.4-1.fc26.s390x
rpmdevtools-8.10-2.fc26.noarch
texi2html-5.0-5.fc26.noarch
libnfs-devel-1.9.8-3.fc26.s390x
firewalld-0.4.4.5-1.fc26.noarch
wpa_supplicant-2.6-12.fc26.s390x
systemtap-sdt-devel-3.2-2.fc26.s390x
newt-python-0.52.20-1.fc26.s390x
perl-Mozilla-CA-20160104-4.fc26.noarch
pth-2.0.7-28.fc26.s390x
python3-pyxdg-0.25-12.fc26.noarch
nss-softokn-devel-3.34.0-1.0.fc26.s390x
fedpkg-1.30-4.fc26.noarch
timedatex-0.4-3.fc26.s390x
libjpeg-turbo-1.5.3-1.fc26.s390x
glusterfs-cli-3.10.8-1.fc26.s390x
libsss_nss_idmap-1.16.0-4.fc26.s390x
gdb-8.0.1-33.fc26.s390x
dnf-yum-2.7.5-2.fc26.noarch
perl-Data-Dumper-2.161-3.fc26.s390x
python-async-0.6.1-9.fc22.s390x
poppler-data-0.4.7-7.fc26.noarch
ocaml-srpm-macros-4-2.fc26.noarch
libuuid-2.30.2-1.fc26.s390x
libgpg-error-1.25-2.fc26.s390x
libassuan-2.4.3-2.fc26.s390x
graphite2-1.3.10-1.fc26.s390x
perl-Text-Tabs+Wrap-2013.0523-366.fc26.noarch
perl-Error-0.17024-8.fc26.noarch
which-2.21-2.fc26.s390x
libXau-1.0.8-7.fc26.s390x
orc-0.4.27-1.fc26.s390x
perl-Pod-Perldoc-3.28-1.fc26.noarch
libsndfile-1.0.28-6.fc26.s390x
patch-2.7.5-4.fc26.s390x
gzip-1.8-2.fc26.s390x
python-ipaddress-1.0.16-4.fc26.noarch
yum-metadata-parser-1.1.4-18.fc26.s390x
python3-dbus-1.2.4-6.fc26.s390x
python3-cryptography-2.0.2-2.fc26.s390x
python3-kickstart-2.35-2.fc26.noarch
python2-imagesize-0.7.1-5.fc26.noarch
python2-jinja2-2.9.6-1.fc26.noarch
libradosstriper-devel-10.2.7-2.fc26.s390x
soundtouch-1.9.2-4.fc26.s390x
glibc-headers-2.25-12.fc26.s390x
libndp-1.6-2.fc26.s390x
rpm-4.13.0.2-1.fc26.s390x
rest-0.8.0-2.fc26.s390x
libvisual-0.4.0-21.fc26.s390x
python2-hawkey-0.11.1-1.fc26.s390x
dnf-plugins-core-2.1.5-1.fc26.noarch
fakeroot-libs-1.22-1.fc26.s390x
device-mapper-event-libs-1.02.137-6.fc26.s390x
cyrus-sasl-2.1.26-32.fc26.s390x
kernel-modules-4.13.13-200.fc26.s390x
cronie-anacron-1.5.1-5.fc26.s390x
libpath_utils-0.2.1-34.fc26.s390x
libX11-common-1.6.5-2.fc26.noarch
libXft-2.3.2-5.fc26.s390x
gtk2-2.24.31-4.fc26.s390x
texlive-etoolbox-svn38031.2.2a-33.fc26.2.noarch
texlive-multido-svn18302.1.42-33.fc26.2.noarch
texlive-glyphlist-svn28576.0-33.fc26.2.noarch
texlive-setspace-svn24881.6.7a-33.fc26.2.noarch
texlive-mathtools-svn38833-33.fc26.2.noarch
texlive-ncntrsbk-svn31835.0-33.fc26.2.noarch
texlive-dvisvgm-def-svn41011-33.fc26.2.noarch
texlive-ifetex-svn24853.1.2-33.fc26.2.noarch
texlive-parskip-svn19963.2.0-33.fc26.2.noarch
texlive-bera-svn20031.0-33.fc26.2.noarch
texlive-pgf-svn40966-33.fc26.2.noarch
texlive-auto-pst-pdf-svn23723.0.6-33.fc26.2.noarch
texlive-ctable-svn38672-33.fc26.2.noarch
texlive-typehtml-svn17134.0-33.fc26.2.noarch
mesa-libGLES-17.2.4-2.fc26.s390x
vte291-0.48.4-1.fc26.s390x
libdrm-devel-2.4.88-1.fc26.s390x
libcephfs_jni1-10.2.7-2.fc26.s390x
bzip2-devel-1.0.6-22.fc26.s390x
expat-devel-2.2.4-1.fc26.s390x
libsepol-devel-2.6-2.fc26.s390x
glib2-static-2.52.3-2.fc26.s390x
virglrenderer-devel-0.6.0-1.20170210git76b3da97b.fc26.s390x
yum-utils-1.1.31-512.fc26.noarch
parted-3.2-24.fc26.s390x
python3-beautifulsoup4-4.6.0-1.fc26.noarch
python-bunch-1.0.1-10.fc26.noarch
perl-Time-HiRes-1.9746-1.fc26.s390x
lz4-1.8.0-1.fc26.s390x
nss-util-3.34.0-1.0.fc26.s390x
openssh-clients-7.5p1-4.fc26.s390x
chrony-3.2-1.fc26.s390x
dnf-conf-2.7.5-2.fc26.noarch
glusterfs-server-3.10.8-1.fc26.s390x
sssd-client-1.16.0-4.fc26.s390x
man-db-2.7.6.1-8.fc26.s390x
bodhi-client-2.12.2-3.fc26.noarch
perl-Module-CoreList-5.20171120-1.fc26.noarch
hawkey-0.6.4-3.fc25.s390x
python-srpm-macros-3-20.fc26.noarch
perl-srpm-macros-1-21.fc26.noarch
expat-2.2.4-1.fc26.s390x
chkconfig-1.10-1.fc26.s390x
findutils-4.6.0-12.fc26.s390x
mesa-libwayland-egl-17.2.4-2.fc26.s390x
procps-ng-3.3.10-13.fc26.s390x
mesa-libglapi-17.2.4-2.fc26.s390x
perl-Unicode-Normalize-1.25-366.fc26.s390x
perl-IO-Socket-IP-0.39-1.fc26.noarch
hunspell-en-US-0.20140811.1-6.fc26.noarch
libxcb-1.12-3.fc26.s390x
libgo-devel-7.2.1-2.fc26.s390x
perl-Pod-Escapes-1.07-366.fc26.noarch
perl-Pod-Usage-1.69-2.fc26.noarch
libtheora-1.1.1-15.fc26.s390x
tcp_wrappers-7.6-85.fc26.s390x
coreutils-8.27-7.fc26.s390x
libmount-2.30.2-1.fc26.s390x
python2-iniparse-0.4-24.fc26.noarch
python2-decorator-4.0.11-2.fc26.noarch
ModemManager-glib-1.6.10-1.fc26.s390x
python3-decorator-4.0.11-2.fc26.noarch
python3-cffi-1.9.1-2.fc26.s390x
python-bugzilla-cli-2.1.0-1.fc26.noarch
python2-funcsigs-1.0.2-5.fc26.noarch
python2-babel-2.3.4-5.fc26.noarch
python-bugzilla-2.1.0-1.fc26.noarch
libradosstriper1-10.2.7-2.fc26.s390x
snappy-1.1.4-3.fc26.s390x
dtc-1.4.5-1.fc26.s390x
libmpcdec-1.2.6-17.fc26.s390x
rpm-libs-4.13.0.2-1.fc26.s390x
python-urlgrabber-3.10.1-11.fc26.noarch
sysfsutils-2.1.0-20.fc26.s390x
python3-hawkey-0.11.1-1.fc26.s390x
python3-dnf-plugins-core-2.1.5-1.fc26.noarch
ethtool-4.13-1.fc26.s390x
iputils-20161105-5.fc26.s390x
plymouth-scripts-0.9.3-0.7.20160620git0e65b86c.fc26.s390x
cronie-1.5.1-5.fc26.s390x
libini_config-1.3.1-34.fc26.s390x
libX11-1.6.5-2.fc26.s390x
libglvnd-egl-1.0.0-1.fc26.s390x
texlive-kpathsea-svn41139-33.fc26.2.noarch
texlive-thumbpdf-bin-svn6898.0-33.20160520.fc26.2.noarch
texlive-subfig-svn15878.1.3-33.fc26.2.noarch
texlive-gsftopk-bin-svn40473-33.20160520.fc26.2.s390x
texlive-tex-ini-files-svn40533-33.fc26.2.noarch
texlive-qstest-svn15878.0-33.fc26.2.noarch
texlive-palatino-svn31835.0-33.fc26.2.noarch
texlive-ec-svn25033.1.0-33.fc26.2.noarch
texlive-iftex-svn29654.0.2-33.fc26.2.noarch
texlive-pslatex-svn16416.0-33.fc26.2.noarch
texlive-algorithms-svn38085.0.1-33.fc26.2.noarch
texlive-filehook-svn24280.0.5d-33.fc26.2.noarch
texlive-pst-node-svn40743-33.fc26.2.noarch
texlive-rotating-svn16832.2.16b-33.fc26.2.noarch
texlive-seminar-svn34011.1.62-33.fc26.2.noarch
gtk3-3.22.21-2.fc26.s390x
libuuid-devel-2.30.2-1.fc26.s390x
java-1.8.0-openjdk-1.8.0.151-1.b12.fc26.s390x
libXinerama-devel-1.1.3-7.fc26.s390x
emacs-common-25.3-3.fc26.s390x
gtk3-devel-3.22.21-2.fc26.s390x
fedora-packager-0.6.0.1-2.fc26.noarch
libxml2-devel-2.9.4-2.fc26.s390x
snappy-devel-1.1.4-3.fc26.s390x
python2-dnf-plugin-migrate-2.1.5-1.fc26.noarch
authconfig-7.0.1-2.fc26.s390x
newt-python3-0.52.20-1.fc26.s390x
python-decoratortools-1.8-13.fc26.noarch
python-systemd-doc-234-1.fc26.s390x
openssl-libs-1.1.0g-1.fc26.s390x
git-core-2.13.6-2.fc26.s390x
python3-dnf-plugin-system-upgrade-2.0.4-1.fc26.noarch
glusterfs-libs-3.10.8-1.fc26.s390x
ca-certificates-2017.2.20-1.0.fc26.noarch
unbound-libs-1.6.7-1.fc26.s390x
libsss_certmap-1.16.0-4.fc26.s390x
glusterfs-api-devel-3.10.8-1.fc26.s390x
selinux-policy-targeted-3.13.1-260.17.fc26.noarch
publicsuffix-list-dafsa-20171028-1.fc26.noarch
gpg-pubkey-a0a7badb-52844296
gpg-pubkey-e372e838-56fd7943
gpg-pubkey-3b921d09-57a87096
google-roboto-slab-fonts-1.100263-0.5.20150923git.fc26.noarch
libreport-filesystem-2.9.1-3.fc26.s390x
glibc-all-langpacks-2.25-12.fc26.s390x
libcom_err-1.43.4-2.fc26.s390x
libffi-3.1-12.fc26.s390x
keyutils-libs-1.5.10-1.fc26.s390x
diffutils-3.5-3.fc26.s390x
apr-util-1.5.4-6.fc26.s390x
bluez-libs-5.46-6.fc26.s390x
libksba-1.3.5-3.fc26.s390x
ncurses-6.0-8.20170212.fc26.s390x
gsm-1.0.17-1.fc26.s390x
libteam-1.27-1.fc26.s390x
perl-Fedora-VSP-0.001-5.fc26.noarch
libusb-0.1.5-8.fc26.s390x
acl-2.2.52-15.fc26.s390x
dwz-0.12-3.fc26.s390x
libblkid-2.30.2-1.fc26.s390x
polkit-libs-0.113-8.fc26.s390x
dbus-python-1.2.4-6.fc26.s390x
gts-0.7.6-30.20121130.fc26.s390x
libfdisk-2.30.2-1.fc26.s390x
python3-pycparser-2.14-10.fc26.noarch
python3-bugzilla-2.1.0-1.fc26.noarch
python2-docutils-0.13.1-4.fc26.noarch
pytz-2016.10-4.fc26.noarch
python2-requests-2.13.0-1.fc26.noarch
libcephfs-devel-10.2.7-2.fc26.s390x
ncurses-c++-libs-6.0-8.20170212.fc26.s390x
GeoIP-1.6.11-1.fc26.s390x
liblockfile-1.09-5.fc26.s390x
rpm-plugin-selinux-4.13.0.2-1.fc26.s390x
systemtap-devel-3.2-2.fc26.s390x
libsysfs-2.1.0-20.fc26.s390x
libdnf-0.11.1-1.fc26.s390x
libgfortran-7.2.1-2.fc26.s390x
mesa-libgbm-17.2.4-2.fc26.s390x
dracut-046-3.1.fc26.s390x
lvm2-libs-2.02.168-6.fc26.s390x
libXfixes-5.0.3-2.fc26.s390x
brlapi-0.6.6-5.fc26.s390x
texlive-metafont-svn40793-33.fc26.2.noarch
texlive-graphics-cfg-svn40269-33.fc26.2.noarch
texlive-mptopdf-svn41282-33.fc26.2.noarch
texlive-makeindex-bin-svn40473-33.20160520.fc26.2.s390x
texlive-texlive-scripts-bin-svn29741.0-33.20160520.fc26.2.noarch
texlive-sauerj-svn15878.0-33.fc26.2.noarch
texlive-txfonts-svn15878.0-33.fc26.2.noarch
texlive-filecontents-svn24250.1.3-33.fc26.2.noarch
texlive-lualibs-svn40370-33.fc26.2.noarch
texlive-section-svn20180.0-33.fc26.2.noarch
texlive-ucharcat-svn38907-33.fc26.2.noarch
texlive-hyperref-svn41396-33.fc26.2.noarch
texlive-pst-3d-svn17257.1.10-33.fc26.2.noarch
texlive-oberdiek-svn41346-33.fc26.2.noarch
texlive-ae-svn15878.1.4-33.fc26.2.noarch
texlive-collection-basic-svn41149-33.20160520.fc26.2.noarch
gnat-srpm-macros-4-2.fc26.noarch
glib2-devel-2.52.3-2.fc26.s390x
netpbm-progs-10.80.00-2.fc26.s390x
libXxf86vm-devel-1.1.4-4.fc26.s390x
nettle-devel-3.3-2.fc26.s390x
cairo-gobject-devel-1.14.10-1.fc26.s390x
fedora-rpm-macros-26-2.fc26.noarch
elfutils-devel-0.169-1.fc26.s390x
libidn-devel-1.33-2.fc26.s390x
s390utils-1.36.1-3.fc26.s390x
gcc-gfortran-7.2.1-2.fc26.s390x
libtool-2.4.6-17.fc26.s390x
python3-cssselect-0.9.2-4.fc26.noarch
python2-cssselect-0.9.2-4.fc26.noarch
bison-3.0.4-6.fc26.s390x
rootfiles-8.1-20.fc26.noarch
git-core-doc-2.13.6-2.fc26.s390x
vim-enhanced-8.0.1360-1.fc26.s390x
glusterfs-3.10.8-1.fc26.s390x
boost-system-1.63.0-10.fc26.s390x
gnutls-dane-3.5.16-4.fc26.s390x
pkgconf-m4-1.3.12-1.fc26.noarch
libcurl-devel-7.53.1-13.fc26.s390x
python3-urllib3-1.20-2.fc26.noarch
libsss_autofs-1.16.0-4.fc26.s390x
=== TEST BEGIN ===
Using CC: /home/fam/bin/cc
Install prefix /var/tmp/patchew-tester-tmp-dep3o2js/src/install
BIOS directory /var/tmp/patchew-tester-tmp-dep3o2js/src/install/share/qemu
firmware path /var/tmp/patchew-tester-tmp-dep3o2js/src/install/share/qemu-firmware
binary directory /var/tmp/patchew-tester-tmp-dep3o2js/src/install/bin
library directory /var/tmp/patchew-tester-tmp-dep3o2js/src/install/lib
module directory /var/tmp/patchew-tester-tmp-dep3o2js/src/install/lib/qemu
libexec directory /var/tmp/patchew-tester-tmp-dep3o2js/src/install/libexec
include directory /var/tmp/patchew-tester-tmp-dep3o2js/src/install/include
config directory /var/tmp/patchew-tester-tmp-dep3o2js/src/install/etc
local state directory /var/tmp/patchew-tester-tmp-dep3o2js/src/install/var
Manual directory /var/tmp/patchew-tester-tmp-dep3o2js/src/install/share/man
ELF interp prefix /usr/gnemul/qemu-%M
Source path /var/tmp/patchew-tester-tmp-dep3o2js/src
GIT binary git
GIT submodules ui/keycodemapdb capstone
C compiler /home/fam/bin/cc
Host C compiler cc
C++ compiler c++
Objective-C compiler /home/fam/bin/cc
ARFLAGS rv
CFLAGS -O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -g
QEMU_CFLAGS -I/usr/include/pixman-1 -Werror -DHAS_LIBSSH2_SFTP_FSYNC -pthread -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -DNCURSES_WIDECHAR -D_GNU_SOURCE -D_DEFAULT_SOURCE -m64 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -Wstrict-prototypes -Wredundant-decls -Wall -Wundef -Wwrite-strings -Wmissing-prototypes -fno-strict-aliasing -fno-common -fwrapv -Wexpansion-to-defined -Wendif-labels -Wno-shift-negative-value -Wno-missing-include-dirs -Wempty-body -Wnested-externs -Wformat-security -Wformat-y2k -Winit-self -Wignored-qualifiers -Wold-style-declaration -Wold-style-definition -Wtype-limits -fstack-protector-strong -I/usr/include/p11-kit-1 -I/usr/include/libpng16 -I/usr/include/libdrm -I$(SRC_PATH)/capstone/include
LDFLAGS -Wl,--warn-common -m64 -g
make make
install install
python python -B
smbd /usr/sbin/smbd
module support no
host CPU s390x
host big endian yes
target list aarch64-softmmu alpha-softmmu arm-softmmu cris-softmmu i386-softmmu lm32-softmmu m68k-softmmu microblazeel-softmmu microblaze-softmmu mips64el-softmmu mips64-softmmu mipsel-softmmu mips-softmmu moxie-softmmu nios2-softmmu or1k-softmmu ppc64-softmmu ppcemb-softmmu ppc-softmmu s390x-softmmu sh4eb-softmmu sh4-softmmu sparc64-softmmu sparc-softmmu tricore-softmmu unicore32-softmmu x86_64-softmmu xtensaeb-softmmu xtensa-softmmu aarch64_be-linux-user aarch64-linux-user alpha-linux-user armeb-linux-user arm-linux-user cris-linux-user hppa-linux-user i386-linux-user m68k-linux-user microblazeel-linux-user microblaze-linux-user mips64el-linux-user mips64-linux-user mipsel-linux-user mips-linux-user mipsn32el-linux-user mipsn32-linux-user nios2-linux-user or1k-linux-user ppc64abi32-linux-user ppc64le-linux-user ppc64-linux-user ppc-linux-user s390x-linux-user sh4eb-linux-user sh4-linux-user sparc32plus-linux-user sparc64-linux-user sparc-linux-user tilegx-linux-user x86_64-linux-user
gprof enabled no
sparse enabled no
strip binaries yes
profiler no
static build no
SDL support yes (2.0.7)
GTK support yes (3.22.21)
GTK GL support yes
VTE support yes (0.48.4)
TLS priority NORMAL
GNUTLS support yes
GNUTLS rnd yes
libgcrypt no
libgcrypt kdf no
nettle yes (3.3)
nettle kdf yes
libtasn1 yes
curses support yes
virgl support yes
curl support yes
mingw32 support no
Audio drivers oss
Block whitelist (rw)
Block whitelist (ro)
VirtFS support yes
Multipath support no
VNC support yes
VNC SASL support yes
VNC JPEG support yes
VNC PNG support yes
xen support no
brlapi support yes
bluez support yes
Documentation yes
PIE no
vde support no
netmap support no
Linux AIO support yes
ATTR/XATTR support yes
Install blobs yes
KVM support yes
HAX support no
HVF support no
TCG support yes
TCG debug enabled no
TCG interpreter no
malloc trim support yes
RDMA support no
fdt support yes
preadv support yes
fdatasync yes
madvise yes
posix_madvise yes
libcap-ng support yes
vhost-net support yes
vhost-scsi support yes
vhost-vsock support yes
vhost-user support yes
Trace backends log
spice support no
rbd support yes
xfsctl support no
smartcard support yes
libusb yes
usb net redir yes
OpenGL support yes
OpenGL dmabufs yes
libiscsi support yes
libnfs support yes
build guest agent yes
QGA VSS support no
QGA w32 disk info no
QGA MSI support no
seccomp support yes
coroutine backend ucontext
coroutine pool yes
debug stack usage no
crypto afalg no
GlusterFS support yes
gcov gcov
gcov enabled no
TPM support yes
libssh2 support yes
TPM passthrough no
TPM emulator yes
QOM debugging yes
Live block migration yes
lzo support yes
snappy support yes
bzip2 support yes
NUMA host support no
tcmalloc support no
jemalloc support no
avx2 optimization no
replication support yes
VxHS block device no
capstone git
GEN aarch64-softmmu/config-devices.mak.tmp
GEN alpha-softmmu/config-devices.mak.tmp
GEN arm-softmmu/config-devices.mak.tmp
GEN cris-softmmu/config-devices.mak.tmp
GEN cris-softmmu/config-devices.mak
GEN i386-softmmu/config-devices.mak.tmp
GEN alpha-softmmu/config-devices.mak
GEN lm32-softmmu/config-devices.mak.tmp
GEN arm-softmmu/config-devices.mak
GEN aarch64-softmmu/config-devices.mak
GEN m68k-softmmu/config-devices.mak.tmp
GEN lm32-softmmu/config-devices.mak
GEN microblazeel-softmmu/config-devices.mak.tmp
GEN microblaze-softmmu/config-devices.mak.tmp
GEN i386-softmmu/config-devices.mak
GEN m68k-softmmu/config-devices.mak
GEN mips64el-softmmu/config-devices.mak.tmp
GEN mips64-softmmu/config-devices.mak.tmp
GEN microblaze-softmmu/config-devices.mak
GEN microblazeel-softmmu/config-devices.mak
GEN mipsel-softmmu/config-devices.mak.tmp
GEN mips-softmmu/config-devices.mak.tmp
GEN mips64-softmmu/config-devices.mak
GEN mips64el-softmmu/config-devices.mak
GEN moxie-softmmu/config-devices.mak.tmp
GEN nios2-softmmu/config-devices.mak.tmp
GEN mipsel-softmmu/config-devices.mak
GEN mips-softmmu/config-devices.mak
GEN moxie-softmmu/config-devices.mak
GEN nios2-softmmu/config-devices.mak
GEN or1k-softmmu/config-devices.mak.tmp
GEN ppc64-softmmu/config-devices.mak.tmp
GEN ppcemb-softmmu/config-devices.mak.tmp
GEN ppc-softmmu/config-devices.mak.tmp
GEN or1k-softmmu/config-devices.mak
GEN s390x-softmmu/config-devices.mak.tmp
GEN ppcemb-softmmu/config-devices.mak
GEN ppc-softmmu/config-devices.mak
GEN ppc64-softmmu/config-devices.mak
GEN s390x-softmmu/config-devices.mak
GEN sh4eb-softmmu/config-devices.mak.tmp
GEN sh4-softmmu/config-devices.mak.tmp
GEN sparc64-softmmu/config-devices.mak.tmp
GEN sparc-softmmu/config-devices.mak.tmp
GEN sparc-softmmu/config-devices.mak
GEN tricore-softmmu/config-devices.mak.tmp
GEN sh4eb-softmmu/config-devices.mak
GEN sh4-softmmu/config-devices.mak
GEN unicore32-softmmu/config-devices.mak.tmp
GEN sparc64-softmmu/config-devices.mak
GEN x86_64-softmmu/config-devices.mak.tmp
GEN xtensaeb-softmmu/config-devices.mak.tmp
GEN tricore-softmmu/config-devices.mak
GEN unicore32-softmmu/config-devices.mak
GEN xtensaeb-softmmu/config-devices.mak
GEN xtensa-softmmu/config-devices.mak.tmp
GEN aarch64_be-linux-user/config-devices.mak.tmp
GEN aarch64-linux-user/config-devices.mak.tmp
GEN xtensa-softmmu/config-devices.mak
GEN x86_64-softmmu/config-devices.mak
GEN alpha-linux-user/config-devices.mak.tmp
GEN aarch64_be-linux-user/config-devices.mak
GEN aarch64-linux-user/config-devices.mak
GEN armeb-linux-user/config-devices.mak.tmp
GEN arm-linux-user/config-devices.mak.tmp
GEN cris-linux-user/config-devices.mak.tmp
GEN alpha-linux-user/config-devices.mak
GEN armeb-linux-user/config-devices.mak
GEN cris-linux-user/config-devices.mak
GEN arm-linux-user/config-devices.mak
GEN hppa-linux-user/config-devices.mak.tmp
GEN i386-linux-user/config-devices.mak.tmp
GEN m68k-linux-user/config-devices.mak.tmp
GEN microblazeel-linux-user/config-devices.mak.tmp
GEN hppa-linux-user/config-devices.mak
GEN i386-linux-user/config-devices.mak
GEN microblazeel-linux-user/config-devices.mak
GEN m68k-linux-user/config-devices.mak
GEN microblaze-linux-user/config-devices.mak.tmp
GEN mips64el-linux-user/config-devices.mak.tmp
GEN mips64-linux-user/config-devices.mak.tmp
GEN mipsel-linux-user/config-devices.mak.tmp
GEN microblaze-linux-user/config-devices.mak
GEN mips-linux-user/config-devices.mak.tmp
GEN mips64el-linux-user/config-devices.mak
GEN mips64-linux-user/config-devices.mak
GEN mipsel-linux-user/config-devices.mak
GEN mipsn32el-linux-user/config-devices.mak.tmp
GEN mipsn32-linux-user/config-devices.mak.tmp
GEN nios2-linux-user/config-devices.mak.tmp
GEN mips-linux-user/config-devices.mak
GEN mipsn32el-linux-user/config-devices.mak
GEN or1k-linux-user/config-devices.mak.tmp
GEN mipsn32-linux-user/config-devices.mak
GEN ppc64abi32-linux-user/config-devices.mak.tmp
GEN ppc64le-linux-user/config-devices.mak.tmp
GEN nios2-linux-user/config-devices.mak
GEN ppc64-linux-user/config-devices.mak.tmp
GEN or1k-linux-user/config-devices.mak
GEN ppc64abi32-linux-user/config-devices.mak
GEN ppc-linux-user/config-devices.mak.tmp
GEN s390x-linux-user/config-devices.mak.tmp
GEN ppc64-linux-user/config-devices.mak
GEN ppc64le-linux-user/config-devices.mak
GEN sh4eb-linux-user/config-devices.mak.tmp
GEN ppc-linux-user/config-devices.mak
GEN sh4-linux-user/config-devices.mak.tmp
GEN sparc32plus-linux-user/config-devices.mak.tmp
GEN s390x-linux-user/config-devices.mak
GEN sh4eb-linux-user/config-devices.mak
GEN sh4-linux-user/config-devices.mak
GEN sparc64-linux-user/config-devices.mak.tmp
GEN tilegx-linux-user/config-devices.mak.tmp
GEN sparc-linux-user/config-devices.mak.tmp
GEN sparc32plus-linux-user/config-devices.mak
GEN x86_64-linux-user/config-devices.mak.tmp
GEN sparc64-linux-user/config-devices.mak
GEN tilegx-linux-user/config-devices.mak
GEN sparc-linux-user/config-devices.mak
GEN config-host.h
GIT ui/keycodemapdb capstone
GEN x86_64-linux-user/config-devices.mak
GEN qemu-options.def
GEN qmp-commands.h
GEN qapi-types.h
GEN qapi-visit.h
GEN qapi-event.h
GEN qmp-marshal.c
GEN qapi-types.c
GEN qapi-visit.c
GEN qapi-event.c
GEN qmp-introspect.h
GEN qmp-introspect.c
GEN trace/generated-tcg-tracers.h
GEN trace/generated-helpers-wrappers.h
Submodule 'capstone' (git://git.qemu.org/capstone.git) registered for path 'capstone'
Submodule 'ui/keycodemapdb' (git://git.qemu.org/keycodemapdb.git) registered for path 'ui/keycodemapdb'
GEN trace/generated-helpers.h
GEN trace/generated-helpers.c
GEN module_block.h
Cloning into '/var/tmp/patchew-tester-tmp-dep3o2js/src/capstone'...
GEN tests/test-qapi-types.h
GEN tests/test-qapi-visit.h
GEN tests/test-qmp-commands.h
GEN tests/test-qapi-event.h
GEN tests/test-qmp-introspect.h
GEN trace-root.h
GEN util/trace.h
GEN crypto/trace.h
GEN io/trace.h
GEN migration/trace.h
GEN block/trace.h
GEN chardev/trace.h
GEN hw/block/trace.h
GEN hw/block/dataplane/trace.h
GEN hw/char/trace.h
GEN hw/intc/trace.h
GEN hw/net/trace.h
GEN hw/virtio/trace.h
GEN hw/audio/trace.h
GEN hw/misc/trace.h
GEN hw/usb/trace.h
GEN hw/scsi/trace.h
GEN hw/nvram/trace.h
GEN hw/display/trace.h
GEN hw/input/trace.h
GEN hw/timer/trace.h
GEN hw/dma/trace.h
GEN hw/sparc/trace.h
GEN hw/sparc64/trace.h
GEN hw/sd/trace.h
GEN hw/isa/trace.h
GEN hw/mem/trace.h
GEN hw/i386/trace.h
GEN hw/i386/xen/trace.h
GEN hw/9pfs/trace.h
GEN hw/ppc/trace.h
GEN hw/pci/trace.h
GEN hw/s390x/trace.h
GEN hw/vfio/trace.h
GEN hw/acpi/trace.h
GEN hw/arm/trace.h
GEN hw/alpha/trace.h
GEN hw/xen/trace.h
GEN hw/ide/trace.h
GEN ui/trace.h
GEN audio/trace.h
GEN net/trace.h
GEN target/arm/trace.h
GEN target/i386/trace.h
GEN target/mips/trace.h
GEN target/sparc/trace.h
GEN target/s390x/trace.h
GEN target/ppc/trace.h
GEN qom/trace.h
GEN linux-user/trace.h
GEN qapi/trace.h
GEN accel/tcg/trace.h
GEN accel/kvm/trace.h
GEN nbd/trace.h
GEN scsi/trace.h
GEN trace-root.c
GEN util/trace.c
GEN crypto/trace.c
GEN io/trace.c
GEN migration/trace.c
GEN block/trace.c
GEN chardev/trace.c
GEN hw/block/trace.c
GEN hw/block/dataplane/trace.c
GEN hw/char/trace.c
GEN hw/intc/trace.c
GEN hw/net/trace.c
GEN hw/virtio/trace.c
GEN hw/audio/trace.c
GEN hw/misc/trace.c
GEN hw/usb/trace.c
GEN hw/scsi/trace.c
GEN hw/nvram/trace.c
GEN hw/display/trace.c
GEN hw/input/trace.c
GEN hw/timer/trace.c
GEN hw/dma/trace.c
GEN hw/sparc/trace.c
GEN hw/sparc64/trace.c
GEN hw/sd/trace.c
GEN hw/isa/trace.c
GEN hw/mem/trace.c
GEN hw/i386/trace.c
GEN hw/i386/xen/trace.c
GEN hw/9pfs/trace.c
GEN hw/ppc/trace.c
GEN hw/pci/trace.c
GEN hw/s390x/trace.c
GEN hw/vfio/trace.c
GEN hw/acpi/trace.c
GEN hw/arm/trace.c
GEN hw/alpha/trace.c
GEN hw/xen/trace.c
GEN hw/ide/trace.c
GEN ui/trace.c
GEN audio/trace.c
GEN net/trace.c
GEN target/arm/trace.c
GEN target/i386/trace.c
GEN target/mips/trace.c
GEN target/sparc/trace.c
GEN target/s390x/trace.c
GEN target/ppc/trace.c
GEN qom/trace.c
GEN linux-user/trace.c
GEN qapi/trace.c
GEN accel/tcg/trace.c
GEN accel/kvm/trace.c
GEN nbd/trace.c
GEN scsi/trace.c
GEN config-all-devices.mak
Cloning into '/var/tmp/patchew-tester-tmp-dep3o2js/src/ui/keycodemapdb'...
GEN ui/input-keymap-linux-to-qcode.c
GEN ui/input-keymap-qcode-to-qnum.c
GEN ui/input-keymap-qnum-to-qcode.c
CC cs.o
GEN ui/input-keymap-qcode-to-linux.c
CC utils.o
CC SStream.o
CC MCInstrDesc.o
CC MCRegisterInfo.o
CC arch/ARM/ARMDisassembler.o
CC arch/ARM/ARMInstPrinter.o
CC arch/ARM/ARMMapping.o
CC arch/ARM/ARMModule.o
CC arch/AArch64/AArch64BaseInfo.o
CC arch/AArch64/AArch64Disassembler.o
CC arch/AArch64/AArch64InstPrinter.o
CC arch/AArch64/AArch64Mapping.o
CC arch/AArch64/AArch64Module.o
CC arch/Mips/MipsDisassembler.o
CC arch/Mips/MipsInstPrinter.o
CC arch/Mips/MipsMapping.o
CC arch/Mips/MipsModule.o
CC arch/PowerPC/PPCDisassembler.o
CC arch/PowerPC/PPCInstPrinter.o
CC arch/PowerPC/PPCMapping.o
CC arch/PowerPC/PPCModule.o
CC arch/Sparc/SparcDisassembler.o
CC arch/Sparc/SparcInstPrinter.o
CC arch/Sparc/SparcMapping.o
CC arch/Sparc/SparcModule.o
CC arch/SystemZ/SystemZDisassembler.o
CC arch/SystemZ/SystemZInstPrinter.o
CC arch/SystemZ/SystemZMapping.o
CC arch/SystemZ/SystemZModule.o
CC arch/SystemZ/SystemZMCTargetDesc.o
CC arch/X86/X86DisassemblerDecoder.o
CC arch/X86/X86Disassembler.o
CC arch/X86/X86IntelInstPrinter.o
CC arch/X86/X86ATTInstPrinter.o
CC arch/X86/X86Mapping.o
CC arch/X86/X86Module.o
CC arch/XCore/XCoreDisassembler.o
CC arch/XCore/XCoreInstPrinter.o
CC arch/XCore/XCoreMapping.o
CC arch/XCore/XCoreModule.o
CC MCInst.o
AR libcapstone.a
ar: creating /var/tmp/patchew-tester-tmp-dep3o2js/src/build/capstone/libcapstone.a
make[1]: '/var/tmp/patchew-tester-tmp-dep3o2js/src/build/capstone/libcapstone.a' is up to date.
CC tests/qemu-iotests/socket_scm_helper.o
GEN docs/version.texi
GEN qemu-options.texi
GEN qemu-monitor.texi
GEN qemu-img-cmds.texi
GEN qemu-monitor-info.texi
GEN qemu-img.1
GEN qemu-nbd.8
GEN qemu-ga.8
GEN docs/interop/qemu-qmp-qapi.texi
GEN docs/interop/qemu-ga-qapi.texi
GEN docs/qemu-block-drivers.7
GEN fsdev/virtfs-proxy-helper.1
GEN qga/qapi-generated/qga-qapi-types.h
GEN qga/qapi-generated/qga-qapi-visit.h
GEN qga/qapi-generated/qga-qmp-commands.h
GEN qga/qapi-generated/qga-qapi-types.c
GEN qga/qapi-generated/qga-qapi-visit.c
GEN qga/qapi-generated/qga-qmp-marshal.c
CC qmp-introspect.o
CC qapi-types.o
CC qapi-visit.o
CC qapi-event.o
CC qapi/qapi-visit-core.o
CC qapi/qapi-dealloc-visitor.o
CC qapi/qobject-input-visitor.o
CC qapi/qobject-output-visitor.o
CC qapi/qmp-registry.o
CC qapi/qmp-dispatch.o
CC qapi/string-input-visitor.o
CC qapi/string-output-visitor.o
CC qapi/opts-visitor.o
CC qapi/qapi-clone-visitor.o
CC qapi/qmp-event.o
CC qapi/qapi-util.o
CC qobject/qnull.o
CC qobject/qnum.o
CC qobject/qstring.o
CC qobject/qdict.o
CC qobject/qlist.o
CC qobject/qbool.o
CC qobject/qlit.o
CC qobject/qjson.o
CC qobject/qobject.o
CC qobject/json-lexer.o
CC qobject/json-streamer.o
CC qobject/json-parser.o
CC trace/control.o
CC trace/qmp.o
CC util/osdep.o
CC util/cutils.o
CC util/unicode.o
CC util/qemu-timer-common.o
CC util/bufferiszero.o
CC util/lockcnt.o
CC util/aiocb.o
CC util/async.o
CC util/thread-pool.o
CC util/qemu-timer.o
CC util/main-loop.o
CC util/iohandler.o
CC util/aio-posix.o
CC util/compatfd.o
CC util/event_notifier-posix.o
CC util/mmap-alloc.o
CC util/oslib-posix.o
CC util/qemu-openpty.o
CC util/qemu-thread-posix.o
CC util/memfd.o
CC util/envlist.o
CC util/path.o
CC util/module.o
CC util/host-utils.o
CC util/bitmap.o
CC util/bitops.o
CC util/hbitmap.o
CC util/fifo8.o
CC util/acl.o
CC util/cacheinfo.o
CC util/error.o
CC util/qemu-error.o
CC util/id.o
CC util/iov.o
CC util/qemu-config.o
CC util/qemu-sockets.o
CC util/uri.o
CC util/notify.o
CC util/qemu-option.o
CC util/qemu-progress.o
CC util/keyval.o
CC util/hexdump.o
CC util/crc32c.o
CC util/uuid.o
CC util/throttle.o
CC util/getauxval.o
CC util/readline.o
CC util/rcu.o
CC util/qemu-coroutine.o
CC util/qemu-coroutine-lock.o
CC util/qemu-coroutine-io.o
CC util/qemu-coroutine-sleep.o
CC util/coroutine-ucontext.o
CC util/buffer.o
CC util/timed-average.o
CC util/base64.o
CC util/log.o
CC util/pagesize.o
CC util/qdist.o
CC util/qht.o
CC util/range.o
CC util/stats64.o
CC util/systemd.o
CC trace-root.o
CC util/trace.o
CC crypto/trace.o
CC io/trace.o
CC migration/trace.o
CC block/trace.o
CC chardev/trace.o
CC hw/block/trace.o
CC hw/block/dataplane/trace.o
CC hw/char/trace.o
CC hw/intc/trace.o
CC hw/net/trace.o
CC hw/virtio/trace.o
CC hw/audio/trace.o
CC hw/misc/trace.o
CC hw/usb/trace.o
CC hw/scsi/trace.o
CC hw/nvram/trace.o
CC hw/display/trace.o
CC hw/input/trace.o
CC hw/timer/trace.o
CC hw/dma/trace.o
CC hw/sparc/trace.o
CC hw/sparc64/trace.o
CC hw/sd/trace.o
CC hw/isa/trace.o
CC hw/mem/trace.o
CC hw/i386/trace.o
CC hw/i386/xen/trace.o
CC hw/9pfs/trace.o
CC hw/ppc/trace.o
CC hw/pci/trace.o
CC hw/s390x/trace.o
CC hw/vfio/trace.o
CC hw/acpi/trace.o
CC hw/arm/trace.o
CC hw/alpha/trace.o
CC hw/xen/trace.o
CC hw/ide/trace.o
CC ui/trace.o
CC audio/trace.o
CC net/trace.o
CC target/arm/trace.o
CC target/i386/trace.o
CC target/mips/trace.o
CC target/sparc/trace.o
CC target/s390x/trace.o
CC target/ppc/trace.o
CC qom/trace.o
CC linux-user/trace.o
CC qapi/trace.o
CC accel/tcg/trace.o
CC accel/kvm/trace.o
CC nbd/trace.o
CC scsi/trace.o
CC crypto/pbkdf-stub.o
CC stubs/arch-query-cpu-def.o
CC stubs/arch-query-cpu-model-expansion.o
CC stubs/arch-query-cpu-model-comparison.o
CC stubs/arch-query-cpu-model-baseline.o
CC stubs/bdrv-next-monitor-owned.o
CC stubs/blk-commit-all.o
CC stubs/blockdev-close-all-bdrv-states.o
CC stubs/clock-warp.o
CC stubs/cpu-get-clock.o
CC stubs/cpu-get-icount.o
CC stubs/dump.o
CC stubs/error-printf.o
CC stubs/fdset.o
CC stubs/gdbstub.o
CC stubs/get-vm-name.o
CC stubs/iothread.o
CC stubs/iothread-lock.o
CC stubs/is-daemonized.o
CC stubs/linux-aio.o
CC stubs/machine-init-done.o
CC stubs/migr-blocker.o
CC stubs/change-state-handler.o
CC stubs/monitor.o
CC stubs/notify-event.o
CC stubs/qtest.o
CC stubs/replay.o
CC stubs/runstate-check.o
CC stubs/set-fd-handler.o
CC stubs/slirp.o
CC stubs/sysbus.o
CC stubs/tpm.o
CC stubs/trace-control.o
CC stubs/uuid.o
CC stubs/vm-stop.o
CC stubs/vmstate.o
CC stubs/qmp_pc_dimm.o
CC stubs/target-monitor-defs.o
CC stubs/target-get-monitor-def.o
CC stubs/pc_madt_cpu_entry.o
CC stubs/vmgenid.o
CC stubs/xen-common.o
CC stubs/xen-hvm.o
CC stubs/pci-host-piix.o
CC qemu-keymap.o
CC ui/input-keymap.o
CC contrib/ivshmem-client/ivshmem-client.o
CC contrib/ivshmem-client/main.o
CC contrib/ivshmem-server/ivshmem-server.o
CC contrib/ivshmem-server/main.o
CC qemu-nbd.o
CC block.o
CC blockjob.o
CC qemu-io-cmds.o
CC replication.o
CC block/raw-format.o
CC block/qcow.o
CC block/vdi.o
CC block/vmdk.o
CC block/cloop.o
CC block/bochs.o
CC block/vpc.o
CC block/vvfat.o
CC block/dmg.o
CC block/qcow2.o
CC block/qcow2-refcount.o
CC block/qcow2-cluster.o
CC block/qcow2-snapshot.o
CC block/qcow2-cache.o
CC block/qcow2-bitmap.o
CC block/qed.o
CC block/qed-l2-cache.o
CC block/qed-table.o
CC block/qed-cluster.o
CC block/qed-check.o
CC block/vhdx.o
CC block/vhdx-endian.o
CC block/vhdx-log.o
CC block/quorum.o
CC block/parallels.o
CC block/blkdebug.o
CC block/blkverify.o
CC block/blkreplay.o
CC block/block-backend.o
CC block/snapshot.o
CC block/qapi.o
CC block/file-posix.o
CC block/linux-aio.o
CC block/null.o
CC block/mirror.o
CC block/commit.o
CC block/io.o
CC block/throttle-groups.o
CC block/nbd.o
CC block/nbd-client.o
CC block/sheepdog.o
CC block/iscsi-opts.o
CC block/accounting.o
CC block/dirty-bitmap.o
CC block/write-threshold.o
CC block/backup.o
CC block/replication.o
CC block/throttle.o
CC block/crypto.o
CC nbd/server.o
CC nbd/client.o
CC nbd/common.o
CC scsi/utils.o
CC scsi/pr-manager.o
CC scsi/pr-manager-helper.o
CC block/iscsi.o
CC block/nfs.o
CC block/curl.o
CC block/rbd.o
CC block/gluster.o
CC block/ssh.o
CC block/dmg-bz2.o
CC crypto/init.o
CC crypto/hash.o
CC crypto/hash-nettle.o
CC crypto/hmac.o
CC crypto/hmac-nettle.o
CC crypto/aes.o
CC crypto/desrfb.o
CC crypto/cipher.o
CC crypto/tlscreds.o
CC crypto/tlscredsanon.o
CC crypto/tlscredsx509.o
CC crypto/tlssession.o
CC crypto/secret.o
CC crypto/random-gnutls.o
CC crypto/pbkdf.o
CC crypto/pbkdf-nettle.o
CC crypto/ivgen.o
CC crypto/ivgen-essiv.o
CC crypto/ivgen-plain.o
CC crypto/ivgen-plain64.o
CC crypto/afsplit.o
CC crypto/xts.o
CC crypto/block.o
CC crypto/block-qcow.o
CC crypto/block-luks.o
CC io/channel.o
CC io/channel-buffer.o
CC io/channel-command.o
CC io/channel-file.o
CC io/channel-socket.o
CC io/channel-tls.o
CC io/channel-watch.o
CC io/channel-websock.o
CC io/channel-util.o
CC io/dns-resolver.o
CC io/net-listener.o
CC io/task.o
CC qom/object.o
CC qom/container.o
CC qom/qom-qobject.o
CC qom/object_interfaces.o
GEN qemu-img-cmds.h
CC qemu-io.o
CC fsdev/virtfs-proxy-helper.o
CC fsdev/9p-marshal.o
CC fsdev/9p-iov-marshal.o
CC scsi/qemu-pr-helper.o
CC qemu-bridge-helper.o
CC blockdev.o
CC blockdev-nbd.o
CC bootdevice.o
CC iothread.o
CC qdev-monitor.o
CC device-hotplug.o
CC os-posix.o
CC bt-host.o
CC bt-vhci.o
CC dma-helpers.o
CC vl.o
CC tpm.o
CC qemu-seccomp.o
CC device_tree.o
CC qmp-marshal.o
CC qmp.o
CC hmp.o
CC cpus-common.o
CC audio/audio.o
CC audio/noaudio.o
CC audio/wavaudio.o
CC audio/mixeng.o
CC audio/sdlaudio.o
CC audio/ossaudio.o
CC audio/wavcapture.o
CC backends/rng.o
CC backends/rng-egd.o
CC backends/rng-random.o
CC backends/tpm.o
CC backends/hostmem.o
CC backends/hostmem-ram.o
CC backends/hostmem-file.o
CC backends/cryptodev.o
CC backends/cryptodev-builtin.o
CC block/stream.o
CC chardev/msmouse.o
CC chardev/wctablet.o
CC chardev/testdev.o
CC chardev/baum.o
CC disas/alpha.o
CC disas/arm.o
CXX disas/arm-a64.o
CC disas/cris.o
CC disas/hppa.o
CC disas/i386.o
CC disas/m68k.o
CC disas/microblaze.o
CC disas/mips.o
CC disas/nios2.o
CC disas/moxie.o
CC disas/ppc.o
CC disas/s390.o
CC disas/sh4.o
CC disas/sparc.o
CC disas/lm32.o
CC disas/xtensa.o
CXX disas/libvixl/vixl/utils.o
CXX disas/libvixl/vixl/compiler-intrinsics.o
CXX disas/libvixl/vixl/a64/instructions-a64.o
CXX disas/libvixl/vixl/a64/decoder-a64.o
CXX disas/libvixl/vixl/a64/disasm-a64.o
CC fsdev/qemu-fsdev.o
CC fsdev/qemu-fsdev-opts.o
CC fsdev/qemu-fsdev-throttle.o
CC fsdev/qemu-fsdev-dummy.o
CC hw/9pfs/9p.o
CC hw/9pfs/9p-util.o
CC hw/9pfs/9p-local.o
CC hw/9pfs/9p-xattr.o
CC hw/9pfs/9p-xattr-user.o
CC hw/9pfs/9p-posix-acl.o
CC hw/9pfs/coth.o
CC hw/9pfs/cofs.o
CC hw/9pfs/codir.o
CC hw/9pfs/cofile.o
CC hw/9pfs/coxattr.o
CC hw/9pfs/9p-synth.o
CC hw/9pfs/9p-handle.o
CC hw/9pfs/9p-proxy.o
CC hw/acpi/core.o
CC hw/acpi/piix4.o
CC hw/acpi/pcihp.o
CC hw/acpi/ich9.o
CC hw/acpi/tco.o
CC hw/acpi/cpu_hotplug.o
CC hw/acpi/memory_hotplug.o
CC hw/acpi/cpu.o
CC hw/acpi/nvdimm.o
CC hw/acpi/vmgenid.o
CC hw/acpi/acpi_interface.o
CC hw/acpi/bios-linker-loader.o
CC hw/acpi/aml-build.o
CC hw/acpi/ipmi.o
CC hw/acpi/acpi-stub.o
CC hw/acpi/ipmi-stub.o
CC hw/audio/sb16.o
CC hw/audio/es1370.o
CC hw/audio/ac97.o
CC hw/audio/fmopl.o
CC hw/audio/adlib.o
CC hw/audio/gus.o
CC hw/audio/gusemu_hal.o
CC hw/audio/gusemu_mixer.o
CC hw/audio/cs4231a.o
CC hw/audio/intel-hda.o
CC hw/audio/hda-codec.o
CC hw/audio/pcspk.o
CC hw/audio/wm8750.o
CC hw/audio/pl041.o
CC hw/audio/lm4549.o
CC hw/audio/cs4231.o
CC hw/audio/marvell_88w8618.o
CC hw/audio/milkymist-ac97.o
CC hw/audio/soundhw.o
CC hw/block/block.o
CC hw/block/cdrom.o
CC hw/block/hd-geometry.o
CC hw/block/fdc.o
CC hw/block/m25p80.o
CC hw/block/nand.o
CC hw/block/pflash_cfi01.o
CC hw/block/pflash_cfi02.o
CC hw/block/ecc.o
CC hw/block/onenand.o
CC hw/block/nvme.o
CC hw/bt/core.o
CC hw/bt/l2cap.o
CC hw/bt/sdp.o
CC hw/bt/hci.o
CC hw/bt/hid.o
CC hw/bt/hci-csr.o
CC hw/char/ipoctal232.o
CC hw/char/escc.o
CC hw/char/parallel.o
CC hw/char/pl011.o
CC hw/char/serial.o
CC hw/char/serial-isa.o
CC hw/char/serial-pci.o
CC hw/char/virtio-console.o
CC hw/char/xilinx_uartlite.o
CC hw/char/cadence_uart.o
CC hw/char/cmsdk-apb-uart.o
CC hw/char/etraxfs_ser.o
CC hw/char/debugcon.o
CC hw/char/grlib_apbuart.o
CC hw/char/imx_serial.o
CC hw/char/lm32_juart.o
CC hw/char/lm32_uart.o
CC hw/char/milkymist-uart.o
CC hw/char/sclpconsole.o
CC hw/char/sclpconsole-lm.o
CC hw/core/qdev.o
CC hw/core/qdev-properties.o
CC hw/core/bus.o
CC hw/core/reset.o
CC hw/core/fw-path-provider.o
CC hw/core/irq.o
CC hw/core/hotplug.o
CC hw/core/nmi.o
CC hw/core/empty_slot.o
CC hw/core/stream.o
CC hw/core/ptimer.o
CC hw/core/sysbus.o
CC hw/core/machine.o
CC hw/core/loader.o
CC hw/core/loader-fit.o
CC hw/core/qdev-properties-system.o
CC hw/core/register.o
CC hw/core/or-irq.o
CC hw/core/platform-bus.o
CC hw/cpu/core.o
CC hw/display/ads7846.o
CC hw/display/cirrus_vga.o
CC hw/display/g364fb.o
CC hw/display/jazz_led.o
CC hw/display/pl110.o
CC hw/display/ssd0303.o
CC hw/display/ssd0323.o
CC hw/display/vga-pci.o
CC hw/display/vga-isa.o
CC hw/display/vga-isa-mm.o
CC hw/display/vmware_vga.o
CC hw/display/blizzard.o
CC hw/display/exynos4210_fimd.o
CC hw/display/framebuffer.o
CC hw/display/milkymist-vgafb.o
CC hw/display/tc6393xb.o
CC hw/display/milkymist-tmu2.o
CC hw/dma/puv3_dma.o
CC hw/dma/rc4030.o
CC hw/dma/pl080.o
CC hw/dma/pl330.o
CC hw/dma/i82374.o
CC hw/dma/i8257.o
CC hw/dma/xilinx_axidma.o
CC hw/dma/xlnx-zynq-devcfg.o
CC hw/dma/etraxfs_dma.o
CC hw/dma/sparc32_dma.o
CC hw/gpio/max7310.o
CC hw/gpio/pl061.o
CC hw/gpio/puv3_gpio.o
CC hw/gpio/zaurus.o
CC hw/gpio/mpc8xxx.o
CC hw/gpio/gpio_key.o
CC hw/i2c/core.o
CC hw/i2c/smbus.o
CC hw/i2c/smbus_eeprom.o
CC hw/i2c/i2c-ddc.o
CC hw/i2c/versatile_i2c.o
CC hw/i2c/smbus_ich9.o
CC hw/i2c/pm_smbus.o
CC hw/i2c/bitbang_i2c.o
CC hw/i2c/exynos4210_i2c.o
CC hw/i2c/imx_i2c.o
CC hw/i2c/aspeed_i2c.o
CC hw/ide/core.o
CC hw/ide/atapi.o
CC hw/ide/qdev.o
CC hw/ide/pci.o
CC hw/ide/isa.o
CC hw/ide/piix.o
CC hw/ide/cmd646.o
CC hw/ide/macio.o
CC hw/ide/mmio.o
CC hw/ide/via.o
CC hw/ide/microdrive.o
CC hw/ide/ahci.o
CC hw/ide/ich.o
CC hw/ide/ahci-allwinner.o
CC hw/ide/sii3112.o
CC hw/input/adb.o
CC hw/input/adb-mouse.o
CC hw/input/adb-kbd.o
CC hw/input/hid.o
CC hw/input/lm832x.o
CC hw/input/pckbd.o
CC hw/input/pl050.o
CC hw/input/ps2.o
CC hw/input/stellaris_input.o
CC hw/input/tsc2005.o
CC hw/input/virtio-input.o
CC hw/input/virtio-input-hid.o
CC hw/input/virtio-input-host.o
CC hw/intc/heathrow_pic.o
CC hw/intc/i8259_common.o
CC hw/intc/i8259.o
CC hw/intc/pl190.o
CC hw/intc/puv3_intc.o
CC hw/intc/xilinx_intc.o
CC hw/intc/etraxfs_pic.o
CC hw/intc/imx_avic.o
CC hw/intc/lm32_pic.o
CC hw/intc/realview_gic.o
CC hw/intc/slavio_intctl.o
CC hw/intc/ioapic_common.o
CC hw/intc/arm_gic_common.o
CC hw/intc/arm_gic.o
CC hw/intc/arm_gicv2m.o
CC hw/intc/arm_gicv3_common.o
CC hw/intc/arm_gicv3.o
CC hw/intc/arm_gicv3_dist.o
CC hw/intc/arm_gicv3_redist.o
CC hw/intc/arm_gicv3_its_common.o
CC hw/intc/openpic.o
CC hw/intc/intc.o
CC hw/ipack/ipack.o
CC hw/ipack/tpci200.o
CC hw/ipmi/ipmi.o
CC hw/ipmi/ipmi_bmc_sim.o
CC hw/ipmi/ipmi_bmc_extern.o
CC hw/ipmi/isa_ipmi_kcs.o
CC hw/ipmi/isa_ipmi_bt.o
CC hw/isa/isa-bus.o
CC hw/isa/apm.o
CC hw/isa/i82378.o
CC hw/isa/pc87312.o
CC hw/isa/piix4.o
CC hw/isa/vt82c686.o
CC hw/mem/pc-dimm.o
CC hw/mem/nvdimm.o
CC hw/misc/applesmc.o
CC hw/misc/max111x.o
CC hw/misc/tmp105.o
CC hw/misc/tmp421.o
CC hw/misc/debugexit.o
CC hw/misc/sga.o
CC hw/misc/pc-testdev.o
CC hw/misc/pci-testdev.o
CC hw/misc/edu.o
CC hw/misc/unimp.o
CC hw/misc/vmcoreinfo.o
CC hw/misc/arm_l2x0.o
CC hw/misc/arm_integrator_debug.o
CC hw/misc/a9scu.o
CC hw/misc/arm11scu.o
CC hw/misc/puv3_pm.o
CC hw/misc/macio/macio.o
CC hw/misc/macio/cuda.o
CC hw/misc/macio/mac_dbdma.o
CC hw/net/dp8393x.o
CC hw/net/ne2000.o
CC hw/net/eepro100.o
CC hw/net/pcnet-pci.o
CC hw/net/pcnet.o
CC hw/net/e1000.o
CC hw/net/e1000x_common.o
CC hw/net/net_tx_pkt.o
CC hw/net/net_rx_pkt.o
CC hw/net/e1000e.o
CC hw/net/e1000e_core.o
CC hw/net/rtl8139.o
CC hw/net/vmxnet3.o
CC hw/net/smc91c111.o
CC hw/net/lan9118.o
CC hw/net/ne2000-isa.o
CC hw/net/opencores_eth.o
CC hw/net/xgmac.o
CC hw/net/mipsnet.o
CC hw/net/xilinx_axienet.o
CC hw/net/allwinner_emac.o
CC hw/net/imx_fec.o
CC hw/net/cadence_gem.o
CC hw/net/stellaris_enet.o
CC hw/net/lance.o
CC hw/net/sunhme.o
CC hw/net/ftgmac100.o
CC hw/net/sungem.o
CC hw/net/rocker/rocker.o
CC hw/net/rocker/rocker_fp.o
CC hw/net/rocker/rocker_desc.o
CC hw/net/rocker/rocker_world.o
CC hw/net/rocker/rocker_of_dpa.o
CC hw/nvram/ds1225y.o
CC hw/nvram/eeprom93xx.o
CC hw/nvram/eeprom_at24c.o
CC hw/nvram/fw_cfg.o
CC hw/nvram/chrp_nvram.o
CC hw/nvram/mac_nvram.o
CC hw/pci-bridge/pci_bridge_dev.o
CC hw/pci-bridge/pcie_root_port.o
CC hw/pci-bridge/gen_pcie_root_port.o
CC hw/pci-bridge/pcie_pci_bridge.o
CC hw/pci-bridge/pci_expander_bridge.o
CC hw/pci-bridge/xio3130_upstream.o
CC hw/pci-bridge/xio3130_downstream.o
CC hw/pci-bridge/ioh3420.o
CC hw/pci-bridge/i82801b11.o
CC hw/pci-bridge/dec.o
CC hw/pci-host/pam.o
CC hw/pci-host/prep.o
CC hw/pci-host/grackle.o
CC hw/pci-host/uninorth.o
CC hw/pci-host/ppce500.o
CC hw/pci-host/versatile.o
CC hw/pci-host/apb.o
CC hw/pci-host/bonito.o
CC hw/pci-host/piix.o
CC hw/pci-host/q35.o
CC hw/pci-host/gpex.o
CC hw/pci-host/xilinx-pcie.o
CC hw/pci/pci.o
CC hw/pci/pci_bridge.o
CC hw/pci/msix.o
CC hw/pci/msi.o
CC hw/pci/shpc.o
CC hw/pci/slotid_cap.o
CC hw/pci/pci_host.o
CC hw/pci/pcie_host.o
CC hw/pci/pcie.o
CC hw/pci/pcie_aer.o
CC hw/pci/pcie_port.o
CC hw/pci/pci-stub.o
CC hw/pcmcia/pcmcia.o
CC hw/scsi/scsi-disk.o
CC hw/scsi/scsi-generic.o
CC hw/scsi/scsi-bus.o
CC hw/scsi/lsi53c895a.o
CC hw/scsi/mptsas.o
CC hw/scsi/mptconfig.o
CC hw/scsi/mptendian.o
CC hw/scsi/megasas.o
CC hw/scsi/vmw_pvscsi.o
CC hw/scsi/esp.o
CC hw/scsi/esp-pci.o
CC hw/sd/pl181.o
CC hw/sd/ssi-sd.o
CC hw/sd/sd.o
CC hw/sd/core.o
CC hw/sd/sdhci.o
CC hw/smbios/smbios.o
CC hw/smbios/smbios_type_38.o
CC hw/smbios/smbios-stub.o
CC hw/smbios/smbios_type_38-stub.o
CC hw/ssi/pl022.o
CC hw/ssi/ssi.o
CC hw/ssi/xilinx_spi.o
CC hw/ssi/xilinx_spips.o
CC hw/ssi/aspeed_smc.o
CC hw/ssi/stm32f2xx_spi.o
CC hw/ssi/mss-spi.o
CC hw/timer/arm_timer.o
CC hw/timer/arm_mptimer.o
CC hw/timer/armv7m_systick.o
CC hw/timer/a9gtimer.o
CC hw/timer/cadence_ttc.o
CC hw/timer/ds1338.o
CC hw/timer/hpet.o
CC hw/timer/i8254_common.o
CC hw/timer/i8254.o
CC hw/timer/m48t59.o
CC hw/timer/m48t59-isa.o
CC hw/timer/pl031.o
CC hw/timer/puv3_ost.o
CC hw/timer/xilinx_timer.o
CC hw/timer/twl92230.o
CC hw/timer/slavio_timer.o
CC hw/timer/etraxfs_timer.o
CC hw/timer/grlib_gptimer.o
CC hw/timer/imx_epit.o
CC hw/timer/imx_gpt.o
CC hw/timer/lm32_timer.o
CC hw/timer/milkymist-sysctl.o
CC hw/timer/stm32f2xx_timer.o
CC hw/timer/aspeed_timer.o
CC hw/timer/sun4v-rtc.o
CC hw/timer/cmsdk-apb-timer.o
CC hw/timer/mss-timer.o
CC hw/tpm/tpm_util.o
CC hw/tpm/tpm_tis.o
CC hw/tpm/tpm_emulator.o
CC hw/usb/core.o
CC hw/usb/combined-packet.o
CC hw/usb/bus.o
CC hw/usb/libhw.o
CC hw/usb/desc.o
CC hw/usb/desc-msos.o
CC hw/usb/hcd-uhci.o
CC hw/usb/hcd-ohci.o
CC hw/usb/hcd-ehci.o
CC hw/usb/hcd-ehci-pci.o
CC hw/usb/hcd-ehci-sysbus.o
CC hw/usb/hcd-xhci.o
CC hw/usb/hcd-xhci-nec.o
CC hw/usb/hcd-musb.o
CC hw/usb/dev-hub.o
CC hw/usb/dev-hid.o
CC hw/usb/dev-wacom.o
CC hw/usb/dev-storage.o
CC hw/usb/dev-uas.o
CC hw/usb/dev-audio.o
CC hw/usb/dev-serial.o
CC hw/usb/dev-network.o
CC hw/usb/dev-bluetooth.o
CC hw/usb/dev-smartcard-reader.o
CC hw/usb/ccid-card-passthru.o
CC hw/usb/ccid-card-emulated.o
CC hw/usb/dev-mtp.o
CC hw/usb/redirect.o
CC hw/usb/quirks.o
CC hw/usb/host-libusb.o
CC hw/usb/host-legacy.o
CC hw/usb/host-stub.o
CC hw/virtio/virtio-rng.o
CC hw/virtio/virtio-pci.o
CC hw/virtio/virtio-bus.o
CC hw/virtio/virtio-mmio.o
CC hw/virtio/vhost-stub.o
CC hw/watchdog/watchdog.o
CC hw/watchdog/wdt_i6300esb.o
CC hw/watchdog/wdt_ib700.o
CC hw/watchdog/wdt_diag288.o
CC hw/watchdog/wdt_aspeed.o
CC migration/migration.o
CC migration/socket.o
CC migration/fd.o
CC migration/exec.o
CC migration/tls.o
CC migration/channel.o
CC migration/savevm.o
CC migration/colo-comm.o
CC migration/colo.o
CC migration/colo-failover.o
CC migration/vmstate.o
CC migration/vmstate-types.o
CC migration/page_cache.o
CC migration/qemu-file.o
CC migration/global_state.o
CC migration/qemu-file-channel.o
CC migration/xbzrle.o
CC migration/postcopy-ram.o
CC migration/qjson.o
CC migration/block.o
CC net/net.o
CC net/queue.o
CC net/checksum.o
CC net/util.o
CC net/hub.o
CC net/socket.o
CC net/dump.o
CC net/eth.o
CC net/l2tpv3.o
CC net/vhost-user.o
CC net/slirp.o
CC net/filter.o
CC net/filter-buffer.o
CC net/filter-mirror.o
CC net/colo-compare.o
CC net/colo.o
CC net/filter-rewriter.o
CC net/filter-replay.o
CC net/tap.o
CC net/tap-linux.o
CC qom/cpu.o
CC replay/replay.o
CC replay/replay-internal.o
CC replay/replay-events.o
CC replay/replay-time.o
CC replay/replay-input.o
CC replay/replay-char.o
CC replay/replay-snapshot.o
CC replay/replay-net.o
CC replay/replay-audio.o
CC slirp/cksum.o
CC slirp/if.o
CC slirp/ip_icmp.o
CC slirp/ip6_icmp.o
CC slirp/ip6_input.o
CC slirp/ip6_output.o
CC slirp/ip_input.o
CC slirp/ip_output.o
CC slirp/dnssearch.o
CC slirp/dhcpv6.o
CC slirp/slirp.o
CC slirp/mbuf.o
CC slirp/misc.o
CC slirp/sbuf.o
CC slirp/socket.o
CC slirp/tcp_input.o
CC slirp/tcp_output.o
CC slirp/tcp_subr.o
CC slirp/tcp_timer.o
CC slirp/udp.o
CC slirp/udp6.o
CC slirp/bootp.o
CC slirp/tftp.o
CC slirp/arp_table.o
CC slirp/ndp_table.o
CC slirp/ncsi.o
CC ui/keymaps.o
CC ui/console.o
CC ui/cursor.o
CC ui/qemu-pixman.o
CC ui/input.o
CC ui/input-legacy.o
CC ui/input-linux.o
CC ui/sdl2.o
CC ui/sdl2-input.o
CC ui/sdl2-2d.o
CC ui/sdl2-gl.o
CC ui/x_keymap.o
CC ui/curses.o
CC ui/vnc.o
CC ui/vnc-enc-zlib.o
CC ui/vnc-enc-hextile.o
CC ui/vnc-enc-tight.o
CC ui/vnc-palette.o
CC ui/vnc-enc-zrle.o
CC ui/vnc-auth-vencrypt.o
CC ui/vnc-auth-sasl.o
CC ui/vnc-ws.o
CC ui/vnc-jobs.o
CC ui/gtk.o
VERT ui/shader/texture-blit-vert.h
VERT ui/shader/texture-blit-flip-vert.h
FRAG ui/shader/texture-blit-frag.h
CC ui/console-gl.o
CC ui/egl-helpers.o
CC ui/egl-context.o
CC ui/egl-headless.o
CC ui/gtk-gl-area.o
CC chardev/char.o
CC chardev/char-fd.o
CC chardev/char-fe.o
CC chardev/char-file.o
CC chardev/char-io.o
CC chardev/char-mux.o
CC chardev/char-null.o
CC chardev/char-parallel.o
CC chardev/char-pipe.o
CC chardev/char-pty.o
CC chardev/char-ringbuf.o
CC chardev/char-serial.o
CC chardev/char-socket.o
CC chardev/char-stdio.o
CC chardev/char-udp.o
CCAS s390-ccw/start.o
LINK tests/qemu-iotests/socket_scm_helper
CC s390-ccw/main.o
GEN qemu-doc.html
GEN qemu-doc.txt
GEN qemu.1
CC s390-ccw/bootmap.o
In file included from /var/tmp/patchew-tester-tmp-dep3o2js/src/pc-bios/s390-ccw/bootmap.c:13:0:
/var/tmp/patchew-tester-tmp-dep3o2js/src/pc-bios/s390-ccw/bootmap.c: In function ‘run_eckd_boot_script’:
/var/tmp/patchew-tester-tmp-dep3o2js/src/pc-bios/s390-ccw/bootmap.h:326:16: error: ‘next_block_nr’ may be used uninitialized in this function [-Werror=maybe-uninitialized]
IPL_assert(virtio_read(blockno, buffer) == 0, errmsg);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~
/var/tmp/patchew-tester-tmp-dep3o2js/src/pc-bios/s390-ccw/bootmap.c:218:49: note: ‘next_block_nr’ was declared here
block_number_t cur_block_nr, prev_block_nr, next_block_nr;
^~~~~~~~~~~~~
In file included from /var/tmp/patchew-tester-tmp-dep3o2js/src/pc-bios/s390-ccw/bootmap.c:13:0:
/var/tmp/patchew-tester-tmp-dep3o2js/src/pc-bios/s390-ccw/bootmap.h:326:16: error: ‘prev_block_nr’ may be used uninitialized in this function [-Werror=maybe-uninitialized]
IPL_assert(virtio_read(blockno, buffer) == 0, errmsg);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~
/var/tmp/patchew-tester-tmp-dep3o2js/src/pc-bios/s390-ccw/bootmap.c:218:34: note: ‘prev_block_nr’ was declared here
block_number_t cur_block_nr, prev_block_nr, next_block_nr;
^~~~~~~~~~~~~
cc1: all warnings being treated as errors
make[1]: *** [/var/tmp/patchew-tester-tmp-dep3o2js/src/rules.mak:66: bootmap.o] Error 1
make: *** [Makefile:420: romsubdir-s390-ccw] Error 2
make: *** Waiting for unfinished jobs....
=== OUTPUT END ===
Test command exited with code: 2
---
Email generated automatically by Patchew [http://patchew.org/].
Please send your feedback to patchew-devel@freelists.org
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [Qemu-devel] [PATCH v3 1/8] s390-ccw: update libc
2018-01-15 16:44 ` [Qemu-devel] [PATCH v3 1/8] s390-ccw: update libc Collin L. Walling
@ 2018-01-15 17:05 ` Eric Blake
2018-01-15 17:23 ` Collin L. Walling
0 siblings, 1 reply; 32+ messages in thread
From: Eric Blake @ 2018-01-15 17:05 UTC (permalink / raw)
To: Collin L. Walling, qemu-s390x, qemu-devel
Cc: frankja, thuth, cohuck, david, alifm, borntraeger
[-- Attachment #1: Type: text/plain, Size: 4782 bytes --]
On 01/15/2018 10:44 AM, Collin L. Walling wrote:
> Moved:
> memcmp from bootmap.h to libc.h (renamed from _memcmp)
> strlen from sclp.c to libc.h (renamed from _strlen)
>
> Added C standard functions:
> isdigit
> atoi
>
> Added non-C standard function:
> itostr
>
> Signed-off-by: Collin L. Walling <walling@linux.vnet.ibm.com>
> Acked-by: Christian Borntraeger <borntraeger@de.ibm.com>
> Reviewed-by: Janosch Frank <frankja@linux.vnet.ibm.com>
> ---
> +++ b/pc-bios/s390-ccw/libc.c
> @@ -0,0 +1,83 @@
> +/*
> + * libc-style definitions and functions
> + *
> + * This code is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU General Public License as published by the
> + * Free Software Foundation; either version 2 of the License, or (at your
> + * option) any later version.
I'm not a lawyer, but generically, the GPL and its variants depend on a
copyright owner to actually work. You may want to add a copyright line.
> + */
> +
> +#include "libc.h"
> +#include "s390-ccw.h"
> +
> +/**
> + * atoi:
> + * @str: the string to be converted.
> + *
> + * Given a string @str, convert it to an integer. Any non-numerical value
> + * will terminate the conversion.
> + *
> + * Returns: an integer converted from the string @str.
> + */
> +int atoi(const char *str)
> +{
> + int i;
> + int val = 0;
> +
> + for (i = 0; str[i]; i++) {
> + char c = str[i];
> + if (!isdigit(c)) {
> + break;
> + }
> + val *= 10;
> + val += c - '0';
Silently gives garbage on integer overflow, but matches the fact that
POSIX atoi() can't flag errors. However, it does not handle leading
whitespace nor '-', which means it is NOT doing a POSIX-compatible
atoi() implementation; naming it atoi() is perhaps thus a disservice to
end users.
> + }
> +
> + return val;
> +}
> +
> +/**
> + * itostr:
> + * @num: the integer to be converted.
> + * @str: a pointer to a string to store the conversion.
> + * @len: the length of the passed string.
> + *
> + * Given an integer @num, convert it to a string. The string @str must be
> + * allocated beforehand. The resulting string will be null terminated and
> + * returned.
> + *
> + * Returns: the string @str of the converted integer @num.
> + */
> +static char *_itostr(int num, char *str, size_t len)
> +{
> + long num_len = 1;
> + int tmp = num;
> + int i;
> +
> + /* Count length of num */
> + while ((tmp /= 10) > 0) {
> + num_len++;
> + }
> +
> + /* Check if we have enough space for num and null */
> + if (len <= num_len) {
> + return 0;
> + }
> +
> + /* Convert int to string */
> + for (i = num_len - 1; i >= 0; i--) {
> + str[i] = num % 10 + '0';
> + num /= 10;
> + }
No handling of negative integers?
> +
> + str[num_len] = '\0';
> +
> + return str;
> +}
> +
> +char *itostr(int num, char *str, size_t len)
> +{
> + char *tmp = _itostr(num, str, len);
> + IPL_assert(tmp != 0, "array too small for itostr conversion");
> + return tmp;
> +}
> diff --git a/pc-bios/s390-ccw/libc.h b/pc-bios/s390-ccw/libc.h
> index 0142ea8..00268e3 100644
> --- a/pc-bios/s390-ccw/libc.h
> +++ b/pc-bios/s390-ccw/libc.h
> @@ -42,4 +42,35 @@ static inline void *memcpy(void *s1, const void *s2, size_t n)
> return s1;
> }
>
> +static inline int memcmp(const void *s1, const void *s2, size_t n)
> +{
> + int i;
> + const uint8_t *p1 = s1, *p2 = s2;
> +
> + for (i = 0; i < n; i++) {
Are you safe comparing int to size_t, or would it be safer to use size_t
for your iterator? I guess this shim is unlikely to be abused by
someone trying to compare 2G of memory at once.
> + if (p1[i] != p2[i]) {
> + return p1[i] > p2[i] ? 1 : -1;
> + }
> + }
Not the fastest of implementations, but that probably doesn't matter
(the complexity of writing a vectored implementation that works on a
long or larger per loop iteration is important in a generic libc, but
less so in a compatibility shim).
> +
> + return 0;
> +}
> +
> +static inline size_t strlen(const char *str)
> +{
> + size_t i;
> + for (i = 0; *str; i++) {
> + str++;
> + }
> + return i;
Again, not the fastest implementation, but that shouldn't matter.
> +}
> +
> +static inline int isdigit(int c)
> +{
> + return (c >= '0') && (c <= '9');
> +}
> +
> +int atoi(const char *str);
> +char *itostr(int num, char *str, size_t len);
> +
> #endif
--
Eric Blake, Principal Software Engineer
Red Hat, Inc. +1-919-301-3266
Virtualization: qemu.org | libvirt.org
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 619 bytes --]
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [Qemu-devel] [PATCH v3 1/8] s390-ccw: update libc
2018-01-15 17:05 ` Eric Blake
@ 2018-01-15 17:23 ` Collin L. Walling
2018-01-16 10:00 ` Thomas Huth
2018-01-16 11:07 ` Christian Borntraeger
0 siblings, 2 replies; 32+ messages in thread
From: Collin L. Walling @ 2018-01-15 17:23 UTC (permalink / raw)
To: Eric Blake, qemu-s390x, qemu-devel
Cc: frankja, thuth, cohuck, david, alifm, borntraeger
On 01/15/2018 12:05 PM, Eric Blake wrote:
> On 01/15/2018 10:44 AM, Collin L. Walling wrote:
>> Moved:
>> memcmp from bootmap.h to libc.h (renamed from _memcmp)
>> strlen from sclp.c to libc.h (renamed from _strlen)
>>
>> Added C standard functions:
>> isdigit
>> atoi
>>
>> Added non-C standard function:
>> itostr
>>
>> Signed-off-by: Collin L. Walling <walling@linux.vnet.ibm.com>
>> Acked-by: Christian Borntraeger <borntraeger@de.ibm.com>
>> Reviewed-by: Janosch Frank <frankja@linux.vnet.ibm.com>
>> ---
>> +++ b/pc-bios/s390-ccw/libc.c
>> @@ -0,0 +1,83 @@
>> +/*
>> + * libc-style definitions and functions
>> + *
>> + * This code is free software; you can redistribute it and/or modify it
>> + * under the terms of the GNU General Public License as published by the
>> + * Free Software Foundation; either version 2 of the License, or (at your
>> + * option) any later version.
> I'm not a lawyer, but generically, the GPL and its variants depend on a
> copyright owner to actually work. You may want to add a copyright line.
I'll have to check on that. I was not the original author of the libc.h
file.
>
>> + */
>> +
>> +#include "libc.h"
>> +#include "s390-ccw.h"
>> +
>> +/**
>> + * atoi:
>> + * @str: the string to be converted.
>> + *
>> + * Given a string @str, convert it to an integer. Any non-numerical value
>> + * will terminate the conversion.
>> + *
>> + * Returns: an integer converted from the string @str.
>> + */
>> +int atoi(const char *str)
>> +{
>> + int i;
>> + int val = 0;
>> +
>> + for (i = 0; str[i]; i++) {
>> + char c = str[i];
>> + if (!isdigit(c)) {
>> + break;
>> + }
>> + val *= 10;
>> + val += c - '0';
> Silently gives garbage on integer overflow, but matches the fact that
> POSIX atoi() can't flag errors. However, it does not handle leading
> whitespace nor '-', which means it is NOT doing a POSIX-compatible
> atoi() implementation; naming it atoi() is perhaps thus a disservice to
> end users.
Fair enough. Perhaps the "strtoi" convention suits this better.
>
>> + }
>> +
>> + return val;
>> +}
>> +
>> +/**
>> + * itostr:
>> + * @num: the integer to be converted.
>> + * @str: a pointer to a string to store the conversion.
>> + * @len: the length of the passed string.
>> + *
>> + * Given an integer @num, convert it to a string. The string @str must be
>> + * allocated beforehand. The resulting string will be null terminated and
>> + * returned.
>> + *
>> + * Returns: the string @str of the converted integer @num.
>> + */
>> +static char *_itostr(int num, char *str, size_t len)
>> +{
>> + long num_len = 1;
>> + int tmp = num;
>> + int i;
>> +
>> + /* Count length of num */
>> + while ((tmp /= 10) > 0) {
>> + num_len++;
>> + }
>> +
>> + /* Check if we have enough space for num and null */
>> + if (len <= num_len) {
>> + return 0;
>> + }
>> +
>> + /* Convert int to string */
>> + for (i = num_len - 1; i >= 0; i--) {
>> + str[i] = num % 10 + '0';
>> + num /= 10;
>> + }
> No handling of negative integers?
It's not necessary for the purpose it serves. The functions that
call itostr do some preprocessing to reject the negative sign and
the string. We only care about positive numbers in the use cases.
>
>> +
>> + str[num_len] = '\0';
>> +
>> + return str;
>> +}
>> +
>> +char *itostr(int num, char *str, size_t len)
>> +{
>> + char *tmp = _itostr(num, str, len);
>> + IPL_assert(tmp != 0, "array too small for itostr conversion");
>> + return tmp;
>> +}
>> diff --git a/pc-bios/s390-ccw/libc.h b/pc-bios/s390-ccw/libc.h
>> index 0142ea8..00268e3 100644
>> --- a/pc-bios/s390-ccw/libc.h
>> +++ b/pc-bios/s390-ccw/libc.h
>> @@ -42,4 +42,35 @@ static inline void *memcpy(void *s1, const void *s2, size_t n)
>> return s1;
>> }
>>
>> +static inline int memcmp(const void *s1, const void *s2, size_t n)
>> +{
>> + int i;
>> + const uint8_t *p1 = s1, *p2 = s2;
>> +
>> + for (i = 0; i < n; i++) {
> Are you safe comparing int to size_t, or would it be safer to use size_t
> for your iterator? I guess this shim is unlikely to be abused by
> someone trying to compare 2G of memory at once.
It probably makes more sense to declare i as size_t, at least for the sake
of consistency. I'll do some clean up.
>
>> + if (p1[i] != p2[i]) {
>> + return p1[i] > p2[i] ? 1 : -1;
>> + }
>> + }
> Not the fastest of implementations, but that probably doesn't matter
> (the complexity of writing a vectored implementation that works on a
> long or larger per loop iteration is important in a generic libc, but
> less so in a compatibility shim).
>
>> +
>> + return 0;
>> +}
>> +
>> +static inline size_t strlen(const char *str)
>> +{
>> + size_t i;
>> + for (i = 0; *str; i++) {
>> + str++;
>> + }
>> + return i;
> Again, not the fastest implementation, but that shouldn't matter.
>
>> +}
>> +
>> +static inline int isdigit(int c)
>> +{
>> + return (c >= '0') && (c <= '9');
>> +}
>> +
>> +int atoi(const char *str);
>> +char *itostr(int num, char *str, size_t len);
>> +
>> #endif
--
- Collin L Walling
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [Qemu-devel] [PATCH v3 1/8] s390-ccw: update libc
2018-01-15 17:23 ` Collin L. Walling
@ 2018-01-16 10:00 ` Thomas Huth
2018-01-16 17:19 ` [Qemu-devel] [qemu-s390x] " Collin L. Walling
2018-01-16 11:07 ` Christian Borntraeger
1 sibling, 1 reply; 32+ messages in thread
From: Thomas Huth @ 2018-01-16 10:00 UTC (permalink / raw)
To: Collin L. Walling, Eric Blake, qemu-s390x, qemu-devel
Cc: frankja, cohuck, david, alifm, borntraeger
On 15.01.2018 18:23, Collin L. Walling wrote:
> On 01/15/2018 12:05 PM, Eric Blake wrote:
>> On 01/15/2018 10:44 AM, Collin L. Walling wrote:
[...]
>>> +/**
>>> + * atoi:
>>> + * @str: the string to be converted.
>>> + *
>>> + * Given a string @str, convert it to an integer. Any non-numerical
>>> value
>>> + * will terminate the conversion.
>>> + *
>>> + * Returns: an integer converted from the string @str.
>>> + */
>>> +int atoi(const char *str)
>>> +{
>>> + int i;
>>> + int val = 0;
>>> +
>>> + for (i = 0; str[i]; i++) {
>>> + char c = str[i];
>>> + if (!isdigit(c)) {
>>> + break;
>>> + }
>>> + val *= 10;
>>> + val += c - '0';
>> Silently gives garbage on integer overflow, but matches the fact that
>> POSIX atoi() can't flag errors. However, it does not handle leading
>> whitespace nor '-', which means it is NOT doing a POSIX-compatible
>> atoi() implementation; naming it atoi() is perhaps thus a disservice to
>> end users.
>
> Fair enough. Perhaps the "strtoi" convention suits this better.
Or maybe simply add an assert(str[0] != '-') for now. If we ever hit the
assert, we can still add the support for negative numbers if necessary.
>>> +static inline size_t strlen(const char *str)
>>> +{
>>> + size_t i;
>>> + for (i = 0; *str; i++) {
>>> + str++;
>>> + }
>>> + return i;
>> Again, not the fastest implementation, but that shouldn't matter.
Yes, indeed, speed does not really matter here for the some few bytes
that are handled during the life-time of the s390-ccw bios.
>>> +}
>>> +
>>> +static inline int isdigit(int c)
>>> +{
>>> + return (c >= '0') && (c <= '9');
>>> +}
>>> +
>>> +int atoi(const char *str);
>>> +char *itostr(int num, char *str, size_t len);
>>> +
>>> #endif
>
>
Thomas
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [Qemu-devel] [qemu-s390x] [PATCH v3 1/8] s390-ccw: update libc
2018-01-15 17:23 ` Collin L. Walling
2018-01-16 10:00 ` Thomas Huth
@ 2018-01-16 11:07 ` Christian Borntraeger
2018-01-16 15:32 ` Collin L. Walling
1 sibling, 1 reply; 32+ messages in thread
From: Christian Borntraeger @ 2018-01-16 11:07 UTC (permalink / raw)
To: Collin L. Walling, Eric Blake, qemu-s390x, qemu-devel
Cc: frankja, thuth, cohuck, david, alifm
On 01/15/2018 06:23 PM, Collin L. Walling wrote:
> On 01/15/2018 12:05 PM, Eric Blake wrote:
>> On 01/15/2018 10:44 AM, Collin L. Walling wrote:
>>> Moved:
>>> memcmp from bootmap.h to libc.h (renamed from _memcmp)
>>> strlen from sclp.c to libc.h (renamed from _strlen)
>>>
>>> Added C standard functions:
>>> isdigit
>>> atoi
>>>
>>> Added non-C standard function:
>>> itostr
>>>
>>> Signed-off-by: Collin L. Walling <walling@linux.vnet.ibm.com>
>>> Acked-by: Christian Borntraeger <borntraeger@de.ibm.com>
>>> Reviewed-by: Janosch Frank <frankja@linux.vnet.ibm.com>
>>> ---
>>> +++ b/pc-bios/s390-ccw/libc.c
>>> @@ -0,0 +1,83 @@
>>> +/*
>>> + * libc-style definitions and functions
>>> + *
>>> + * This code is free software; you can redistribute it and/or modify it
>>> + * under the terms of the GNU General Public License as published by the
>>> + * Free Software Foundation; either version 2 of the License, or (at your
>>> + * option) any later version.
>> I'm not a lawyer, but generically, the GPL and its variants depend on a
>> copyright owner to actually work. You may want to add a copyright line.
>
>
> I'll have to check on that. I was not the original author of the libc.h file.
I think you can add the normal IBM Copyright statement. (I think all authors could add theirs as well)
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [Qemu-devel] [PATCH v3 2/8] s390-ccw: ipl structs for eckd cdl/ldl
2018-01-15 16:44 ` [Qemu-devel] [PATCH v3 2/8] s390-ccw: ipl structs for eckd cdl/ldl Collin L. Walling
@ 2018-01-16 12:32 ` Thomas Huth
2018-01-16 15:21 ` [Qemu-devel] [qemu-s390x] " Collin L. Walling
0 siblings, 1 reply; 32+ messages in thread
From: Thomas Huth @ 2018-01-16 12:32 UTC (permalink / raw)
To: Collin L. Walling, qemu-s390x, qemu-devel
Cc: borntraeger, frankja, cohuck, david, alifm
On 15.01.2018 17:44, Collin L. Walling wrote:
> ECKD DASDs have different IPL structures for CDL and LDL
> formats. The current Ipl1 and Ipl2 structs follow the CDL
> format, so we prepend "EckdCdl" to them. Boot info for LDL
> has been moved to a new struct: EckdLdlIpl1.
>
> Also introduce structs for IPL stages 1 and 1b and for
> disk geometry.
>
> Signed-off-by: Collin L. Walling <walling@linux.vnet.ibm.com>
> Acked-by: Janosch Frank <frankja@linux.vnet.ibm.com>
> ---
> pc-bios/s390-ccw/bootmap.c | 29 +++++++++++++-----------
> pc-bios/s390-ccw/bootmap.h | 55 +++++++++++++++++++++++++++++++++-------------
> 2 files changed, 56 insertions(+), 28 deletions(-)
>
> diff --git a/pc-bios/s390-ccw/bootmap.c b/pc-bios/s390-ccw/bootmap.c
> index 6f8e30f..29915e4 100644
> --- a/pc-bios/s390-ccw/bootmap.c
> +++ b/pc-bios/s390-ccw/bootmap.c
> @@ -221,9 +221,9 @@ static void run_eckd_boot_script(block_number_t mbr_block_nr)
> static void ipl_eckd_cdl(void)
> {
> XEckdMbr *mbr;
> - Ipl2 *ipl2 = (void *)sec;
> + EckdCdlIpl2 *ipl2 = (void *)sec;
> IplVolumeLabel *vlbl = (void *)sec;
> - block_number_t block_nr;
> + block_number_t mbr_block_nr;
>
> /* we have just read the block #0 and recognized it as "IPL1" */
> sclp_print("CDL\n");
> @@ -231,16 +231,13 @@ static void ipl_eckd_cdl(void)
> memset(sec, FREE_SPACE_FILLER, sizeof(sec));
> read_block(1, ipl2, "Cannot read IPL2 record at block 1");
>
> - mbr = &ipl2->u.x.mbr;
> + mbr = &ipl2->mbr;
> IPL_assert(magic_match(mbr, ZIPL_MAGIC), "No zIPL section in IPL2 record.");
> IPL_assert(block_size_ok(mbr->blockptr.xeckd.bptr.size),
> "Bad block size in zIPL section of IPL2 record.");
> IPL_assert(mbr->dev_type == DEV_TYPE_ECKD,
> "Non-ECKD device type in zIPL section of IPL2 record.");
>
> - /* save pointer to Boot Script */
> - block_nr = eckd_block_num((void *)&(mbr->blockptr));
> -
> memset(sec, FREE_SPACE_FILLER, sizeof(sec));
> read_block(2, vlbl, "Cannot read Volume Label at block 2");
Why did you move the block_nr = eckd_block_num(...) behind the
read_block() ? That sounds like you could different values here now. If
that has been done on purpose and is not a mistake, please add a proper
sentence about this to the patch description.
> IPL_assert(magic_match(vlbl->key, VOL1_MAGIC),
> @@ -249,7 +246,10 @@ static void ipl_eckd_cdl(void)
> "Invalid magic of volser block");
> print_volser(vlbl->f.volser);
>
> - run_eckd_boot_script(block_nr);
> + /* save pointer to Boot Script */
> + mbr_block_nr = eckd_block_num((void *)&mbr->blockptr);
> +
> + run_eckd_boot_script(mbr_block_nr);
> /* no return */
> }
>
> @@ -280,8 +280,8 @@ static void print_eckd_ldl_msg(ECKD_IPL_mode_t mode)
>
> static void ipl_eckd_ldl(ECKD_IPL_mode_t mode)
> {
> - block_number_t block_nr;
> - BootInfo *bip = (void *)(sec + 0x70); /* BootInfo is MBR for LDL */
> + block_number_t mbr_block_nr;
> + EckdLdlIpl1 *ipl1 = (void *)sec;
>
> if (mode != ECKD_LDL_UNLABELED) {
> print_eckd_ldl_msg(mode);
> @@ -292,15 +292,18 @@ static void ipl_eckd_ldl(ECKD_IPL_mode_t mode)
> memset(sec, FREE_SPACE_FILLER, sizeof(sec));
> read_block(0, sec, "Cannot read block 0 to grab boot info.");
> if (mode == ECKD_LDL_UNLABELED) {
> - if (!magic_match(bip->magic, ZIPL_MAGIC)) {
> + if (!magic_match(ipl1->boot_info.magic, ZIPL_MAGIC)) {
> return; /* not applicable layout */
> }
> sclp_print("unlabeled LDL.\n");
> }
> - verify_boot_info(bip);
> + verify_boot_info(&ipl1->boot_info);
> +
> + /* save pointer to Boot Script */
> + mbr_block_nr =
> + eckd_block_num((void *)&ipl1->boot_info.bp.ipl.bm_ptr.eckd.bptr);
Well, the original code fitted nicely in one line ... thus maybe better
keep the original variable name? (or use mbr_blk_nr or something similar
shorter?)
> - block_nr = eckd_block_num((void *)&(bip->bp.ipl.bm_ptr.eckd.bptr));
> - run_eckd_boot_script(block_nr);
> + run_eckd_boot_script(mbr_block_nr);
> /* no return */
> }
Thomas
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [Qemu-devel] [PATCH v3 3/8] s390-ccw: parse and set boot menu options
2018-01-15 16:44 ` [Qemu-devel] [PATCH v3 3/8] s390-ccw: parse and set boot menu options Collin L. Walling
@ 2018-01-16 12:44 ` Thomas Huth
2018-01-16 15:26 ` [Qemu-devel] [qemu-s390x] " Collin L. Walling
0 siblings, 1 reply; 32+ messages in thread
From: Thomas Huth @ 2018-01-16 12:44 UTC (permalink / raw)
To: Collin L. Walling, qemu-s390x, qemu-devel
Cc: borntraeger, frankja, cohuck, david, alifm
On 15.01.2018 17:44, Collin L. Walling wrote:
> Set boot menu options for an s390 guest and store them in
> the iplb. These options are set via the QEMU command line
> option:
>
> -boot menu=on|off[,splash-time=X]
>
> or via the libvirt domain xml:
>
> <os>
> <bootmenu enable='yes|no' timeout='X'/>
> </os>
>
> Where X represents some positive integer representing
> milliseconds.
>
> A loadparm other than 'prompt' will disable the menu and
> just boot the specified entry.
>
> Signed-off-by: Collin L. Walling <walling@linux.vnet.ibm.com>
> Reviewed-by: Janosch Frank <frankja@linux.vnet.ibm.com>
> ---
> hw/s390x/ipl.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++++
> hw/s390x/ipl.h | 11 ++++++++--
> pc-bios/s390-ccw/iplb.h | 8 ++++++--
> 3 files changed, 69 insertions(+), 4 deletions(-)
>
> diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c
> index 0d06fc1..81ba9ed 100644
> --- a/hw/s390x/ipl.c
> +++ b/hw/s390x/ipl.c
> @@ -23,6 +23,8 @@
> #include "hw/s390x/ebcdic.h"
> #include "ipl.h"
> #include "qemu/error-report.h"
> +#include "qemu/config-file.h"
> +#include "qemu/cutils.h"
>
> #define KERN_IMAGE_START 0x010000UL
> #define KERN_PARM_AREA 0x010480UL
> @@ -219,6 +221,55 @@ static Property s390_ipl_properties[] = {
> DEFINE_PROP_END_OF_LIST(),
> };
>
> +static void s390_ipl_set_boot_menu(IplParameterBlock *iplb)
> +{
> + QemuOptsList *plist = qemu_find_opts("boot-opts");
> + QemuOpts *opts = QTAILQ_FIRST(&plist->head);
> + uint8_t *flags;
> + uint16_t *timeout;
> + const char *tmp;
> + unsigned long result = 0;
> +
> + switch (iplb->pbt) {
> + case S390_IPL_TYPE_CCW:
> + flags = &iplb->ccw.boot_menu_flags;
> + timeout = &iplb->ccw.boot_menu_timeout;
> + break;
> + case S390_IPL_TYPE_QEMU_SCSI:
> + flags = &iplb->scsi.boot_menu_flags;
> + timeout = &iplb->scsi.boot_menu_timeout;
> + break;
> + default:
> + error_report("boot menu is not supported for this device type.");
> + return;
> + }
> +
> + /* In the absence of -boot menu, use zipl parameters */
> + if (!qemu_opt_get(opts, "menu")) {
> + *flags = BOOT_MENU_FLAG_ZIPL_OPTS;
> + } else if (boot_menu) {
> + *flags = BOOT_MENU_FLAG_BOOT_OPTS;
> +
> + tmp = qemu_opt_get(opts, "splash-time");
> +
> + if (tmp && qemu_strtoul(tmp, NULL, 10, &result)) {
> + error_report("splash-time value is invalid, forcing it to 0.");
It's likely not needed, but an explicit "*timeout = 0" would be fine
here, I think.
> + return;
> + }
> +
> + result /= 1000; /* Store timeout value as seconds */
Maybe rather do proper rounding:
result = (result + 500) / 1000;
?
> + if (result > 0xffff) {
> + error_report("splash-time value is greater than 65535000,"
> + " forcing it to 65535000.");
> + *timeout = 0xffff;
> + return;
> + }
> +
> + *timeout = cpu_to_be16(result);
> + }
> +}
> +
I've found just some nits ... patch looks fine in general, so feel free
to add:
Reviewed-by: Thomas Huth <thuth@redhat.com>
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [Qemu-devel] [qemu-s390x] [PATCH v3 2/8] s390-ccw: ipl structs for eckd cdl/ldl
2018-01-16 12:32 ` Thomas Huth
@ 2018-01-16 15:21 ` Collin L. Walling
0 siblings, 0 replies; 32+ messages in thread
From: Collin L. Walling @ 2018-01-16 15:21 UTC (permalink / raw)
To: Thomas Huth, qemu-s390x, qemu-devel
Cc: alifm, borntraeger, cohuck, david, frankja
On 01/16/2018 07:32 AM, Thomas Huth wrote:
> On 15.01.2018 17:44, Collin L. Walling wrote:
>> ECKD DASDs have different IPL structures for CDL and LDL
>> formats. The current Ipl1 and Ipl2 structs follow the CDL
>> format, so we prepend "EckdCdl" to them. Boot info for LDL
>> has been moved to a new struct: EckdLdlIpl1.
>>
>> Also introduce structs for IPL stages 1 and 1b and for
>> disk geometry.
>>
>> Signed-off-by: Collin L. Walling <walling@linux.vnet.ibm.com>
>> Acked-by: Janosch Frank <frankja@linux.vnet.ibm.com>
>> ---
>> pc-bios/s390-ccw/bootmap.c | 29 +++++++++++++-----------
>> pc-bios/s390-ccw/bootmap.h | 55 +++++++++++++++++++++++++++++++++-------------
>> 2 files changed, 56 insertions(+), 28 deletions(-)
>>
>> diff --git a/pc-bios/s390-ccw/bootmap.c b/pc-bios/s390-ccw/bootmap.c
>> index 6f8e30f..29915e4 100644
>> --- a/pc-bios/s390-ccw/bootmap.c
>> +++ b/pc-bios/s390-ccw/bootmap.c
>> @@ -221,9 +221,9 @@ static void run_eckd_boot_script(block_number_t mbr_block_nr)
>> static void ipl_eckd_cdl(void)
>> {
>> XEckdMbr *mbr;
>> - Ipl2 *ipl2 = (void *)sec;
>> + EckdCdlIpl2 *ipl2 = (void *)sec;
>> IplVolumeLabel *vlbl = (void *)sec;
>> - block_number_t block_nr;
>> + block_number_t mbr_block_nr;
>>
>> /* we have just read the block #0 and recognized it as "IPL1" */
>> sclp_print("CDL\n");
>> @@ -231,16 +231,13 @@ static void ipl_eckd_cdl(void)
>> memset(sec, FREE_SPACE_FILLER, sizeof(sec));
>> read_block(1, ipl2, "Cannot read IPL2 record at block 1");
>>
>> - mbr = &ipl2->u.x.mbr;
>> + mbr = &ipl2->mbr;
>> IPL_assert(magic_match(mbr, ZIPL_MAGIC), "No zIPL section in IPL2 record.");
>> IPL_assert(block_size_ok(mbr->blockptr.xeckd.bptr.size),
>> "Bad block size in zIPL section of IPL2 record.");
>> IPL_assert(mbr->dev_type == DEV_TYPE_ECKD,
>> "Non-ECKD device type in zIPL section of IPL2 record.");
>>
>> - /* save pointer to Boot Script */
>> - block_nr = eckd_block_num((void *)&(mbr->blockptr));
>> -
>> memset(sec, FREE_SPACE_FILLER, sizeof(sec));
>> read_block(2, vlbl, "Cannot read Volume Label at block 2");
> Why did you move the block_nr = eckd_block_num(...) behind the
> read_block() ? That sounds like you could different values here now. If
> that has been done on purpose and is not a mistake, please add a proper
> sentence about this to the patch description.
Yes you are definitely correct... a guest running cdl formatted dasd should
fail to IPL with this. I must've made this error somewhere along the way
when cleaning up the commits. Thank you for catching this.
>
>> IPL_assert(magic_match(vlbl->key, VOL1_MAGIC),
>> @@ -249,7 +246,10 @@ static void ipl_eckd_cdl(void)
>> "Invalid magic of volser block");
>> print_volser(vlbl->f.volser);
>>
>> - run_eckd_boot_script(block_nr);
>> + /* save pointer to Boot Script */
>> + mbr_block_nr = eckd_block_num((void *)&mbr->blockptr);
>> +
>> + run_eckd_boot_script(mbr_block_nr);
>> /* no return */
>> }
>>
>> @@ -280,8 +280,8 @@ static void print_eckd_ldl_msg(ECKD_IPL_mode_t mode)
>>
>> static void ipl_eckd_ldl(ECKD_IPL_mode_t mode)
>> {
>> - block_number_t block_nr;
>> - BootInfo *bip = (void *)(sec + 0x70); /* BootInfo is MBR for LDL */
>> + block_number_t mbr_block_nr;
>> + EckdLdlIpl1 *ipl1 = (void *)sec;
>>
>> if (mode != ECKD_LDL_UNLABELED) {
>> print_eckd_ldl_msg(mode);
>> @@ -292,15 +292,18 @@ static void ipl_eckd_ldl(ECKD_IPL_mode_t mode)
>> memset(sec, FREE_SPACE_FILLER, sizeof(sec));
>> read_block(0, sec, "Cannot read block 0 to grab boot info.");
>> if (mode == ECKD_LDL_UNLABELED) {
>> - if (!magic_match(bip->magic, ZIPL_MAGIC)) {
>> + if (!magic_match(ipl1->boot_info.magic, ZIPL_MAGIC)) {
>> return; /* not applicable layout */
>> }
>> sclp_print("unlabeled LDL.\n");
>> }
>> - verify_boot_info(bip);
>> + verify_boot_info(&ipl1->boot_info);
>> +
>> + /* save pointer to Boot Script */
>> + mbr_block_nr =
>> + eckd_block_num((void *)&ipl1->boot_info.bp.ipl.bm_ptr.eckd.bptr);
> Well, the original code fitted nicely in one line ... thus maybe better
> keep the original variable name? (or use mbr_blk_nr or something similar
> shorter?)
Maybe a voidptr to ipl1->boot_info... and pass that to eckd_block_num?
(or something along those lines?)
or
EckdBlockPtr bptr = ipl1->....bptr
I'll play with the options.
>
>> - block_nr = eckd_block_num((void *)&(bip->bp.ipl.bm_ptr.eckd.bptr));
>> - run_eckd_boot_script(block_nr);
>> + run_eckd_boot_script(mbr_block_nr);
>> /* no return */
>> }
> Thomas
>
--
- Collin L Walling
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [Qemu-devel] [qemu-s390x] [PATCH v3 3/8] s390-ccw: parse and set boot menu options
2018-01-16 12:44 ` Thomas Huth
@ 2018-01-16 15:26 ` Collin L. Walling
0 siblings, 0 replies; 32+ messages in thread
From: Collin L. Walling @ 2018-01-16 15:26 UTC (permalink / raw)
To: Thomas Huth, qemu-s390x, qemu-devel
Cc: alifm, borntraeger, cohuck, david, frankja
On 01/16/2018 07:44 AM, Thomas Huth wrote:
> On 15.01.2018 17:44, Collin L. Walling wrote:
>> Set boot menu options for an s390 guest and store them in
>> the iplb. These options are set via the QEMU command line
>> option:
>>
>> -boot menu=on|off[,splash-time=X]
>>
>> or via the libvirt domain xml:
>>
>> <os>
>> <bootmenu enable='yes|no' timeout='X'/>
>> </os>
>>
>> Where X represents some positive integer representing
>> milliseconds.
>>
>> A loadparm other than 'prompt' will disable the menu and
>> just boot the specified entry.
>>
>> Signed-off-by: Collin L. Walling <walling@linux.vnet.ibm.com>
>> Reviewed-by: Janosch Frank <frankja@linux.vnet.ibm.com>
>> ---
>> hw/s390x/ipl.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++++
>> hw/s390x/ipl.h | 11 ++++++++--
>> pc-bios/s390-ccw/iplb.h | 8 ++++++--
>> 3 files changed, 69 insertions(+), 4 deletions(-)
>>
>> diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c
>> index 0d06fc1..81ba9ed 100644
>> --- a/hw/s390x/ipl.c
>> +++ b/hw/s390x/ipl.c
>> @@ -23,6 +23,8 @@
>> #include "hw/s390x/ebcdic.h"
>> #include "ipl.h"
>> #include "qemu/error-report.h"
>> +#include "qemu/config-file.h"
>> +#include "qemu/cutils.h"
>>
>> #define KERN_IMAGE_START 0x010000UL
>> #define KERN_PARM_AREA 0x010480UL
>> @@ -219,6 +221,55 @@ static Property s390_ipl_properties[] = {
>> DEFINE_PROP_END_OF_LIST(),
>> };
>>
>> +static void s390_ipl_set_boot_menu(IplParameterBlock *iplb)
>> +{
>> + QemuOptsList *plist = qemu_find_opts("boot-opts");
>> + QemuOpts *opts = QTAILQ_FIRST(&plist->head);
>> + uint8_t *flags;
>> + uint16_t *timeout;
>> + const char *tmp;
>> + unsigned long result = 0;
>> +
>> + switch (iplb->pbt) {
>> + case S390_IPL_TYPE_CCW:
>> + flags = &iplb->ccw.boot_menu_flags;
>> + timeout = &iplb->ccw.boot_menu_timeout;
>> + break;
>> + case S390_IPL_TYPE_QEMU_SCSI:
>> + flags = &iplb->scsi.boot_menu_flags;
>> + timeout = &iplb->scsi.boot_menu_timeout;
>> + break;
>> + default:
>> + error_report("boot menu is not supported for this device type.");
>> + return;
>> + }
>> +
>> + /* In the absence of -boot menu, use zipl parameters */
>> + if (!qemu_opt_get(opts, "menu")) {
>> + *flags = BOOT_MENU_FLAG_ZIPL_OPTS;
>> + } else if (boot_menu) {
>> + *flags = BOOT_MENU_FLAG_BOOT_OPTS;
>> +
>> + tmp = qemu_opt_get(opts, "splash-time");
>> +
>> + if (tmp && qemu_strtoul(tmp, NULL, 10, &result)) {
>> + error_report("splash-time value is invalid, forcing it to 0.");
> It's likely not needed, but an explicit "*timeout = 0" would be fine
> here, I think.
It is not needed, but it might assist with readability.
>
>> + return;
>> + }
>> +
>> + result /= 1000; /* Store timeout value as seconds */
> Maybe rather do proper rounding:
>
> result = (result + 500) / 1000;
>
> ?
Makes sense.
>
>> + if (result > 0xffff) {
>> + error_report("splash-time value is greater than 65535000,"
>> + " forcing it to 65535000.");
>> + *timeout = 0xffff;
>> + return;
>> + }
>> +
>> + *timeout = cpu_to_be16(result);
>> + }
>> +}
>> +
> I've found just some nits ... patch looks fine in general, so feel free
> to add:
>
> Reviewed-by: Thomas Huth <thuth@redhat.com>
>
Thanks for the review, Thomas.
--
- Collin L Walling
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [Qemu-devel] [qemu-s390x] [PATCH v3 1/8] s390-ccw: update libc
2018-01-16 11:07 ` Christian Borntraeger
@ 2018-01-16 15:32 ` Collin L. Walling
2018-01-16 15:48 ` Thomas Huth
0 siblings, 1 reply; 32+ messages in thread
From: Collin L. Walling @ 2018-01-16 15:32 UTC (permalink / raw)
To: Christian Borntraeger, Eric Blake, qemu-s390x, qemu-devel, thuth
Cc: alifm, frankja, cohuck, david
On 01/16/2018 06:07 AM, Christian Borntraeger wrote:
>
> On 01/15/2018 06:23 PM, Collin L. Walling wrote:
>> On 01/15/2018 12:05 PM, Eric Blake wrote:
>>> On 01/15/2018 10:44 AM, Collin L. Walling wrote:
>>>> Moved:
>>>> memcmp from bootmap.h to libc.h (renamed from _memcmp)
>>>> strlen from sclp.c to libc.h (renamed from _strlen)
>>>>
>>>> Added C standard functions:
>>>> isdigit
>>>> atoi
>>>>
>>>> Added non-C standard function:
>>>> itostr
>>>>
>>>> Signed-off-by: Collin L. Walling <walling@linux.vnet.ibm.com>
>>>> Acked-by: Christian Borntraeger <borntraeger@de.ibm.com>
>>>> Reviewed-by: Janosch Frank <frankja@linux.vnet.ibm.com>
>>>> ---
>>>> +++ b/pc-bios/s390-ccw/libc.c
>>>> @@ -0,0 +1,83 @@
>>>> +/*
>>>> + * libc-style definitions and functions
>>>> + *
>>>> + * This code is free software; you can redistribute it and/or modify it
>>>> + * under the terms of the GNU General Public License as published by the
>>>> + * Free Software Foundation; either version 2 of the License, or (at your
>>>> + * option) any later version.
>>> I'm not a lawyer, but generically, the GPL and its variants depend on a
>>> copyright owner to actually work. You may want to add a copyright line.
>>
>> I'll have to check on that. I was not the original author of the libc.h file.
> I think you can add the normal IBM Copyright statement. (I think all authors could add theirs as well)
>
>
"Copyright 2018 IBM Corp."
@Thomas, git shows you as the initial creator of libc.h. Shall I add
"Copyright 2018 Thomas Huth, Red Hat Inc." in there as well?
--
- Collin L Walling
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [Qemu-devel] [qemu-s390x] [PATCH v3 1/8] s390-ccw: update libc
2018-01-16 15:32 ` Collin L. Walling
@ 2018-01-16 15:48 ` Thomas Huth
0 siblings, 0 replies; 32+ messages in thread
From: Thomas Huth @ 2018-01-16 15:48 UTC (permalink / raw)
To: Collin L. Walling, Christian Borntraeger, Eric Blake, qemu-s390x,
qemu-devel
Cc: alifm, frankja, cohuck, david
On 16.01.2018 16:32, Collin L. Walling wrote:
> On 01/16/2018 06:07 AM, Christian Borntraeger wrote:
>>
>> On 01/15/2018 06:23 PM, Collin L. Walling wrote:
>>> On 01/15/2018 12:05 PM, Eric Blake wrote:
[...]
>>>> I'm not a lawyer, but generically, the GPL and its variants depend on a
>>>> copyright owner to actually work. You may want to add a copyright
>>>> line.
>>>
>>> I'll have to check on that. I was not the original author of the
>>> libc.h file.
>> I think you can add the normal IBM Copyright statement. (I think all
>> authors could add theirs as well)
>
> "Copyright 2018 IBM Corp."
>
> @Thomas, git shows you as the initial creator of libc.h. Shall I add
> "Copyright 2018 Thomas Huth, Red Hat Inc." in there as well?
Actually, I only moved the functions from s390-ccw.h and sclp.c into
that header file. I just tried to trace who introduced them first, and
it seems like it was Alex who added them. So I guess you should add:
Copyright (c) 2013 Alexander Graf <agraf@suse.de>
to libc.h for that. Sorry that I did not do that right from the start.
Thomas
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [Qemu-devel] [qemu-s390x] [PATCH v3 1/8] s390-ccw: update libc
2018-01-16 10:00 ` Thomas Huth
@ 2018-01-16 17:19 ` Collin L. Walling
0 siblings, 0 replies; 32+ messages in thread
From: Collin L. Walling @ 2018-01-16 17:19 UTC (permalink / raw)
To: Thomas Huth, Eric Blake, qemu-s390x, qemu-devel
Cc: alifm, frankja, cohuck, borntraeger, david
On 01/16/2018 05:00 AM, Thomas Huth wrote:
> On 15.01.2018 18:23, Collin L. Walling wrote:
>> On 01/15/2018 12:05 PM, Eric Blake wrote:
>>> On 01/15/2018 10:44 AM, Collin L. Walling wrote:
> [...]
>>>> +/**
>>>> + * atoi:
>>>> + * @str: the string to be converted.
>>>> + *
>>>> + * Given a string @str, convert it to an integer. Any non-numerical
>>>> value
>>>> + * will terminate the conversion.
>>>> + *
>>>> + * Returns: an integer converted from the string @str.
>>>> + */
>>>> +int atoi(const char *str)
>>>> +{
>>>> + int i;
>>>> + int val = 0;
>>>> +
>>>> + for (i = 0; str[i]; i++) {
>>>> + char c = str[i];
>>>> + if (!isdigit(c)) {
>>>> + break;
>>>> + }
>>>> + val *= 10;
>>>> + val += c - '0';
>>> Silently gives garbage on integer overflow, but matches the fact that
>>> POSIX atoi() can't flag errors. However, it does not handle leading
>>> whitespace nor '-', which means it is NOT doing a POSIX-compatible
>>> atoi() implementation; naming it atoi() is perhaps thus a disservice to
>>> end users.
>> Fair enough. Perhaps the "strtoi" convention suits this better.
> Or maybe simply add an assert(str[0] != '-') for now. If we ever hit the
> assert, we can still add the support for negative numbers if necessary.
Eh... honestly it's easy enough to just add a flag for the negative sign
and handle it at the end. We don't need it for this patch series, but at
least the support will be there. :)
[...]
--
- Collin L Walling
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [Qemu-devel] [PATCH v3 4/8] s390-ccw: interactive boot menu for eckd dasd (menu setup)
2018-01-15 16:44 ` [Qemu-devel] [PATCH v3 4/8] s390-ccw: interactive boot menu for eckd dasd (menu setup) Collin L. Walling
@ 2018-01-16 18:23 ` Thomas Huth
2018-01-16 19:37 ` [Qemu-devel] [qemu-s390x] " Collin L. Walling
0 siblings, 1 reply; 32+ messages in thread
From: Thomas Huth @ 2018-01-16 18:23 UTC (permalink / raw)
To: Collin L. Walling, qemu-s390x, qemu-devel
Cc: borntraeger, frankja, cohuck, david, alifm
On 15.01.2018 17:44, Collin L. Walling wrote:
> Reads boot menu flag and timeout values from the iplb and
> sets the respective fields for the menu.
>
> Signed-off-by: Collin L. Walling <walling@linux.vnet.ibm.com>
> ---
[...]
> diff --git a/pc-bios/s390-ccw/iplb.h b/pc-bios/s390-ccw/iplb.h
> index fe909d2..da29e6e 100644
> --- a/pc-bios/s390-ccw/iplb.h
> +++ b/pc-bios/s390-ccw/iplb.h
> @@ -81,6 +81,9 @@ extern IplParameterBlock iplb __attribute__((__aligned__(PAGE_SIZE)));
> #define S390_IPL_TYPE_CCW 0x02
> #define S390_IPL_TYPE_QEMU_SCSI 0xff
>
> +#define LOADPARM_PROMPT "PROMPT "
> +#define LOADPARM_EMPTY "........"
I've got a question: Is there a (public) specification document
available somewhere for the loadparm field?
[...]
> diff --git a/pc-bios/s390-ccw/menu.h b/pc-bios/s390-ccw/menu.h
> new file mode 100644
> index 0000000..04b1db1
> --- /dev/null
> +++ b/pc-bios/s390-ccw/menu.h
> @@ -0,0 +1,23 @@
> +/*
> + * QEMU S390 Interactive Boot Menu
> + *
> + * Copyright 2017 IBM Corp.
> + * Author: Collin L. Walling <walling@linux.vnet.ibm.com>
> + *
> + * This work is licensed under the terms of the GNU GPL, version 2 or (at
> + * your option) any later version. See the COPYING file in the top-level
> + * directory.
> + */
> +
> +#ifndef MENU_H
> +#define MENU_H
> +
> +#include "libc.h"
> +
> +#define BOOT_MENU_FLAG_BOOT_OPTS 0x80
> +#define BOOT_MENU_FLAG_ZIPL_OPTS 0x40
> +
> +void menu_set_parms(uint8_t boot_menu_flags, uint16_t boot_menu_timeout);
> +bool menu_check_flags(uint8_t check_flags);
> +
> +#endif /* MENU_H */
>
Reviewed-by: Thomas Huth <thuth@redhat.com>
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [Qemu-devel] [qemu-s390x] [PATCH v3 4/8] s390-ccw: interactive boot menu for eckd dasd (menu setup)
2018-01-16 18:23 ` Thomas Huth
@ 2018-01-16 19:37 ` Collin L. Walling
2018-01-17 6:11 ` Thomas Huth
0 siblings, 1 reply; 32+ messages in thread
From: Collin L. Walling @ 2018-01-16 19:37 UTC (permalink / raw)
To: Thomas Huth, qemu-s390x, qemu-devel
Cc: alifm, borntraeger, cohuck, david, frankja
On 01/16/2018 01:23 PM, Thomas Huth wrote:
> On 15.01.2018 17:44, Collin L. Walling wrote:
>> Reads boot menu flag and timeout values from the iplb and
>> sets the respective fields for the menu.
>>
>> Signed-off-by: Collin L. Walling <walling@linux.vnet.ibm.com>
>> ---
> [...]
>> diff --git a/pc-bios/s390-ccw/iplb.h b/pc-bios/s390-ccw/iplb.h
>> index fe909d2..da29e6e 100644
>> --- a/pc-bios/s390-ccw/iplb.h
>> +++ b/pc-bios/s390-ccw/iplb.h
>> @@ -81,6 +81,9 @@ extern IplParameterBlock iplb __attribute__((__aligned__(PAGE_SIZE)));
>> #define S390_IPL_TYPE_CCW 0x02
>> #define S390_IPL_TYPE_QEMU_SCSI 0xff
>>
>> +#define LOADPARM_PROMPT "PROMPT "
>> +#define LOADPARM_EMPTY "........"
> I've got a question: Is there a (public) specification document
> available somewhere for the loadparm field?
Unfortunately there does not seems to be any kind of documentation
regarding loadparm for
KVM on IBM z. Most of the information available on the IBM Knowledge
Center focuses on
z/VM, which isn't very helpful in this case :(
Are there any specific questions that I can help with?
>
> [...]
>> diff --git a/pc-bios/s390-ccw/menu.h b/pc-bios/s390-ccw/menu.h
>> new file mode 100644
>> index 0000000..04b1db1
>> --- /dev/null
>> +++ b/pc-bios/s390-ccw/menu.h
>> @@ -0,0 +1,23 @@
>> +/*
>> + * QEMU S390 Interactive Boot Menu
>> + *
>> + * Copyright 2017 IBM Corp.
>> + * Author: Collin L. Walling <walling@linux.vnet.ibm.com>
>> + *
>> + * This work is licensed under the terms of the GNU GPL, version 2 or (at
>> + * your option) any later version. See the COPYING file in the top-level
>> + * directory.
>> + */
>> +
>> +#ifndef MENU_H
>> +#define MENU_H
>> +
>> +#include "libc.h"
>> +
>> +#define BOOT_MENU_FLAG_BOOT_OPTS 0x80
>> +#define BOOT_MENU_FLAG_ZIPL_OPTS 0x40
>> +
>> +void menu_set_parms(uint8_t boot_menu_flags, uint16_t boot_menu_timeout);
>> +bool menu_check_flags(uint8_t check_flags);
>> +
>> +#endif /* MENU_H */
>>
> Reviewed-by: Thomas Huth <thuth@redhat.com>
>
Thanks for the review.
--
- Collin L Walling
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [Qemu-devel] [qemu-s390x] [PATCH v3 4/8] s390-ccw: interactive boot menu for eckd dasd (menu setup)
2018-01-16 19:37 ` [Qemu-devel] [qemu-s390x] " Collin L. Walling
@ 2018-01-17 6:11 ` Thomas Huth
2018-01-17 12:12 ` Collin L. Walling
0 siblings, 1 reply; 32+ messages in thread
From: Thomas Huth @ 2018-01-17 6:11 UTC (permalink / raw)
To: Collin L. Walling, qemu-s390x, qemu-devel
Cc: alifm, borntraeger, cohuck, david, frankja
On 16.01.2018 20:37, Collin L. Walling wrote:
> On 01/16/2018 01:23 PM, Thomas Huth wrote:
>> On 15.01.2018 17:44, Collin L. Walling wrote:
>>> Reads boot menu flag and timeout values from the iplb and
>>> sets the respective fields for the menu.
>>>
>>> Signed-off-by: Collin L. Walling <walling@linux.vnet.ibm.com>
>>> ---
>> [...]
>>> diff --git a/pc-bios/s390-ccw/iplb.h b/pc-bios/s390-ccw/iplb.h
>>> index fe909d2..da29e6e 100644
>>> --- a/pc-bios/s390-ccw/iplb.h
>>> +++ b/pc-bios/s390-ccw/iplb.h
>>> @@ -81,6 +81,9 @@ extern IplParameterBlock iplb
>>> __attribute__((__aligned__(PAGE_SIZE)));
>>> #define S390_IPL_TYPE_CCW 0x02
>>> #define S390_IPL_TYPE_QEMU_SCSI 0xff
>>> +#define LOADPARM_PROMPT "PROMPT "
>>> +#define LOADPARM_EMPTY "........"
>> I've got a question: Is there a (public) specification document
>> available somewhere for the loadparm field?
>
> Unfortunately there does not seems to be any kind of documentation
> regarding loadparm for
> KVM on IBM z. Most of the information available on the IBM Knowledge
> Center focuses on
> z/VM, which isn't very helpful in this case :(
Ok, too bad :-(
> Are there any specific questions that I can help with?
I was just wondering whether there are pre-defined values for this
field, e.g. is "PROMPT" something you came up with, or is this a value
that has been documented in a specification somewhere? ... I'm just
curious: If there is a list of pre-defined values somewhere, what are
the other values that the s390-ccw bios does not support yet?
Thomas
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [Qemu-devel] [PATCH v3 5/8] s390-ccw: interactive boot menu for eckd dasd (read stage2 data)
2018-01-15 16:44 ` [Qemu-devel] [PATCH v3 5/8] s390-ccw: interactive boot menu for eckd dasd (read stage2 data) Collin L. Walling
@ 2018-01-17 8:38 ` Thomas Huth
2018-01-17 9:12 ` [Qemu-devel] [qemu-s390x] " Thomas Huth
2018-01-17 12:29 ` Collin L. Walling
0 siblings, 2 replies; 32+ messages in thread
From: Thomas Huth @ 2018-01-17 8:38 UTC (permalink / raw)
To: Collin L. Walling, qemu-s390x, qemu-devel
Cc: borntraeger, frankja, cohuck, david, alifm
On 15.01.2018 17:44, Collin L. Walling wrote:
> Read the stage2 boot loader data block-by-block. We scan the
> current block for the string "zIPL" to detect the start of the
> boot menu banner. We then load the adjacent blocks (previous
> block and next block) to account for the possibility of menu
> data spanning multiple blocks.
>
> Signed-off-by: Collin L. Walling <walling@linux.vnet.ibm.com>
> ---
> pc-bios/s390-ccw/bootmap.c | 112 +++++++++++++++++++++++++++++++++++++++++++--
> pc-bios/s390-ccw/bootmap.h | 1 +
> pc-bios/s390-ccw/menu.h | 10 ++++
> 3 files changed, 118 insertions(+), 5 deletions(-)
>
> diff --git a/pc-bios/s390-ccw/bootmap.c b/pc-bios/s390-ccw/bootmap.c
> index 29915e4..fb8ff80 100644
> --- a/pc-bios/s390-ccw/bootmap.c
> +++ b/pc-bios/s390-ccw/bootmap.c
> @@ -13,6 +13,7 @@
> #include "bootmap.h"
> #include "virtio.h"
> #include "bswap.h"
> +#include "menu.h"
>
> #ifdef DEBUG
> /* #define DEBUG_FALLBACK */
> @@ -83,6 +84,10 @@ static void jump_to_IPL_code(uint64_t address)
>
> static unsigned char _bprs[8*1024]; /* guessed "max" ECKD sector size */
> static const int max_bprs_entries = sizeof(_bprs) / sizeof(ExtEckdBlockPtr);
> +static uint8_t _s2[MAX_SECTOR_SIZE * 4] __attribute__((__aligned__(PAGE_SIZE)));
If I get the code right, you only load three sectors (prev, cur and
next), aren't you? So "* 3" instead of "* 4" should be enough?
> +static void *s2_prev_blk = _s2;
> +static void *s2_cur_blk = _s2 + MAX_SECTOR_SIZE;
> +static void *s2_next_blk = _s2 + MAX_SECTOR_SIZE * 2;
>
> static inline void verify_boot_info(BootInfo *bip)
> {
> @@ -182,7 +187,94 @@ static block_number_t load_eckd_segments(block_number_t blk, uint64_t *address)
> return block_nr;
> }
>
> -static void run_eckd_boot_script(block_number_t mbr_block_nr)
> +static ZiplParms get_zipl_parms(int offset)
> +{
> + ZiplParms zipl_parms = {
> + .flag = *(uint16_t *)(s2_cur_blk + offset - ZIPL_FLAG_OFFSET),
> + .timeout = *(uint16_t *)(s2_cur_blk + offset - ZIPL_TIMEOUT_OFFSET),
> + .menu_start = offset,
> + };
> +
> + return zipl_parms;
> +}
Looks weird that you need a separate function (with 9 lines of code) for
just setting three values in a struct ... and since the function is also
only used once: Why don't you simply set the three values at the place
where you call this function below?
> +static bool find_zipl_boot_menu_banner(int *offset)
> +{
> + int i;
> +
> + /* Menu banner starts with "zIPL" */
> + for (i = 0; i < virtio_get_block_size() - 4; i++) {
> + if (magic_match(s2_cur_blk + i, ZIPL_MAGIC_EBCDIC)) {
> + *offset = i;
> + return true;
> + }
> + }
> +
> + return false;
> +}
> +
> +static int eckd_get_boot_menu_index(block_number_t s1b_block_nr)
> +{
> + block_number_t cur_block_nr, prev_block_nr, next_block_nr;
> + EckdStage1b *s1b = (void *)sec;
> + ZiplParms zipl_parms;
> + bool found = false;
> + int offset;
> + int i;
> +
> + /* Get Stage1b data */
> + memset(sec, FREE_SPACE_FILLER, sizeof(sec));
> + read_block(s1b_block_nr, s1b, "Cannot read stage1b boot loader");
> +
> + memset(_s2, FREE_SPACE_FILLER, sizeof(_s2));
> +
> + /* Get Stage2 data */
> + for (i = 0; i < STAGE2_BLK_CNT_MAX; i++) {
> + cur_block_nr = eckd_block_num((void *)&s1b->seek[i].cyl);
Casting a subset of EckdSeekArg via a void* into a BootMapPointer is
quite ugly. Maybe you could refactor eckd_block_num() instead, e.g. like
this:
static block_number_t eckd_block_num_by_chs(uint64_t cylinder,
uint64_t head, uint64_t sec)
{
const uint64_t sectors = virtio_get_sectors();
const uint64_t heads = virtio_get_heads();
block_number_t block;
cylinder = cylinder + ((head & 0xfff0) << 12);
head = head & 0x000f;
block = sectors * heads * cylinder
+ sectors * head + sec
- 1; /* block nr starts with zero */
return block;
}
static block_number_t eckd_block_num(BootMapPointer *p)
{
const uint64_t sectors = virtio_get_sectors();
const uint64_t heads = virtio_get_heads();
const uint64_t cylinder = p->eckd.cylinder
+ ((p->eckd.head & 0xfff0) << 12);
const uint64_t head = p->eckd.head & 0x000f;
const block_number_t block = sectors * heads * cylinder
+ sectors * head
+ p->eckd.sector
- 1; /* block nr starts with zero */
return eckd_block_num_by_chs(p->eckd.cylinder, p->eckd.head,
p->eckd.sector);
}
... and then use eckd_block_num_by_chs() here instead?
> + if (!cur_block_nr) {
> + break;
> + }
> +
> + read_block(cur_block_nr, s2_cur_blk, "Cannot read stage2 boot loader");
> +
> + if (find_zipl_boot_menu_banner(&offset)) {
> + /* Load the adjacent blocks to account for the
> + * possibility of menu data spanning multiple blocks.
> + */
> + if (prev_block_nr) {
You did not pre-initialize prev_block_nr = 0 at the beginning of the
function. Do you feel confident enough that the first block never
contains the zipl banner? If not, please set prev_block_nr = 0 before
entering the for-loop.
> + read_block(prev_block_nr, s2_prev_blk,
> + "Cannot read stage2 boot loader");
> + }
> +
> + if (i + 1 < STAGE2_BLK_CNT_MAX) {
> + next_block_nr = eckd_block_num((void *)&s1b->seek[i + 1].cyl);
> + }
> +
> + if (next_block_nr) {
Maybe also better set next_block_nr = 0 at the beginning of this function.
> + read_block(next_block_nr, s2_next_blk,
> + "Cannot read stage2 boot loader");
> + }
> +
> + zipl_parms = get_zipl_parms(offset);
> + found = true;
> + break;
> + }
> +
> + prev_block_nr = cur_block_nr;
> + }
> +
> + if (!found) {
> + sclp_print("No zipl boot menu data found. Booting default entry.");
> + return 0;
> + }
> +
> + zipl_parms.menu_start++; /* make compiler happy -- does nothing vital */
<nit>
It's always nicer to avoid introducing code that you've got to remove
right in the next patch. You could rather add a
int menu_get_zipl_boot_index(const void *stage2, ZiplParms zipl_parms)
{
/* implemented in the next patch */
}
to menu.c in this patch already, so you can already call it here and
don't have to modify eckd_get_boot_menu_index() again in the next patch.
</nit>
> + return 0; /* implemented next patch */
> +}
> +
> +static void run_eckd_boot_script(block_number_t mbr_block_nr,
> + block_number_t s1b_block_nr)
> {
> int i;
> unsigned int loadparm = get_loadparm_index();
> @@ -191,6 +283,10 @@ static void run_eckd_boot_script(block_number_t mbr_block_nr)
> ScsiMbr *bte = (void *)sec; /* Eckd bootmap table entry */
> BootMapScript *bms = (void *)sec;
>
> + if (menu_check_flags(BOOT_MENU_FLAG_BOOT_OPTS | BOOT_MENU_FLAG_ZIPL_OPTS)) {
> + loadparm = eckd_get_boot_menu_index(s1b_block_nr);
> + }
> +
> debug_print_int("loadparm", loadparm);
> IPL_assert(loadparm < 31, "loadparm value greater than"
> " maximum number of boot entries allowed");
> @@ -223,7 +319,7 @@ static void ipl_eckd_cdl(void)
> XEckdMbr *mbr;
> EckdCdlIpl2 *ipl2 = (void *)sec;
> IplVolumeLabel *vlbl = (void *)sec;
> - block_number_t mbr_block_nr;
> + block_number_t mbr_block_nr, s1b_block_nr;
>
> /* we have just read the block #0 and recognized it as "IPL1" */
> sclp_print("CDL\n");
> @@ -249,7 +345,10 @@ static void ipl_eckd_cdl(void)
> /* save pointer to Boot Script */
> mbr_block_nr = eckd_block_num((void *)&mbr->blockptr);
>
> - run_eckd_boot_script(mbr_block_nr);
> + /* save pointer to Stage1b Data */
> + s1b_block_nr = eckd_block_num((void *)&ipl2->stage1.seek[0].cyl);
That could use eckd_block_num_by_chs(), too.
> + run_eckd_boot_script(mbr_block_nr, s1b_block_nr);
> /* no return */
> }
>
> @@ -280,7 +379,7 @@ static void print_eckd_ldl_msg(ECKD_IPL_mode_t mode)
>
> static void ipl_eckd_ldl(ECKD_IPL_mode_t mode)
> {
> - block_number_t mbr_block_nr;
> + block_number_t mbr_block_nr, s1b_block_nr;
> EckdLdlIpl1 *ipl1 = (void *)sec;
>
> if (mode != ECKD_LDL_UNLABELED) {
> @@ -303,7 +402,10 @@ static void ipl_eckd_ldl(ECKD_IPL_mode_t mode)
> mbr_block_nr =
> eckd_block_num((void *)&ipl1->boot_info.bp.ipl.bm_ptr.eckd.bptr);
>
> - run_eckd_boot_script(mbr_block_nr);
> + /* save pointer to Stage1b Data */
> + s1b_block_nr = eckd_block_num((void *)&ipl1->stage1.seek[0].cyl);
dito.
> + run_eckd_boot_script(mbr_block_nr, s1b_block_nr);
> /* no return */
> }
>
> diff --git a/pc-bios/s390-ccw/bootmap.h b/pc-bios/s390-ccw/bootmap.h
> index df956f2..56445f2 100644
> --- a/pc-bios/s390-ccw/bootmap.h
> +++ b/pc-bios/s390-ccw/bootmap.h
> @@ -74,6 +74,7 @@ typedef struct ScsiMbr {
> } __attribute__ ((packed)) ScsiMbr;
>
> #define ZIPL_MAGIC "zIPL"
> +#define ZIPL_MAGIC_EBCDIC "\xa9\xc9\xd7\xd3"
> #define IPL1_MAGIC "\xc9\xd7\xd3\xf1" /* == "IPL1" in EBCDIC */
> #define IPL2_MAGIC "\xc9\xd7\xd3\xf2" /* == "IPL2" in EBCDIC */
> #define VOL1_MAGIC "\xe5\xd6\xd3\xf1" /* == "VOL1" in EBCDIC */
> diff --git a/pc-bios/s390-ccw/menu.h b/pc-bios/s390-ccw/menu.h
> index 04b1db1..3a8a487 100644
> --- a/pc-bios/s390-ccw/menu.h
> +++ b/pc-bios/s390-ccw/menu.h
> @@ -17,6 +17,16 @@
> #define BOOT_MENU_FLAG_BOOT_OPTS 0x80
> #define BOOT_MENU_FLAG_ZIPL_OPTS 0x40
>
> +/* Offsets from zipl fields to zipl banner start */
> +#define ZIPL_TIMEOUT_OFFSET 138
> +#define ZIPL_FLAG_OFFSET 140
> +
> +typedef struct ZiplParms {
> + uint16_t flag;
> + uint16_t timeout;
> + uint64_t menu_start;
> +} ZiplParms;
> +
> void menu_set_parms(uint8_t boot_menu_flags, uint16_t boot_menu_timeout);
> bool menu_check_flags(uint8_t check_flags);
Thomas
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [Qemu-devel] [PATCH v3 6/8] s390-ccw: interactive boot menu for eckd dasd (print menu)
2018-01-15 16:44 ` [Qemu-devel] [PATCH v3 6/8] s390-ccw: interactive boot menu for eckd dasd (print menu) Collin L. Walling
@ 2018-01-17 8:58 ` Thomas Huth
0 siblings, 0 replies; 32+ messages in thread
From: Thomas Huth @ 2018-01-17 8:58 UTC (permalink / raw)
To: Collin L. Walling, qemu-s390x, qemu-devel
Cc: borntraeger, frankja, cohuck, david, alifm
On 15.01.2018 17:44, Collin L. Walling wrote:
> Prints the menu data starting from the zIPL menu banner.
>
> Signed-off-by: Collin L. Walling <walling@linux.vnet.ibm.com>
> ---
[...]
> static void run_eckd_boot_script(block_number_t mbr_block_nr,
> diff --git a/pc-bios/s390-ccw/menu.c b/pc-bios/s390-ccw/menu.c
> index e15a7f2..30470b3 100644
> --- a/pc-bios/s390-ccw/menu.c
> +++ b/pc-bios/s390-ccw/menu.c
> @@ -10,10 +10,52 @@
> */
>
> #include "menu.h"
> +#include "s390-ccw.h"
>
> static uint8_t flags;
> static uint64_t timeout;
>
> +static void zipl_println(const char *data, size_t len)
> +{
> + char buf[len + 1];
> +
> + ebcdic_to_ascii(data, buf, len);
> + buf[len] = '\n';
> + buf[len + 1] = '\0';
Buffer overflow by 1. You need to declare "char buf[len + 2]".
Or drop the 0-termination and use write(1, buf, len + 1) instead of
sclp_print().
> + sclp_print(buf);
> +}
Thomas
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [Qemu-devel] [qemu-s390x] [PATCH v3 5/8] s390-ccw: interactive boot menu for eckd dasd (read stage2 data)
2018-01-17 8:38 ` Thomas Huth
@ 2018-01-17 9:12 ` Thomas Huth
2018-01-17 12:29 ` Collin L. Walling
1 sibling, 0 replies; 32+ messages in thread
From: Thomas Huth @ 2018-01-17 9:12 UTC (permalink / raw)
To: Collin L. Walling, qemu-s390x, qemu-devel
Cc: alifm, borntraeger, cohuck, david, frankja
On 17.01.2018 09:38, Thomas Huth wrote:
> On 15.01.2018 17:44, Collin L. Walling wrote:
[...]
>> + if (find_zipl_boot_menu_banner(&offset)) {
>> + /* Load the adjacent blocks to account for the
>> + * possibility of menu data spanning multiple blocks.
>> + */
>> + if (prev_block_nr) {
>
> You did not pre-initialize prev_block_nr = 0 at the beginning of the
> function. Do you feel confident enough that the first block never
> contains the zipl banner? If not, please set prev_block_nr = 0 before
> entering the for-loop.
Ah, I just noticed that this is also the issue that has been reported by
patchew. So you've got to set prev_block_nr = 0 anyway to keep all
compilers happy ;-)
Thomas
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [Qemu-devel] [PATCH v3 7/8] s390-ccw: interactive boot menu for eckd dasd (read input)
2018-01-15 16:44 ` [Qemu-devel] [PATCH v3 7/8] s390-ccw: interactive boot menu for eckd dasd (read input) Collin L. Walling
@ 2018-01-17 10:10 ` Thomas Huth
2018-01-17 13:19 ` [Qemu-devel] [qemu-s390x] " Collin L. Walling
0 siblings, 1 reply; 32+ messages in thread
From: Thomas Huth @ 2018-01-17 10:10 UTC (permalink / raw)
To: Collin L. Walling, qemu-s390x, qemu-devel
Cc: borntraeger, frankja, cohuck, david, alifm
On 15.01.2018 17:44, Collin L. Walling wrote:
> When the boot menu options are present and the guest's
> disk has been configured by the zipl tool, then the user
> will be presented with an interactive boot menu with
> labeled entries. An example of what the menu might look
> like:
>
> zIPL v1.37.1-build-20170714 interactive boot menu.
>
> 0. default (linux-4.13.0)
>
> 1. linux-4.13.0
> 2. performance
> 3. kvm
>
> Please choose (default will boot in 10 seconds):
>
> If the user's input is empty or 0, the default zipl entry will
> be chosen. If the input is within the range presented by the
> menu, then the selection will be booted. Any erroneous input
> will cancel the timeout and prompt the user until correct
> input is given.
>
> Any value set for loadparm will override all boot menu options.
> If loadparm=PROMPT, then the menu prompt will continuously wait
> until correct user input is given.
>
> The absence of any boot options on the command line will attempt
> to use the zipl loader values.
>
> --- Specific notes regarding this patch ---
>
> Implements an sclp_read function to capture input from the
> console, and a wrapper function in that handles parsing
> certain characters and adding input to a buffer. The input
> is checked for any erroneous values and is handled
> appropriately. A correct value will boot the respective
> boot menu entry.
>
> Signed-off-by: Collin L. Walling <walling@linux.vnet.ibm.com>
> ---
> pc-bios/s390-ccw/menu.c | 160 +++++++++++++++++++++++++++++++++++++++++++-
> pc-bios/s390-ccw/s390-ccw.h | 2 +
> pc-bios/s390-ccw/sclp.c | 20 ++++++
> pc-bios/s390-ccw/virtio.c | 2 +-
> 4 files changed, 182 insertions(+), 2 deletions(-)
>
> diff --git a/pc-bios/s390-ccw/menu.c b/pc-bios/s390-ccw/menu.c
> index 30470b3..c219b7f 100644
> --- a/pc-bios/s390-ccw/menu.c
> +++ b/pc-bios/s390-ccw/menu.c
> @@ -12,9 +12,167 @@
> #include "menu.h"
> #include "s390-ccw.h"
>
> +#define KEYCODE_NO_INP '\0'
> +#define KEYCODE_ESCAPE '\033'
> +#define KEYCODE_BACKSP '\177'
> +#define KEYCODE_ENTER '\r'
> +
> static uint8_t flags;
> static uint64_t timeout;
>
> +static inline void enable_clock_int(void)
> +{
> + uint64_t tmp = 0;
> +
> + asm volatile(
> + "stctg 0,0,%0\n"
> + "oi 6+%0, 0x8\n"
> + "lctlg 0,0,%0"
> + : : "Q" (tmp) : "memory"
> + );
> +}
> +
> +static inline void disable_clock_int(void)
> +{
> + uint64_t tmp = 0;
> +
> + asm volatile(
> + "stctg 0,0,%0\n"
> + "ni 6+%0, 0xf7\n"
> + "lctlg 0,0,%0"
> + : : "Q" (tmp) : "memory"
> + );
> +}
> +
> +static inline void set_clock_comparator(uint64_t time)
> +{
> + asm volatile("sckc %0" : : "Q" (time));
> +}
> +
> +static inline bool check_clock_int(void)
> +{
> + uint16_t *code = (uint16_t *)0x86;
Maybe add a comment at the end of the line saying that 0x86 is the
"External-Interruption Code" field in the low-core.
> + consume_sclp_int();
> +
> + return *code == 0x1004;
> +}
> +
> +static int read_prompt(char *buf, size_t len)
> +{
> + char inp[2] = {};
> + uint8_t idx = 0;
> + uint64_t time;
> +
> + if (timeout) {
> + time = get_clock() + (timeout << 32);
Well, that looks like you're calculating with 1s = 1024 ms here. That's
likely ok for small timeouts ... but anyway, why not do it correct right
from the start to avoid confusion later? (Testers sometime really try
large timeouts to see whether the time is accurate)
By the way, just an idea, but I currently wonder whether using a
resolution of 1s for timeout is really the best idea. Some people might
also want to wait for half of seconds, for example ... so a resolution
of 0.1s might be a better choice for the timeout value in the IPL block?
> + set_clock_comparator(time);
> + enable_clock_int();
> + timeout = 0;
> + }
> +
> + while (!check_clock_int()) {> +
> + /* Process only one character at a time */
> + sclp_read(inp, 1);
> +
> + switch (inp[0]) {
> + case KEYCODE_NO_INP:
> + case KEYCODE_ESCAPE:
> + continue;
> + case KEYCODE_BACKSP:
> + if (idx > 0) {
> + /* Remove last character */
> + buf[idx - 1] = ' ';
> + sclp_print("\r");
> + sclp_print(buf);
> +
> + idx--;
> +
> + /* Reset cursor */
> + buf[idx] = 0;
> + sclp_print("\r");
> + sclp_print(buf);
Not sure, but I think you could simplify this whole block in the curly
braces to:
buf[--idx] = 0;
sclp_print("\b \b");
?
> + }
> + continue;
> + case KEYCODE_ENTER:
> + disable_clock_int();
> + return idx;
> + }
> +
> + /* Echo input and add to buffer */
> + if (idx < len) {
> + buf[idx] = inp[0];
> + sclp_print(inp);
> + idx++;
> + }
> + }
> +
> + disable_clock_int();
> + *buf = 0;
> +
> + return 0;
> +}
[...]
> diff --git a/pc-bios/s390-ccw/sclp.c b/pc-bios/s390-ccw/sclp.c
> index 486fce1..5e4a78b 100644
> --- a/pc-bios/s390-ccw/sclp.c
> +++ b/pc-bios/s390-ccw/sclp.c
> @@ -101,3 +101,23 @@ void sclp_get_loadparm_ascii(char *loadparm)
> ebcdic_to_ascii((char *) sccb->loadparm, loadparm, 8);
> }
> }
> +
> +void sclp_read(char *str, size_t len)
> +{
> + ReadEventData *sccb = (void *)_sccb;
> + char *buf = (char *)(&sccb->ebh) + 7;
> +
> + /* Len should not exceed the maximum size of the event buffer */
> + if (len > SCCB_SIZE - 8) {
> + len = SCCB_SIZE - 8;
> + }
> +
> + sccb->h.length = SCCB_SIZE;
> + sccb->h.function_code = SCLP_UNCONDITIONAL_READ;
> + sccb->ebh.length = sizeof(EventBufferHeader);
> + sccb->ebh.type = SCLP_EVENT_ASCII_CONSOLE_DATA;
> + sccb->ebh.flags = 0;
> +
> + sclp_service_call(SCLP_CMD_READ_EVENT_DATA, sccb);
Likely not required for your patch, but let me ask anyway:
I'm not very familiar with the SCLP call, but isn't there a way to
detect the amount of bytes that really have been read? ... it might be
good to use that as return value for this function, so that the caller
has a way to see how many bytes are valid.
> + memcpy(str, buf, len);
> +}
> diff --git a/pc-bios/s390-ccw/virtio.c b/pc-bios/s390-ccw/virtio.c
> index c890a03..817e7f5 100644
> --- a/pc-bios/s390-ccw/virtio.c
> +++ b/pc-bios/s390-ccw/virtio.c
> @@ -176,7 +176,7 @@ void vring_send_buf(VRing *vr, void *p, int len, int flags)
> }
> }
>
> -static u64 get_clock(void)
> +u64 get_clock(void)
> {
> u64 r;
Thomas
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [Qemu-devel] [PATCH v3 8/8] s390-ccw: interactive boot menu for scsi
2018-01-15 16:44 ` [Qemu-devel] [PATCH v3 8/8] s390-ccw: interactive boot menu for scsi Collin L. Walling
@ 2018-01-17 10:16 ` Thomas Huth
0 siblings, 0 replies; 32+ messages in thread
From: Thomas Huth @ 2018-01-17 10:16 UTC (permalink / raw)
To: Collin L. Walling, qemu-s390x, qemu-devel
Cc: borntraeger, frankja, cohuck, david, alifm
On 15.01.2018 17:44, Collin L. Walling wrote:
> Interactive boot menu for scsi. This follows the same procedure
> as the interactive menu for eckd dasd. An example follows:
>
> s390x Enumerated Boot Menu.
>
> 3 entries detected. Select from index 0 to 2.
>
> Please choose:
>
> Signed-off-by: Collin L. Walling <walling@linux.vnet.ibm.com>
> ---
> pc-bios/s390-ccw/bootmap.c | 9 ++++++---
> pc-bios/s390-ccw/main.c | 3 +++
> pc-bios/s390-ccw/menu.c | 14 ++++++++++++++
> pc-bios/s390-ccw/menu.h | 1 +
> 4 files changed, 24 insertions(+), 3 deletions(-)
Reviewed-by: Thomas Huth <thuth@redhat.com>
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [Qemu-devel] [qemu-s390x] [PATCH v3 4/8] s390-ccw: interactive boot menu for eckd dasd (menu setup)
2018-01-17 6:11 ` Thomas Huth
@ 2018-01-17 12:12 ` Collin L. Walling
0 siblings, 0 replies; 32+ messages in thread
From: Collin L. Walling @ 2018-01-17 12:12 UTC (permalink / raw)
To: Thomas Huth, qemu-s390x, qemu-devel
Cc: frankja, borntraeger, alifm, david, cohuck
On 01/17/2018 01:11 AM, Thomas Huth wrote:
> On 16.01.2018 20:37, Collin L. Walling wrote:
>> On 01/16/2018 01:23 PM, Thomas Huth wrote:
>>> On 15.01.2018 17:44, Collin L. Walling wrote:
>>>> Reads boot menu flag and timeout values from the iplb and
>>>> sets the respective fields for the menu.
>>>>
>>>> Signed-off-by: Collin L. Walling <walling@linux.vnet.ibm.com>
>>>> ---
>>> [...]
>>>> diff --git a/pc-bios/s390-ccw/iplb.h b/pc-bios/s390-ccw/iplb.h
>>>> index fe909d2..da29e6e 100644
>>>> --- a/pc-bios/s390-ccw/iplb.h
>>>> +++ b/pc-bios/s390-ccw/iplb.h
>>>> @@ -81,6 +81,9 @@ extern IplParameterBlock iplb
>>>> __attribute__((__aligned__(PAGE_SIZE)));
>>>> #define S390_IPL_TYPE_CCW 0x02
>>>> #define S390_IPL_TYPE_QEMU_SCSI 0xff
>>>> +#define LOADPARM_PROMPT "PROMPT "
>>>> +#define LOADPARM_EMPTY "........"
>>> I've got a question: Is there a (public) specification document
>>> available somewhere for the loadparm field?
>> Unfortunately there does not seems to be any kind of documentation
>> regarding loadparm for
>> KVM on IBM z. Most of the information available on the IBM Knowledge
>> Center focuses on
>> z/VM, which isn't very helpful in this case :(
> Ok, too bad :-(
>
>> Are there any specific questions that I can help with?
> I was just wondering whether there are pre-defined values for this
> field, e.g. is "PROMPT" something you came up with, or is this a value
> that has been documented in a specification somewhere? ... I'm just
> curious: If there is a list of pre-defined values somewhere, what are
> the other values that the s390-ccw bios does not support yet?
We're mimicking zipl's behavior. It currently supports two use cases for
loadparm: setting an explicit boot index (by providing a valid integer),
and showing the boot menu without a timeout (by providing the string
'prompt').
> Thomas
>
--
- Collin L Walling
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [Qemu-devel] [qemu-s390x] [PATCH v3 5/8] s390-ccw: interactive boot menu for eckd dasd (read stage2 data)
2018-01-17 8:38 ` Thomas Huth
2018-01-17 9:12 ` [Qemu-devel] [qemu-s390x] " Thomas Huth
@ 2018-01-17 12:29 ` Collin L. Walling
1 sibling, 0 replies; 32+ messages in thread
From: Collin L. Walling @ 2018-01-17 12:29 UTC (permalink / raw)
To: Thomas Huth, qemu-s390x, qemu-devel
Cc: alifm, borntraeger, cohuck, david, frankja
On 01/17/2018 03:38 AM, Thomas Huth wrote:
> On 15.01.2018 17:44, Collin L. Walling wrote:
>> Read the stage2 boot loader data block-by-block. We scan the
>> current block for the string "zIPL" to detect the start of the
>> boot menu banner. We then load the adjacent blocks (previous
>> block and next block) to account for the possibility of menu
>> data spanning multiple blocks.
>>
>> Signed-off-by: Collin L. Walling <walling@linux.vnet.ibm.com>
>> ---
>> pc-bios/s390-ccw/bootmap.c | 112 +++++++++++++++++++++++++++++++++++++++++++--
>> pc-bios/s390-ccw/bootmap.h | 1 +
>> pc-bios/s390-ccw/menu.h | 10 ++++
>> 3 files changed, 118 insertions(+), 5 deletions(-)
>>
>> diff --git a/pc-bios/s390-ccw/bootmap.c b/pc-bios/s390-ccw/bootmap.c
>> index 29915e4..fb8ff80 100644
>> --- a/pc-bios/s390-ccw/bootmap.c
>> +++ b/pc-bios/s390-ccw/bootmap.c
>> @@ -13,6 +13,7 @@
>> #include "bootmap.h"
>> #include "virtio.h"
>> #include "bswap.h"
>> +#include "menu.h"
>>
>> #ifdef DEBUG
>> /* #define DEBUG_FALLBACK */
>> @@ -83,6 +84,10 @@ static void jump_to_IPL_code(uint64_t address)
>>
>> static unsigned char _bprs[8*1024]; /* guessed "max" ECKD sector size */
>> static const int max_bprs_entries = sizeof(_bprs) / sizeof(ExtEckdBlockPtr);
>> +static uint8_t _s2[MAX_SECTOR_SIZE * 4] __attribute__((__aligned__(PAGE_SIZE)));
> If I get the code right, you only load three sectors (prev, cur and
> next), aren't you? So "* 3" instead of "* 4" should be enough?
Agreed.
>
>> +static void *s2_prev_blk = _s2;
>> +static void *s2_cur_blk = _s2 + MAX_SECTOR_SIZE;
>> +static void *s2_next_blk = _s2 + MAX_SECTOR_SIZE * 2;
>>
>> static inline void verify_boot_info(BootInfo *bip)
>> {
>> @@ -182,7 +187,94 @@ static block_number_t load_eckd_segments(block_number_t blk, uint64_t *address)
>> return block_nr;
>> }
>>
>> -static void run_eckd_boot_script(block_number_t mbr_block_nr)
>> +static ZiplParms get_zipl_parms(int offset)
>> +{
>> + ZiplParms zipl_parms = {
>> + .flag = *(uint16_t *)(s2_cur_blk + offset - ZIPL_FLAG_OFFSET),
>> + .timeout = *(uint16_t *)(s2_cur_blk + offset - ZIPL_TIMEOUT_OFFSET),
>> + .menu_start = offset,
>> + };
>> +
>> + return zipl_parms;
>> +}
> Looks weird that you need a separate function (with 9 lines of code) for
> just setting three values in a struct ... and since the function is also
> only used once: Why don't you simply set the three values at the place
> where you call this function below?
Can do.
>
>> +static bool find_zipl_boot_menu_banner(int *offset)
>> +{
>> + int i;
>> +
>> + /* Menu banner starts with "zIPL" */
>> + for (i = 0; i < virtio_get_block_size() - 4; i++) {
>> + if (magic_match(s2_cur_blk + i, ZIPL_MAGIC_EBCDIC)) {
>> + *offset = i;
>> + return true;
>> + }
>> + }
>> +
>> + return false;
>> +}
>> +
>> +static int eckd_get_boot_menu_index(block_number_t s1b_block_nr)
>> +{
>> + block_number_t cur_block_nr, prev_block_nr, next_block_nr;
>> + EckdStage1b *s1b = (void *)sec;
>> + ZiplParms zipl_parms;
>> + bool found = false;
>> + int offset;
>> + int i;
>> +
>> + /* Get Stage1b data */
>> + memset(sec, FREE_SPACE_FILLER, sizeof(sec));
>> + read_block(s1b_block_nr, s1b, "Cannot read stage1b boot loader");
>> +
>> + memset(_s2, FREE_SPACE_FILLER, sizeof(_s2));
>> +
>> + /* Get Stage2 data */
>> + for (i = 0; i < STAGE2_BLK_CNT_MAX; i++) {
>> + cur_block_nr = eckd_block_num((void *)&s1b->seek[i].cyl);
> Casting a subset of EckdSeekArg via a void* into a BootMapPointer is
> quite ugly. Maybe you could refactor eckd_block_num() instead, e.g. like
> this:
>
> static block_number_t eckd_block_num_by_chs(uint64_t cylinder,
> uint64_t head, uint64_t sec)
> {
> const uint64_t sectors = virtio_get_sectors();
> const uint64_t heads = virtio_get_heads();
> block_number_t block;
>
> cylinder = cylinder + ((head & 0xfff0) << 12);
> head = head & 0x000f;
> block = sectors * heads * cylinder
> + sectors * head + sec
> - 1; /* block nr starts with zero */
>
> return block;
> }
>
> static block_number_t eckd_block_num(BootMapPointer *p)
> {
> const uint64_t sectors = virtio_get_sectors();
> const uint64_t heads = virtio_get_heads();
> const uint64_t cylinder = p->eckd.cylinder
> + ((p->eckd.head & 0xfff0) << 12);
> const uint64_t head = p->eckd.head & 0x000f;
> const block_number_t block = sectors * heads * cylinder
> + sectors * head
> + p->eckd.sector
> - 1; /* block nr starts with zero */
> return eckd_block_num_by_chs(p->eckd.cylinder, p->eckd.head,
> p->eckd.sector);
> }
>
> ... and then use eckd_block_num_by_chs() here instead?
I like it!
>
>> + if (!cur_block_nr) {
>> + break;
>> + }
>> +
>> + read_block(cur_block_nr, s2_cur_blk, "Cannot read stage2 boot loader");
>> +
>> + if (find_zipl_boot_menu_banner(&offset)) {
>> + /* Load the adjacent blocks to account for the
>> + * possibility of menu data spanning multiple blocks.
>> + */
>> + if (prev_block_nr) {
> You did not pre-initialize prev_block_nr = 0 at the beginning of the
> function. Do you feel confident enough that the first block never
> contains the zipl banner? If not, please set prev_block_nr = 0 before
> entering the for-loop.
>
>> + read_block(prev_block_nr, s2_prev_blk,
>> + "Cannot read stage2 boot loader");
>> + }
>> +
>> + if (i + 1 < STAGE2_BLK_CNT_MAX) {
>> + next_block_nr = eckd_block_num((void *)&s1b->seek[i + 1].cyl);
>> + }
>> +
>> + if (next_block_nr) {
> Maybe also better set next_block_nr = 0 at the beginning of this function.
>
>> + read_block(next_block_nr, s2_next_blk,
>> + "Cannot read stage2 boot loader");
>> + }
>> +
>> + zipl_parms = get_zipl_parms(offset);
>> + found = true;
>> + break;
>> + }
>> +
>> + prev_block_nr = cur_block_nr;
>> + }
>> +
>> + if (!found) {
>> + sclp_print("No zipl boot menu data found. Booting default entry.");
>> + return 0;
>> + }
>> +
>> + zipl_parms.menu_start++; /* make compiler happy -- does nothing vital */
> <nit>
> It's always nicer to avoid introducing code that you've got to remove
> right in the next patch. You could rather add a
>
> int menu_get_zipl_boot_index(const void *stage2, ZiplParms zipl_parms)
> {
> /* implemented in the next patch */
> }
>
> to menu.c in this patch already, so you can already call it here and
> don't have to modify eckd_get_boot_menu_index() again in the next patch.
> </nit>
Thanks for the advice... I wasn't sure what the best approach to this was.
>
>> + return 0; /* implemented next patch */
>> +}
>> +
>> +static void run_eckd_boot_script(block_number_t mbr_block_nr,
>> + block_number_t s1b_block_nr)
>> {
>> int i;
>> unsigned int loadparm = get_loadparm_index();
>> @@ -191,6 +283,10 @@ static void run_eckd_boot_script(block_number_t mbr_block_nr)
>> ScsiMbr *bte = (void *)sec; /* Eckd bootmap table entry */
>> BootMapScript *bms = (void *)sec;
>>
>> + if (menu_check_flags(BOOT_MENU_FLAG_BOOT_OPTS | BOOT_MENU_FLAG_ZIPL_OPTS)) {
>> + loadparm = eckd_get_boot_menu_index(s1b_block_nr);
>> + }
>> +
>> debug_print_int("loadparm", loadparm);
>> IPL_assert(loadparm < 31, "loadparm value greater than"
>> " maximum number of boot entries allowed");
>> @@ -223,7 +319,7 @@ static void ipl_eckd_cdl(void)
>> XEckdMbr *mbr;
>> EckdCdlIpl2 *ipl2 = (void *)sec;
>> IplVolumeLabel *vlbl = (void *)sec;
>> - block_number_t mbr_block_nr;
>> + block_number_t mbr_block_nr, s1b_block_nr;
>>
>> /* we have just read the block #0 and recognized it as "IPL1" */
>> sclp_print("CDL\n");
>> @@ -249,7 +345,10 @@ static void ipl_eckd_cdl(void)
>> /* save pointer to Boot Script */
>> mbr_block_nr = eckd_block_num((void *)&mbr->blockptr);
>>
>> - run_eckd_boot_script(mbr_block_nr);
>> + /* save pointer to Stage1b Data */
>> + s1b_block_nr = eckd_block_num((void *)&ipl2->stage1.seek[0].cyl);
> That could use eckd_block_num_by_chs(), too.
>
>> + run_eckd_boot_script(mbr_block_nr, s1b_block_nr);
>> /* no return */
>> }
>>
>> @@ -280,7 +379,7 @@ static void print_eckd_ldl_msg(ECKD_IPL_mode_t mode)
>>
>> static void ipl_eckd_ldl(ECKD_IPL_mode_t mode)
>> {
>> - block_number_t mbr_block_nr;
>> + block_number_t mbr_block_nr, s1b_block_nr;
>> EckdLdlIpl1 *ipl1 = (void *)sec;
>>
>> if (mode != ECKD_LDL_UNLABELED) {
>> @@ -303,7 +402,10 @@ static void ipl_eckd_ldl(ECKD_IPL_mode_t mode)
>> mbr_block_nr =
>> eckd_block_num((void *)&ipl1->boot_info.bp.ipl.bm_ptr.eckd.bptr);
>>
>> - run_eckd_boot_script(mbr_block_nr);
>> + /* save pointer to Stage1b Data */
>> + s1b_block_nr = eckd_block_num((void *)&ipl1->stage1.seek[0].cyl);
> dito.
>
>> + run_eckd_boot_script(mbr_block_nr, s1b_block_nr);
>> /* no return */
>> }
>>
>> diff --git a/pc-bios/s390-ccw/bootmap.h b/pc-bios/s390-ccw/bootmap.h
>> index df956f2..56445f2 100644
>> --- a/pc-bios/s390-ccw/bootmap.h
>> +++ b/pc-bios/s390-ccw/bootmap.h
>> @@ -74,6 +74,7 @@ typedef struct ScsiMbr {
>> } __attribute__ ((packed)) ScsiMbr;
>>
>> #define ZIPL_MAGIC "zIPL"
>> +#define ZIPL_MAGIC_EBCDIC "\xa9\xc9\xd7\xd3"
>> #define IPL1_MAGIC "\xc9\xd7\xd3\xf1" /* == "IPL1" in EBCDIC */
>> #define IPL2_MAGIC "\xc9\xd7\xd3\xf2" /* == "IPL2" in EBCDIC */
>> #define VOL1_MAGIC "\xe5\xd6\xd3\xf1" /* == "VOL1" in EBCDIC */
>> diff --git a/pc-bios/s390-ccw/menu.h b/pc-bios/s390-ccw/menu.h
>> index 04b1db1..3a8a487 100644
>> --- a/pc-bios/s390-ccw/menu.h
>> +++ b/pc-bios/s390-ccw/menu.h
>> @@ -17,6 +17,16 @@
>> #define BOOT_MENU_FLAG_BOOT_OPTS 0x80
>> #define BOOT_MENU_FLAG_ZIPL_OPTS 0x40
>>
>> +/* Offsets from zipl fields to zipl banner start */
>> +#define ZIPL_TIMEOUT_OFFSET 138
>> +#define ZIPL_FLAG_OFFSET 140
>> +
>> +typedef struct ZiplParms {
>> + uint16_t flag;
>> + uint16_t timeout;
>> + uint64_t menu_start;
>> +} ZiplParms;
>> +
>> void menu_set_parms(uint8_t boot_menu_flags, uint16_t boot_menu_timeout);
>> bool menu_check_flags(uint8_t check_flags);
> Thomas
>
Thanks.
--
- Collin L Walling
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [Qemu-devel] [qemu-s390x] [PATCH v3 7/8] s390-ccw: interactive boot menu for eckd dasd (read input)
2018-01-17 10:10 ` Thomas Huth
@ 2018-01-17 13:19 ` Collin L. Walling
0 siblings, 0 replies; 32+ messages in thread
From: Collin L. Walling @ 2018-01-17 13:19 UTC (permalink / raw)
To: Thomas Huth, qemu-s390x, qemu-devel
Cc: alifm, borntraeger, cohuck, david, frankja
On 01/17/2018 05:10 AM, Thomas Huth wrote:
> On 15.01.2018 17:44, Collin L. Walling wrote:
>> When the boot menu options are present and the guest's
>> disk has been configured by the zipl tool, then the user
>> will be presented with an interactive boot menu with
>> labeled entries. An example of what the menu might look
>> like:
>>
>> zIPL v1.37.1-build-20170714 interactive boot menu.
>>
>> 0. default (linux-4.13.0)
>>
>> 1. linux-4.13.0
>> 2. performance
>> 3. kvm
>>
>> Please choose (default will boot in 10 seconds):
>>
>> If the user's input is empty or 0, the default zipl entry will
>> be chosen. If the input is within the range presented by the
>> menu, then the selection will be booted. Any erroneous input
>> will cancel the timeout and prompt the user until correct
>> input is given.
>>
>> Any value set for loadparm will override all boot menu options.
>> If loadparm=PROMPT, then the menu prompt will continuously wait
>> until correct user input is given.
>>
>> The absence of any boot options on the command line will attempt
>> to use the zipl loader values.
>>
>> --- Specific notes regarding this patch ---
>>
>> Implements an sclp_read function to capture input from the
>> console, and a wrapper function in that handles parsing
>> certain characters and adding input to a buffer. The input
>> is checked for any erroneous values and is handled
>> appropriately. A correct value will boot the respective
>> boot menu entry.
>>
>> Signed-off-by: Collin L. Walling <walling@linux.vnet.ibm.com>
>> ---
>> pc-bios/s390-ccw/menu.c | 160 +++++++++++++++++++++++++++++++++++++++++++-
>> pc-bios/s390-ccw/s390-ccw.h | 2 +
>> pc-bios/s390-ccw/sclp.c | 20 ++++++
>> pc-bios/s390-ccw/virtio.c | 2 +-
>> 4 files changed, 182 insertions(+), 2 deletions(-)
>>
>> diff --git a/pc-bios/s390-ccw/menu.c b/pc-bios/s390-ccw/menu.c
>> index 30470b3..c219b7f 100644
>> --- a/pc-bios/s390-ccw/menu.c
>> +++ b/pc-bios/s390-ccw/menu.c
>> @@ -12,9 +12,167 @@
>> #include "menu.h"
>> #include "s390-ccw.h"
>>
>> +#define KEYCODE_NO_INP '\0'
>> +#define KEYCODE_ESCAPE '\033'
>> +#define KEYCODE_BACKSP '\177'
>> +#define KEYCODE_ENTER '\r'
>> +
>> static uint8_t flags;
>> static uint64_t timeout;
>>
>> +static inline void enable_clock_int(void)
>> +{
>> + uint64_t tmp = 0;
>> +
>> + asm volatile(
>> + "stctg 0,0,%0\n"
>> + "oi 6+%0, 0x8\n"
>> + "lctlg 0,0,%0"
>> + : : "Q" (tmp) : "memory"
>> + );
>> +}
>> +
>> +static inline void disable_clock_int(void)
>> +{
>> + uint64_t tmp = 0;
>> +
>> + asm volatile(
>> + "stctg 0,0,%0\n"
>> + "ni 6+%0, 0xf7\n"
>> + "lctlg 0,0,%0"
>> + : : "Q" (tmp) : "memory"
>> + );
>> +}
>> +
>> +static inline void set_clock_comparator(uint64_t time)
>> +{
>> + asm volatile("sckc %0" : : "Q" (time));
>> +}
>> +
>> +static inline bool check_clock_int(void)
>> +{
>> + uint16_t *code = (uint16_t *)0x86;
> Maybe add a comment at the end of the line saying that 0x86 is the
> "External-Interruption Code" field in the low-core.
Good idea.
>
>> + consume_sclp_int();
>> +
>> + return *code == 0x1004;
>> +}
>> +
>> +static int read_prompt(char *buf, size_t len)
>> +{
>> + char inp[2] = {};
>> + uint8_t idx = 0;
>> + uint64_t time;
>> +
>> + if (timeout) {
>> + time = get_clock() + (timeout << 32);
> Well, that looks like you're calculating with 1s = 1024 ms here. That's
> likely ok for small timeouts ... but anyway, why not do it correct right
> from the start to avoid confusion later? (Testers sometime really try
> large timeouts to see whether the time is accurate)
You're absolutely right. I should do timeout * ONE_TOD_CLOCK_SECOND
instead.
>
> By the way, just an idea, but I currently wonder whether using a
> resolution of 1s for timeout is really the best idea. Some people might
> also want to wait for half of seconds, for example ... so a resolution
> of 0.1s might be a better choice for the timeout value in the IPL block?
I see your point. The seconds vs milliseconds debate is something that
will
be answered once we'vemade a decision (internally) on exactly how we want
to store the boot menu fields in the IPLB.
I'll keep it in consideration.
>
>> + set_clock_comparator(time);
>> + enable_clock_int();
>> + timeout = 0;
>> + }
>> +
>> + while (!check_clock_int()) {> +
>> + /* Process only one character at a time */
>> + sclp_read(inp, 1);
>> +
>> + switch (inp[0]) {
>> + case KEYCODE_NO_INP:
>> + case KEYCODE_ESCAPE:
>> + continue;
>> + case KEYCODE_BACKSP:
>> + if (idx > 0) {
>> + /* Remove last character */
>> + buf[idx - 1] = ' ';
>> + sclp_print("\r");
>> + sclp_print(buf);
>> +
>> + idx--;
>> +
>> + /* Reset cursor */
>> + buf[idx] = 0;
>> + sclp_print("\r");
>> + sclp_print(buf);
> Not sure, but I think you could simplify this whole block in the curly
> braces to:
>
> buf[--idx] = 0;
> sclp_print("\b \b");
>
> ?
Just tried it out... you're a genius! (wish I thought it myself :) )
>
>> + }
>> + continue;
>> + case KEYCODE_ENTER:
>> + disable_clock_int();
>> + return idx;
>> + }
>> +
>> + /* Echo input and add to buffer */
>> + if (idx < len) {
>> + buf[idx] = inp[0];
>> + sclp_print(inp);
>> + idx++;
>> + }
>> + }
>> +
>> + disable_clock_int();
>> + *buf = 0;
>> +
>> + return 0;
>> +}
> [...]
>> diff --git a/pc-bios/s390-ccw/sclp.c b/pc-bios/s390-ccw/sclp.c
>> index 486fce1..5e4a78b 100644
>> --- a/pc-bios/s390-ccw/sclp.c
>> +++ b/pc-bios/s390-ccw/sclp.c
>> @@ -101,3 +101,23 @@ void sclp_get_loadparm_ascii(char *loadparm)
>> ebcdic_to_ascii((char *) sccb->loadparm, loadparm, 8);
>> }
>> }
>> +
>> +void sclp_read(char *str, size_t len)
>> +{
>> + ReadEventData *sccb = (void *)_sccb;
>> + char *buf = (char *)(&sccb->ebh) + 7;
>> +
>> + /* Len should not exceed the maximum size of the event buffer */
>> + if (len > SCCB_SIZE - 8) {
>> + len = SCCB_SIZE - 8;
>> + }
>> +
>> + sccb->h.length = SCCB_SIZE;
>> + sccb->h.function_code = SCLP_UNCONDITIONAL_READ;
>> + sccb->ebh.length = sizeof(EventBufferHeader);
>> + sccb->ebh.type = SCLP_EVENT_ASCII_CONSOLE_DATA;
>> + sccb->ebh.flags = 0;
>> +
>> + sclp_service_call(SCLP_CMD_READ_EVENT_DATA, sccb);
> Likely not required for your patch, but let me ask anyway:
> I'm not very familiar with the SCLP call, but isn't there a way to
> detect the amount of bytes that really have been read? ... it might be
> good to use that as return value for this function, so that the caller
> has a way to see how many bytes are valid.
AFAIK the only returns we get are response codes used for telling us if
something went wrong. The best we might be able to do is return strlen(buf)?
>
>> + memcpy(str, buf, len);
>> +}
>> diff --git a/pc-bios/s390-ccw/virtio.c b/pc-bios/s390-ccw/virtio.c
>> index c890a03..817e7f5 100644
>> --- a/pc-bios/s390-ccw/virtio.c
>> +++ b/pc-bios/s390-ccw/virtio.c
>> @@ -176,7 +176,7 @@ void vring_send_buf(VRing *vr, void *p, int len, int flags)
>> }
>> }
>>
>> -static u64 get_clock(void)
>> +u64 get_clock(void)
>> {
>> u64 r;
> Thomas
>
--
- Collin L Walling
^ permalink raw reply [flat|nested] 32+ messages in thread
end of thread, other threads:[~2018-01-17 13:19 UTC | newest]
Thread overview: 32+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-01-15 16:44 [Qemu-devel] [PATCH v3 0/8] Interactive Boot Menu for DASD and SCSI Guests on s390x Collin L. Walling
2018-01-15 16:44 ` [Qemu-devel] [PATCH v3 1/8] s390-ccw: update libc Collin L. Walling
2018-01-15 17:05 ` Eric Blake
2018-01-15 17:23 ` Collin L. Walling
2018-01-16 10:00 ` Thomas Huth
2018-01-16 17:19 ` [Qemu-devel] [qemu-s390x] " Collin L. Walling
2018-01-16 11:07 ` Christian Borntraeger
2018-01-16 15:32 ` Collin L. Walling
2018-01-16 15:48 ` Thomas Huth
2018-01-15 16:44 ` [Qemu-devel] [PATCH v3 2/8] s390-ccw: ipl structs for eckd cdl/ldl Collin L. Walling
2018-01-16 12:32 ` Thomas Huth
2018-01-16 15:21 ` [Qemu-devel] [qemu-s390x] " Collin L. Walling
2018-01-15 16:44 ` [Qemu-devel] [PATCH v3 3/8] s390-ccw: parse and set boot menu options Collin L. Walling
2018-01-16 12:44 ` Thomas Huth
2018-01-16 15:26 ` [Qemu-devel] [qemu-s390x] " Collin L. Walling
2018-01-15 16:44 ` [Qemu-devel] [PATCH v3 4/8] s390-ccw: interactive boot menu for eckd dasd (menu setup) Collin L. Walling
2018-01-16 18:23 ` Thomas Huth
2018-01-16 19:37 ` [Qemu-devel] [qemu-s390x] " Collin L. Walling
2018-01-17 6:11 ` Thomas Huth
2018-01-17 12:12 ` Collin L. Walling
2018-01-15 16:44 ` [Qemu-devel] [PATCH v3 5/8] s390-ccw: interactive boot menu for eckd dasd (read stage2 data) Collin L. Walling
2018-01-17 8:38 ` Thomas Huth
2018-01-17 9:12 ` [Qemu-devel] [qemu-s390x] " Thomas Huth
2018-01-17 12:29 ` Collin L. Walling
2018-01-15 16:44 ` [Qemu-devel] [PATCH v3 6/8] s390-ccw: interactive boot menu for eckd dasd (print menu) Collin L. Walling
2018-01-17 8:58 ` Thomas Huth
2018-01-15 16:44 ` [Qemu-devel] [PATCH v3 7/8] s390-ccw: interactive boot menu for eckd dasd (read input) Collin L. Walling
2018-01-17 10:10 ` Thomas Huth
2018-01-17 13:19 ` [Qemu-devel] [qemu-s390x] " Collin L. Walling
2018-01-15 16:44 ` [Qemu-devel] [PATCH v3 8/8] s390-ccw: interactive boot menu for scsi Collin L. Walling
2018-01-17 10:16 ` Thomas Huth
2018-01-15 16:58 ` [Qemu-devel] [PATCH v3 0/8] Interactive Boot Menu for DASD and SCSI Guests on s390x no-reply
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).