Skip to content

Commit cc1d23d

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 8f0c958 commit cc1d23d

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
@@ -163,6 +163,11 @@ static inline void emu_tick_peripherals(emu_state_t *emu)
163163
emu_update_vblk_interrupts(vm);
164164
#endif
165165

166+
#if SEMU_HAS(VIRTIORNG)
167+
if (emu->vrng.InterruptStatus)
168+
emu_update_vrng_interrupts(vm);
169+
#endif
170+
166171
#if SEMU_HAS(VIRTIOSND)
167172
if (emu->vsnd.InterruptStatus)
168173
emu_update_vsnd_interrupts(vm);
@@ -193,7 +198,6 @@ static void mem_load(hart_t *hart,
193198
case 0x0:
194199
case 0x2: /* PLIC (0 - 0x3F) */
195200
plic_read(hart, &data->plic, addr & 0x3FFFFFF, width, value);
196-
plic_update_interrupts(hart->vm, &data->plic);
197201
return;
198202
case 0x40: /* UART */
199203
u8250_read(hart, &data->uart, addr & 0xFFFFF, width, value);
@@ -202,46 +206,38 @@ static void mem_load(hart_t *hart,
202206
#if SEMU_HAS(VIRTIONET)
203207
case 0x41: /* virtio-net */
204208
virtio_net_read(hart, &data->vnet, addr & 0xFFFFF, width, value);
205-
emu_update_vnet_interrupts(hart->vm);
206209
return;
207210
#endif
208211
#if SEMU_HAS(VIRTIOBLK)
209212
case 0x42: /* virtio-blk */
210213
virtio_blk_read(hart, &data->vblk, addr & 0xFFFFF, width, value);
211-
emu_update_vblk_interrupts(hart->vm);
212214
return;
213215
#endif
214216
case 0x43: /* mtimer */
215217
aclint_mtimer_read(hart, &data->mtimer, addr & 0xFFFFF, width,
216218
value);
217-
aclint_mtimer_update_interrupts(hart, &data->mtimer);
218219
return;
219220
case 0x44: /* mswi */
220221
aclint_mswi_read(hart, &data->mswi, addr & 0xFFFFF, width, value);
221-
aclint_mswi_update_interrupts(hart, &data->mswi);
222222
return;
223223
case 0x45: /* sswi */
224224
aclint_sswi_read(hart, &data->sswi, addr & 0xFFFFF, width, value);
225-
aclint_sswi_update_interrupts(hart, &data->sswi);
226225
return;
227226
#if SEMU_HAS(VIRTIORNG)
228227
case 0x46: /* virtio-rng */
229228
virtio_rng_read(hart, &data->vrng, addr & 0xFFFFF, width, value);
230-
emu_update_vrng_interrupts(hart->vm);
231229
return;
232230
#endif
233231

234232
#if SEMU_HAS(VIRTIOSND)
235233
case 0x47: /* virtio-snd */
236234
virtio_snd_read(hart, &data->vsnd, addr & 0xFFFFF, width, value);
237-
emu_update_vsnd_interrupts(hart->vm);
238235
return;
239236
#endif
240237

241238
#if SEMU_HAS(VIRTIOFS)
242239
case 0x48: /* virtio-fs */
243240
virtio_fs_read(hart, &data->vfs, addr & 0xFFFFF, width, value);
244-
emu_update_vfs_interrupts(hart->vm);
245241
return;
246242
#endif
247243
}

0 commit comments

Comments
 (0)