[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[qemu-s390x] [PATCH v8 12/13] s390-ccw: use zipl values when no boot men
From: |
Collin L. Walling |
Subject: |
[qemu-s390x] [PATCH v8 12/13] s390-ccw: use zipl values when no boot menu options are present |
Date: |
Wed, 21 Feb 2018 14:35:51 -0500 |
If no boot menu options are present, then flag the boot menu to
use the zipl options that were set in the zipl configuration file
(and stored on disk by zipl). These options are found at some
offset prior to the start of the zipl boot menu banner. The zipl
timeout value is limited to a 16-bit unsigned integer and stored
as seconds, so we take care to convert it to milliseconds in order
to conform to the rest of the boot menu functionality. This is
limited to CCW devices.
For reference, the zipl configuration file uses the following
fields in the menu section:
prompt=1 enable the boot menu
timeout=X set the timeout to X seconds
To explicitly disregard any boot menu options, then menu=off or
<bootmenu enable='no' ... /> must be specified.
Signed-off-by: Collin L. Walling <address@hidden>
---
hw/s390x/ipl.c | 5 +++++
hw/s390x/ipl.h | 1 +
pc-bios/s390-ccw/iplb.h | 1 +
pc-bios/s390-ccw/main.c | 3 ++-
pc-bios/s390-ccw/menu.c | 14 ++++++++++++++
5 files changed, 23 insertions(+), 1 deletion(-)
diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c
index a176c4a..a0f4f40 100644
--- a/hw/s390x/ipl.c
+++ b/hw/s390x/ipl.c
@@ -233,6 +233,11 @@ static void s390_ipl_set_boot_menu(S390IPLState *ipl)
switch (ipl->iplb.pbt) {
case S390_IPL_TYPE_CCW:
+ /* In the absence of -boot menu, use zipl parameters */
+ if (!qemu_opt_get(opts, "menu")) {
+ *flags |= QIPL_FLAG_BM_OPTS_ZIPL;
+ return;
+ }
break;
default:
error_report("boot menu is not supported for this device type.");
diff --git a/hw/s390x/ipl.h b/hw/s390x/ipl.h
index 3a37924..1a8adc2 100644
--- a/hw/s390x/ipl.h
+++ b/hw/s390x/ipl.h
@@ -93,6 +93,7 @@ void s390_reipl_request(void);
/* Boot Menu flags */
#define QIPL_FLAG_BM_OPTS_CMD 0x80
+#define QIPL_FLAG_BM_OPTS_ZIPL 0x40
/*
* The QEMU IPL Parameters will be stored at absolute address
diff --git a/pc-bios/s390-ccw/iplb.h b/pc-bios/s390-ccw/iplb.h
index 832bb94..7dfce4f 100644
--- a/pc-bios/s390-ccw/iplb.h
+++ b/pc-bios/s390-ccw/iplb.h
@@ -76,6 +76,7 @@ extern IplParameterBlock iplb
__attribute__((__aligned__(PAGE_SIZE)));
/* Boot Menu flags */
#define QIPL_FLAG_BM_OPTS_CMD 0x80
+#define QIPL_FLAG_BM_OPTS_ZIPL 0x40
/*
* This definition must be kept in sync with the defininition
diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c
index 32ed70e..a7473b0 100644
--- a/pc-bios/s390-ccw/main.c
+++ b/pc-bios/s390-ccw/main.c
@@ -20,6 +20,7 @@ QemuIplParameters qipl;
#define LOADPARM_PROMPT "PROMPT "
#define LOADPARM_EMPTY "........"
+#define BOOT_MENU_FLAG_MASK (QIPL_FLAG_BM_OPTS_CMD | QIPL_FLAG_BM_OPTS_ZIPL)
/*
* Priniciples of Operations (SA22-7832-09) chapter 17 requires that
@@ -91,7 +92,7 @@ static void menu_setup(void)
switch (iplb.pbt) {
case S390_IPL_TYPE_CCW:
- menu_set_parms(qipl.qipl_flags & QIPL_FLAG_BM_OPTS_CMD,
+ menu_set_parms(qipl.qipl_flags & BOOT_MENU_FLAG_MASK,
qipl.boot_menu_timeout);
return;
}
diff --git a/pc-bios/s390-ccw/menu.c b/pc-bios/s390-ccw/menu.c
index 4f84bfe..4fc328d 100644
--- a/pc-bios/s390-ccw/menu.c
+++ b/pc-bios/s390-ccw/menu.c
@@ -18,6 +18,10 @@
#define KEYCODE_BACKSP '\177'
#define KEYCODE_ENTER '\r'
+/* Offsets from zipl fields to zipl banner start */
+#define ZIPL_TIMEOUT_OFFSET 138
+#define ZIPL_FLAG_OFFSET 140
+
#define TOD_CLOCK_MILLISECOND 0x3e8000
#define LOW_CORE_EXTERNAL_INT_ADDR 0x86
@@ -187,6 +191,16 @@ int menu_get_zipl_boot_index(const char *menu_data)
{
size_t len;
int entries;
+ uint16_t zipl_flag = *(uint16_t *)(menu_data - ZIPL_FLAG_OFFSET);
+ uint16_t zipl_timeout = *(uint16_t *)(menu_data - ZIPL_TIMEOUT_OFFSET);
+
+ if (flag == QIPL_FLAG_BM_OPTS_ZIPL) {
+ if (!zipl_flag) {
+ return 0; /* Boot default */
+ }
+ /* zipl stores timeout as seconds */
+ timeout = zipl_timeout * 1000;
+ }
/* Print and count all menu items, including the banner */
for (entries = 0; *menu_data; entries++) {
--
2.7.4
- [qemu-s390x] [PATCH v8 00/13] Interactive Boot Menu for DASD and SCSI Guests on s390x, Collin L. Walling, 2018/02/21
- [qemu-s390x] [PATCH v8 08/13] s390-ccw: read stage2 boot loader data to find menu, Collin L. Walling, 2018/02/21
- [qemu-s390x] [PATCH v8 02/13] s390-ccw: refactor eckd_block_num to use CHS, Collin L. Walling, 2018/02/21
- [qemu-s390x] [PATCH v8 12/13] s390-ccw: use zipl values when no boot menu options are present,
Collin L. Walling <=
- [qemu-s390x] [PATCH v8 01/13] s390-ccw: refactor boot map table code, Collin L. Walling, 2018/02/21
- [qemu-s390x] [PATCH v8 04/13] s390-ccw: update libc, Collin L. Walling, 2018/02/21
- [qemu-s390x] [PATCH v8 10/13] s390-ccw: read user input for boot index via the SCLP console, Collin L. Walling, 2018/02/21
- [qemu-s390x] [PATCH v8 11/13] s390-ccw: set cp_receive mask only when needed and consume pending service irqs, Collin L. Walling, 2018/02/21
- [qemu-s390x] [PATCH v8 06/13] s390-ccw: parse and set boot menu options, Collin L. Walling, 2018/02/21
- [qemu-s390x] [PATCH v8 07/13] s390-ccw: set up interactive boot menu parameters, Collin L. Walling, 2018/02/21