ld-tool portability fix: MacOS build experience
[lunaix-os.git] / lunaix-os / arch / i386 / includes / sys / apic.h
1 #ifndef __LUNAIX_APIC_H
2 #define __LUNAIX_APIC_H
3
4 #include "sys/x86_isa.h"
5 #include <lunaix/types.h>
6
7 #define __APIC_BASE_PADDR 0xFEE00000
8
9 #define IA32_MSR_APIC_BASE 0x1B
10 #define IA32_APIC_ENABLE 0x800
11
12 /*
13  *  Common APIC memory-mapped registers
14  *              Ref: Intel Manual, Vol. 3A, Table 10-1
15  */
16
17 #define APIC_IDR 0x20   // ID Reg
18 #define APIC_VER 0x30   // Version Reg
19 #define APIC_TPR 0x80   // Task Priority
20 #define APIC_APR 0x90   // Arbitration Priority
21 #define APIC_PPR 0xA0   // Processor Priority
22 #define APIC_EOI 0xB0   // End-Of-Interrupt
23 #define APIC_RRD 0xC0   // Remote Read
24 #define APIC_LDR 0xD0   // Local Destination Reg
25 #define APIC_DFR 0xE0   // Destination Format Reg
26 #define APIC_SPIVR 0xF0 // Spurious Interrupt Vector Reg
27 #define APIC_ISR_BASE                                                          \
28     0x100 // Base address for In-Service-Interrupt bitmap register (256bits)
29 #define APIC_TMR_BASE                                                          \
30     0x180 // Base address for Trigger-Mode bitmap register (256bits)
31 #define APIC_IRR_BASE                                                          \
32     0x200 // Base address for Interrupt-Request bitmap register (256bits)
33 #define APIC_ESR 0x280      // Error Status Reg
34 #define APIC_ICR_BASE 0x300 // Interrupt Command
35 #define APIC_LVT_LINT0 0x350
36 #define APIC_LVT_LINT1 0x360
37 #define APIC_LVT_ERROR 0x370
38
39 // APIC Timer specific
40 #define APIC_TIMER_LVT 0x320
41 #define APIC_TIMER_ICR 0x380 // Initial Count
42 #define APIC_TIMER_CCR 0x390 // Current Count
43 #define APIC_TIMER_DCR 0x3E0 // Divide Configuration
44
45 #define APIC_SPIV_FOCUS_DISABLE 0x200
46 #define APIC_SPIV_APIC_ENABLE 0x100
47 #define APIC_SPIV_EOI_BROADCAST 0x1000
48
49 #define LVT_DELIVERY_FIXED 0
50 #define LVT_DELIVERY_NMI (0x4 << 8)
51 #define LVT_TRIGGER_EDGE (0 << 15)
52 #define LVT_TRIGGER_LEVEL (1 << 15)
53 #define LVT_MASKED (1 << 16)
54 #define LVT_TIMER_ONESHOT (0 << 17)
55 #define LVT_TIMER_PERIODIC (1 << 17)
56
57 // Dividers for timer. See Intel Manual Vol3A. 10-17 (pp. 3207), Figure 10-10
58 #define APIC_TIMER_DIV1 0b1011
59 #define APIC_TIMER_DIV2 0b0000
60 #define APIC_TIMER_DIV4 0b0001
61 #define APIC_TIMER_DIV8 0b0010
62 #define APIC_TIMER_DIV16 0b0011
63 #define APIC_TIMER_DIV32 0b1000
64 #define APIC_TIMER_DIV64 0b1001
65 #define APIC_TIMER_DIV128 0b1010
66
67 #define APIC_PRIORITY(cls, subcls) (((cls) << 4) | (subcls))
68
69 unsigned int
70 apic_read_reg(unsigned int reg);
71
72 void
73 apic_write_reg(unsigned int reg, unsigned int val);
74
75 void
76 apic_init();
77
78 void
79 apic_on_eoi(struct x86_intc* intc_ctx, cpu_t cpu, int iv);
80
81 #endif /* __LUNAIX_APIC_H */