diff --git a/kernel/lang/kio.cc b/kernel/lang/kio.cc index e558c96..3579f82 100644 --- a/kernel/lang/kio.cc +++ b/kernel/lang/kio.cc @@ -24,7 +24,7 @@ void kio_bootstrap() cursor_y = 9; } -void kprintf(char * fmt, ...) +void kprintf(const char * fmt, ...) { va_list args; va_start(args, fmt); @@ -34,7 +34,7 @@ void kprintf(char * fmt, ...) va_end(args); } -void kvprintf(char * fmt, va_list args) +void kvprintf(const char * fmt, va_list args) { char tmpbuf[25]; for ( ; *fmt; fmt++) @@ -127,7 +127,7 @@ void kputc(char c) } } -void kputs(char * s) +void kputs(const char * s) { while (*s) { diff --git a/kernel/lang/kio.h b/kernel/lang/kio.h index 58b4e15..925b407 100644 --- a/kernel/lang/kio.h +++ b/kernel/lang/kio.h @@ -10,13 +10,13 @@ extern "C" { void kio_bootstrap(); -void kprintf(char * fmt, ...); +void kprintf(const char * fmt, ...); -void kvprintf(char * fmt, va_list args); +void kvprintf(const char * fmt, va_list args); void kputc(char c); -void kputs(char * s); +void kputs(const char * s); #ifdef __cplusplus } /* extern "C" */ diff --git a/kernel/mm/mm.cc b/kernel/mm/mm.cc index c8a088a..625472a 100644 --- a/kernel/mm/mm.cc +++ b/kernel/mm/mm.cc @@ -3,6 +3,7 @@ #include "mm.h" #include "boot/k_early_panic.h" +#include "lang/string.h" #define MM_MAX_MMAP_ENTRIES 64 @@ -13,6 +14,7 @@ static mm_mem_range_t mm_mmap_entries[MM_MAX_MMAP_ENTRIES]; static int mm_mmap_num_entries = 0; static int mm_num_free_pages = 0; u32_t * mm_free_page_ptr = NULL; +gdtr_t mm_gdtr; /************************************************************************** * This function is run in segmented memory before paging is in effect. * @@ -141,6 +143,15 @@ void mm_bootstrap() mm_map(page_base, page_base - KERNEL_OFFSET, 0, 1); } + /* set up the global descriptor table */ + u32_t gdt_base = mm_page_alloc(); + u64_t * gdt = (u64_t *) ((u32_t) gdt_base + (u32_t) KERNEL_OFFSET); + memsetd((u32_t *) gdt, 0, PAGE_SIZE / 4); + mm_gdtr.length = PAGE_SIZE - 1; + mm_gdtr.phys_addr = gdt_base; + gdt[1] = MAKE_DESCRIPTOR(0, 0xFFFFF, 1, 0, 1, 1); + gdt[2] = MAKE_DESCRIPTOR(0, 0xFFFFF, 1, 0, 1, 0); + /* set the page directory base register */ set_cr3(page_directory); diff --git a/kernel/mm/mm.h b/kernel/mm/mm.h index daa0eda..cfc28b0 100644 --- a/kernel/mm/mm.h +++ b/kernel/mm/mm.h @@ -26,8 +26,32 @@ int mm_map(u32_t virtual_address, u32_t physical_address, u32_t mm_page_alloc(); +typedef struct +{ + u16_t length; + u32_t phys_addr; +} __attribute__ ((packed)) gdtr_t; + #define set_cr3(address) \ __asm__ __volatile__ ("movl %0, %%cr3" : : "r" (address)); +/* http://courses.ece.illinois.edu/ece391/references/descriptors.pdf */ +/* granularity: 0: limit in bytes; 1: limit in pages */ +/* dpl: 0: system mode; 3: user mode */ +/* normal: 0: TSS/LDT/call gate; 1: code/data segment */ +/* code_seg: 0: data segment; 1: code segment */ +#define MAKE_DESCRIPTOR(base, limit, granularity, dpl, normal, code_seg) \ + (u64_t) ( ( (((u64_t) base) & 0xFF000000ull) << 32 ) /* base 31:24 */ \ + | ( (((u64_t) granularity) & 0x1ull) << 55 ) /* granularity */ \ + | ( ( (u64_t) 0x1ull) << 54 ) /* 32-bit */ \ + | ( (((u64_t) limit) & 0xF0000ull) << 32 ) /* limit 19:16 */ \ + | ( ( (u64_t) 0x1ull) << 47 ) /* present */ \ + | ( (((u64_t) dpl) & 0x3ull) << 45 ) /* dpl */ \ + | ( (((u64_t) normal) & 0x1ull) << 44 ) /* normal */ \ + | ( (((u64_t) code_seg) & 0x1ull) << 43 ) /* code seg */ \ + | ( ( (u64_t) 0x2ull) << 40 ) /* ? */ \ + | ( (((u64_t) base) & 0x00FFFFFFull) << 16) /* base 23:00 */ \ + | ( (((u64_t) limit) & 0x0000FFFFull) ) ) /* limit 15:00 */ + #endif