@@ -72,6 +72,18 @@ static void emu_update_vblk_interrupts(vm_t *vm)
7272}
7373#endif
7474
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+
7587static void emu_update_timer_interrupt (hart_t * hart )
7688{
7789 emu_state_t * data = PRIV (hart );
@@ -137,6 +149,12 @@ static void mem_load(hart_t *hart,
137149 aclint_sswi_read (hart , & data -> sswi , addr & 0xFFFFF , width , value );
138150 aclint_sswi_update_interrupts (hart , & data -> sswi );
139151 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
140158 }
141159 }
142160 vm_set_exception (hart , RV_EXC_LOAD_FAULT , hart -> exc_val );
@@ -191,6 +209,12 @@ static void mem_store(hart_t *hart,
191209 aclint_sswi_write (hart , & data -> sswi , addr & 0xFFFFF , width , value );
192210 aclint_sswi_update_interrupts (hart , & data -> sswi );
193211 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
194218 }
195219 }
196220 vm_set_exception (hart , RV_EXC_STORE_FAULT , hart -> exc_val );
@@ -617,6 +641,10 @@ static int semu_start(int argc, char **argv)
617641#if SEMU_HAS (VIRTIOBLK )
618642 emu .vblk .ram = emu .ram ;
619643 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 ();
620648#endif
621649 /* Set up ACLINT */
622650 semu_timer_init (& emu .mtimer .mtime , CLOCK_FREQ );
0 commit comments