Skip to content

Commit c6a1d5f

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 137d4d0 commit c6a1d5f

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
@@ -770,12 +770,15 @@ static int semu_init(emu_state_t *emu, int argc, char **argv)
770770
emu->uart.in_fd = 0, emu->uart.out_fd = 1;
771771
capture_keyboard_input(); /* set up uart */
772772
#if SEMU_HAS(VIRTIONET)
773+
/* Always set ram pointer, even if netdev is not configured.
774+
* Device tree may still expose the device to guest.
775+
*/
776+
emu->vnet.ram = emu->ram;
773777
if (netdev) {
774778
if (!virtio_net_init(&emu->vnet, netdev)) {
775779
fprintf(stderr, "Failed to initialize virtio-net device.\n");
776780
return 1;
777781
}
778-
emu->vnet.ram = emu->ram;
779782
netdev_ready = true;
780783
}
781784
#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)