17d36db35SAvi Kivity #ifndef CFLAT_APIC_H 27d36db35SAvi Kivity #define CFLAT_APIC_H 37d36db35SAvi Kivity 47d36db35SAvi Kivity #include <stdint.h> 57d36db35SAvi Kivity #include "apic-defs.h" 67d36db35SAvi Kivity 718a34cceSNadav Amit extern u8 id_map[MAX_TEST_CPUS]; 818a34cceSNadav Amit 9f66d11caSArbel Moshe extern void *g_apic; 10f66d11caSArbel Moshe extern void *g_ioapic; 11f66d11caSArbel Moshe 127d36db35SAvi Kivity typedef struct { 137d36db35SAvi Kivity uint8_t vector; 147d36db35SAvi Kivity uint8_t delivery_mode:3; 157d36db35SAvi Kivity uint8_t dest_mode:1; 167d36db35SAvi Kivity uint8_t delivery_status:1; 177d36db35SAvi Kivity uint8_t polarity:1; 187d36db35SAvi Kivity uint8_t remote_irr:1; 197d36db35SAvi Kivity uint8_t trig_mode:1; 207d36db35SAvi Kivity uint8_t mask:1; 217d36db35SAvi Kivity uint8_t reserve:7; 227d36db35SAvi Kivity uint8_t reserved[4]; 237d36db35SAvi Kivity uint8_t dest_id; 247d36db35SAvi Kivity } ioapic_redir_entry_t; 257d36db35SAvi Kivity 260172b95cSPeter Xu typedef enum trigger_mode { 270172b95cSPeter Xu TRIGGER_EDGE = 0, 280172b95cSPeter Xu TRIGGER_LEVEL, 290172b95cSPeter Xu TRIGGER_MAX, 300172b95cSPeter Xu } trigger_mode_t; 310172b95cSPeter Xu 327d36db35SAvi Kivity void mask_pic_interrupts(void); 337d36db35SAvi Kivity 340f187a08SSteve Rutherford void eoi(void); 35e0a5cfcaSPaolo Bonzini uint8_t apic_get_tpr(void); 36e0a5cfcaSPaolo Bonzini void apic_set_tpr(uint8_t tpr); 370f187a08SSteve Rutherford 387d36db35SAvi Kivity void ioapic_write_redir(unsigned line, ioapic_redir_entry_t e); 397d36db35SAvi Kivity void ioapic_write_reg(unsigned reg, uint32_t value); 400f187a08SSteve Rutherford ioapic_redir_entry_t ioapic_read_redir(unsigned line); 410f187a08SSteve Rutherford uint32_t ioapic_read_reg(unsigned reg); 420f187a08SSteve Rutherford 4322207960SLiran Alon void ioapic_set_redir(unsigned line, unsigned vec, 44f66d11caSArbel Moshe trigger_mode_t trig_mode); 45f66d11caSArbel Moshe 460f187a08SSteve Rutherford void set_mask(unsigned line, int mask); 477d36db35SAvi Kivity 48f66d11caSArbel Moshe void set_irq_line(unsigned line, int val); 49f66d11caSArbel Moshe 507d36db35SAvi Kivity void enable_apic(void); 517d36db35SAvi Kivity uint32_t apic_read(unsigned reg); 527c5f3ee9SPaolo Bonzini bool apic_read_bit(unsigned reg, int n); 537d36db35SAvi Kivity void apic_write(unsigned reg, uint32_t val); 547d36db35SAvi Kivity void apic_icr_write(uint32_t val, uint32_t dest); 557d36db35SAvi Kivity uint32_t apic_id(void); 567d36db35SAvi Kivity 577d36db35SAvi Kivity int enable_x2apic(void); 58e38858bcSJim Mattson void disable_apic(void); 59a222b5e2SRadim Krčmář void reset_apic(void); 6018a34cceSNadav Amit void init_apic_map(void); 617d36db35SAvi Kivity 62268752cdSMarc Orr /* Converts byte-addressable APIC register offset to 4-byte offset. */ 63268752cdSMarc Orr static inline u32 apic_reg_index(u32 reg) 64268752cdSMarc Orr { 65268752cdSMarc Orr return reg >> 2; 66268752cdSMarc Orr } 67268752cdSMarc Orr 682a2546b7SMarc Orr static inline u32 x2apic_msr(u32 reg) 692a2546b7SMarc Orr { 702a2546b7SMarc Orr return APIC_BASE_MSR + (reg >> 4); 712a2546b7SMarc Orr } 722a2546b7SMarc Orr 732a2546b7SMarc Orr static inline bool x2apic_reg_reserved(u32 reg) 742a2546b7SMarc Orr { 752a2546b7SMarc Orr switch (reg) { 762a2546b7SMarc Orr case 0x000 ... 0x010: 772a2546b7SMarc Orr case 0x040 ... 0x070: 78*9e2e12c4SNadav Amit case 0x090: 792a2546b7SMarc Orr case 0x0c0: 802a2546b7SMarc Orr case 0x0e0: 812a2546b7SMarc Orr case 0x290 ... 0x2e0: 822a2546b7SMarc Orr case 0x310: 832a2546b7SMarc Orr case 0x3a0 ... 0x3d0: 842a2546b7SMarc Orr case 0x3f0: 852a2546b7SMarc Orr return true; 862a2546b7SMarc Orr default: 872a2546b7SMarc Orr return false; 882a2546b7SMarc Orr } 892a2546b7SMarc Orr } 902a2546b7SMarc Orr 917d36db35SAvi Kivity #endif 92