mbox series

[v5,00/19] s390x: Add Full Boot Order Support

Message ID 20241020012953.1380075-1-jrossi@linux.ibm.com (mailing list archive)
Headers show
Series s390x: Add Full Boot Order Support | expand

Message

Jared Rossi Oct. 20, 2024, 1:29 a.m. UTC
From: Jared Rossi <jrossi@linux.ibm.com>

changes v4 -> v5:
- Fix a bug with per-deice loadparm support:
    The machine loadparm is no longer overwritten by device values, which now
    allows an empty machine loadparm to propagate to later devices even if
    the primary boot device set an initial loadparm
- Fix two instances where changes were squashed into wrong patch
- Fix an instance where NULL_BLOCK_NR was returned instead of ERROR_BLOCK_NR
- Fix an instance of logical AND being used instead of bitwise AND
- Standardize all error values to be negative in all device type paths
- Minor stylistic changes and code simplification


changes v3 -> v4:
- Ensure signed-ness of return values is appropriate
- Add missing newline character in replacements of sclp_print_int()
- Add a missing return in a SCSI error path
- Restore break that was incorrectly removed for Virtio CU devices
- Remove an extra/early return that caused probing to end early
- Convert "good" device to scsi-cd in a cdrom-test for better coverage
- Minor stylistic clean-ups and variable name clarifications

Jared Rossi (19):
  hw/s390x/ipl: Provide more memory to the s390-ccw.img firmware
  pc-bios/s390-ccw: Use the libc from SLOF and remove sclp prints
  pc-bios/s390-ccw: Link the netboot code into the main s390-ccw.img
    binary
  hw/s390x: Remove the possibility to load the s390-netboot.img binary
  pc-bios/s390-ccw: Merge netboot.mak into the main Makefile
  docs/system/s390x/bootdevices: Update the documentation about network
    booting
  pc-bios/s390-ccw: Remove panics from ISO IPL path
  pc-bios/s390-ccw: Remove panics from ECKD IPL path
  pc-bios/s390-ccw: Remove panics from SCSI IPL path
  pc-bios/s390-ccw: Remove panics from DASD IPL path
  pc-bios/s390-ccw: Remove panics from Netboot IPL path
  pc-bios/s390-ccw: Enable failed IPL to return after error
  include/hw/s390x: Add include files for common IPL structs
  s390x: Add individual loadparm assignment to CCW device
  hw/s390x: Build an IPLB for each boot device
  s390x: Rebuild IPLB for SCSI device directly from DIAG308
  pc-bios/s390x: Enable multi-device boot loop
  docs/system: Update documentation for s390x IPL
  tests/qtest: Add s390x boot order tests to cdrom-test.c

 docs/system/bootindex.rst         |   7 +-
 docs/system/s390x/bootdevices.rst |  29 +-
 pc-bios/s390-ccw/netboot.mak      |  62 ----
 hw/s390x/ccw-device.h             |   2 +
 hw/s390x/ipl.h                    | 123 +-------
 include/hw/s390x/ipl/qipl.h       | 127 +++++++++
 pc-bios/s390-ccw/bootmap.h        |  20 +-
 pc-bios/s390-ccw/cio.h            |   2 +
 pc-bios/s390-ccw/dasd-ipl.h       |   2 +-
 pc-bios/s390-ccw/iplb.h           | 108 ++-----
 pc-bios/s390-ccw/libc.h           |  89 ------
 pc-bios/s390-ccw/s390-ccw.h       |  36 +--
 pc-bios/s390-ccw/virtio.h         |   3 +-
 hw/s390x/ccw-device.c             |  46 +++
 hw/s390x/ipl.c                    | 282 +++++++++---------
 hw/s390x/s390-virtio-ccw.c        |  28 +-
 hw/s390x/sclp.c                   |   9 +-
 pc-bios/s390-ccw/bootmap.c        | 455 ++++++++++++++++++++----------
 pc-bios/s390-ccw/cio.c            |  81 +++---
 pc-bios/s390-ccw/dasd-ipl.c       |  71 ++---
 pc-bios/s390-ccw/jump2ipl.c       |  22 +-
 pc-bios/s390-ccw/libc.c           |  88 ------
 pc-bios/s390-ccw/main.c           |  97 ++++---
 pc-bios/s390-ccw/menu.c           |  51 ++--
 pc-bios/s390-ccw/netmain.c        |  38 ++-
 pc-bios/s390-ccw/sclp.c           |   7 +-
 pc-bios/s390-ccw/virtio-blkdev.c  |  12 +-
 pc-bios/s390-ccw/virtio-net.c     |   7 +-
 pc-bios/s390-ccw/virtio-scsi.c    | 160 +++++++----
 pc-bios/s390-ccw/virtio.c         |  67 +++--
 target/s390x/diag.c               |   9 +-
 tests/qtest/cdrom-test.c          |  24 ++
 pc-bios/meson.build               |   1 -
 pc-bios/s390-ccw/Makefile         |  69 ++++-
 pc-bios/s390-netboot.img          | Bin 67232 -> 0 bytes
 35 files changed, 1158 insertions(+), 1076 deletions(-)
 delete mode 100644 pc-bios/s390-ccw/netboot.mak
 create mode 100644 include/hw/s390x/ipl/qipl.h
 delete mode 100644 pc-bios/s390-ccw/libc.h
 delete mode 100644 pc-bios/s390-ccw/libc.c
 delete mode 100644 pc-bios/s390-netboot.img

Comments

Thomas Huth Oct. 31, 2024, 3:50 p.m. UTC | #1
On 20/10/2024 03.29, jrossi@linux.ibm.com wrote:
> From: Jared Rossi <jrossi@linux.ibm.com>
> 
> changes v4 -> v5:
> - Fix a bug with per-deice loadparm support:
>      The machine loadparm is no longer overwritten by device values, which now
>      allows an empty machine loadparm to propagate to later devices even if
>      the primary boot device set an initial loadparm
> - Fix two instances where changes were squashed into wrong patch
> - Fix an instance where NULL_BLOCK_NR was returned instead of ERROR_BLOCK_NR
> - Fix an instance of logical AND being used instead of bitwise AND
> - Standardize all error values to be negative in all device type paths
> - Minor stylistic changes and code simplification

  Hi Jared!

Our QE Sebastian also had a try with the patches today, and discovered some 
non-working scenarios:

Try to boot from non-working CD image first, then from a working HD image:

dd if=/dev/zero of=/tmp/zero.dat bs=1M count=10
qemu-system-s390x -nographic -accel kvm -m 2G \
  -drive if=none,id=d1,file=/tmp/zero.dat,format=raw,media=cdrom \
  -device virtio-scsi -device scsi-cd,drive=d1,bootindex=1 \
  -drive if=none,file=good-image.qcow2,id=d2 \
  -device virtio-blk,drive=d2,bootindex=2

This outputs something like the following text, then aborts:

LOADPARM=[        ]

Using virtio-scsi.
SCSI CD-ROM detected.
Failed to IPL this ISO image!
LOADPARM=[        ]

Using virtio-blk.
Failed to IPL this ISO image!
ERROR: No suitable device for IPL. Halting...

Looks like the s390-ccw bios is treating the virtio-blk device as CD-ROM in 
this case?

Almost the same setup, first device is again a non-working CD image, but the 
second device is a virtio-net device - results in the same error message (so 
it's likely the same or at least a very similar problem).

Could you please have a look?

  Thanks!
   Thomas
Jared Rossi Nov. 5, 2024, 4:42 p.m. UTC | #2
Hi Thomas, Sebastian,

It looks like this is simply caused by the "is_cdrom" value only ever 
being set
to true.  I think it is a one-line fix that just makes sure to 
initialize the
value to false each time we try a new device:

diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c
index a4d1c05aac..3fdba0bedc 100644
--- a/pc-bios/s390-ccw/main.c
+++ b/pc-bios/s390-ccw/main.c
@@ -214,6 +214,7 @@ static void boot_setup(void)
  static bool find_boot_device(void)
  {
      VDev *vdev = virtio_get_device();
+    vdev->is_cdrom = false;
      bool found = false;

      switch (iplb.pbt) {

I tested it with the two scenarios you mention and with the existing qtests,
and it seems to work correctly now.

Thanks for finding the mistake,
  Jared Rossi

On 10/31/24 11:50 AM, Thomas Huth wrote:
> On 20/10/2024 03.29, jrossi@linux.ibm.com wrote:
>> From: Jared Rossi <jrossi@linux.ibm.com>
>>
>> changes v4 -> v5:
>> - Fix a bug with per-deice loadparm support:
>>      The machine loadparm is no longer overwritten by device values, 
>> which now
>>      allows an empty machine loadparm to propagate to later devices 
>> even if
>>      the primary boot device set an initial loadparm
>> - Fix two instances where changes were squashed into wrong patch
>> - Fix an instance where NULL_BLOCK_NR was returned instead of 
>> ERROR_BLOCK_NR
>> - Fix an instance of logical AND being used instead of bitwise AND
>> - Standardize all error values to be negative in all device type paths
>> - Minor stylistic changes and code simplification
>
>  Hi Jared!
>
> Our QE Sebastian also had a try with the patches today, and discovered 
> some non-working scenarios:
>
> Try to boot from non-working CD image first, then from a working HD 
> image:
>
> dd if=/dev/zero of=/tmp/zero.dat bs=1M count=10
> qemu-system-s390x -nographic -accel kvm -m 2G \
>  -drive if=none,id=d1,file=/tmp/zero.dat,format=raw,media=cdrom \
>  -device virtio-scsi -device scsi-cd,drive=d1,bootindex=1 \
>  -drive if=none,file=good-image.qcow2,id=d2 \
>  -device virtio-blk,drive=d2,bootindex=2
>
> This outputs something like the following text, then aborts:
>
> LOADPARM=[        ]
>
> Using virtio-scsi.
> SCSI CD-ROM detected.
> Failed to IPL this ISO image!
> LOADPARM=[        ]
>
> Using virtio-blk.
> Failed to IPL this ISO image!
> ERROR: No suitable device for IPL. Halting...
>
> Looks like the s390-ccw bios is treating the virtio-blk device as 
> CD-ROM in this case?
>
> Almost the same setup, first device is again a non-working CD image, 
> but the second device is a virtio-net device - results in the same 
> error message (so it's likely the same or at least a very similar 
> problem).
>
> Could you please have a look?
>
>  Thanks!
>   Thomas
>
Thomas Huth Nov. 6, 2024, 11:10 a.m. UTC | #3
On 05/11/2024 17.42, Jared Rossi wrote:
> Hi Thomas, Sebastian,
> 
> It looks like this is simply caused by the "is_cdrom" value only ever being set
> to true.  I think it is a one-line fix that just makes sure to initialize the
> value to false each time we try a new device:
> 
> diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c
> index a4d1c05aac..3fdba0bedc 100644
> --- a/pc-bios/s390-ccw/main.c
> +++ b/pc-bios/s390-ccw/main.c
> @@ -214,6 +214,7 @@ static void boot_setup(void)
>   static bool find_boot_device(void)
>   {
>       VDev *vdev = virtio_get_device();
> +    vdev->is_cdrom = false;
>       bool found = false;
> 
>       switch (iplb.pbt) {
> 
> I tested it with the two scenarios you mention and with the existing qtests,
> and it seems to work correctly now.

Agreed, this seems to fix the issue when all devices are properly marked 
with bootindex properties. But it still persists in case the BIOS has to 
scan for the boot device, e.g.:

qemu-system-s390x -accel kvm -m 2G -nographic \
  -drive if=none,id=d1,file=/tmp/bad.dat,format=raw,media=cdrom \
  -device virtio-scsi -device scsi-cd,drive=d1 \
  -drive if=none,id=d2,file=good.qcow2 -device virtio-blk,drive=d2

Isn't there a better place to set the is_cdrom variable?

  Thomas