@@ -72,6 +72,18 @@ static void emu_update_vblk_interrupts(vm_t *vm)
72
72
}
73
73
#endif
74
74
75
+ #if SEMU_HAS (VIRTIORNG )
76
+ static void emu_update_vrng_interrupts (vm_t * vm )
77
+ {
78
+ emu_state_t * data = PRIV (vm -> hart [0 ]);
79
+ if (data -> vrng .InterruptStatus )
80
+ data -> plic .active |= IRQ_VRNG_BIT ;
81
+ else
82
+ data -> plic .active &= ~IRQ_VRNG_BIT ;
83
+ plic_update_interrupts (vm , & data -> plic );
84
+ }
85
+ #endif
86
+
75
87
static void emu_update_timer_interrupt (hart_t * hart )
76
88
{
77
89
emu_state_t * data = PRIV (hart );
@@ -137,6 +149,12 @@ static void mem_load(hart_t *hart,
137
149
aclint_sswi_read (hart , & data -> sswi , addr & 0xFFFFF , width , value );
138
150
aclint_sswi_update_interrupts (hart , & data -> sswi );
139
151
return ;
152
+ #if SEMU_HAS (VIRTIORNG )
153
+ case 0x46 : /* virtio-rng */
154
+ virtio_rng_read (hart , & data -> vrng , addr & 0xFFFFF , width , value );
155
+ emu_update_vrng_interrupts (hart -> vm );
156
+ return ;
157
+ #endif
140
158
}
141
159
}
142
160
vm_set_exception (hart , RV_EXC_LOAD_FAULT , hart -> exc_val );
@@ -191,6 +209,12 @@ static void mem_store(hart_t *hart,
191
209
aclint_sswi_write (hart , & data -> sswi , addr & 0xFFFFF , width , value );
192
210
aclint_sswi_update_interrupts (hart , & data -> sswi );
193
211
return ;
212
+ #if SEMU_HAS (VIRTIORNG )
213
+ case 0x46 : /* virtio-rng */
214
+ virtio_rng_write (hart , & data -> vrng , addr & 0xFFFFF , width , value );
215
+ emu_update_vrng_interrupts (hart -> vm );
216
+ return ;
217
+ #endif
194
218
}
195
219
}
196
220
vm_set_exception (hart , RV_EXC_STORE_FAULT , hart -> exc_val );
@@ -617,6 +641,10 @@ static int semu_start(int argc, char **argv)
617
641
#if SEMU_HAS (VIRTIOBLK )
618
642
emu .vblk .ram = emu .ram ;
619
643
emu .disk = virtio_blk_init (& (emu .vblk ), disk_file );
644
+ #endif
645
+ #if SEMU_HAS (VIRTIORNG )
646
+ emu .vrng .ram = emu .ram ;
647
+ virtio_rng_init ();
620
648
#endif
621
649
/* Set up ACLINT */
622
650
semu_timer_init (& emu .mtimer .mtime , CLOCK_FREQ );
0 commit comments