#include "gdt.h" static struct gdt gdt = { 0 }; static void create_kernel_ds() { } static void create_kernel_cs() { } static void create_gdt() { create_kernel_ds(); create_kernel_cs(); } static void load_gdt() { struct gdt_r gdtr; gdtr.addr = (uint32_t)&gdt; gdtr.limit = GDT_SIZE - 1; asm volatile("lgdt %0\n" : : "m" (gdtr) : "memory"); } static void load_ds() { struct segment_selector selector; selector.index = KERNEL_DS_INDEX; selector.table_indicator = 0; selector.rpl = 0; asm volatile("movw %0, %%ax\n" "movw %%ax, %%ds\n" "movw %%ax, %%fs\n" "movw %%ax, %%gs\n" "movw %%ax, %%ss\n" : : "m" (selector) : "ax"); } static void load_cs() { struct segment_selector selector; selector.index = KERNEL_CS_INDEX; selector.table_indicator = 0; selector.rpl = 0; asm volatile("pushl %0\n" "pushl $1f\n" "lret\n" "1:\n" : : "m" (selector)); } static void reload_segment_selectors() { load_ds(); load_cs(); } void init_gdt() { create_gdt(); load_gdt(); reload_segment_selectors(); }