nckernel  0.1
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
segment.h
Go to the documentation of this file.
1 
11 enum {
12  GDT = 0,
13  LDT = 1,
14 };
15 
19 #define TI(table) ((table) << 2)
20 
21 enum {
22  ACCESSED = 0x01,
23 
24  WRITABLE = 0x02,
26 
27  READABLE = 0x02,
28  CONFORMING = 0x04,
29 
30  CODE = 0x08,
31 };
32 
33 enum {
34  KERNEL = 0,
35  USER = 3,
36 };
37 
38 enum {
39  DESC_NULL = 0x00,
43  DESC_USER_CS = 0x04,
44  DESC_USER_DS = 0x05,
45  DESC_USER_SS = 0x06,
46  DESC_TSS = 0x07,
47  DESC_COUNT = 0x08,
48 
51 };
52 
57 #define TI(table) ((table) << 2)
58 
62 struct segment {
63  unsigned long limit0:16;
64  unsigned long base0:16;
65  unsigned long base1:8;
66  unsigned long type:4;
67  unsigned long s:1;
68  unsigned long dpl:2;
69  unsigned long p:1;
70  unsigned long limit1:4;
71  unsigned long avl:1;
72  unsigned long zero:1;
73  unsigned long size:1;
74  unsigned long g:1;
75  unsigned long base2:8;
76 } __PACKED;
77 
81 struct tss {
82  unsigned short segment_limit_low;
83  unsigned short base_low;
84  unsigned char base_high_low;
85  unsigned int type:4;
86  unsigned int zero1:1;
87  unsigned int dpl:2;
88  unsigned int p:1;
89  unsigned int segment_limit_high:4;
90  unsigned int avl:1;
91  unsigned int zero2:2;
92  unsigned int g:1;
93  unsigned char base_high_high;
94 } __PACKED;
95 
99 struct gdtr {
100  unsigned short limit;
101  unsigned long base;
102 } __PACKED;
103 
112 #define IO_BITMAP_SIZE 8192
113 
117 struct tss32 {
118  unsigned short prev;
119  unsigned short reserved0;
120  unsigned long esp0;
121  unsigned short ss0;
122  unsigned short reserved1;
123  unsigned long esp1;
124  unsigned short ss1;
125  unsigned short reserved2;
126  unsigned long esp2;
127  unsigned short ss2;
128  unsigned short reserved3;
129  unsigned long cr3;
130  unsigned long eip;
131  unsigned long eflags;
132  unsigned long eax;
133  unsigned long ecx;
134  unsigned long edx;
135  unsigned long ebx;
136  unsigned long esp;
137  unsigned long ebp;
138  unsigned long esi;
139  unsigned long edi;
140  unsigned short es;
141  unsigned short reserved4;
142  unsigned short cs;
143  unsigned short reserved5;
144  unsigned short ss;
145  unsigned short reserved6;
146  unsigned short ds;
147  unsigned short reserved7;
148  unsigned short fs;
149  unsigned short reserved8;
150  unsigned short gs;
151  unsigned short reserved9;
152  unsigned short ldt_segment_selctor;
153  unsigned long reserved10;
154  unsigned short io_map_base_address;
155  unsigned char io_bitmap[IO_BITMAP_SIZE];
156 } __PACKED;
157 
161 struct tss16 {
162  unsigned short prev;
163  unsigned short sp0;
164  unsigned short ss0;
165  unsigned short sp1;
166  unsigned short ss1;
167  unsigned short sp2;
168  unsigned short ss2;
169  unsigned short ip;
170  unsigned short flag;
171  unsigned short ax;
172  unsigned short cx;
173  unsigned short dx;
174  unsigned short bx;
175  unsigned short sp;
176  unsigned short bp;
177  unsigned short si;
178  unsigned short di;
179  unsigned short es;
180  unsigned short cs;
181  unsigned short ss;
182  unsigned short ds;
183  unsigned short ldt;
184 } __PACKED;
185 
189 extern void segment_init(void);
190 
196 extern unsigned char *tss_io_bitmap_get(void);
197 
203 extern void tss_update_kernel_stack(unsigned long esp);
204