mbox series

[V2,0/18] s390x: Add Full Boot Order Support

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

Message

Jared Rossi Sept. 27, 2024, 12:50 a.m. UTC
From: Jared Rossi <jrossi@linux.ibm.com>

Loosely a v2, this updated patch set is a significant rework to most aspects of
the initially proposed multi-device boot order. Of particular note, the
original patch set used code jumps to restart the IPL while this version
does not. In order to remove the code jumps, two significant prerequisite
changes are required for the pc-bios. Firstly, the netboot code is linked into
the main s390-ccw.img, which allows for return after a failed netboot, based on
the patch set from Thomas Huth <thuth@redhat.com>
(https://lists.gnu.org/archive/html/qemu-devel/2024-06/msg03956.html).
Secondly, IPL errors that result in an immediate termination are converted
to instead provide a return value back to the main IPL calling function.

The routines for building and loading fallback device IPLBs are largely
unchanged: An IPLB is built for each device with a boot index
specified (up to 8 devices). The IPLBs location in memory is passed to the guest
using the global QIPL structure, which is stored at a fixed address. If the
first device in the boot order successfully IPLs, then the additional IPLBs are
never used; however, if the first device fails, subsequent IPLBs are retrieved
from memory and the IPL process restarts using the specifications contained in
the new IPLB.

This continues until IPL is successful or there are no IPLBs left to try.

The per-device loadparm attribute is still uniformly added to CCW devices
although it may only be assigned a value if the device has a boot index.
This will need further rework if a more targeted approach is desired.

Two automated test cases are planned for v3: a minimal test where a guest has
two boot devices defined and the first fails, and also a limit test where the
guest has 8 boot devices defined but only the last one can actually IPL.

Changes v1 -> v2:

- Use the libc from SLOF and replace sclp_print calls with put/printf
- Merge netboot into the main s390-ccw.img
- Rework pc-bios to return on error instead of panic
- Handle non-archetected IPLB types (QEMU SCSI) from DIAG308
- Remove code jumps and instead restart the IPL using a traditional loop

Jared Rossi (18):
  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 SCSI IPL path
  pc-bios/s390-ccw: Remove panics from ECKD 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
  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

 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       | 126 +++++++++
 pc-bios/s390-ccw/bootmap.h        |  21 +-
 pc-bios/s390-ccw/cio.h            |   2 +
 pc-bios/s390-ccw/dasd-ipl.h       |   2 +-
 pc-bios/s390-ccw/iplb.h           | 107 ++------
 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                    | 314 +++++++++++-----------
 hw/s390x/s390-virtio-ccw.c        |  28 +-
 hw/s390x/sclp.c                   |   3 +-
 pc-bios/s390-ccw/bootmap.c        | 428 ++++++++++++++++++++----------
 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           | 125 ++++-----
 pc-bios/s390-ccw/menu.c           |  51 ++--
 pc-bios/s390-ccw/netmain.c        |  44 ++-
 pc-bios/s390-ccw/sclp.c           |   7 +-
 pc-bios/s390-ccw/virtio-blkdev.c  |  14 +-
 pc-bios/s390-ccw/virtio-net.c     |   7 +-
 pc-bios/s390-ccw/virtio-scsi.c    | 164 ++++++++----
 pc-bios/s390-ccw/virtio.c         |  67 +++--
 target/s390x/diag.c               |   9 +-
 pc-bios/meson.build               |   1 -
 pc-bios/s390-ccw/Makefile         |  69 ++++-
 pc-bios/s390-netboot.img          | Bin 67232 -> 0 bytes
 34 files changed, 1143 insertions(+), 1105 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 Sept. 30, 2024, 1:14 p.m. UTC | #1
On 27/09/2024 02.50, jrossi@linux.ibm.com wrote:
> From: Jared Rossi <jrossi@linux.ibm.com>
> 
> Loosely a v2, this updated patch set is a significant rework to most aspects of
> the initially proposed multi-device boot order. Of particular note, the
> original patch set used code jumps to restart the IPL while this version
> does not. In order to remove the code jumps, two significant prerequisite
> changes are required for the pc-bios. Firstly, the netboot code is linked into
> the main s390-ccw.img, which allows for return after a failed netboot, based on
> the patch set from Thomas Huth <thuth@redhat.com>
> (https://lists.gnu.org/archive/html/qemu-devel/2024-06/msg03956.html).
> Secondly, IPL errors that result in an immediate termination are converted
> to instead provide a return value back to the main IPL calling function.
> 
> The routines for building and loading fallback device IPLBs are largely
> unchanged: An IPLB is built for each device with a boot index
> specified (up to 8 devices). The IPLBs location in memory is passed to the guest
> using the global QIPL structure, which is stored at a fixed address. If the
> first device in the boot order successfully IPLs, then the additional IPLBs are
> never used; however, if the first device fails, subsequent IPLBs are retrieved
> from memory and the IPL process restarts using the specifications contained in
> the new IPLB.
> 
> This continues until IPL is successful or there are no IPLBs left to try.
> 
> The per-device loadparm attribute is still uniformly added to CCW devices
> although it may only be assigned a value if the device has a boot index.
> This will need further rework if a more targeted approach is desired.
> 
> Two automated test cases are planned for v3: a minimal test where a guest has
> two boot devices defined and the first fails, and also a limit test where the
> guest has 8 boot devices defined but only the last one can actually IPL.

Thanks, this looks already much better than the "jump back to start" stuff 
in v1 !

One thing I noticed while testing your patches: Booting from ISO images 
seems to be broken for me now, e.g. something like:

./qemu-system-s390x -nographic -accel kvm -m 1G \
  -bios pc-bios/s390-ccw/s390-ccw.img \
  -drive 
if=none,id=d1,file=Fedora-Server-dvd-s390x-38-1.6.iso,format=raw,media=cdrom \
  -device virtio-scsi -device scsi-cd,drive=d1,bootindex=1

used to work fine in the past, but gives me a "Failed to IPL this ISO 
image!" error now.

Does ISO IPL-ing work for you?

  Thomas
Jared Rossi Sept. 30, 2024, 2:20 p.m. UTC | #2
On 9/30/24 9:14 AM, Thomas Huth wrote:
> On 27/09/2024 02.50, jrossi@linux.ibm.com wrote:
>> From: Jared Rossi <jrossi@linux.ibm.com>
>> ...
>
> Thanks, this looks already much better than the "jump back to start" 
> stuff in v1 !
>
> One thing I noticed while testing your patches: Booting from ISO 
> images seems to be broken for me now, e.g. something like:
>
> ./qemu-system-s390x -nographic -accel kvm -m 1G \
>  -bios pc-bios/s390-ccw/s390-ccw.img \
>  -drive 
> if=none,id=d1,file=Fedora-Server-dvd-s390x-38-1.6.iso,format=raw,media=cdrom 
> \
>  -device virtio-scsi -device scsi-cd,drive=d1,bootindex=1
>
> used to work fine in the past, but gives me a "Failed to IPL this ISO 
> image!" error now.
>
> Does ISO IPL-ing work for you?
>
>  Thomas
>
>

Hi Thomas,

Firstly, I just wanted to say thank you for your continued support and 
guidance
on this feature. Converting all of the panics to returns ended up being 
rather
invasive and touched a lot of code I had not initially expected to 
modify, so
I appreciate your patience with the rework.

As for the ISO IPL, after reading your review comments I’m not surprised it
fails for you. The problem is certainly caused by the mismatched error
condition checks you pointed out in your response to patch 07. I also
recognize that means this code path was not sufficiently exercised in my own
testing, so I will resolve that and also double check for any other gaps in
coverage on my side.

I will make the changes you suggest and also add the automated test 
cases you
previously requested, and try to get v3 posted ASAP.

Thanks again,
Jared Rossi