Advertisement
jintack

QEMU for L1 with vgic

Apr 9th, 2016
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.69 KB | None | 0 0
  1. diff --git a/hw/arm/virt.c b/hw/arm/virt.c
  2. index 2972bb3..47caea2 100644
  3. --- a/hw/arm/virt.c
  4. +++ b/hw/arm/virt.c
  5. @@ -67,6 +67,8 @@ enum {
  6. VIRT_CPUPERIPHS,
  7. VIRT_GIC_DIST,
  8. VIRT_GIC_CPU,
  9. + VIRT_GIC_VDIST,
  10. + VIRT_GIC_VCPU,
  11. VIRT_UART,
  12. VIRT_MMIO,
  13. VIRT_RTC,
  14. @@ -130,6 +132,8 @@ static const MemMapEntry a15memmap[] = {
  15. /* GIC distributor and CPU interfaces sit inside the CPU peripheral space */
  16. [VIRT_GIC_DIST] = { 0x08000000, 0x00010000 },
  17. [VIRT_GIC_CPU] = { 0x08010000, 0x00010000 },
  18. + [VIRT_GIC_VDIST] = { 0x08030000, 0x00010000 },
  19. + [VIRT_GIC_VCPU] = { 0x08010000, 0x00010000 },
  20. [VIRT_GIC_V2M] = { 0x08020000, 0x00001000 },
  21. [VIRT_UART] = { 0x09000000, 0x00001000 },
  22. [VIRT_RTC] = { 0x09010000, 0x00001000 },
  23. @@ -356,12 +360,20 @@ static void fdt_add_gic_node(VirtBoardInfo *vbi)
  24. 2, vbi->memmap[VIRT_GIC_DIST].base,
  25. 2, vbi->memmap[VIRT_GIC_DIST].size,
  26. 2, vbi->memmap[VIRT_GIC_CPU].base,
  27. - 2, vbi->memmap[VIRT_GIC_CPU].size);
  28. + 2, vbi->memmap[VIRT_GIC_CPU].size,
  29. + 2, vbi->memmap[VIRT_GIC_VDIST].base,
  30. + 2, vbi->memmap[VIRT_GIC_VDIST].size,
  31. + 2, vbi->memmap[VIRT_GIC_VCPU].base,
  32. + 2, vbi->memmap[VIRT_GIC_VCPU].size);
  33. qemu_fdt_setprop_cell(vbi->fdt, "/intc", "#address-cells", 0x2);
  34. qemu_fdt_setprop_cell(vbi->fdt, "/intc", "#size-cells", 0x2);
  35. qemu_fdt_setprop(vbi->fdt, "/intc", "ranges", NULL, 0);
  36. qemu_fdt_setprop_cell(vbi->fdt, "/intc", "phandle", vbi->gic_phandle);
  37.  
  38. + qemu_fdt_setprop_cells(vbi->fdt, "/intc", "interrupts",
  39. + GIC_FDT_IRQ_TYPE_PPI, 9,
  40. + GIC_FDT_IRQ_FLAGS_LEVEL_HI | 0xf00);
  41. +
  42. }
  43.  
  44. static void create_v2m(VirtBoardInfo *vbi, qemu_irq *pic)
  45. diff --git a/hw/intc/arm_gic_kvm.c b/hw/intc/arm_gic_kvm.c
  46. index 2cb7d25..5ee0102 100644
  47. --- a/hw/intc/arm_gic_kvm.c
  48. +++ b/hw/intc/arm_gic_kvm.c
  49. @@ -625,6 +625,7 @@ static void kvm_arm_gic_realize(DeviceState *dev, Error **errp)
  50. KVM_DEV_ARM_VGIC_GRP_ADDR,
  51. KVM_VGIC_V2_ADDR_TYPE_CPU,
  52. s->dev_fd);
  53. +
  54. }
  55.  
  56. static void kvm_arm_gic_class_init(ObjectClass *klass, void *data)
  57. diff --git a/kvm-all.c b/kvm-all.c
  58. index b2b1bc3..c9761b5 100644
  59. --- a/kvm-all.c
  60. +++ b/kvm-all.c
  61. @@ -968,6 +968,8 @@ int kvm_set_irq(KVMState *s, int irq, int level)
  62.  
  63. event.level = level;
  64. event.irq = irq;
  65. + if ((irq & KVM_ARM_IRQ_NUM_MASK) != 33)
  66. + printf("%s IRQ: %d\n", __func__, irq & KVM_ARM_IRQ_NUM_MASK);
  67. ret = kvm_vm_ioctl(s, s->irq_set_ioctl, &event);
  68. if (ret < 0) {
  69. perror("kvm_set_irq");
  70. @@ -1968,6 +1970,7 @@ int kvm_device_ioctl(int fd, int type, ...)
  71. trace_kvm_device_ioctl(fd, type, arg);
  72. ret = ioctl(fd, type, arg);
  73. if (ret == -1) {
  74. + printf("%s\n", __func__);
  75. ret = -errno;
  76. }
  77. return ret;
  78. diff --git a/linux-headers/asm-arm64/kvm.h b/linux-headers/asm-arm64/kvm.h
  79. index c8abf25..ab3353d 100644
  80. --- a/linux-headers/asm-arm64/kvm.h
  81. +++ b/linux-headers/asm-arm64/kvm.h
  82. @@ -75,6 +75,9 @@ struct kvm_regs {
  83. #define KVM_VGIC_V2_ADDR_TYPE_DIST 0
  84. #define KVM_VGIC_V2_ADDR_TYPE_CPU 1
  85.  
  86. +#define KVM_VGIC_V2_ADDR_TYPE_VDIST 4
  87. +#define KVM_VGIC_V2_ADDR_TYPE_VCPU 5
  88. +
  89. #define KVM_VGIC_V2_DIST_SIZE 0x1000
  90. #define KVM_VGIC_V2_CPU_SIZE 0x2000
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement