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