diff mbox series

[v3,4/8] s390-ccw: interactive boot menu for eckd dasd (menu setup)

Message ID 1516034665-27606-5-git-send-email-walling@linux.vnet.ibm.com
State New
Headers show
Series Interactive Boot Menu for DASD and SCSI Guests on s390x | expand

Commit Message

Collin L. Walling Jan. 15, 2018, 4:44 p.m. UTC
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 +++++++++++++++++++++
 pc-bios/s390-ccw/menu.c   | 26 ++++++++++++++++++++++++++
 pc-bios/s390-ccw/menu.h   | 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

Comments

Thomas Huth Jan. 16, 2018, 6:23 p.m. UTC | #1
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>
Collin L. Walling Jan. 16, 2018, 7:37 p.m. UTC | #2
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.
Thomas Huth Jan. 17, 2018, 6:11 a.m. UTC | #3
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
Collin L. Walling Jan. 17, 2018, 12:12 p.m. UTC | #4
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
>
diff mbox series

Patch

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;
diff --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;
+}
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 */