2
0

xen_apic.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. /*
  2. * Xen basic APIC support
  3. *
  4. * Copyright (c) 2012 Citrix
  5. *
  6. * Authors:
  7. * Wei Liu <wei.liu2@citrix.com>
  8. *
  9. * This work is licensed under the terms of the GNU GPL version 2 or
  10. * later. See the COPYING file in the top-level directory.
  11. */
  12. #include "qemu/osdep.h"
  13. #include "hw/i386/apic_internal.h"
  14. #include "hw/pci/msi.h"
  15. #include "hw/xen/xen.h"
  16. #include "qemu/module.h"
  17. static uint64_t xen_apic_mem_read(void *opaque, hwaddr addr,
  18. unsigned size)
  19. {
  20. return ~(uint64_t)0;
  21. }
  22. static void xen_apic_mem_write(void *opaque, hwaddr addr,
  23. uint64_t data, unsigned size)
  24. {
  25. if (size != sizeof(uint32_t)) {
  26. fprintf(stderr, "Xen: APIC write data size = %d, invalid\n", size);
  27. return;
  28. }
  29. xen_hvm_inject_msi(addr, data);
  30. }
  31. static const MemoryRegionOps xen_apic_io_ops = {
  32. .read = xen_apic_mem_read,
  33. .write = xen_apic_mem_write,
  34. .endianness = DEVICE_LITTLE_ENDIAN,
  35. };
  36. static void xen_apic_realize(DeviceState *dev, Error **errp)
  37. {
  38. APICCommonState *s = APIC_COMMON(dev);
  39. s->vapic_control = 0;
  40. memory_region_init_io(&s->io_memory, OBJECT(s), &xen_apic_io_ops, s,
  41. "xen-apic-msi", APIC_SPACE_SIZE);
  42. msi_nonbroken = true;
  43. }
  44. static int xen_apic_set_base(APICCommonState *s, uint64_t val)
  45. {
  46. return 0;
  47. }
  48. static void xen_apic_set_tpr(APICCommonState *s, uint8_t val)
  49. {
  50. }
  51. static uint8_t xen_apic_get_tpr(APICCommonState *s)
  52. {
  53. return 0;
  54. }
  55. static void xen_apic_vapic_base_update(APICCommonState *s)
  56. {
  57. }
  58. static void xen_apic_external_nmi(APICCommonState *s)
  59. {
  60. }
  61. static void xen_send_msi(MSIMessage *msi)
  62. {
  63. xen_hvm_inject_msi(msi->address, msi->data);
  64. }
  65. static void xen_apic_class_init(ObjectClass *klass, void *data)
  66. {
  67. APICCommonClass *k = APIC_COMMON_CLASS(klass);
  68. k->realize = xen_apic_realize;
  69. k->set_base = xen_apic_set_base;
  70. k->set_tpr = xen_apic_set_tpr;
  71. k->get_tpr = xen_apic_get_tpr;
  72. k->vapic_base_update = xen_apic_vapic_base_update;
  73. k->external_nmi = xen_apic_external_nmi;
  74. k->send_msi = xen_send_msi;
  75. }
  76. static const TypeInfo xen_apic_info = {
  77. .name = "xen-apic",
  78. .parent = TYPE_APIC_COMMON,
  79. .instance_size = sizeof(APICCommonState),
  80. .class_init = xen_apic_class_init,
  81. };
  82. static void xen_apic_register_types(void)
  83. {
  84. type_register_static(&xen_apic_info);
  85. }
  86. type_init(xen_apic_register_types)