Skip to content

Commit d977d35

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 7b3120b commit d977d35

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
@@ -143,7 +143,6 @@ static void mem_load(hart_t *hart,
143143
case 0x0:
144144
case 0x2: /* PLIC (0 - 0x3F) */
145145
plic_read(hart, &data->plic, addr & 0x3FFFFFF, width, value);
146-
plic_update_interrupts(hart->vm, &data->plic);
147146
return;
148147
case 0x40: /* UART */
149148
u8250_read(hart, &data->uart, addr & 0xFFFFF, width, value);
@@ -152,46 +151,38 @@ static void mem_load(hart_t *hart,
152151
#if SEMU_HAS(VIRTIONET)
153152
case 0x41: /* virtio-net */
154153
virtio_net_read(hart, &data->vnet, addr & 0xFFFFF, width, value);
155-
emu_update_vnet_interrupts(hart->vm);
156154
return;
157155
#endif
158156
#if SEMU_HAS(VIRTIOBLK)
159157
case 0x42: /* virtio-blk */
160158
virtio_blk_read(hart, &data->vblk, addr & 0xFFFFF, width, value);
161-
emu_update_vblk_interrupts(hart->vm);
162159
return;
163160
#endif
164161
case 0x43: /* mtimer */
165162
aclint_mtimer_read(hart, &data->mtimer, addr & 0xFFFFF, width,
166163
value);
167-
aclint_mtimer_update_interrupts(hart, &data->mtimer);
168164
return;
169165
case 0x44: /* mswi */
170166
aclint_mswi_read(hart, &data->mswi, addr & 0xFFFFF, width, value);
171-
aclint_mswi_update_interrupts(hart, &data->mswi);
172167
return;
173168
case 0x45: /* sswi */
174169
aclint_sswi_read(hart, &data->sswi, addr & 0xFFFFF, width, value);
175-
aclint_sswi_update_interrupts(hart, &data->sswi);
176170
return;
177171
#if SEMU_HAS(VIRTIORNG)
178172
case 0x46: /* virtio-rng */
179173
virtio_rng_read(hart, &data->vrng, addr & 0xFFFFF, width, value);
180-
emu_update_vrng_interrupts(hart->vm);
181174
return;
182175
#endif
183176

184177
#if SEMU_HAS(VIRTIOSND)
185178
case 0x47: /* virtio-snd */
186179
virtio_snd_read(hart, &data->vsnd, addr & 0xFFFFF, width, value);
187-
emu_update_vsnd_interrupts(hart->vm);
188180
return;
189181
#endif
190182

191183
#if SEMU_HAS(VIRTIOFS)
192184
case 0x48: /* virtio-fs */
193185
virtio_fs_read(hart, &data->vfs, addr & 0xFFFFF, width, value);
194-
emu_update_vfs_interrupts(hart->vm);
195186
return;
196187
#endif
197188
}
@@ -760,6 +751,11 @@ static int semu_step(emu_state_t *emu)
760751
emu_update_vblk_interrupts(vm);
761752
#endif
762753

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

0 commit comments

Comments
 (0)