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