void zipl_load(void)
{
- if (virtio_get_device()->is_cdrom) {
+ VDev *vdev = virtio_get_device();
+
+ if (vdev->is_cdrom) {
ipl_iso_el_torito();
panic("\n! Cannot IPL this ISO image !\n");
}
+ if (virtio_get_device_type() == VIRTIO_ID_NET) {
+ jump_to_IPL_code(vdev->netboot_start_addr);
+ }
+
ipl_scsi();
switch (virtio_get_device_type()) {
if (!virtio_is_supported(blk_schid)) {
continue;
}
+ /* Skip net devices since no IPLB is created and therefore no
+ * no network bootloader has been loaded
+ */
+ if (virtio_get_device_type() == VIRTIO_ID_NET && dev_no < 0) {
+ continue;
+ }
if ((dev_no < 0) || (schib->pmcw.dev == dev_no)) {
return true;
}
int ssid;
bool found = false;
uint16_t dev_no;
+ VDev *vdev = virtio_get_device();
/*
* We unconditionally enable mss support. In every sane configuration,
found = find_dev(&schib, dev_no);
break;
case S390_IPL_TYPE_QEMU_SCSI:
- {
- VDev *vdev = virtio_get_device();
-
vdev->scsi_device_selected = true;
vdev->selected_scsi_device.channel = iplb.scsi.channel;
vdev->selected_scsi_device.target = iplb.scsi.target;
blk_schid.ssid = iplb.scsi.ssid & 0x3;
found = find_dev(&schib, iplb.scsi.devno);
break;
- }
default:
panic("List-directed IPL not supported yet!\n");
}
IPL_assert(found, "No virtio device found");
- virtio_setup_device(blk_schid);
+ if (virtio_get_device_type() == VIRTIO_ID_NET) {
+ sclp_print("Network boot device detected\n");
+ vdev->netboot_start_addr = iplb.ccw.netboot_start_addr;
+ } else {
+ virtio_setup_device(blk_schid);
- IPL_assert(virtio_ipl_disk_is_valid(), "No valid IPL device detected");
+ IPL_assert(virtio_ipl_disk_is_valid(), "No valid IPL device detected");
+ }
}
int main(void)