qemu/hw/i386/xen/xen_apic.c
<<
>>
Prefs
   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
  13#include "qemu/osdep.h"
  14#include "hw/i386/apic_internal.h"
  15#include "hw/pci/msi.h"
  16#include "hw/xen/xen.h"
  17#include "qemu/module.h"
  18
  19static uint64_t xen_apic_mem_read(void *opaque, hwaddr addr,
  20                                  unsigned size)
  21{
  22    return ~(uint64_t)0;
  23}
  24
  25static void xen_apic_mem_write(void *opaque, hwaddr addr,
  26                               uint64_t data, unsigned size)
  27{
  28    if (size != sizeof(uint32_t)) {
  29        fprintf(stderr, "Xen: APIC write data size = %d, invalid\n", size);
  30        return;
  31    }
  32
  33    xen_hvm_inject_msi(addr, data);
  34}
  35
  36static const MemoryRegionOps xen_apic_io_ops = {
  37    .read = xen_apic_mem_read,
  38    .write = xen_apic_mem_write,
  39    .endianness = DEVICE_NATIVE_ENDIAN,
  40};
  41
  42static void xen_apic_realize(DeviceState *dev, Error **errp)
  43{
  44    APICCommonState *s = APIC_COMMON(dev);
  45
  46    s->vapic_control = 0;
  47    memory_region_init_io(&s->io_memory, OBJECT(s), &xen_apic_io_ops, s,
  48                          "xen-apic-msi", APIC_SPACE_SIZE);
  49    msi_nonbroken = true;
  50}
  51
  52static void xen_apic_set_base(APICCommonState *s, uint64_t val)
  53{
  54}
  55
  56static void xen_apic_set_tpr(APICCommonState *s, uint8_t val)
  57{
  58}
  59
  60static uint8_t xen_apic_get_tpr(APICCommonState *s)
  61{
  62    return 0;
  63}
  64
  65static void xen_apic_vapic_base_update(APICCommonState *s)
  66{
  67}
  68
  69static void xen_apic_external_nmi(APICCommonState *s)
  70{
  71}
  72
  73static void xen_send_msi(MSIMessage *msi)
  74{
  75    xen_hvm_inject_msi(msi->address, msi->data);
  76}
  77
  78static void xen_apic_class_init(ObjectClass *klass, void *data)
  79{
  80    APICCommonClass *k = APIC_COMMON_CLASS(klass);
  81
  82    k->realize = xen_apic_realize;
  83    k->set_base = xen_apic_set_base;
  84    k->set_tpr = xen_apic_set_tpr;
  85    k->get_tpr = xen_apic_get_tpr;
  86    k->vapic_base_update = xen_apic_vapic_base_update;
  87    k->external_nmi = xen_apic_external_nmi;
  88    k->send_msi = xen_send_msi;
  89}
  90
  91static const TypeInfo xen_apic_info = {
  92    .name = "xen-apic",
  93    .parent = TYPE_APIC_COMMON,
  94    .instance_size = sizeof(APICCommonState),
  95    .class_init = xen_apic_class_init,
  96};
  97
  98static void xen_apic_register_types(void)
  99{
 100    type_register_static(&xen_apic_info);
 101}
 102
 103type_init(xen_apic_register_types)
 104