|
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