[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 4/5] pc-bios/s390-ccw: Use the ccw bios to start the
From: |
Cornelia Huck |
Subject: |
[Qemu-devel] [PATCH 4/5] pc-bios/s390-ccw: Use the ccw bios to start the network boot |
Date: |
Mon, 20 Feb 2017 15:19:42 +0100 |
From: Farhan Ali <address@hidden>
We want to use the ccw bios to start final network boot. To do
this we use ccw bios to detect if the boot device is a virtio
network device and retrieve the start address of the
network boot image.
Signed-off-by: Farhan Ali <address@hidden>
Reviewed-by: Christian Borntraeger <address@hidden>
Signed-off-by: Cornelia Huck <address@hidden>
---
pc-bios/s390-ccw/bootmap.c | 8 +++++++-
pc-bios/s390-ccw/iplb.h | 3 ++-
pc-bios/s390-ccw/main.c | 20 ++++++++++++++------
pc-bios/s390-ccw/virtio.c | 1 +
pc-bios/s390-ccw/virtio.h | 1 +
5 files changed, 25 insertions(+), 8 deletions(-)
diff --git a/pc-bios/s390-ccw/bootmap.c b/pc-bios/s390-ccw/bootmap.c
index 611102e3ef..b21c877b53 100644
--- a/pc-bios/s390-ccw/bootmap.c
+++ b/pc-bios/s390-ccw/bootmap.c
@@ -724,11 +724,17 @@ static void zipl_load_vscsi(void)
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()) {
diff --git a/pc-bios/s390-ccw/iplb.h b/pc-bios/s390-ccw/iplb.h
index 86abc56a90..890aed9ece 100644
--- a/pc-bios/s390-ccw/iplb.h
+++ b/pc-bios/s390-ccw/iplb.h
@@ -13,7 +13,8 @@
#define IPLB_H
struct IplBlockCcw {
- uint8_t reserved0[85];
+ uint64_t netboot_start_addr;
+ uint8_t reserved0[77];
uint8_t ssid;
uint16_t devno;
uint8_t vm_flags;
diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c
index 345b848752..0946766d86 100644
--- a/pc-bios/s390-ccw/main.c
+++ b/pc-bios/s390-ccw/main.c
@@ -53,6 +53,12 @@ static bool find_dev(Schib *schib, int dev_no)
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;
}
@@ -67,6 +73,7 @@ static void virtio_setup(void)
int ssid;
bool found = false;
uint16_t dev_no;
+ VDev *vdev = virtio_get_device();
/*
* We unconditionally enable mss support. In every sane configuration,
@@ -85,9 +92,6 @@ static void virtio_setup(void)
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;
@@ -95,7 +99,6 @@ static void virtio_setup(void)
blk_schid.ssid = iplb.scsi.ssid & 0x3;
found = find_dev(&schib, iplb.scsi.devno);
break;
- }
default:
panic("List-directed IPL not supported yet!\n");
}
@@ -111,9 +114,14 @@ static void virtio_setup(void)
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)
diff --git a/pc-bios/s390-ccw/virtio.c b/pc-bios/s390-ccw/virtio.c
index b333734955..6ee93d56db 100644
--- a/pc-bios/s390-ccw/virtio.c
+++ b/pc-bios/s390-ccw/virtio.c
@@ -585,6 +585,7 @@ bool virtio_is_supported(SubChannelId schid)
switch (vdev.senseid.cu_model) {
case VIRTIO_ID_BLOCK:
case VIRTIO_ID_SCSI:
+ case VIRTIO_ID_NET:
return true;
}
}
diff --git a/pc-bios/s390-ccw/virtio.h b/pc-bios/s390-ccw/virtio.h
index eb35ea5faf..3388a423e5 100644
--- a/pc-bios/s390-ccw/virtio.h
+++ b/pc-bios/s390-ccw/virtio.h
@@ -276,6 +276,7 @@ struct VDev {
uint8_t scsi_dev_heads;
bool scsi_device_selected;
ScsiDevice selected_scsi_device;
+ uint64_t netboot_start_addr;
};
typedef struct VDev VDev;
--
2.11.0
- [Qemu-devel] [PATCH 2/5] s390x/ipl: Extend S390IPLState to support network boot, (continued)
- [Qemu-devel] [PATCH 2/5] s390x/ipl: Extend S390IPLState to support network boot, Cornelia Huck, 2017/02/20
- [Qemu-devel] [PATCH 1/5] elf-loader: Allow late loading of elf, Cornelia Huck, 2017/02/20
- Re: [Qemu-devel] [PATCH 1/5] elf-loader: Allow late loading of elf, Thomas Huth, 2017/02/20
- Re: [Qemu-devel] [PATCH 1/5] elf-loader: Allow late loading of elf, Cornelia Huck, 2017/02/21
- Re: [Qemu-devel] [PATCH 1/5] elf-loader: Allow late loading of elf, Christian Borntraeger, 2017/02/21
- Re: [Qemu-devel] [PATCH 1/5] elf-loader: Allow late loading of elf, Thomas Huth, 2017/02/24
- Re: [Qemu-devel] [PATCH 1/5] elf-loader: Allow late loading of elf, Christian Borntraeger, 2017/02/24
- Re: [Qemu-devel] [PATCH 1/5] elf-loader: Allow late loading of elf, Thomas Huth, 2017/02/24
- Re: [Qemu-devel] [PATCH 1/5] elf-loader: Allow late loading of elf, Farhan Ali, 2017/02/24
- Re: [Qemu-devel] [PATCH 1/5] elf-loader: Allow late loading of elf, Thomas Huth, 2017/02/24
[Qemu-devel] [PATCH 4/5] pc-bios/s390-ccw: Use the ccw bios to start the network boot,
Cornelia Huck <=
[Qemu-devel] [PATCH 3/5] s390x/ipl: Load network boot image, Cornelia Huck, 2017/02/20
[Qemu-devel] [PATCH 5/5] pc-bios/s390-ccw.img: rebuild image, Cornelia Huck, 2017/02/20
Re: [Qemu-devel] [PATCH 0/5] s390x: network boot, Thomas Huth, 2017/02/20