* [PATCH v4 0/8] s390x: Add support for virtio-net-pci boot device
@ 2026-09-24 19:48 Zhuoying Cai
2026-09-24 19:48 ` [PATCH v4 1/8] pc-bios/s390-ccw: Move CCW net setup to virtio-ccw Zhuoying Cai
` (7 more replies)
0 siblings, 8 replies; 16+ messages in thread
From: Zhuoying Cai @ 2026-09-24 19:48 UTC (permalink / raw)
To: qemu-devel, qemu-s390x
Cc: mst, jrossi, zycai, borntraeger, jjherne, cohuck, farman,
mjrosato, pasic, farosas, lvivier, pbonzini, jdaley
changelog v3->v4
[PATCH v3 2/8] pc-bios/s390-ccw: Add dynamic net header size handling
- Fixed the UAPI path in the commit message
- Removed the commented-out num_buffers field from VirtioNetHdr
- Acked-by: Christian Borntraeger <borntraeger@linux.ibm.com>
- Reviewed-by: Jared Rossi <jrossi@linux.ibm.com>
- Reviewed-by: Matthew Rosato <mjrosato@linux.ibm.com>
[PATCH v3 4/8] pc-bios/s390-ccw: Add support for virtio-net-pci IPL
- Resolved merge conflicts
- Added a comment in ipl_pci_device() clarifying that all PCI devices
use the same shared setup
- Updated the comment in netmain() to clarify that PCI devices do not
need specific network setup
- Reviewed-by: Matthew Rosato <mjrosato@linux.ibm.com>
[PATCH v3 5/8] hw/virtio: Add "loadparm" property to virtio net PCI
devices booting on s390x
- Reviewed-by: Matthew Rosato <mjrosato@linux.ibm.com>
[PATCH v3 6/8] tests/qtest: Check s390x boot device support in pxe-test.c
- Reworded the log message for strings found in the BIOS
- Removed the comment from s390_bios_has_net_ccw() that assumes
virtio-net-ccw is present
- Tested-by: Joshua Daley <jdaley@linux.ibm.com>
[PATCH v3 7/8] tests/qtest: Add s390x virtio net PCI test to pxe-test.c
- Added a comment clarifying that the presence of the string indicates
virtio-net-pci support
- Tested-by: Joshua Daley <jdaley@linux.ibm.com>
[PATCH v3 8/8] tests/functional/s390x: Add tests for virtio net PCI in
test_pxelinux.py
- Added "_ccw" to the existing virtio-net-ccw test names
- Reviewed-by: Matthew Rosato <mjrosato@linux.ibm.com>
----------------------------------------------------------------------
This series enables network booting via virtio-net-pci on s390x.
Refactor virtio-net to separate virtio-ccw specific logic and add
support for booting from virtio-net-pci devices with proper endianness
handling. Add support for the loadparm property during network boot.
Add corresponding test coverage to verify correct network boot
functionality with virtio-net-pci devices.
----------------------------------------------------------------------
changelog v2->v3
Added a new patch, "tests/qtest: Check s390x boot device support in
pxe-test.c", which gracefully skips the test when the network boot
device is not supported by the bios.
[PATCH v2 1/7] pc-bios/s390-ccw: Move CCW net setup to virtio-ccw
- Reviewed-by: Jared Rossi <jrossi@linux.ibm.com>
- Reviewed-by: Jason J. Herne <jjherne@linux.ibm.com>
- Reviewed-by: Matthew Rosato <mjrosato@linux.ibm.com>
[PATCH v2 2/7] pc-bios/s390-ccw: Add dynamic net header size handling
- Removed VIRTIO_NET_F_MRG_RXBUF_BIT, as it is never negotiated.
- Updated the commit message to note that the same structure mappings
are replicated as defined in the UAPI.
Re: [PATCH v2 3/7] pc-bios/s390-ccw: Introduce virtio_tswap helpers
- Reviewed-by: Jared Rossi <jrossi@linux.ibm.com>
[PATCH v2 4/7] pc-bios/s390-ccw: Add support for virtio-net-pci IPL
- Simplified virtio_pci_get_net_config().
- Removed cmd_vr_idx initialization for net devices.
- Added a comment indicating that byte swapping is required when other
fields are used in the net config.
- Reviewed-by: Jared Rossi <jrossi@linux.ibm.com>
[PATCH v2 5/7] hw/virtio: Add "loadparm" property to virtio net PCI
devices booting on s390x
- Reviewed-by: Jared Rossi <jrossi@linux.ibm.com>
- Reviewed-by: Jason J. Herne <jjherne@linux.ibm.com>
changlog v1->v2
pc-bios/s390-ccw: Move CCW net setup to virtio-ccw
- Removed the virtio_net_setup() dispatcher; netmain.c now calls
virtio_ccw_net_setup() directly
- Improved the error message to be CCW-specific
pc-bios/s390-ccw: Add dynamic net header size handling
- Defined VirtioNetHdrMrgRxbuf, which includes VirtioNetHdr and a
num_buffers field
- Defined header size constants using the sizeof() each struct
pc-bios/s390-ccw: Introduce virtio_tswap helpers
- Edited the commit message to mention that only 16-bit helper function
is used in this commit
- Reviewed-by: Jason J. Herne <jjherne@linux.ibm.com>
- Reviewed-by: Matthew Rosato <mjrosato@linux.ibm.com>
pc-bios/s390-ccw: Add support for virtio-net-pci IPL
- Updated the commit message to change "adds" to "extends" when
describing endianness handling
- Removed net specific setup/find for PCI device
- Checked for virtio initialization failures during network device
initialization
hw/virtio: Add "loadparm" property to virtio net PCI devices booting on s390x
- Edited the commit message to avoid implying that PCI netboot will fail
if a valid loadparm is not provided.
tests/qtest: Add s390x virtio net PCI test to pxe-test.c
tests/functional/s390x: Add tests for virtio net PCI in test_pxelinux.py
- Tested-by: Joshua Daley <jdaley@linux.ibm.com>
Zhuoying Cai (8):
pc-bios/s390-ccw: Move CCW net setup to virtio-ccw
pc-bios/s390-ccw: Add dynamic net header size handling
pc-bios/s390-ccw: Introduce virtio_tswap helpers
pc-bios/s390-ccw: Add support for virtio-net-pci IPL
hw/virtio: Add "loadparm" property to virtio net PCI devices booting
on s390x
tests/qtest: Check s390x boot device support in pxe-test.c
tests/qtest: Add s390x virtio net PCI test to pxe-test.c
tests/functional/s390x: Add tests for virtio net PCI in
test_pxelinux.py
hw/virtio/virtio-net-pci.c | 1 +
pc-bios/s390-ccw/main.c | 2 +
pc-bios/s390-ccw/netmain.c | 73 +++-----------------
pc-bios/s390-ccw/virtio-ccw.c | 62 +++++++++++++++++
pc-bios/s390-ccw/virtio-ccw.h | 1 +
pc-bios/s390-ccw/virtio-net.c | 66 ++++++++++++++----
pc-bios/s390-ccw/virtio-pci.c | 18 +++++
pc-bios/s390-ccw/virtio.c | 27 ++++++--
pc-bios/s390-ccw/virtio.h | 4 ++
tests/functional/s390x/test_pxelinux.py | 71 +++++++++++++++----
tests/qtest/meson.build | 1 +
tests/qtest/pxe-test.c | 92 ++++++++++++++++++++++++-
12 files changed, 322 insertions(+), 96 deletions(-)
--
2.55.0
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH v4 1/8] pc-bios/s390-ccw: Move CCW net setup to virtio-ccw
2026-09-24 19:48 [PATCH v4 0/8] s390x: Add support for virtio-net-pci boot device Zhuoying Cai
@ 2026-09-24 19:48 ` Zhuoying Cai
2026-09-24 19:48 ` [PATCH v4 2/8] pc-bios/s390-ccw: Add dynamic net header size handling Zhuoying Cai
` (6 subsequent siblings)
7 siblings, 0 replies; 16+ messages in thread
From: Zhuoying Cai @ 2026-09-24 19:48 UTC (permalink / raw)
To: qemu-devel, qemu-s390x
Cc: mst, jrossi, zycai, borntraeger, jjherne, cohuck, farman,
mjrosato, pasic, farosas, lvivier, pbonzini, jdaley
Move CCW-specific virtio_setup() and find_net_dev() to virtio-ccw.c
to decouple the generic net boot logic from the CCW transport.
Also update the error message on failure to specify "ccw net device".
Signed-off-by: Zhuoying Cai <zycai@linux.ibm.com>
Reviewed-by: Jared Rossi <jrossi@linux.ibm.com>
Reviewed-by: Jason J. Herne <jjherne@linux.ibm.com>
Reviewed-by: Matthew Rosato <mjrosato@linux.ibm.com>
---
pc-bios/s390-ccw/netmain.c | 67 ++---------------------------------
pc-bios/s390-ccw/virtio-ccw.c | 62 ++++++++++++++++++++++++++++++++
pc-bios/s390-ccw/virtio-ccw.h | 1 +
3 files changed, 66 insertions(+), 64 deletions(-)
diff --git a/pc-bios/s390-ccw/netmain.c b/pc-bios/s390-ccw/netmain.c
index ccd1c30013..bcb62bf6ca 100644
--- a/pc-bios/s390-ccw/netmain.c
+++ b/pc-bios/s390-ccw/netmain.c
@@ -35,6 +35,7 @@
#include "s390-ccw.h"
#include "cio.h"
#include "virtio.h"
+#include "virtio-ccw.h"
#include "s390-time.h"
#define DEFAULT_BOOT_RETRIES 10
@@ -489,68 +490,6 @@ static int net_try_direct_tftp_load(filename_ip_t *fn_ip)
return rc;
}
-static bool find_net_dev(Schib *schib, int dev_no)
-{
- int i, r;
-
- for (i = 0; i < 0x10000; i++) {
- net_schid.sch_no = i;
- r = stsch_err(net_schid, schib);
- if (r == 3 || r == -EIO) {
- break;
- }
- if (!schib->pmcw.dnv) {
- continue;
- }
- enable_subchannel(net_schid);
- if (!virtio_is_supported(virtio_get_device())) {
- continue;
- }
- if (virtio_get_device_type() != VIRTIO_ID_NET) {
- continue;
- }
- if (dev_no < 0 || schib->pmcw.dev == dev_no) {
- return true;
- }
- }
-
- return false;
-}
-
-static bool virtio_setup(void)
-{
- Schib schib;
- int ssid;
- bool found = false;
- uint16_t dev_no;
-
- /*
- * We unconditionally enable mss support. In every sane configuration,
- * this will succeed; and even if it doesn't, stsch_err() can deal
- * with the consequences.
- */
- enable_mss_facility();
-
- if (have_iplb || store_iplb(iplb)) {
- IPL_assert(iplb->pbt == S390_IPL_TYPE_CCW, "IPL_TYPE_CCW expected");
- dev_no = iplb->ccw.devno;
- debug_print_int("device no. ", dev_no);
- net_schid.ssid = iplb->ccw.ssid & 0x3;
- debug_print_int("ssid ", net_schid.ssid);
- found = find_net_dev(&schib, dev_no);
- } else {
- for (ssid = 0; ssid < 0x3; ssid++) {
- net_schid.ssid = ssid;
- found = find_net_dev(&schib, -1);
- if (found) {
- break;
- }
- }
- }
-
- return found;
-}
-
int netmain(void)
{
filename_ip_t fn_ip;
@@ -559,8 +498,8 @@ int netmain(void)
sclp_setup();
puts("Network boot starting...");
- if (!virtio_setup()) {
- puts("No virtio net device found.");
+ if (!virtio_ccw_net_setup()) {
+ puts("No valid virtio ccw net device found.");
return -1;
}
diff --git a/pc-bios/s390-ccw/virtio-ccw.c b/pc-bios/s390-ccw/virtio-ccw.c
index ea5dbc2857..3c2c44529c 100644
--- a/pc-bios/s390-ccw/virtio-ccw.c
+++ b/pc-bios/s390-ccw/virtio-ccw.c
@@ -220,3 +220,65 @@ int virtio_ccw_setup(VDev *vdev)
return 0;
}
+
+static bool find_ccw_net_dev(Schib *schib, int dev_no)
+{
+ int i, r;
+
+ for (i = 0; i < 0x10000; i++) {
+ net_schid.sch_no = i;
+ r = stsch_err(net_schid, schib);
+ if (r == 3 || r == -EIO) {
+ break;
+ }
+ if (!schib->pmcw.dnv) {
+ continue;
+ }
+ enable_subchannel(net_schid);
+ if (!virtio_is_supported(virtio_get_device())) {
+ continue;
+ }
+ if (virtio_get_device_type() != VIRTIO_ID_NET) {
+ continue;
+ }
+ if (dev_no < 0 || schib->pmcw.dev == dev_no) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+bool virtio_ccw_net_setup(void)
+{
+ Schib schib;
+ int ssid;
+ bool found = false;
+ uint16_t dev_no;
+
+ /*
+ * We unconditionally enable mss support. In every sane configuration,
+ * this will succeed; and even if it doesn't, stsch_err() can deal
+ * with the consequences.
+ */
+ enable_mss_facility();
+
+ if (have_iplb || store_iplb(iplb)) {
+ IPL_assert(iplb->pbt == S390_IPL_TYPE_CCW, "IPL_TYPE_CCW expected");
+ dev_no = iplb->ccw.devno;
+ debug_print_int("device no. ", dev_no);
+ net_schid.ssid = iplb->ccw.ssid & 0x3;
+ debug_print_int("ssid ", net_schid.ssid);
+ found = find_ccw_net_dev(&schib, dev_no);
+ } else {
+ for (ssid = 0; ssid < 0x3; ssid++) {
+ net_schid.ssid = ssid;
+ found = find_ccw_net_dev(&schib, -1);
+ if (found) {
+ break;
+ }
+ }
+ }
+
+ return found;
+}
diff --git a/pc-bios/s390-ccw/virtio-ccw.h b/pc-bios/s390-ccw/virtio-ccw.h
index 43d21906e5..7768c152d0 100644
--- a/pc-bios/s390-ccw/virtio-ccw.h
+++ b/pc-bios/s390-ccw/virtio-ccw.h
@@ -19,5 +19,6 @@ bool virtio_ccw_is_supported(VDev *vdev);
long virtio_ccw_notify(SubChannelId schid, int vq_idx, long cookie);
int virtio_ccw_setup(VDev *vdev);
int virtio_ccw_reset(VDev *vdev);
+bool virtio_ccw_net_setup(void);
#endif
--
2.55.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v4 2/8] pc-bios/s390-ccw: Add dynamic net header size handling
2026-09-24 19:48 [PATCH v4 0/8] s390x: Add support for virtio-net-pci boot device Zhuoying Cai
2026-09-24 19:48 ` [PATCH v4 1/8] pc-bios/s390-ccw: Move CCW net setup to virtio-ccw Zhuoying Cai
@ 2026-09-24 19:48 ` Zhuoying Cai
2026-09-24 19:48 ` [PATCH v4 3/8] pc-bios/s390-ccw: Introduce virtio_tswap helpers Zhuoying Cai
` (5 subsequent siblings)
7 siblings, 0 replies; 16+ messages in thread
From: Zhuoying Cai @ 2026-09-24 19:48 UTC (permalink / raw)
To: qemu-devel, qemu-s390x
Cc: mst, jrossi, zycai, borntraeger, jjherne, cohuck, farman,
mjrosato, pasic, farosas, lvivier, pbonzini, jdaley
The virtio-net device used a fixed header size that did not account for
the num_buffers field used in VirtIO 1.0.
Use dynamic header sizing: 10 bytes for legacy mode and 12 bytes for
VirtIO 1.0. This ensures correct packet handling across different
VirtIO configurations.
The VirtioNetHdr and VirtioNetHdrMrgRxbuf structures replicate the
same field layout as struct virtio_net_hdr and struct
virtio_net_hdr_mrg_rxbuf defined in include/uapi/linux/virtio_net.h.
Signed-off-by: Zhuoying Cai <zycai@linux.ibm.com>
Acked-by: Christian Borntraeger <borntraeger@linux.ibm.com>
Reviewed-by: Jared Rossi <jrossi@linux.ibm.com>
Reviewed-by: Matthew Rosato <mjrosato@linux.ibm.com>
---
pc-bios/s390-ccw/virtio-net.c | 29 ++++++++++++++++++++++-------
1 file changed, 22 insertions(+), 7 deletions(-)
diff --git a/pc-bios/s390-ccw/virtio-net.c b/pc-bios/s390-ccw/virtio-net.c
index f58f7ffc55..7bb3f8f551 100644
--- a/pc-bios/s390-ccw/virtio-net.c
+++ b/pc-bios/s390-ccw/virtio-net.c
@@ -20,6 +20,7 @@
#include "s390-ccw.h"
#include "virtio.h"
#include "virtio-ccw.h"
+#include "virtio-pci.h"
#include "s390-time.h"
#include "helper.h"
@@ -39,11 +40,21 @@ struct VirtioNetHdr {
uint16_t gso_size;
uint16_t csum_start;
uint16_t csum_offset;
- /*uint16_t num_buffers;*/ /* Only with VIRTIO_NET_F_MRG_RXBUF or VIRTIO1 */
};
typedef struct VirtioNetHdr VirtioNetHdr;
+struct VirtioNetHdrMrgRxbuf {
+ struct VirtioNetHdr hdr;
+ uint16_t num_buffers; /* Only with VIRTIO_NET_F_MRG_RXBUF or VIRTIO1 */
+};
+typedef struct VirtioNetHdrMrgRxbuf VirtioNetHdrMrgRxbuf;
+
+/* Header sizes for different modes */
+#define VIRTIO_NET_HDR_SIZE_LEGACY sizeof(VirtioNetHdr)
+#define VIRTIO_NET_HDR_SIZE_V1 sizeof(VirtioNetHdrMrgRxbuf)
+
static uint16_t rx_last_idx; /* Last index in receive queue "used" ring */
+static int virtio_net_hdr_size;
int virtio_net_init(void *mac_addr)
{
@@ -62,12 +73,16 @@ int virtio_net_init(void *mac_addr)
return -1;
}
+ virtio_net_hdr_size = vdev->guest_features[1] & VIRTIO_F_VERSION_1
+ ? VIRTIO_NET_HDR_SIZE_V1
+ : VIRTIO_NET_HDR_SIZE_LEGACY;
+
memcpy(mac_addr, vdev->config.net.mac, ETH_ALEN);
for (i = 0; i < 64; i++) {
- buf = malloc(ETH_MTU_SIZE + sizeof(VirtioNetHdr));
+ buf = malloc(ETH_MTU_SIZE + virtio_net_hdr_size);
IPL_assert(buf != NULL, "Can not allocate memory for receive buffers");
- vring_send_buf(rxvq, buf, ETH_MTU_SIZE + sizeof(VirtioNetHdr),
+ vring_send_buf(rxvq, buf, ETH_MTU_SIZE + virtio_net_hdr_size,
VRING_DESC_F_WRITE);
}
vring_notify(rxvq);
@@ -77,14 +92,14 @@ int virtio_net_init(void *mac_addr)
int send(int fd, const void *buf, int len, int flags)
{
- VirtioNetHdr tx_hdr;
+ VirtioNetHdrMrgRxbuf tx_hdr;
VDev *vdev = virtio_get_device();
VRing *txvq = &vdev->vrings[VQ_TX];
/* Set up header - we do not use anything special, so simply clear it */
memset(&tx_hdr, 0, sizeof(tx_hdr));
- vring_send_buf(txvq, &tx_hdr, sizeof(tx_hdr), VRING_DESC_F_NEXT);
+ vring_send_buf(txvq, &tx_hdr, virtio_net_hdr_size, VRING_DESC_F_NEXT);
vring_send_buf(txvq, (void *)buf, len, VRING_HIDDEN_IS_CHAIN);
while (!vr_poll(txvq)) {
yield();
@@ -108,13 +123,13 @@ int recv(int fd, void *buf, int maxlen, int flags)
return 0;
}
- len = rxvq->used->ring[rx_last_idx % rxvq->num].len - sizeof(VirtioNetHdr);
+ len = rxvq->used->ring[rx_last_idx % rxvq->num].len - virtio_net_hdr_size;
if (len > maxlen) {
puts("virtio-net: Receive buffer too small");
len = maxlen;
}
id = rxvq->used->ring[rx_last_idx % rxvq->num].id % rxvq->num;
- pkt = (uint8_t *)(rxvq->desc[id].addr + sizeof(VirtioNetHdr));
+ pkt = (uint8_t *)(rxvq->desc[id].addr + virtio_net_hdr_size);
#if DEBUG_VIRTIO_NET /* Dump packet */
int i;
--
2.55.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v4 3/8] pc-bios/s390-ccw: Introduce virtio_tswap helpers
2026-09-24 19:48 [PATCH v4 0/8] s390x: Add support for virtio-net-pci boot device Zhuoying Cai
2026-09-24 19:48 ` [PATCH v4 1/8] pc-bios/s390-ccw: Move CCW net setup to virtio-ccw Zhuoying Cai
2026-09-24 19:48 ` [PATCH v4 2/8] pc-bios/s390-ccw: Add dynamic net header size handling Zhuoying Cai
@ 2026-09-24 19:48 ` Zhuoying Cai
2026-09-24 19:48 ` [PATCH v4 4/8] pc-bios/s390-ccw: Add support for virtio-net-pci IPL Zhuoying Cai
` (4 subsequent siblings)
7 siblings, 0 replies; 16+ messages in thread
From: Zhuoying Cai @ 2026-09-24 19:48 UTC (permalink / raw)
To: qemu-devel, qemu-s390x
Cc: mst, jrossi, zycai, borntraeger, jjherne, cohuck, farman,
mjrosato, pasic, farosas, lvivier, pbonzini, jdaley
Replace the repeated pattern:
be_ipl() ? x : bswapN(x)
with helpers that conditionally byte-swap based on the virtio transport
endianness.
While only the 16-bit helper is used immediately, the 32-bit and 64-bit
variants are added here for later use.
Signed-off-by: Zhuoying Cai <zycai@linux.ibm.com>
Reviewed-by: Jared Rossi <jrossi@linux.ibm.com>
Reviewed-by: Jason J. Herne <jjherne@linux.ibm.com>
Reviewed-by: Matthew Rosato <mjrosato@linux.ibm.com>
---
pc-bios/s390-ccw/virtio.c | 27 +++++++++++++++++++++------
pc-bios/s390-ccw/virtio.h | 4 ++++
2 files changed, 25 insertions(+), 6 deletions(-)
diff --git a/pc-bios/s390-ccw/virtio.c b/pc-bios/s390-ccw/virtio.c
index 34c5e6ee22..8949e6c7c0 100644
--- a/pc-bios/s390-ccw/virtio.c
+++ b/pc-bios/s390-ccw/virtio.c
@@ -102,7 +102,7 @@ void vring_init(VRing *vr, VqInfo *info)
vr->avail->idx = 0;
/* We're running with interrupts off anyways, so don't bother */
- vr->used->flags = be_ipl() ? VRING_USED_F_NO_NOTIFY : bswap16(VRING_USED_F_NO_NOTIFY);
+ vr->used->flags = virtio_tswap16(VRING_USED_F_NO_NOTIFY);
vr->used->idx = 0;
vr->used_idx = 0;
vr->next_idx = 0;
@@ -143,6 +143,22 @@ bool be_ipl(void)
}
}
+/* Conditionally byte-swap between virtio-endian and s390x native big-endian. */
+uint16_t virtio_tswap16(uint16_t x)
+{
+ return be_ipl() ? x : bswap16(x);
+}
+
+uint32_t virtio_tswap32(uint32_t x)
+{
+ return be_ipl() ? x : bswap32(x);
+}
+
+uint64_t virtio_tswap64(uint64_t x)
+{
+ return be_ipl() ? x : bswap64(x);
+}
+
/*
* Format the virtio ring descriptor endianness
* Return the available index increment in the appropriate endianness
@@ -159,12 +175,11 @@ void vring_send_buf(VRing *vr, void *p, int len, int flags)
{
uint16_t avail_idx;
- avail_idx = be_ipl() ? vr->avail->idx : bswap16(vr->avail->idx);
+ avail_idx = virtio_tswap16(vr->avail->idx);
/* For follow-up chains we need to keep the first entry point */
if (!(flags & VRING_HIDDEN_IS_CHAIN)) {
- vr->avail->ring[avail_idx % vr->num] = be_ipl() ? vr->next_idx :
- bswap16(vr->next_idx);
+ vr->avail->ring[avail_idx % vr->num] = virtio_tswap16(vr->next_idx);
}
vr->desc[vr->next_idx].addr = (unsigned long)p;
@@ -182,7 +197,7 @@ void vring_send_buf(VRing *vr, void *p, int len, int flags)
/* Chains only have a single ID */
if (!(flags & VRING_DESC_F_NEXT)) {
avail_idx++;
- vr->avail->idx = be_ipl() ? avail_idx : bswap16(avail_idx);
+ vr->avail->idx = virtio_tswap16(avail_idx);
}
}
@@ -190,7 +205,7 @@ int vr_poll(VRing *vr)
{
uint16_t used_idx;
- used_idx = be_ipl() ? vr->used->idx : bswap16(vr->used->idx);
+ used_idx = virtio_tswap16(vr->used->idx);
if (used_idx == vr->used_idx) {
vring_notify(vr);
yield();
diff --git a/pc-bios/s390-ccw/virtio.h b/pc-bios/s390-ccw/virtio.h
index aa307025e0..645dc288b1 100644
--- a/pc-bios/s390-ccw/virtio.h
+++ b/pc-bios/s390-ccw/virtio.h
@@ -287,6 +287,10 @@ int virtio_run(VDev *vdev, int vqid, VirtioCmd *cmd);
int virtio_reset(VDev *vdev);
int virtio_setup_ccw(VDev *vdev);
+uint16_t virtio_tswap16(uint16_t x);
+uint32_t virtio_tswap32(uint32_t x);
+uint64_t virtio_tswap64(uint64_t x);
+
/* virtio-net.c */
int virtio_net_init(void *mac_addr);
void virtio_net_deinit(void);
--
2.55.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v4 4/8] pc-bios/s390-ccw: Add support for virtio-net-pci IPL
2026-09-24 19:48 [PATCH v4 0/8] s390x: Add support for virtio-net-pci boot device Zhuoying Cai
` (2 preceding siblings ...)
2026-09-24 19:48 ` [PATCH v4 3/8] pc-bios/s390-ccw: Introduce virtio_tswap helpers Zhuoying Cai
@ 2026-09-24 19:48 ` Zhuoying Cai
2026-09-24 20:12 ` Matthew Rosato
2026-09-24 19:48 ` [PATCH v4 5/8] hw/virtio: Add "loadparm" property to virtio net PCI devices booting on s390x Zhuoying Cai
` (3 subsequent siblings)
7 siblings, 1 reply; 16+ messages in thread
From: Zhuoying Cai @ 2026-09-24 19:48 UTC (permalink / raw)
To: qemu-devel, qemu-s390x
Cc: mst, jrossi, zycai, borntraeger, jjherne, cohuck, farman,
mjrosato, pasic, farosas, lvivier, pbonzini, jdaley
Enable network booting via virtio-net-pci by implementing PCI transport
support for virtio-net.
This patch also extends endianness handling for virtio PCI ring operations in
little-endian to ensure correct behavior on s390x.
Signed-off-by: Zhuoying Cai <zycai@linux.ibm.com>
Reviewed-by: Jared Rossi <jrossi@linux.ibm.com>
Reviewed-by: Matthew Rosato <mjrosato@linux.ibm.com>
---
pc-bios/s390-ccw/main.c | 2 ++
pc-bios/s390-ccw/netmain.c | 8 ++++++-
pc-bios/s390-ccw/virtio-net.c | 41 ++++++++++++++++++++++++++++-------
pc-bios/s390-ccw/virtio-pci.c | 18 +++++++++++++++
4 files changed, 60 insertions(+), 9 deletions(-)
diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c
index d2a2ac3138..b06d67c563 100644
--- a/pc-bios/s390-ccw/main.c
+++ b/pc-bios/s390-ccw/main.c
@@ -342,7 +342,9 @@ static void ipl_pci_device(void)
return;
}
+ /* net, scsi, and block all intentionally use the same shared boot setup */
switch (vdev->dev_type) {
+ case VIRTIO_ID_NET:
case VIRTIO_ID_SCSI:
case VIRTIO_ID_BLOCK:
if (virtio_setup() == 0) {
diff --git a/pc-bios/s390-ccw/netmain.c b/pc-bios/s390-ccw/netmain.c
index bcb62bf6ca..dd02c5c71f 100644
--- a/pc-bios/s390-ccw/netmain.c
+++ b/pc-bios/s390-ccw/netmain.c
@@ -498,7 +498,13 @@ int netmain(void)
sclp_setup();
puts("Network boot starting...");
- if (!virtio_ccw_net_setup()) {
+ /*
+ * CCW devices require subchannel enumeration here.
+ * PCI devices don't need specific net setup; the virtio-net-pci devices
+ * still follow the regular Virtio, PCI, and generic network setup.
+ */
+ if (virtio_get_device()->ipl_type == S390_IPL_TYPE_CCW &&
+ !virtio_ccw_net_setup()) {
puts("No valid virtio ccw net device found.");
return -1;
}
diff --git a/pc-bios/s390-ccw/virtio-net.c b/pc-bios/s390-ccw/virtio-net.c
index 7bb3f8f551..632ce059d6 100644
--- a/pc-bios/s390-ccw/virtio-net.c
+++ b/pc-bios/s390-ccw/virtio-net.c
@@ -66,7 +66,22 @@ int virtio_net_init(void *mac_addr)
rx_last_idx = 0;
vdev->guest_features[0] = VIRTIO_NET_F_MAC_BIT;
- virtio_ccw_setup(vdev);
+ switch (virtio_get_device()->ipl_type) {
+ case S390_IPL_TYPE_CCW:
+ if (virtio_ccw_setup(vdev)) {
+ puts("Setup failed for virtio-net-ccw");
+ return -1;
+ }
+ break;
+ case S390_IPL_TYPE_PCI:
+ if (virtio_pci_setup(vdev)) {
+ puts("Setup failed for virtio-net-pci");
+ return -1;
+ }
+ break;
+ default:
+ return -1;
+ }
if (!(vdev->guest_features[0] & VIRTIO_NET_F_MAC_BIT)) {
puts("virtio-net device does not support the MAC address feature");
@@ -118,22 +133,30 @@ int recv(int fd, void *buf, int maxlen, int flags)
VRing *rxvq = &vdev->vrings[VQ_RX];
int len, id;
uint8_t *pkt;
+ uint16_t rx_used_idx, rx_avail_idx;
+ uint32_t rx_used_len, rx_used_id;
+ uint64_t rx_desc_addr;
- if (rx_last_idx == rxvq->used->idx) {
+ rx_used_idx = virtio_tswap16(rxvq->used->idx);
+ if (rx_last_idx == rx_used_idx) {
return 0;
}
- len = rxvq->used->ring[rx_last_idx % rxvq->num].len - virtio_net_hdr_size;
+ rx_used_len = virtio_tswap32(rxvq->used->ring[rx_last_idx % rxvq->num].len);
+ rx_used_id = virtio_tswap32(rxvq->used->ring[rx_last_idx % rxvq->num].id);
+
+ len = rx_used_len - virtio_net_hdr_size;
if (len > maxlen) {
puts("virtio-net: Receive buffer too small");
len = maxlen;
}
- id = rxvq->used->ring[rx_last_idx % rxvq->num].id % rxvq->num;
- pkt = (uint8_t *)(rxvq->desc[id].addr + virtio_net_hdr_size);
+ id = rx_used_id % rxvq->num;
+ rx_desc_addr = virtio_tswap64(rxvq->desc[id].addr);
+ pkt = (uint8_t *)(rx_desc_addr + virtio_net_hdr_size);
#if DEBUG_VIRTIO_NET /* Dump packet */
int i;
- printf("\nbuf %p: len=%i\n", (void *)rxvq->desc[id].addr, len);
+ printf("\nbuf %p: len=%i\n", (void *)rx_desc_addr, len);
for (i = 0; i < 64; i++) {
printf(" %02x", pkt[i]);
if ((i % 16) == 15) {
@@ -147,8 +170,10 @@ int recv(int fd, void *buf, int maxlen, int flags)
memcpy(buf, pkt, len);
/* Mark buffer as available to the host again */
- rxvq->avail->ring[rxvq->avail->idx % rxvq->num] = id;
- rxvq->avail->idx = rxvq->avail->idx + 1;
+ rx_avail_idx = virtio_tswap16(rxvq->avail->idx);
+ rxvq->avail->ring[rx_avail_idx % rxvq->num] = virtio_tswap16(id);
+ rx_avail_idx++;
+ rxvq->avail->idx = virtio_tswap16(rx_avail_idx);
vring_notify(rxvq);
/* Move index to next entry */
diff --git a/pc-bios/s390-ccw/virtio-pci.c b/pc-bios/s390-ccw/virtio-pci.c
index 277c3ea68d..7fb987099d 100644
--- a/pc-bios/s390-ccw/virtio-pci.c
+++ b/pc-bios/s390-ccw/virtio-pci.c
@@ -55,6 +55,9 @@ void virtio_pci_id2type(VDev *vdev, uint16_t device_id)
case 0x1048:
case 0x1004:
vdev->dev_type = VIRTIO_ID_SCSI;
+ case 0x1041:
+ case 0x1000:
+ vdev->dev_type = VIRTIO_ID_NET;
break;
default:
vdev->dev_type = 0;
@@ -223,6 +226,17 @@ static int virtio_pci_get_scsi_config(void)
return rc;
}
+static int virtio_pci_get_net_config(void)
+{
+ VirtioNetConfig *cfg = &virtio_get_device()->config.net;
+
+ /*
+ * Byte-swapping is not needed as only the MAC address (byte array)
+ * is used here. Byte-swap if other fields are added.
+ */
+ return vpci_read_flex(d_cap.off, d_cap.bar, cfg, sizeof(VirtioNetConfig));
+}
+
static int virtio_pci_negotiate(void)
{
int i, rc;
@@ -355,6 +369,7 @@ bool virtio_pci_is_supported(VDev *vdev)
switch (vdev->dev_type) {
case VIRTIO_ID_BLOCK:
case VIRTIO_ID_SCSI:
+ case VIRTIO_ID_NET:
return true;
default:
return false;
@@ -413,6 +428,9 @@ int virtio_pci_setup(VDev *vdev)
vdev->nr_vqs = 3;
vdev->cmd_vr_idx = 2;
virtio_pci_get_scsi_config();
+ case VIRTIO_ID_NET:
+ vdev->nr_vqs = 2;
+ virtio_pci_get_net_config();
break;
default:
puts("Unsupported virtio device");
--
2.55.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v4 5/8] hw/virtio: Add "loadparm" property to virtio net PCI devices booting on s390x
2026-09-24 19:48 [PATCH v4 0/8] s390x: Add support for virtio-net-pci boot device Zhuoying Cai
` (3 preceding siblings ...)
2026-09-24 19:48 ` [PATCH v4 4/8] pc-bios/s390-ccw: Add support for virtio-net-pci IPL Zhuoying Cai
@ 2026-09-24 19:48 ` Zhuoying Cai
2026-09-24 19:48 ` [PATCH v4 6/8] tests/qtest: Check s390x boot device support in pxe-test.c Zhuoying Cai
` (2 subsequent siblings)
7 siblings, 0 replies; 16+ messages in thread
From: Zhuoying Cai @ 2026-09-24 19:48 UTC (permalink / raw)
To: qemu-devel, qemu-s390x
Cc: mst, jrossi, zycai, borntraeger, jjherne, cohuck, farman,
mjrosato, pasic, farosas, lvivier, pbonzini, jdaley
Add optional loadparm property to virtio-net-pci to allow boot entry
selection on s390x, consistent with virtio-blk-pci.
Signed-off-by: Zhuoying Cai <zycai@linux.ibm.com>
Reviewed-by: Jared Rossi <jrossi@linux.ibm.com>
Reviewed-by: Jason J. Herne <jjherne@linux.ibm.com>
Reviewed-by: Matthew Rosato <mjrosato@linux.ibm.com>
---
hw/virtio/virtio-net-pci.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/hw/virtio/virtio-net-pci.c b/hw/virtio/virtio-net-pci.c
index fd3e0303f5..893d1905a9 100644
--- a/hw/virtio/virtio-net-pci.c
+++ b/hw/virtio/virtio-net-pci.c
@@ -77,6 +77,7 @@ static void virtio_net_pci_class_init(ObjectClass *klass, const void *data)
k->sriov_vf_user_creatable = true;
set_bit(DEVICE_CATEGORY_NETWORK, dc->categories);
device_class_set_props(dc, virtio_net_properties);
+ pci_qdev_property_add_specifics(dc);
vpciklass->realize = virtio_net_pci_realize;
}
--
2.55.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v4 6/8] tests/qtest: Check s390x boot device support in pxe-test.c
2026-09-24 19:48 [PATCH v4 0/8] s390x: Add support for virtio-net-pci boot device Zhuoying Cai
` (4 preceding siblings ...)
2026-09-24 19:48 ` [PATCH v4 5/8] hw/virtio: Add "loadparm" property to virtio net PCI devices booting on s390x Zhuoying Cai
@ 2026-09-24 19:48 ` Zhuoying Cai
2026-09-24 20:25 ` Matthew Rosato
2026-09-24 19:48 ` [PATCH v4 7/8] tests/qtest: Add s390x virtio net PCI test to pxe-test.c Zhuoying Cai
2026-09-24 19:48 ` [PATCH v4 8/8] tests/functional/s390x: Add tests for virtio net PCI in test_pxelinux.py Zhuoying Cai
7 siblings, 1 reply; 16+ messages in thread
From: Zhuoying Cai @ 2026-09-24 19:48 UTC (permalink / raw)
To: qemu-devel, qemu-s390x
Cc: mst, jrossi, zycai, borntraeger, jjherne, cohuck, farman,
mjrosato, pasic, farosas, lvivier, pbonzini, jdaley
The pxe test for a net device does not fail gracefully when the
s390-ccw.img in use was built without support for booting that device.
Add a boot_dev_support check that searches for a known string in the
bios image to confirm boot support. If absent, the test is skipped
gracefully instead of failing.
Also re-enable pxe-test in qtests_s390x, which was accidentally
removed by commit 973d97feca93.
Signed-off-by: Zhuoying Cai <zycai@linux.ibm.com>
Tested-by: Joshua Daley <jdaley@linux.ibm.com>
---
tests/qtest/meson.build | 1 +
tests/qtest/pxe-test.c | 81 ++++++++++++++++++++++++++++++++++++++++-
2 files changed, 81 insertions(+), 1 deletion(-)
diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
index 33f58b0e95..341f6ad1ba 100644
--- a/tests/qtest/meson.build
+++ b/tests/qtest/meson.build
@@ -292,6 +292,7 @@ qtests_aarch64 = \
'migration-test']
qtests_s390x = \
+ (slirp.found() ? ['pxe-test'] : []) + \
qtests_filter + \
['boot-serial-test',
'drive_del-test',
diff --git a/tests/qtest/pxe-test.c b/tests/qtest/pxe-test.c
index e85dec5a4e..61ad572bb7 100644
--- a/tests/qtest/pxe-test.c
+++ b/tests/qtest/pxe-test.c
@@ -26,6 +26,7 @@ typedef struct testdef {
const char *machine; /* Machine type */
const char *model; /* NIC device model */
const char *extra; /* Any additional parameters */
+ bool (*boot_dev_support)(void); /* optional: boot device support check */
} testdef_t;
static testdef_t x86_tests[] = {
@@ -58,8 +59,76 @@ static testdef_t ppc64_tests_slow[] = {
{ NULL },
};
+static const char *s390_bios_load(gsize *len)
+{
+ static char *cached_contents;
+ static gsize cached_len;
+ const char *qemu_bin;
+ g_autofree char *cmd = NULL;
+ char dir[PATH_MAX];
+ char *found = NULL;
+ char *path = NULL;
+ FILE *fp;
+
+ if (cached_contents) {
+ g_test_message("Using cached bios contents");
+ goto out;
+ }
+
+ /* search the qemu binary's data directories for s390-ccw.img */
+ qemu_bin = qtest_qemu_binary(NULL);
+ cmd = g_strdup_printf("%s -L help", qemu_bin);
+ fp = popen(cmd, "r");
+
+ if (!fp) {
+ g_error("Failed to run '%s'", cmd);
+ }
+
+ while (fgets(dir, sizeof(dir), fp) && !found) {
+ dir[strcspn(dir, "\n")] = '\0';
+ path = g_build_filename(dir, "s390-ccw.img", NULL);
+ if (g_file_get_contents(path, &cached_contents, &cached_len, NULL)) {
+ found = path;
+ } else {
+ g_free(path);
+ }
+ }
+ pclose(fp);
+
+ if (!found) {
+ g_error("s390-ccw.img not found");
+ }
+
+ g_test_message("Loaded %s", found);
+ g_free(found);
+
+out:
+ *len = cached_len;
+ return cached_contents;
+}
+
+static bool s390_bios_has_string(const char *needle)
+{
+ const char *contents;
+ gsize len;
+ bool found;
+
+ contents = s390_bios_load(&len);
+ found = memmem(contents, len, needle, strlen(needle)) != NULL;
+
+ g_test_message("BIOS boot device support indicator \"%s\": %s",
+ needle, found ? "found" : "not found");
+ return found;
+}
+
+static bool s390_bios_has_net_ccw(void)
+{
+ return s390_bios_has_string("Network boot starting...");
+}
+
static testdef_t s390x_tests[] = {
- { "s390-ccw-virtio", "virtio-net-ccw" },
+ { "s390-ccw-virtio", "virtio-net-ccw",
+ .boot_dev_support = s390_bios_has_net_ccw },
{ NULL },
};
@@ -90,6 +159,11 @@ static void test_pxe_ipv4(gconstpointer data)
{
const testdef_t *test = data;
+ if (test->boot_dev_support && !test->boot_dev_support()) {
+ g_test_skip("The bios does not support booting this device");
+ return;
+ }
+
test_pxe_one(test, false);
}
@@ -97,6 +171,11 @@ static void test_pxe_ipv6(gconstpointer data)
{
const testdef_t *test = data;
+ if (test->boot_dev_support && !test->boot_dev_support()) {
+ g_test_skip("The bios does not support booting this device");
+ return;
+ }
+
test_pxe_one(test, true);
}
--
2.55.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v4 7/8] tests/qtest: Add s390x virtio net PCI test to pxe-test.c
2026-09-24 19:48 [PATCH v4 0/8] s390x: Add support for virtio-net-pci boot device Zhuoying Cai
` (5 preceding siblings ...)
2026-09-24 19:48 ` [PATCH v4 6/8] tests/qtest: Check s390x boot device support in pxe-test.c Zhuoying Cai
@ 2026-09-24 19:48 ` Zhuoying Cai
2026-09-24 21:15 ` Matthew Rosato
2026-09-24 19:48 ` [PATCH v4 8/8] tests/functional/s390x: Add tests for virtio net PCI in test_pxelinux.py Zhuoying Cai
7 siblings, 1 reply; 16+ messages in thread
From: Zhuoying Cai @ 2026-09-24 19:48 UTC (permalink / raw)
To: qemu-devel, qemu-s390x
Cc: mst, jrossi, zycai, borntraeger, jjherne, cohuck, farman,
mjrosato, pasic, farosas, lvivier, pbonzini, jdaley
Add test coverage for virtio-net-pci network booting on s390x by
including it in the PXE test suite. The test verifies that PXE
network booting works correctly with virtio-net-pci devices.
Signed-off-by: Zhuoying Cai <zycai@linux.ibm.com>
Tested-by: Joshua Daley <jdaley@linux.ibm.com>
---
tests/qtest/pxe-test.c | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/tests/qtest/pxe-test.c b/tests/qtest/pxe-test.c
index 61ad572bb7..b12de2bedc 100644
--- a/tests/qtest/pxe-test.c
+++ b/tests/qtest/pxe-test.c
@@ -126,9 +126,20 @@ static bool s390_bios_has_net_ccw(void)
return s390_bios_has_string("Network boot starting...");
}
+static bool s390_bios_has_net_pci(void)
+{
+ /*
+ * Check for a string unique to virtio-net-pci boot support in the bios
+ * to determine if the binary was built with support for this device.
+ */
+ return s390_bios_has_string("Setup failed for virtio-net-pci");
+}
+
static testdef_t s390x_tests[] = {
{ "s390-ccw-virtio", "virtio-net-ccw",
.boot_dev_support = s390_bios_has_net_ccw },
+ { "s390-ccw-virtio", "virtio-net-pci",
+ .boot_dev_support = s390_bios_has_net_pci },
{ NULL },
};
--
2.55.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v4 8/8] tests/functional/s390x: Add tests for virtio net PCI in test_pxelinux.py
2026-09-24 19:48 [PATCH v4 0/8] s390x: Add support for virtio-net-pci boot device Zhuoying Cai
` (6 preceding siblings ...)
2026-09-24 19:48 ` [PATCH v4 7/8] tests/qtest: Add s390x virtio net PCI test to pxe-test.c Zhuoying Cai
@ 2026-09-24 19:48 ` Zhuoying Cai
7 siblings, 0 replies; 16+ messages in thread
From: Zhuoying Cai @ 2026-09-24 19:48 UTC (permalink / raw)
To: qemu-devel, qemu-s390x
Cc: mst, jrossi, zycai, borntraeger, jjherne, cohuck, farman,
mjrosato, pasic, farosas, lvivier, pbonzini, jdaley
Add test coverage for virtio-net-pci network booting on s390x by
extending the pxelinux functional tests.
This patch adds PCI variants of all existing pxelinux tests to verify
that virtio-net-pci devices work correctly for network booting.
Signed-off-by: Zhuoying Cai <zycai@linux.ibm.com>
Tested-by: Joshua Daley <jdaley@linux.ibm.com>
Reviewed-by: Matthew Rosato <mjrosato@linux.ibm.com>
---
tests/functional/s390x/test_pxelinux.py | 71 ++++++++++++++++++++-----
1 file changed, 59 insertions(+), 12 deletions(-)
diff --git a/tests/functional/s390x/test_pxelinux.py b/tests/functional/s390x/test_pxelinux.py
index c00cce6a5a..5ce42aa074 100755
--- a/tests/functional/s390x/test_pxelinux.py
+++ b/tests/functional/s390x/test_pxelinux.py
@@ -50,7 +50,8 @@ class S390PxeLinux(QemuSystemTest):
'/images/kernel.img'),
'480859574f3f44caa6cd35c62d70e1ac0609134e22ce2a954bbed9b110c06e0b')
- def pxelinux_launch(self, pl_name='default', extra_opts=None):
+ def pxelinux_launch(self, pl_name='default', extra_opts=None,
+ dev='virtio-net-ccw'):
'''Create a pxelinux.cfg file in the right location and launch QEMU'''
self.require_netdev('user')
self.set_machine('s390-ccw-virtio')
@@ -74,7 +75,7 @@ def pxelinux_launch(self, pl_name='default', extra_opts=None):
with open(cfg_fname, 'w', encoding='utf-8') as f:
f.write(PXELINUX_CFG_CONTENTS)
- virtio_net_dev = 'virtio-net-ccw,netdev=n1,bootindex=1'
+ virtio_net_dev = f'{dev},netdev=n1,bootindex=1'
if extra_opts:
virtio_net_dev += ',' + extra_opts
@@ -85,9 +86,9 @@ def pxelinux_launch(self, pl_name='default', extra_opts=None):
self.vm.launch()
- def test_default(self):
+ def do_test_default(self, dev):
'''Check whether the guest uses the "default" file name'''
- self.pxelinux_launch()
+ self.pxelinux_launch(dev=dev)
# The kernel prints its arguments to the console, so we can use
# this to check whether the kernel parameters are correctly handled:
wait_for_console_pattern(self, 'testoption=teststring')
@@ -95,36 +96,82 @@ def test_default(self):
wait_for_console_pattern(self, 'Unpacking initramfs...')
wait_for_console_pattern(self, 'Run /init as init process')
- def test_mac(self):
+ def do_test_mac(self, dev):
'''Check whether the guest uses file name based on its MAC address'''
self.pxelinux_launch(pl_name='01-02-ca-fe-ba-be-42',
- extra_opts='mac=02:ca:fe:ba:be:42,loadparm=3')
+ extra_opts='mac=02:ca:fe:ba:be:42,loadparm=3',
+ dev=dev)
wait_for_console_pattern(self, 'Linux version 5.3.7-301.fc31.s390x')
- def test_uuid(self):
+ def do_test_uuid(self, dev):
'''Check whether the guest uses file name based on its UUID'''
# Also add a non-bootable disk to check the fallback to network boot:
self.vm.add_args('-blockdev', 'null-co,size=65536,node-name=d1',
'-device', 'virtio-blk,drive=d1,bootindex=0,loadparm=1',
'-uuid', '550e8400-e29b-11d4-a716-446655441234')
- self.pxelinux_launch(pl_name='550e8400-e29b-11d4-a716-446655441234')
+ self.pxelinux_launch(pl_name='550e8400-e29b-11d4-a716-446655441234',
+ dev=dev)
wait_for_console_pattern(self, 'Debian 4.19.146-1 (2020-09-17)')
- def test_ip(self):
+ def do_test_ip(self, dev):
'''Check whether the guest uses file name based on its IP address'''
self.vm.add_args('-M', 'loadparm=3')
- self.pxelinux_launch(pl_name='0A00020F')
+ self.pxelinux_launch(pl_name='0A00020F', dev=dev)
wait_for_console_pattern(self, 'Linux version 5.3.7-301.fc31.s390x')
- def test_menu(self):
+ def do_test_menu(self, dev):
'''Check whether the boot menu works for pxelinux.cfg booting'''
self.vm.add_args('-boot', 'menu=on,splash-time=10')
- self.pxelinux_launch(pl_name='0A00')
+ self.pxelinux_launch(pl_name='0A00', dev=dev)
wait_for_console_pattern(self, '[1] Nonexisting')
wait_for_console_pattern(self, '[2] Debian')
wait_for_console_pattern(self, '[3] Fedora')
wait_for_console_pattern(self, 'Debian 4.19.146-1 (2020-09-17)')
+ def test_default_ccw(self):
+ '''pxelinux.cfg "default" lookup via virtio-net-ccw'''
+ self.do_test_default('virtio-net-ccw')
+
+ def test_default_pci(self):
+ '''pxelinux.cfg "default" lookup via virtio-net-pci'''
+ self.require_device('virtio-net-pci')
+ self.do_test_default('virtio-net-pci')
+
+ def test_mac_ccw(self):
+ '''pxelinux.cfg MAC-address-based file lookup via virtio-net-ccw'''
+ self.do_test_mac('virtio-net-ccw')
+
+ def test_mac_pci(self):
+ '''pxelinux.cfg MAC-address-based file lookup via virtio-net-pci'''
+ self.require_device('virtio-net-pci')
+ self.do_test_mac('virtio-net-pci')
+
+ def test_uuid_ccw(self):
+ '''pxelinux.cfg UUID-based file lookup via virtio-net-ccw'''
+ self.do_test_uuid('virtio-net-ccw')
+
+ def test_uuid_pci(self):
+ '''pxelinux.cfg UUID-based file lookup via virtio-net-pci'''
+ self.require_device('virtio-net-pci')
+ self.do_test_uuid('virtio-net-pci')
+
+ def test_ip_ccw(self):
+ '''pxelinux.cfg IP-address-based file lookup via virtio-net-ccw'''
+ self.do_test_ip('virtio-net-ccw')
+
+ def test_ip_pci(self):
+ '''pxelinux.cfg IP-address-based file lookup via virtio-net-pci'''
+ self.require_device('virtio-net-pci')
+ self.do_test_ip('virtio-net-pci')
+
+ def test_menu_ccw(self):
+ '''pxelinux.cfg interactive boot menu via virtio-net-ccw'''
+ self.do_test_menu('virtio-net-ccw')
+
+ def test_menu_pci(self):
+ '''pxelinux.cfg interactive boot menu via virtio-net-pci'''
+ self.require_device('virtio-net-pci')
+ self.do_test_menu('virtio-net-pci')
if __name__ == '__main__':
QemuSystemTest.main()
--
2.55.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH v4 4/8] pc-bios/s390-ccw: Add support for virtio-net-pci IPL
2026-09-24 19:48 ` [PATCH v4 4/8] pc-bios/s390-ccw: Add support for virtio-net-pci IPL Zhuoying Cai
@ 2026-09-24 20:12 ` Matthew Rosato
2026-09-24 20:18 ` Zhuoying Cai
0 siblings, 1 reply; 16+ messages in thread
From: Matthew Rosato @ 2026-09-24 20:12 UTC (permalink / raw)
To: Zhuoying Cai, qemu-devel, qemu-s390x
Cc: mst, jrossi, borntraeger, jjherne, cohuck, farman, pasic, farosas,
lvivier, pbonzini, jdaley
On 9/24/26 3:48 PM, Zhuoying Cai wrote:
> Enable network booting via virtio-net-pci by implementing PCI transport
> support for virtio-net.
>
> This patch also extends endianness handling for virtio PCI ring operations in
> little-endian to ensure correct behavior on s390x.
>
> Signed-off-by: Zhuoying Cai <zycai@linux.ibm.com>
> Reviewed-by: Jared Rossi <jrossi@linux.ibm.com>
> Reviewed-by: Matthew Rosato <mjrosato@linux.ibm.com>
Looks like rebase errors with this patch, see below...
> /* Move index to next entry */
> diff --git a/pc-bios/s390-ccw/virtio-pci.c b/pc-bios/s390-ccw/virtio-pci.c
> index 277c3ea68d..7fb987099d 100644
> --- a/pc-bios/s390-ccw/virtio-pci.c
> +++ b/pc-bios/s390-ccw/virtio-pci.c
> @@ -55,6 +55,9 @@ void virtio_pci_id2type(VDev *vdev, uint16_t device_id)
> case 0x1048:
> case 0x1004:
> vdev->dev_type = VIRTIO_ID_SCSI;
missing break?
> + case 0x1041:
> + case 0x1000:
> + vdev->dev_type = VIRTIO_ID_NET;
> break;
[...]
> @@ -413,6 +428,9 @@ int virtio_pci_setup(VDev *vdev)
> vdev->nr_vqs = 3;
> vdev->cmd_vr_idx = 2;
> virtio_pci_get_scsi_config();
missing break?
> + case VIRTIO_ID_NET:
> + vdev->nr_vqs = 2;
> + virtio_pci_get_net_config();
> break;
> default:
> puts("Unsupported virtio device");
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v4 4/8] pc-bios/s390-ccw: Add support for virtio-net-pci IPL
2026-09-24 20:12 ` Matthew Rosato
@ 2026-09-24 20:18 ` Zhuoying Cai
0 siblings, 0 replies; 16+ messages in thread
From: Zhuoying Cai @ 2026-09-24 20:18 UTC (permalink / raw)
To: Matthew Rosato, qemu-devel, qemu-s390x
Cc: mst, jrossi, borntraeger, jjherne, cohuck, farman, pasic, farosas,
lvivier, pbonzini, jdaley
On 9/24/26 4:12 PM, Matthew Rosato wrote:
> On 9/24/26 3:48 PM, Zhuoying Cai wrote:
>> Enable network booting via virtio-net-pci by implementing PCI transport
>> support for virtio-net.
>>
>> This patch also extends endianness handling for virtio PCI ring operations in
>> little-endian to ensure correct behavior on s390x.
>>
>> Signed-off-by: Zhuoying Cai <zycai@linux.ibm.com>
>> Reviewed-by: Jared Rossi <jrossi@linux.ibm.com>
>> Reviewed-by: Matthew Rosato <mjrosato@linux.ibm.com>
>
> Looks like rebase errors with this patch, see below...
>
Thanks for catching this. I’ll fix the rebase errors.
>
>> /* Move index to next entry */
>> diff --git a/pc-bios/s390-ccw/virtio-pci.c b/pc-bios/s390-ccw/virtio-pci.c
>> index 277c3ea68d..7fb987099d 100644
>> --- a/pc-bios/s390-ccw/virtio-pci.c
>> +++ b/pc-bios/s390-ccw/virtio-pci.c
>> @@ -55,6 +55,9 @@ void virtio_pci_id2type(VDev *vdev, uint16_t device_id)
>> case 0x1048:
>> case 0x1004:
>> vdev->dev_type = VIRTIO_ID_SCSI;
>
> missing break?
>
>> + case 0x1041:
>> + case 0x1000:
>> + vdev->dev_type = VIRTIO_ID_NET;
>> break;
>
> [...]
>
>
>> @@ -413,6 +428,9 @@ int virtio_pci_setup(VDev *vdev)
>> vdev->nr_vqs = 3;
>> vdev->cmd_vr_idx = 2;
>> virtio_pci_get_scsi_config();
>
> missing break?
>
>> + case VIRTIO_ID_NET:
>> + vdev->nr_vqs = 2;
>> + virtio_pci_get_net_config();
>> break;
>> default:
>> puts("Unsupported virtio device");
>
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v4 6/8] tests/qtest: Check s390x boot device support in pxe-test.c
2026-09-24 19:48 ` [PATCH v4 6/8] tests/qtest: Check s390x boot device support in pxe-test.c Zhuoying Cai
@ 2026-09-24 20:25 ` Matthew Rosato
2026-09-24 20:57 ` Zhuoying Cai
2026-09-24 21:14 ` Matthew Rosato
0 siblings, 2 replies; 16+ messages in thread
From: Matthew Rosato @ 2026-09-24 20:25 UTC (permalink / raw)
To: Zhuoying Cai, qemu-devel, qemu-s390x
Cc: mst, jrossi, borntraeger, jjherne, cohuck, farman, pasic, farosas,
lvivier, pbonzini, jdaley
> +
> +static bool s390_bios_has_net_ccw(void)
> +{
Since you'll need to respin anyway...
Sorry, I think there was some confusion about what I asked for here.
AFAIU checking for this string is going to unconditionally work as long
as we enter netboot code, before we even decide if -ccw- or -pci support
is actually available. That's why you don't use this test for
virtio-net-pci.
Your old comment block said virtio-net-ccw support has always been there
(that's not strictly true)
So rather than removing the comment block, just reword it to explain
that the test just assumes virtio-net-ccw support is always available
and only checks that netboot started, it doesn't try to verify ccw support.
> + return s390_bios_has_string("Network boot starting...");
> +}
> +
> static testdef_t s390x_tests[] = {
> - { "s390-ccw-virtio", "virtio-net-ccw" },
> + { "s390-ccw-virtio", "virtio-net-ccw",
> + .boot_dev_support = s390_bios_has_net_ccw },
> { NULL },
> };
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v4 6/8] tests/qtest: Check s390x boot device support in pxe-test.c
2026-09-24 20:25 ` Matthew Rosato
@ 2026-09-24 20:57 ` Zhuoying Cai
2026-09-24 21:14 ` Matthew Rosato
1 sibling, 0 replies; 16+ messages in thread
From: Zhuoying Cai @ 2026-09-24 20:57 UTC (permalink / raw)
To: Matthew Rosato, qemu-devel, qemu-s390x
Cc: mst, jrossi, borntraeger, jjherne, cohuck, farman, pasic, farosas,
lvivier, pbonzini, jdaley
On 9/24/26 4:25 PM, Matthew Rosato wrote:
>
>> +
>> +static bool s390_bios_has_net_ccw(void)
>> +{
>
> Since you'll need to respin anyway...
>
> Sorry, I think there was some confusion about what I asked for here.
>
> AFAIU checking for this string is going to unconditionally work as long
> as we enter netboot code, before we even decide if -ccw- or -pci support
> is actually available. That's why you don't use this test for
> virtio-net-pci.
>
> Your old comment block said virtio-net-ccw support has always been there
> (that's not strictly true)
>
> So rather than removing the comment block, just reword it to explain
> that the test just assumes virtio-net-ccw support is always available
> and only checks that netboot started, it doesn't try to verify ccw support.
>
Thanks for the clarification. I misunderstood your previous comment and
removed the comment block since we assume virtio-net-ccw support is
present. I’ll add it back and reword it accordingly.
>> + return s390_bios_has_string("Network boot starting...");
>> +}
>> +
>> static testdef_t s390x_tests[] = {
>> - { "s390-ccw-virtio", "virtio-net-ccw" },
>> + { "s390-ccw-virtio", "virtio-net-ccw",
>> + .boot_dev_support = s390_bios_has_net_ccw },
>> { NULL },
>> };
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v4 6/8] tests/qtest: Check s390x boot device support in pxe-test.c
2026-09-24 20:25 ` Matthew Rosato
2026-09-24 20:57 ` Zhuoying Cai
@ 2026-09-24 21:14 ` Matthew Rosato
1 sibling, 0 replies; 16+ messages in thread
From: Matthew Rosato @ 2026-09-24 21:14 UTC (permalink / raw)
To: Zhuoying Cai, qemu-devel, qemu-s390x
Cc: mst, jrossi, borntraeger, jjherne, cohuck, farman, pasic, farosas,
lvivier, pbonzini, jdaley
On 9/24/26 4:25 PM, Matthew Rosato wrote:
>
>> +
>> +static bool s390_bios_has_net_ccw(void)
>> +{
>
> Since you'll need to respin anyway...
>
> Sorry, I think there was some confusion about what I asked for here.
>
> AFAIU checking for this string is going to unconditionally work as long
> as we enter netboot code, before we even decide if -ccw- or -pci support
> is actually available. That's why you don't use this test for
> virtio-net-pci.
>
> Your old comment block said virtio-net-ccw support has always been there
> (that's not strictly true)
>
> So rather than removing the comment block, just reword it to explain
> that the test just assumes virtio-net-ccw support is always available
> and only checks that netboot started, it doesn't try to verify ccw support.
Quick clarification: I meant 'only checks that netboot code exists' --
since we are just looking for the existence of the string, not that it's
being output somewhere.
You're assuming if netboot support exists then it always supports -ccw
and maybe that's the right way to word it. If that assumption ever were
to change in the future then we'd need to revisit the testcase.
>
>> + return s390_bios_has_string("Network boot starting...");
>> +}
>> +
>> static testdef_t s390x_tests[] = {
>> - { "s390-ccw-virtio", "virtio-net-ccw" },
>> + { "s390-ccw-virtio", "virtio-net-ccw",
>> + .boot_dev_support = s390_bios_has_net_ccw },
>> { NULL },
>> };
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v4 7/8] tests/qtest: Add s390x virtio net PCI test to pxe-test.c
2026-09-24 19:48 ` [PATCH v4 7/8] tests/qtest: Add s390x virtio net PCI test to pxe-test.c Zhuoying Cai
@ 2026-09-24 21:15 ` Matthew Rosato
2026-09-25 16:51 ` Jared Rossi
0 siblings, 1 reply; 16+ messages in thread
From: Matthew Rosato @ 2026-09-24 21:15 UTC (permalink / raw)
To: Zhuoying Cai, qemu-devel, qemu-s390x
Cc: mst, jrossi, borntraeger, jjherne, cohuck, farman, pasic, farosas,
lvivier, pbonzini, jdaley
On 9/24/26 3:48 PM, Zhuoying Cai wrote:
> Add test coverage for virtio-net-pci network booting on s390x by
> including it in the PXE test suite. The test verifies that PXE
> network booting works correctly with virtio-net-pci devices.
>
> Signed-off-by: Zhuoying Cai <zycai@linux.ibm.com>
> Tested-by: Joshua Daley <jdaley@linux.ibm.com>
It's still kind of confusing, but this is a little better.
Not sure if we will need to come up with a better way of identifying the
existence of a feature for s390x bios in the future, but for now:
Reviewed-by: Matthew Rosato <mjrosato@linux.ibm.com>
> ---
> tests/qtest/pxe-test.c | 11 +++++++++++
> 1 file changed, 11 insertions(+)
>
> diff --git a/tests/qtest/pxe-test.c b/tests/qtest/pxe-test.c
> index 61ad572bb7..b12de2bedc 100644
> --- a/tests/qtest/pxe-test.c
> +++ b/tests/qtest/pxe-test.c
> @@ -126,9 +126,20 @@ static bool s390_bios_has_net_ccw(void)
> return s390_bios_has_string("Network boot starting...");
> }
>
> +static bool s390_bios_has_net_pci(void)
> +{
> + /*
> + * Check for a string unique to virtio-net-pci boot support in the bios
> + * to determine if the binary was built with support for this device.
> + */
> + return s390_bios_has_string("Setup failed for virtio-net-pci");
> +}
> +
> static testdef_t s390x_tests[] = {
> { "s390-ccw-virtio", "virtio-net-ccw",
> .boot_dev_support = s390_bios_has_net_ccw },
> + { "s390-ccw-virtio", "virtio-net-pci",
> + .boot_dev_support = s390_bios_has_net_pci },
> { NULL },
> };
>
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v4 7/8] tests/qtest: Add s390x virtio net PCI test to pxe-test.c
2026-09-24 21:15 ` Matthew Rosato
@ 2026-09-25 16:51 ` Jared Rossi
0 siblings, 0 replies; 16+ messages in thread
From: Jared Rossi @ 2026-09-25 16:51 UTC (permalink / raw)
To: Matthew Rosato, Zhuoying Cai, qemu-devel, qemu-s390x
Cc: mst, borntraeger, jjherne, cohuck, farman, pasic, farosas,
lvivier, pbonzini, jdaley
On 9/24/26 5:15 PM, Matthew Rosato wrote:
> On 9/24/26 3:48 PM, Zhuoying Cai wrote:
>> Add test coverage for virtio-net-pci network booting on s390x by
>> including it in the PXE test suite. The test verifies that PXE
>> network booting works correctly with virtio-net-pci devices.
>>
>> Signed-off-by: Zhuoying Cai <zycai@linux.ibm.com>
>> Tested-by: Joshua Daley <jdaley@linux.ibm.com>
> It's still kind of confusing, but this is a little better.
>
> Not sure if we will need to come up with a better way of identifying the
> existence of a feature for s390x bios in the future, but for now:
>
> Reviewed-by: Matthew Rosato <mjrosato@linux.ibm.com>
Probably the normal console messages just need to be updated. Currently
it prints a message like "using virtio-blk" or "netboot started" and that
was fine when only CCW was supported for those devices, but now that there
are a lot more device/bus combinations I think we need to be more verbose.
That would make feature checks easier and also provide better diagnostic
output in general.
In the meantime, this particular output could be clarified by simply using
a substring of the same string literal:
return s390_bios_has_string("virtio-net-pci");
Will result in:
# "virtio-net-pci" found in bios
(or not found) which is much more logical to me. I wouldn't respin the
series just for that though since the test itself does work as intended.
Reviewed-by: Jared Rossi <jrossi@linux.ibm.com>
^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2026-09-25 16:52 UTC | newest]
Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-09-24 19:48 [PATCH v4 0/8] s390x: Add support for virtio-net-pci boot device Zhuoying Cai
2026-09-24 19:48 ` [PATCH v4 1/8] pc-bios/s390-ccw: Move CCW net setup to virtio-ccw Zhuoying Cai
2026-09-24 19:48 ` [PATCH v4 2/8] pc-bios/s390-ccw: Add dynamic net header size handling Zhuoying Cai
2026-09-24 19:48 ` [PATCH v4 3/8] pc-bios/s390-ccw: Introduce virtio_tswap helpers Zhuoying Cai
2026-09-24 19:48 ` [PATCH v4 4/8] pc-bios/s390-ccw: Add support for virtio-net-pci IPL Zhuoying Cai
2026-09-24 20:12 ` Matthew Rosato
2026-09-24 20:18 ` Zhuoying Cai
2026-09-24 19:48 ` [PATCH v4 5/8] hw/virtio: Add "loadparm" property to virtio net PCI devices booting on s390x Zhuoying Cai
2026-09-24 19:48 ` [PATCH v4 6/8] tests/qtest: Check s390x boot device support in pxe-test.c Zhuoying Cai
2026-09-24 20:25 ` Matthew Rosato
2026-09-24 20:57 ` Zhuoying Cai
2026-09-24 21:14 ` Matthew Rosato
2026-09-24 19:48 ` [PATCH v4 7/8] tests/qtest: Add s390x virtio net PCI test to pxe-test.c Zhuoying Cai
2026-09-24 21:15 ` Matthew Rosato
2026-09-25 16:51 ` Jared Rossi
2026-09-24 19:48 ` [PATCH v4 8/8] tests/functional/s390x: Add tests for virtio net PCI in test_pxelinux.py Zhuoying Cai
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.