~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/x86/kvm/ioapic.h

Version: ~ [ linux-5.5-rc1 ] ~ [ linux-5.4.2 ] ~ [ linux-5.3.15 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.88 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.158 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.206 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.206 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.52 ] ~ [ linux-4.0.9 ] ~ [ linux-3.19.8 ] ~ [ linux-3.18.140 ] ~ [ linux-3.17.8 ] ~ [ linux-3.16.78 ] ~ [ linux-3.15.10 ] ~ [ linux-3.14.79 ] ~ [ linux-3.13.11 ] ~ [ linux-3.12.74 ] ~ [ linux-3.11.10 ] ~ [ linux-3.10.108 ] ~ [ linux-3.9.11 ] ~ [ linux-3.8.13 ] ~ [ linux-3.7.10 ] ~ [ linux-3.6.11 ] ~ [ linux-3.5.7 ] ~ [ linux-3.4.113 ] ~ [ linux-3.3.8 ] ~ [ linux-3.2.102 ] ~ [ linux-3.1.10 ] ~ [ linux-3.0.101 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.5 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 #ifndef __KVM_IO_APIC_H
  2 #define __KVM_IO_APIC_H
  3 
  4 #include <linux/kvm_host.h>
  5 
  6 #include <kvm/iodev.h>
  7 
  8 struct kvm;
  9 struct kvm_vcpu;
 10 
 11 #define IOAPIC_NUM_PINS  KVM_IOAPIC_NUM_PINS
 12 #define MAX_NR_RESERVED_IOAPIC_PINS KVM_MAX_IRQ_ROUTES
 13 #define IOAPIC_VERSION_ID 0x11  /* IOAPIC version */
 14 #define IOAPIC_EDGE_TRIG  0
 15 #define IOAPIC_LEVEL_TRIG 1
 16 
 17 #define IOAPIC_DEFAULT_BASE_ADDRESS  0xfec00000
 18 #define IOAPIC_MEM_LENGTH            0x100
 19 
 20 /* Direct registers. */
 21 #define IOAPIC_REG_SELECT  0x00
 22 #define IOAPIC_REG_WINDOW  0x10
 23 
 24 /* Indirect registers. */
 25 #define IOAPIC_REG_APIC_ID 0x00 /* x86 IOAPIC only */
 26 #define IOAPIC_REG_VERSION 0x01
 27 #define IOAPIC_REG_ARB_ID  0x02 /* x86 IOAPIC only */
 28 
 29 /*ioapic delivery mode*/
 30 #define IOAPIC_FIXED                    0x0
 31 #define IOAPIC_LOWEST_PRIORITY          0x1
 32 #define IOAPIC_PMI                      0x2
 33 #define IOAPIC_NMI                      0x4
 34 #define IOAPIC_INIT                     0x5
 35 #define IOAPIC_EXTINT                   0x7
 36 
 37 #ifdef CONFIG_X86
 38 #define RTC_GSI 8
 39 #else
 40 #define RTC_GSI -1U
 41 #endif
 42 
 43 struct dest_map {
 44         /* vcpu bitmap where IRQ has been sent */
 45         DECLARE_BITMAP(map, KVM_MAX_VCPUS);
 46 
 47         /*
 48          * Vector sent to a given vcpu, only valid when
 49          * the vcpu's bit in map is set
 50          */
 51         u8 vectors[KVM_MAX_VCPUS];
 52 };
 53 
 54 
 55 struct rtc_status {
 56         int pending_eoi;
 57         struct dest_map dest_map;
 58 };
 59 
 60 union kvm_ioapic_redirect_entry {
 61         u64 bits;
 62         struct {
 63                 u8 vector;
 64                 u8 delivery_mode:3;
 65                 u8 dest_mode:1;
 66                 u8 delivery_status:1;
 67                 u8 polarity:1;
 68                 u8 remote_irr:1;
 69                 u8 trig_mode:1;
 70                 u8 mask:1;
 71                 u8 reserve:7;
 72                 u8 reserved[4];
 73                 u8 dest_id;
 74         } fields;
 75 };
 76 
 77 struct kvm_ioapic {
 78         u64 base_address;
 79         u32 ioregsel;
 80         u32 id;
 81         u32 irr;
 82         u32 pad;
 83         union kvm_ioapic_redirect_entry redirtbl[IOAPIC_NUM_PINS];
 84         unsigned long irq_states[IOAPIC_NUM_PINS];
 85         struct kvm_io_device dev;
 86         struct kvm *kvm;
 87         void (*ack_notifier)(void *opaque, int irq);
 88         spinlock_t lock;
 89         struct rtc_status rtc_status;
 90         struct delayed_work eoi_inject;
 91         u32 irq_eoi[IOAPIC_NUM_PINS];
 92         u32 irr_delivered;
 93 };
 94 
 95 #ifdef DEBUG
 96 #define ASSERT(x)                                                       \
 97 do {                                                                    \
 98         if (!(x)) {                                                     \
 99                 printk(KERN_EMERG "assertion failed %s: %d: %s\n",      \
100                        __FILE__, __LINE__, #x);                         \
101                 BUG();                                                  \
102         }                                                               \
103 } while (0)
104 #else
105 #define ASSERT(x) do { } while (0)
106 #endif
107 
108 static inline struct kvm_ioapic *ioapic_irqchip(struct kvm *kvm)
109 {
110         return kvm->arch.vioapic;
111 }
112 
113 static inline int ioapic_in_kernel(struct kvm *kvm)
114 {
115         int ret;
116 
117         ret = (ioapic_irqchip(kvm) != NULL);
118         return ret;
119 }
120 
121 void kvm_rtc_eoi_tracking_restore_one(struct kvm_vcpu *vcpu);
122 bool kvm_apic_match_dest(struct kvm_vcpu *vcpu, struct kvm_lapic *source,
123                 int short_hand, unsigned int dest, int dest_mode);
124 int kvm_apic_compare_prio(struct kvm_vcpu *vcpu1, struct kvm_vcpu *vcpu2);
125 void kvm_ioapic_update_eoi(struct kvm_vcpu *vcpu, int vector,
126                         int trigger_mode);
127 int kvm_ioapic_init(struct kvm *kvm);
128 void kvm_ioapic_destroy(struct kvm *kvm);
129 int kvm_ioapic_set_irq(struct kvm_ioapic *ioapic, int irq, int irq_source_id,
130                        int level, bool line_status);
131 void kvm_ioapic_clear_all(struct kvm_ioapic *ioapic, int irq_source_id);
132 int kvm_irq_delivery_to_apic(struct kvm *kvm, struct kvm_lapic *src,
133                              struct kvm_lapic_irq *irq,
134                              struct dest_map *dest_map);
135 int kvm_get_ioapic(struct kvm *kvm, struct kvm_ioapic_state *state);
136 int kvm_set_ioapic(struct kvm *kvm, struct kvm_ioapic_state *state);
137 void kvm_ioapic_scan_entry(struct kvm_vcpu *vcpu,
138                            ulong *ioapic_handled_vectors);
139 void kvm_scan_ioapic_routes(struct kvm_vcpu *vcpu,
140                             ulong *ioapic_handled_vectors);
141 #endif
142 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

osdn.jp