void set_gdt(void *addr, uint16_t limit);
-enum {
- SEG_KCODE = 1,
- SEG_KDATA = 2
-};
-
-#define NUM_SEG 3
+#define NUM_SEG 3
static struct desc gdt[NUM_SEG] __attribute__((aligned(8)));
void mem_init(void)
{
desc_seg(gdt, SEG_NULL, 0, 0, 0);
- desc_seg(gdt + SEG_KCODE, SEG_CODE, 0, 0xffffffff, 0);
- desc_seg(gdt + SEG_KDATA, SEG_DATA, 0, 0xffffffff, 0);
+ desc_seg(gdt + SEL_KCODE, SEG_CODE, 0, 0xffffffff, 0);
+ desc_seg(gdt + SEL_KDATA, SEG_DATA, 0, 0xffffffff, 0);
set_gdt(gdt, sizeof gdt - 1);
+
+ setup_selectors(selector(SEL_KCODE, 0), selector(SEL_KDATA, 0));
+}
+
+uint16_t selector(int idx, int rpl)
+{
+ return (idx << 3) | (rpl & 3);
}