Skip to content

Commit 422c5a2

Browse files
committed
Improve MMIO read path interrupt updates
This removes unnecessary interrupt update calls in mem_load() for non-interactive devices (PLIC, VirtIO-Net/Blk/RNG/Sound/FS, ACLINT MTIMER/MSWI/SSWI). Rationale: - MMIO read operations mostly query state without changing interrupt status - Can safely defer interrupt updates to periodic batch processing (every 64 cycles) - UART is exception due to interactive nature (read clears in_ready flag) - MMIO write operations trigger device actions and must update interrupts immediately
1 parent b50f948 commit 422c5a2

File tree

1 file changed

+5
-9
lines changed

1 file changed

+5
-9
lines changed

main.c

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,6 @@ static void mem_load(hart_t *hart,
146146
case 0x0:
147147
case 0x2: /* PLIC (0 - 0x3F) */
148148
plic_read(hart, &data->plic, addr & 0x3FFFFFF, width, value);
149-
plic_update_interrupts(hart->vm, &data->plic);
150149
return;
151150
case 0x40: /* UART */
152151
u8250_read(hart, &data->uart, addr & 0xFFFFF, width, value);
@@ -155,46 +154,38 @@ static void mem_load(hart_t *hart,
155154
#if SEMU_HAS(VIRTIONET)
156155
case 0x41: /* virtio-net */
157156
virtio_net_read(hart, &data->vnet, addr & 0xFFFFF, width, value);
158-
emu_update_vnet_interrupts(hart->vm);
159157
return;
160158
#endif
161159
#if SEMU_HAS(VIRTIOBLK)
162160
case 0x42: /* virtio-blk */
163161
virtio_blk_read(hart, &data->vblk, addr & 0xFFFFF, width, value);
164-
emu_update_vblk_interrupts(hart->vm);
165162
return;
166163
#endif
167164
case 0x43: /* mtimer */
168165
aclint_mtimer_read(hart, &data->mtimer, addr & 0xFFFFF, width,
169166
value);
170-
aclint_mtimer_update_interrupts(hart, &data->mtimer);
171167
return;
172168
case 0x44: /* mswi */
173169
aclint_mswi_read(hart, &data->mswi, addr & 0xFFFFF, width, value);
174-
aclint_mswi_update_interrupts(hart, &data->mswi);
175170
return;
176171
case 0x45: /* sswi */
177172
aclint_sswi_read(hart, &data->sswi, addr & 0xFFFFF, width, value);
178-
aclint_sswi_update_interrupts(hart, &data->sswi);
179173
return;
180174
#if SEMU_HAS(VIRTIORNG)
181175
case 0x46: /* virtio-rng */
182176
virtio_rng_read(hart, &data->vrng, addr & 0xFFFFF, width, value);
183-
emu_update_vrng_interrupts(hart->vm);
184177
return;
185178
#endif
186179

187180
#if SEMU_HAS(VIRTIOSND)
188181
case 0x47: /* virtio-snd */
189182
virtio_snd_read(hart, &data->vsnd, addr & 0xFFFFF, width, value);
190-
emu_update_vsnd_interrupts(hart->vm);
191183
return;
192184
#endif
193185

194186
#if SEMU_HAS(VIRTIOFS)
195187
case 0x48: /* virtio-fs */
196188
virtio_fs_read(hart, &data->vfs, addr & 0xFFFFF, width, value);
197-
emu_update_vfs_interrupts(hart->vm);
198189
return;
199190
#endif
200191
}
@@ -759,6 +750,11 @@ static int semu_step(emu_state_t *emu)
759750
emu_update_vblk_interrupts(vm);
760751
#endif
761752

753+
#if SEMU_HAS(VIRTIORNG)
754+
if (emu->vrng.InterruptStatus)
755+
emu_update_vrng_interrupts(vm);
756+
#endif
757+
762758
#if SEMU_HAS(VIRTIOSND)
763759
if (emu->vsnd.InterruptStatus)
764760
emu_update_vsnd_interrupts(vm);

0 commit comments

Comments
 (0)