ioapic.h 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. #ifndef __KVM_IO_APIC_H
  2. #define __KVM_IO_APIC_H
  3. #include <linux/kvm_host.h>
  4. #include "iodev.h"
  5. struct kvm;
  6. struct kvm_vcpu;
  7. #define IOAPIC_NUM_PINS KVM_IOAPIC_NUM_PINS
  8. #define IOAPIC_VERSION_ID 0x11 /* IOAPIC version */
  9. #define IOAPIC_EDGE_TRIG 0
  10. #define IOAPIC_LEVEL_TRIG 1
  11. #define IOAPIC_DEFAULT_BASE_ADDRESS 0xfec00000
  12. #define IOAPIC_MEM_LENGTH 0x100
  13. /* Direct registers. */
  14. #define IOAPIC_REG_SELECT 0x00
  15. #define IOAPIC_REG_WINDOW 0x10
  16. /* Indirect registers. */
  17. #define IOAPIC_REG_APIC_ID 0x00 /* x86 IOAPIC only */
  18. #define IOAPIC_REG_VERSION 0x01
  19. #define IOAPIC_REG_ARB_ID 0x02 /* x86 IOAPIC only */
  20. /*ioapic delivery mode*/
  21. #define IOAPIC_FIXED 0x0
  22. #define IOAPIC_LOWEST_PRIORITY 0x1
  23. #define IOAPIC_PMI 0x2
  24. #define IOAPIC_NMI 0x4
  25. #define IOAPIC_INIT 0x5
  26. #define IOAPIC_EXTINT 0x7
  27. #ifdef CONFIG_X86
  28. #define RTC_GSI 8
  29. #else
  30. #define RTC_GSI -1U
  31. #endif
  32. struct rtc_status {
  33. int pending_eoi;
  34. DECLARE_BITMAP(dest_map, KVM_MAX_VCPUS);
  35. };
  36. struct kvm_ioapic {
  37. u64 base_address;
  38. u32 ioregsel;
  39. u32 id;
  40. u32 irr;
  41. u32 pad;
  42. union kvm_ioapic_redirect_entry redirtbl[IOAPIC_NUM_PINS];
  43. unsigned long irq_states[IOAPIC_NUM_PINS];
  44. struct kvm_io_device dev;
  45. struct kvm *kvm;
  46. void (*ack_notifier)(void *opaque, int irq);
  47. spinlock_t lock;
  48. DECLARE_BITMAP(handled_vectors, 256);
  49. struct rtc_status rtc_status;
  50. struct delayed_work eoi_inject;
  51. u32 irq_eoi[IOAPIC_NUM_PINS];
  52. };
  53. #ifdef DEBUG
  54. #define ASSERT(x) \
  55. do { \
  56. if (!(x)) { \
  57. printk(KERN_EMERG "assertion failed %s: %d: %s\n", \
  58. __FILE__, __LINE__, #x); \
  59. BUG(); \
  60. } \
  61. } while (0)
  62. #else
  63. #define ASSERT(x) do { } while (0)
  64. #endif
  65. static inline struct kvm_ioapic *ioapic_irqchip(struct kvm *kvm)
  66. {
  67. return kvm->arch.vioapic;
  68. }
  69. void kvm_rtc_eoi_tracking_restore_one(struct kvm_vcpu *vcpu);
  70. int kvm_apic_match_dest(struct kvm_vcpu *vcpu, struct kvm_lapic *source,
  71. int short_hand, unsigned int dest, int dest_mode);
  72. int kvm_apic_compare_prio(struct kvm_vcpu *vcpu1, struct kvm_vcpu *vcpu2);
  73. void kvm_ioapic_update_eoi(struct kvm_vcpu *vcpu, int vector,
  74. int trigger_mode);
  75. bool kvm_ioapic_handles_vector(struct kvm *kvm, int vector);
  76. int kvm_ioapic_init(struct kvm *kvm);
  77. void kvm_ioapic_destroy(struct kvm *kvm);
  78. int kvm_ioapic_set_irq(struct kvm_ioapic *ioapic, int irq, int irq_source_id,
  79. int level, bool line_status);
  80. void kvm_ioapic_clear_all(struct kvm_ioapic *ioapic, int irq_source_id);
  81. int kvm_irq_delivery_to_apic(struct kvm *kvm, struct kvm_lapic *src,
  82. struct kvm_lapic_irq *irq, unsigned long *dest_map);
  83. int kvm_get_ioapic(struct kvm *kvm, struct kvm_ioapic_state *state);
  84. int kvm_set_ioapic(struct kvm *kvm, struct kvm_ioapic_state *state);
  85. void kvm_vcpu_request_scan_ioapic(struct kvm *kvm);
  86. void kvm_ioapic_scan_entry(struct kvm_vcpu *vcpu, u64 *eoi_exit_bitmap,
  87. u32 *tmr);
  88. #endif