Skip to content

Commit 0c0ec1e

Browse files
committed
Initialize vnet.ram unconditionally for device tree
When no network device is specified via -n option, the virtio-net device was left uninitialized but still exposed to guest via device tree. This caused segmentation fault when guest attempted to initialize the device. Root cause analysis: - WFI merge (e4ae87e) introduced conditional initialization: if (netdev) { virtio_net_init(); vnet.ram = ram; } - Previous code always set vnet.ram regardless of netdev - Guest kernel initializes all devices in device tree - Without vnet.ram pointer, QueueReady handler crashed accessing NULL
1 parent fbc2336 commit 0c0ec1e

File tree

2 files changed

+8
-1
lines changed

2 files changed

+8
-1
lines changed

main.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -774,12 +774,15 @@ static int semu_init(emu_state_t *emu, int argc, char **argv)
774774
emu->uart.in_fd = 0, emu->uart.out_fd = 1;
775775
capture_keyboard_input(); /* set up uart */
776776
#if SEMU_HAS(VIRTIONET)
777+
/* Always set ram pointer, even if netdev is not configured.
778+
* Device tree may still expose the device to guest.
779+
*/
780+
emu->vnet.ram = emu->ram;
777781
if (netdev) {
778782
if (!virtio_net_init(&emu->vnet, netdev)) {
779783
fprintf(stderr, "Failed to initialize virtio-net device.\n");
780784
return 1;
781785
}
782-
emu->vnet.ram = emu->ram;
783786
netdev_ready = true;
784787
}
785788
#endif

virtio-net.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,10 @@ void virtio_net_refresh_queue(virtio_net_state_t *vnet)
359359
(vnet->Status & VIRTIO_STATUS__DEVICE_NEEDS_RESET))
360360
return;
361361

362+
/* Skip if peer network device is not initialized */
363+
if (!vnet->peer.op)
364+
return;
365+
362366
netdev_impl_t dev_type = vnet->peer.type;
363367
#define _(dev) NETDEV_IMPL_##dev
364368
switch (dev_type) {

0 commit comments

Comments
 (0)