diff mbox series

[11/18] pc-bios/s390-ccw: Remove panics from Netboot IPL path

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

Commit Message

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

Remove panic-on-error from Netboot specific functions so that error recovery
may be possible in the future.

Functions that would previously panic now provide a return code.

Signed-off-by: Jared Rossi <jrossi@linux.ibm.com>

---
 pc-bios/s390-ccw/s390-ccw.h   |  2 +-
 pc-bios/s390-ccw/bootmap.c    |  1 +
 pc-bios/s390-ccw/netmain.c    | 22 +++++++++++++++-------
 pc-bios/s390-ccw/virtio-net.c |  7 +++++--
 4 files changed, 22 insertions(+), 10 deletions(-)

Comments

Thomas Huth Sept. 30, 2024, 9:39 a.m. UTC | #1
On 27/09/2024 02.51, jrossi@linux.ibm.com wrote:
> From: Jared Rossi <jrossi@linux.ibm.com>
> 
> Remove panic-on-error from Netboot specific functions so that error recovery
> may be possible in the future.
> 
> Functions that would previously panic now provide a return code.
> 
> Signed-off-by: Jared Rossi <jrossi@linux.ibm.com>
> 
> ---
...
> index bc6ad8695f..013f94d932 100644
> --- a/pc-bios/s390-ccw/netmain.c
> +++ b/pc-bios/s390-ccw/netmain.c
> @@ -464,7 +464,7 @@ static bool find_net_dev(Schib *schib, int dev_no)
>       return false;
>   }
>   
> -static void virtio_setup(void)
> +static int virtio_setup(void)
>   {
>       Schib schib;
>       int ssid;
> @@ -479,7 +479,10 @@ static void virtio_setup(void)
>       enable_mss_facility();
>   
>       if (store_iplb(&iplb)) {
> -        IPL_assert(iplb.pbt == S390_IPL_TYPE_CCW, "IPL_TYPE_CCW expected");
> +        if (iplb.pbt != S390_IPL_TYPE_CCW) {
> +            puts("IPL_TYPE_CCW expected");
> +        }

I think in this case, the IPL_assert() could maybe even stay: If we end up 
here without the correct type in iplb.pbt, there was likely a bug elsewhere 
in the earlier setup code already, or do you see a way we could end up here 
with another type?

Anyway, if you want to change it, shouldn't there be a "return false" after 
the puts() statement?

  Thomas
Jared Rossi Sept. 30, 2024, 1:15 p.m. UTC | #2
On 9/30/24 5:39 AM, Thomas Huth wrote:
> On 27/09/2024 02.51, jrossi@linux.ibm.com wrote:
>> From: Jared Rossi <jrossi@linux.ibm.com>
>>
>> Remove panic-on-error from Netboot specific functions so that error 
>> recovery
>> may be possible in the future.
>>
>> Functions that would previously panic now provide a return code.
>>
>> Signed-off-by: Jared Rossi <jrossi@linux.ibm.com>
>>
>> ---
> ...
>> index bc6ad8695f..013f94d932 100644
>> --- a/pc-bios/s390-ccw/netmain.c
>> +++ b/pc-bios/s390-ccw/netmain.c
>> @@ -464,7 +464,7 @@ static bool find_net_dev(Schib *schib, int dev_no)
>>       return false;
>>   }
>>   -static void virtio_setup(void)
>> +static int virtio_setup(void)
>>   {
>>       Schib schib;
>>       int ssid;
>> @@ -479,7 +479,10 @@ static void virtio_setup(void)
>>       enable_mss_facility();
>>         if (store_iplb(&iplb)) {
>> -        IPL_assert(iplb.pbt == S390_IPL_TYPE_CCW, "IPL_TYPE_CCW 
>> expected");
>> +        if (iplb.pbt != S390_IPL_TYPE_CCW) {
>> +            puts("IPL_TYPE_CCW expected");
>> +        }
>
> I think in this case, the IPL_assert() could maybe even stay: If we 
> end up here without the correct type in iplb.pbt, there was likely a 
> bug elsewhere in the earlier setup code already, or do you see a way 
> we could end up here with another type?
>
I agree that the panic can stay in this case. The only way that the PBT 
could
be wrong at this stage is if there were in error earlier when building the
IPLB, so it is appropriate to terminate the entire IPL in that case.

Jared Rossi
diff mbox series

Patch

diff --git a/pc-bios/s390-ccw/s390-ccw.h b/pc-bios/s390-ccw/s390-ccw.h
index cbd92f3671..8dac070257 100644
--- a/pc-bios/s390-ccw/s390-ccw.h
+++ b/pc-bios/s390-ccw/s390-ccw.h
@@ -57,7 +57,7 @@  unsigned int get_loadparm_index(void);
 void main(void);
 
 /* netmain.c */
-void netmain(void);
+int netmain(void);
 
 /* sclp.c */
 void sclp_print(const char *string);
diff --git a/pc-bios/s390-ccw/bootmap.c b/pc-bios/s390-ccw/bootmap.c
index dc7200c264..9459e19ffb 100644
--- a/pc-bios/s390-ccw/bootmap.c
+++ b/pc-bios/s390-ccw/bootmap.c
@@ -1059,6 +1059,7 @@  void zipl_load(void)
 
     if (virtio_get_device_type() == VIRTIO_ID_NET) {
         netmain();
+        panic("\n! Cannot IPL from this network !\n");
     }
 
     if (ipl_scsi()) {
diff --git a/pc-bios/s390-ccw/netmain.c b/pc-bios/s390-ccw/netmain.c
index bc6ad8695f..013f94d932 100644
--- a/pc-bios/s390-ccw/netmain.c
+++ b/pc-bios/s390-ccw/netmain.c
@@ -464,7 +464,7 @@  static bool find_net_dev(Schib *schib, int dev_no)
     return false;
 }
 
-static void virtio_setup(void)
+static int virtio_setup(void)
 {
     Schib schib;
     int ssid;
@@ -479,7 +479,10 @@  static void virtio_setup(void)
     enable_mss_facility();
 
     if (store_iplb(&iplb)) {
-        IPL_assert(iplb.pbt == S390_IPL_TYPE_CCW, "IPL_TYPE_CCW expected");
+        if (iplb.pbt != S390_IPL_TYPE_CCW) {
+            puts("IPL_TYPE_CCW expected");
+        }
+
         dev_no = iplb.ccw.devno;
         debug_print_int("device no. ", dev_no);
         net_schid.ssid = iplb.ccw.ssid & 0x3;
@@ -495,10 +498,10 @@  static void virtio_setup(void)
         }
     }
 
-    IPL_assert(found, "No virtio net device found");
+    return found;
 }
 
-void netmain(void)
+int netmain(void)
 {
     filename_ip_t fn_ip;
     int rc, fnlen;
@@ -506,11 +509,15 @@  void netmain(void)
     sclp_setup();
     puts("Network boot starting...");
 
-    virtio_setup();
+    if (!virtio_setup()) {
+        puts("No virtio net device found.");
+        return 1;
+    }
 
     rc = net_init(&fn_ip);
     if (rc) {
-        panic("Network initialization failed. Halting.");
+        puts("Network initialization failed.");
+        return 1;
     }
 
     fnlen = strlen(fn_ip.filename);
@@ -528,5 +535,6 @@  void netmain(void)
         jump_to_low_kernel();
     }
 
-    panic("Failed to load OS from network.");
+    puts("Failed to load OS from network.");
+    return 1;
 }
diff --git a/pc-bios/s390-ccw/virtio-net.c b/pc-bios/s390-ccw/virtio-net.c
index 2fcb0a58c5..f9854a22c3 100644
--- a/pc-bios/s390-ccw/virtio-net.c
+++ b/pc-bios/s390-ccw/virtio-net.c
@@ -54,8 +54,11 @@  int virtio_net_init(void *mac_addr)
     vdev->guest_features[0] = VIRTIO_NET_F_MAC_BIT;
     virtio_setup_ccw(vdev);
 
-    IPL_assert(vdev->guest_features[0] & VIRTIO_NET_F_MAC_BIT,
-               "virtio-net device does not support the MAC address feature");
+    if (!(vdev->guest_features[0] & VIRTIO_NET_F_MAC_BIT)) {
+        puts("virtio-net device does not support the MAC address feature");
+        return -1;
+    }
+
     memcpy(mac_addr, vdev->config.net.mac, ETH_ALEN);
 
     for (i = 0; i < 64; i++) {