xref: /kvm-unit-tests/lib/x86/apic.h (revision 9e2e12c40f60e5609bf57a3dc04f3ba5bf51abd4)
1 #ifndef CFLAT_APIC_H
2 #define CFLAT_APIC_H
3 
4 #include <stdint.h>
5 #include "apic-defs.h"
6 
7 extern u8 id_map[MAX_TEST_CPUS];
8 
9 extern void *g_apic;
10 extern void *g_ioapic;
11 
12 typedef struct {
13     uint8_t vector;
14     uint8_t delivery_mode:3;
15     uint8_t dest_mode:1;
16     uint8_t delivery_status:1;
17     uint8_t polarity:1;
18     uint8_t remote_irr:1;
19     uint8_t trig_mode:1;
20     uint8_t mask:1;
21     uint8_t reserve:7;
22     uint8_t reserved[4];
23     uint8_t dest_id;
24 } ioapic_redir_entry_t;
25 
26 typedef enum trigger_mode {
27 	TRIGGER_EDGE = 0,
28 	TRIGGER_LEVEL,
29 	TRIGGER_MAX,
30 } trigger_mode_t;
31 
32 void mask_pic_interrupts(void);
33 
34 void eoi(void);
35 uint8_t apic_get_tpr(void);
36 void apic_set_tpr(uint8_t tpr);
37 
38 void ioapic_write_redir(unsigned line, ioapic_redir_entry_t e);
39 void ioapic_write_reg(unsigned reg, uint32_t value);
40 ioapic_redir_entry_t ioapic_read_redir(unsigned line);
41 uint32_t ioapic_read_reg(unsigned reg);
42 
43 void ioapic_set_redir(unsigned line, unsigned vec,
44 		trigger_mode_t trig_mode);
45 
46 void set_mask(unsigned line, int mask);
47 
48 void set_irq_line(unsigned line, int val);
49 
50 void enable_apic(void);
51 uint32_t apic_read(unsigned reg);
52 bool apic_read_bit(unsigned reg, int n);
53 void apic_write(unsigned reg, uint32_t val);
54 void apic_icr_write(uint32_t val, uint32_t dest);
55 uint32_t apic_id(void);
56 
57 int enable_x2apic(void);
58 void disable_apic(void);
59 void reset_apic(void);
60 void init_apic_map(void);
61 
62 /* Converts byte-addressable APIC register offset to 4-byte offset. */
63 static inline u32 apic_reg_index(u32 reg)
64 {
65 	return reg >> 2;
66 }
67 
68 static inline u32 x2apic_msr(u32 reg)
69 {
70 	return APIC_BASE_MSR + (reg >> 4);
71 }
72 
73 static inline bool x2apic_reg_reserved(u32 reg)
74 {
75 	switch (reg) {
76 	case 0x000 ... 0x010:
77 	case 0x040 ... 0x070:
78 	case 0x090:
79 	case 0x0c0:
80 	case 0x0e0:
81 	case 0x290 ... 0x2e0:
82 	case 0x310:
83 	case 0x3a0 ... 0x3d0:
84 	case 0x3f0:
85 		return true;
86 	default:
87 		return false;
88 	}
89 }
90 
91 #endif
92