selectors, descriptors, more interrupt init
[3sys] / sys1 / kern / src / mem.c
1 #include "mem.h"
2 #include "desc.h"
3
4 void set_gdt(void *addr, uint16_t limit);
5
6 #define NUM_SEG 3
7 static struct desc gdt[NUM_SEG] __attribute__((aligned(8)));
8
9 void mem_init(void)
10 {
11         desc_seg(gdt, SEG_NULL, 0, 0, 0);
12         desc_seg(gdt + SEL_KCODE, SEG_CODE, 0, 0xffffffff, 0);
13         desc_seg(gdt + SEL_KDATA, SEG_DATA, 0, 0xffffffff, 0);
14
15         set_gdt(gdt, sizeof gdt - 1);
16
17         setup_selectors(selector(SEL_KCODE, 0), selector(SEL_KDATA, 0));
18 }
19
20 uint16_t selector(int idx, int rpl)
21 {
22         return (idx << 3) | (rpl & 3);
23 }