c026a6d8fad25e76691cd30bd80eef44ec437db1
[akaros.git] / kern / arch / i686 / ros / mmu.h
1 #ifndef _ROS_INC_ARCH_MMU_H
2 #define _ROS_INC_ARCH_MMU_H
3
4 #ifndef __ASSEMBLER__
5 typedef unsigned long pte_t;
6 typedef unsigned long pde_t;
7 #endif
8
9 // All physical memory mapped at this address
10 #define KERNBASE        0xC0000000
11 #define KERN_LOAD_ADDR  KERNBASE
12
13 /* Static kernel mappings */
14 /* Virtual page table.  Entry PDX(VPT) in the PD contains a pointer to
15  * the page directory itself, thereby turning the PD into a page table,
16  * which maps all the PTEs containing the page mappings for the entire
17  * virtual address space into that 4 Meg region starting at VPT. */
18 #define VPT                             (KERNBASE - PTSIZE)
19 #define LAPIC_BASE              (VPT - PGSIZE)
20 #define IOAPIC_BASE             (LAPIC_BASE - PGSIZE)
21
22 /* All arches must define this, which is the lower limit of their static
23  * mappings, and where the dynamic mappings will start. */
24 #define KERN_DYN_TOP    IOAPIC_BASE
25
26 #define ULIM            0x80000000
27
28 // Use this if needed in annotations
29 #define IVY_KERNBASE (0xC000U << 16)
30
31 #define PTSHIFT 22
32 #define PTSIZE (1 << PTSHIFT)
33
34 #define PGSHIFT 12
35 #define PGSIZE (1 << PGSHIFT)
36
37 #define JPGSIZE PTSIZE
38
39
40 /* Segment descriptor and macros temporarily here.  Remove them when fixing x86
41  * TLS vulns (TLSV) */
42
43 // Global descriptor numbers
44 #define GD_NULL   0x00     // NULL descriptor
45 #define GD_KT     0x08     // kernel text
46 #define GD_KD     0x10     // kernel data
47 #define GD_UT     0x18     // user text
48 #define GD_UD     0x20     // user data
49 #define GD_TSS    0x28     // Task segment selector
50 #define GD_LDT    0x30     // local descriptor table
51
52 #ifdef __ASSEMBLER__
53
54 /*
55  * Macros to build GDT entries in assembly.
56  */
57 #define SEG_NULL                                                \
58         .word 0, 0;                                             \
59         .byte 0, 0, 0, 0
60 #define SEG(type,base,lim)                                      \
61         .word (((lim) >> 12) & 0xffff), ((base) & 0xffff);      \
62         .byte (((base) >> 16) & 0xff), (0x90 | (type)),         \
63                 (0xC0 | (((lim) >> 28) & 0xf)), (((base) >> 24) & 0xff)
64
65 #else   // not __ASSEMBLER__
66
67 #include <ros/common.h>
68
69 // Segment Descriptors
70 typedef struct Segdesc {
71         unsigned sd_lim_15_0 : 16;  // Low bits of segment limit
72         unsigned sd_base_15_0 : 16; // Low bits of segment base address
73         unsigned sd_base_23_16 : 8; // Middle bits of segment base address
74         unsigned sd_type : 4;       // Segment type (see STS_ constants)
75         unsigned sd_s : 1;          // 0 = system, 1 = application
76         unsigned sd_dpl : 2;        // Descriptor Privilege Level
77         unsigned sd_p : 1;          // Present
78         unsigned sd_lim_19_16 : 4;  // High bits of segment limit
79         unsigned sd_avl : 1;        // Unused (available for software use)
80         unsigned sd_rsv1 : 1;       // Reserved
81         unsigned sd_db : 1;         // 0 = 16-bit segment, 1 = 32-bit segment
82         unsigned sd_g : 1;          // Granularity: limit scaled by 4K when set
83         unsigned sd_base_31_24 : 8; // High bits of segment base address
84 } segdesc_t;
85 // Null segment
86 #define SEG_NULL        { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
87 // Segment that is loadable but faults when used
88 #define SEG_FAULT       { 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0 }
89 // Normal segment
90 #define SEG(type, base, lim, dpl)                                                                       \
91 { ((lim) >> 12) & 0xffff, (base) & 0xffff, ((base) >> 16) & 0xff,       \
92     type, 1, dpl, 1, (unsigned) (lim) >> 28, 0, 0, 1, 1,                        \
93     (unsigned) (base) >> 24 }
94 // System segment (LDT)
95 #define SEG_SYS(type, base, lim, dpl)                                                                   \
96 { ((lim) >> 12) & 0xffff, (base) & 0xffff, ((base) >> 16) & 0xff,       \
97     type, 0, dpl, 1, (unsigned) (lim) >> 28, 0, 0, 1, 1,                        \
98     (unsigned) (base) >> 24 }
99
100 #define SEG16(type, base, lim, dpl)                                                             \
101 { (lim) & 0xffff, (base) & 0xffff, ((base) >> 16) & 0xff,                       \
102     type, 1, dpl, 1, (unsigned) (lim) >> 16, 0, 0, 1, 0,                        \
103     (unsigned) (base) >> 24 }
104
105 #define SEG16ROINIT(seg,type,base,lim,dpl) \
106         {\
107                 (seg).sd_lim_15_0 = SINIT((lim) & 0xffff);\
108                 (seg).sd_base_15_0 = SINIT((base)&0xffff);\
109                 (seg).sd_base_23_16 = SINIT(((base)>>16)&0xff);\
110                 (seg).sd_type = SINIT(type);\
111                 (seg).sd_s = SINIT(1);\
112                 (seg).sd_dpl = SINIT(dpl);\
113                 (seg).sd_p = SINIT(1);\
114                 (seg).sd_lim_19_16 = SINIT((unsigned)(lim)>>16);\
115                 (seg).sd_avl = SINIT(0);\
116                 (seg).sd_rsv1 = SINIT(0);\
117                 (seg).sd_db = SINIT(1);\
118                 (seg).sd_g = SINIT(0);\
119                 (seg).sd_base_31_24 = SINIT((unsigned)(base)>> 24);\
120         }
121
122 #endif /* !__ASSEMBLER__ */
123
124 // Application segment type bits
125 #define STA_X           0x8         // Executable segment
126 #define STA_E           0x4         // Expand down (non-executable segments)
127 #define STA_C           0x4         // Conforming code segment (executable only)
128 #define STA_W           0x2         // Writeable (non-executable segments)
129 #define STA_R           0x2         // Readable (executable segments)
130 #define STA_A           0x1         // Accessed
131
132 // System segment type bits
133 #define STS_T16A        0x1         // Available 16-bit TSS
134 #define STS_LDT         0x2         // Local Descriptor Table
135 #define STS_T16B        0x3         // Busy 16-bit TSS
136 #define STS_CG16        0x4         // 16-bit Call Gate
137 #define STS_TG          0x5         // Task Gate / Coum Transmitions
138 #define STS_IG16        0x6         // 16-bit Interrupt Gate
139 #define STS_TG16        0x7         // 16-bit Trap Gate
140 #define STS_T32A        0x9         // Available 32-bit TSS
141 #define STS_T32B        0xB         // Busy 32-bit TSS
142 #define STS_CG32        0xC         // 32-bit Call Gate
143 #define STS_IG32        0xE         // 32-bit Interrupt Gate
144 #define STS_TG32        0xF         // 32-bit Trap Gate
145
146 #define SEG_COUNT       7               // Number of segments in the steady state
147 #define LDT_SIZE        (8192 * sizeof(segdesc_t))
148
149 #endif /* !ROS_INC_ARCH_MMU_H */