@@ -81,6 +81,18 @@ static void emu_update_timer_interrupt(hart_t *hart)
8181 clint_update_interrupts (hart , & data -> clint );
8282}
8383
84+ #if SEMU_HAS (VIRTIOSND )
85+ static void emu_update_vsnd_interrupts (vm_t * vm )
86+ {
87+ emu_state_t * data = PRIV (vm -> hart [0 ]);
88+ if (data -> vsnd .InterruptStatus )
89+ data -> plic .active |= IRQ_VSND_BIT ;
90+ else
91+ data -> plic .active &= ~IRQ_VSND_BIT ;
92+ plic_update_interrupts (vm , & data -> plic );
93+ }
94+ #endif
95+
8496static void mem_load (hart_t * hart ,
8597 uint32_t addr ,
8698 uint8_t width ,
@@ -121,6 +133,13 @@ static void mem_load(hart_t *hart,
121133 clint_read (hart , & data -> clint , addr & 0xFFFFF , width , value );
122134 clint_update_interrupts (hart , & data -> clint );
123135 return ;
136+
137+ #if SEMU_HAS (VIRTIOSND )
138+ case 0x44 : /* virtio-snd */
139+ virtio_snd_read (hart , & data -> vsnd , addr & 0xFFFFF , width , value );
140+ emu_update_vsnd_interrupts (hart -> vm );
141+ return ;
142+ #endif
124143 }
125144 }
126145 vm_set_exception (hart , RV_EXC_LOAD_FAULT , hart -> exc_val );
@@ -166,6 +185,12 @@ static void mem_store(hart_t *hart,
166185 clint_write (hart , & data -> clint , addr & 0xFFFFF , width , value );
167186 clint_update_interrupts (hart , & data -> clint );
168187 return ;
188+ #if SEMU_HAS (VIRTIOSND )
189+ case 0x44 : /* virtio-snd */
190+ virtio_snd_write (hart , & data -> vsnd , addr & 0xFFFFF , width , value );
191+ emu_update_vsnd_interrupts (hart -> vm );
192+ return ;
193+ #endif
169194 }
170195 }
171196 vm_set_exception (hart , RV_EXC_STORE_FAULT , hart -> exc_val );
@@ -581,6 +606,11 @@ static int semu_start(int argc, char **argv)
581606 emu .vblk .ram = emu .ram ;
582607 emu .disk = virtio_blk_init (& (emu .vblk ), disk_file );
583608#endif
609+ #if SEMU_HAS (VIRTIOSND )
610+ if (!virtio_snd_init (& (emu .vsnd )))
611+ fprintf (stderr , "No virtio-snd functioned\n" );
612+ emu .vsnd .ram = emu .ram ;
613+ #endif
584614
585615 /* Emulate */
586616 uint32_t peripheral_update_ctr = 0 ;
@@ -603,6 +633,11 @@ static int semu_start(int argc, char **argv)
603633 if (emu .vblk .InterruptStatus )
604634 emu_update_vblk_interrupts (& vm );
605635#endif
636+
637+ #if SEMU_HAS (VIRTIOSND )
638+ if (emu .vsnd .InterruptStatus )
639+ emu_update_vsnd_interrupts (& vm );
640+ #endif
606641 }
607642
608643 emu_update_timer_interrupt (vm .hart [i ]);
0 commit comments