Merge branch 'master' into isa/arm64
[lunaix-os.git] / lunaix-os / arch / x86 / includes / asm / x86.h
1 #ifndef __LUNAIX_I386_ASM_H
2 #define __LUNAIX_I386_ASM_H
3
4 #define SEL_INDEX(i)    ((i) << 3)
5 #define SEL_RPL(rpl)    ((rpl) & 0b11)
6
7 #define KCODE_SEG (SEL_INDEX(1) | SEL_RPL(0))
8 #define UCODE_SEG (SEL_INDEX(2) | SEL_RPL(3))
9
10 #ifdef CONFIG_ARCH_I386
11     #define KDATA_SEG (SEL_INDEX(3) | SEL_RPL(0))
12     #define UDATA_SEG (SEL_INDEX(4) | SEL_RPL(3))
13     #define TSS_SEG   (SEL_INDEX(5) | SEL_RPL(0))
14
15 #else
16     #define KDATA_SEG (SEL_INDEX(3) | SEL_RPL(0))
17     #define UDATA_SEG (SEL_INDEX(4) | SEL_RPL(3))
18     #define TSS_SEG   (SEL_INDEX(5) | SEL_RPL(0))
19
20 #endif
21
22
23 #ifndef __ASM__
24 #include <lunaix/types.h>
25
26 #define IRQ_TRIG_EDGE 0b0
27 #define IRQ_TRIG_LEVEL 0b1
28
29 #define IRQ_TYPE_FIXED (0b01 << 1)
30 #define IRQ_TYPE_NMI (0b11 << 1)
31 #define IRQ_TYPE (0b11 << 1)
32
33 #define IRQ_VE_HI (0b1 << 3)
34 #define IRQ_VE_LO (0b0 << 3)
35
36 #define IRQ_DEFAULT (IRQ_TRIG_EDGE | IRQ_TYPE_FIXED | IRQ_VE_HI)
37
38
39 struct x86_intc
40 {
41     char* name;
42     void* data;
43
44     void (*irq_attach)(struct x86_intc*,
45                        int irq,
46                        int iv,
47                        cpu_t dest,
48                        u32_t flags);
49     void (*notify_eoi)(struct x86_intc*, cpu_t id, int iv);
50 };
51
52 #ifdef CONFIG_ARCH_X86_64
53
54 struct x86_tss
55 {
56     u32_t rsvd_1;
57     ptr_t rsps[3];
58     union {
59         struct {
60             ptr_t ist_null;
61             ptr_t valid_ists[7];
62         };
63         ptr_t ists[8];
64     };
65     
66     u8_t rsvd_3[12];
67 } compact;
68
69 struct x86_sysdesc {
70     u64_t lo;
71     u64_t hi;
72 } compact;
73
74 typedef u64_t x86_segdesc_t;
75
76 #else
77
78 struct x86_tss
79 {
80     u32_t link;
81     u32_t esp0;
82     u16_t ss0;
83     u8_t __padding[94];
84 } compact;
85
86 struct x86_sysdesc {
87     u32_t lo;
88     u32_t hi;
89 } compact;
90
91 typedef struct x86_sysdesc x86_segdesc_t;
92
93 #endif
94
95 void
96 exception_install_handler();
97
98 void
99 intr_routine_init();
100
101 #endif
102 #endif /* __LUNAIX_I386_ASM_H */