|
13 | 13 | #include "mini-gdbstub/include/gdbstub.h" |
14 | 14 | #include "riscv.h" |
15 | 15 | #include "riscv_private.h" |
| 16 | +#include "window.h" |
| 17 | + |
16 | 18 | #define PRIV(x) ((emu_state_t *) x->priv) |
17 | 19 |
|
18 | 20 | /* Define fetch separately since it is simpler (fixed width, already checked |
@@ -85,6 +87,18 @@ static void emu_update_vrng_interrupts(vm_t *vm) |
85 | 87 | } |
86 | 88 | #endif |
87 | 89 |
|
| 90 | +#if SEMU_HAS(VIRTIOGPU) |
| 91 | +static void emu_update_vgpu_interrupts(vm_t *vm) |
| 92 | +{ |
| 93 | + emu_state_t *data = PRIV(vm->hart[0]); |
| 94 | + if (data->vgpu.InterruptStatus) |
| 95 | + data->plic.active |= IRQ_VGPU_BIT; |
| 96 | + else |
| 97 | + data->plic.active &= ~IRQ_VGPU_BIT; |
| 98 | + plic_update_interrupts(vm, &data->plic); |
| 99 | +} |
| 100 | +#endif |
| 101 | + |
88 | 102 | static void emu_update_timer_interrupt(hart_t *hart) |
89 | 103 | { |
90 | 104 | emu_state_t *data = PRIV(hart); |
@@ -168,12 +182,17 @@ static void mem_load(hart_t *hart, |
168 | 182 | emu_update_vrng_interrupts(hart->vm); |
169 | 183 | return; |
170 | 184 | #endif |
171 | | - |
172 | 185 | #if SEMU_HAS(VIRTIOSND) |
173 | 186 | case 0x47: /* virtio-snd */ |
174 | 187 | virtio_snd_read(hart, &data->vsnd, addr & 0xFFFFF, width, value); |
175 | 188 | emu_update_vsnd_interrupts(hart->vm); |
176 | 189 | return; |
| 190 | +#endif |
| 191 | +#if SEMU_HAS(VIRTIOGPU) |
| 192 | + case 0x48: /* virtio-gpu */ |
| 193 | + virtio_gpu_read(hart, &data->vgpu, addr & 0xFFFFF, width, value); |
| 194 | + emu_update_vgpu_interrupts(hart->vm); |
| 195 | + return; |
177 | 196 | #endif |
178 | 197 | } |
179 | 198 | } |
@@ -229,19 +248,23 @@ static void mem_store(hart_t *hart, |
229 | 248 | aclint_sswi_write(hart, &data->sswi, addr & 0xFFFFF, width, value); |
230 | 249 | aclint_sswi_update_interrupts(hart, &data->sswi); |
231 | 250 | return; |
232 | | - |
233 | 251 | #if SEMU_HAS(VIRTIORNG) |
234 | 252 | case 0x46: /* virtio-rng */ |
235 | 253 | virtio_rng_write(hart, &data->vrng, addr & 0xFFFFF, width, value); |
236 | 254 | emu_update_vrng_interrupts(hart->vm); |
237 | 255 | return; |
238 | 256 | #endif |
239 | | - |
240 | 257 | #if SEMU_HAS(VIRTIOSND) |
241 | 258 | case 0x47: /* virtio-snd */ |
242 | 259 | virtio_snd_write(hart, &data->vsnd, addr & 0xFFFFF, width, value); |
243 | 260 | emu_update_vsnd_interrupts(hart->vm); |
244 | 261 | return; |
| 262 | +#endif |
| 263 | +#if SEMU_HAS(VIRTIOGPU) |
| 264 | + case 0x48: /* virtio-gpu */ |
| 265 | + virtio_gpu_write(hart, &data->vgpu, addr & 0xFFFFF, width, value); |
| 266 | + emu_update_vgpu_interrupts(hart->vm); |
| 267 | + return; |
245 | 268 | #endif |
246 | 269 | } |
247 | 270 | } |
@@ -691,6 +714,12 @@ static int semu_init(emu_state_t *emu, int argc, char **argv) |
691 | 714 | fprintf(stderr, "No virtio-snd functioned\n"); |
692 | 715 | emu->vsnd.ram = emu->ram; |
693 | 716 | #endif |
| 717 | +#if SEMU_HAS(VIRTIOGPU) |
| 718 | + emu->vgpu.ram = emu->ram; |
| 719 | + virtio_gpu_init(&(emu->vgpu)); |
| 720 | + virtio_gpu_add_scanout(&(emu->vgpu), 1024, 768); |
| 721 | + window_init(); |
| 722 | +#endif |
694 | 723 |
|
695 | 724 | emu->peripheral_update_ctr = 0; |
696 | 725 | emu->debug = debug; |
@@ -728,6 +757,11 @@ static int semu_step(emu_state_t *emu) |
728 | 757 | if (emu->vsnd.InterruptStatus) |
729 | 758 | emu_update_vsnd_interrupts(vm); |
730 | 759 | #endif |
| 760 | + |
| 761 | +#if SEMU_HAS(VIRTIOGPU) |
| 762 | + if (emu->vgpu.InterruptStatus) |
| 763 | + emu_update_vgpu_interrupts(vm); |
| 764 | +#endif |
731 | 765 | } |
732 | 766 |
|
733 | 767 | emu_update_timer_interrupt(vm->hart[i]); |
|
0 commit comments