xref: /kvm-unit-tests/lib/x86/apic.h (revision c865f654ffe4c5955038aaf74f702ba62f3eb014)
1*c865f654SCornelia Huck #ifndef _X86_APIC_H_
2*c865f654SCornelia Huck #define _X86_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 
7319697109SNadav Amit static inline bool apic_lvt_entry_supported(int idx)
7419697109SNadav Amit {
7519697109SNadav Amit 	return GET_APIC_MAXLVT(apic_read(APIC_LVR)) >= idx;
7619697109SNadav Amit }
7719697109SNadav Amit 
782a2546b7SMarc Orr static inline bool x2apic_reg_reserved(u32 reg)
792a2546b7SMarc Orr {
802a2546b7SMarc Orr 	switch (reg) {
812a2546b7SMarc Orr 	case 0x000 ... 0x010:
822a2546b7SMarc Orr 	case 0x040 ... 0x070:
839e2e12c4SNadav Amit 	case 0x090:
842a2546b7SMarc Orr 	case 0x0c0:
852a2546b7SMarc Orr 	case 0x0e0:
862a2546b7SMarc Orr 	case 0x290 ... 0x2e0:
872a2546b7SMarc Orr 	case 0x310:
882a2546b7SMarc Orr 	case 0x3a0 ... 0x3d0:
892a2546b7SMarc Orr 	case 0x3f0:
902a2546b7SMarc Orr 		return true;
9119697109SNadav Amit 	case APIC_CMCI:
9219697109SNadav Amit 		return !apic_lvt_entry_supported(6);
932a2546b7SMarc Orr 	default:
942a2546b7SMarc Orr 		return false;
952a2546b7SMarc Orr 	}
962a2546b7SMarc Orr }
972a2546b7SMarc Orr 
987d36db35SAvi Kivity #endif
99