merge branch memory-shit into higher-half
This commit is contained in:
+26
-2
@@ -2,6 +2,8 @@
|
||||
#include "../include/string.h"
|
||||
#include "../include/paging.h"
|
||||
|
||||
struct tss_entry_struct tss;
|
||||
|
||||
void bss_init()
|
||||
{
|
||||
memset((void *)((int)_edata), 0, KERNEL_BSS_SIZE);
|
||||
@@ -29,6 +31,16 @@ void load_gdt(uint32_t gdt_ptr) {
|
||||
);
|
||||
}
|
||||
|
||||
void flush_tss(void) {
|
||||
asm volatile (
|
||||
"mov %0, %%ax\n\t"
|
||||
"ltr %%ax\n\t"
|
||||
:
|
||||
: "i" (0x28)
|
||||
: "ax"
|
||||
);
|
||||
}
|
||||
|
||||
static void gdt_set_entry(int num, uint32_t base_addr, uint32_t limit, char loflags, char hiflags)
|
||||
{
|
||||
num /= sizeof(struct seg_desc);
|
||||
@@ -44,6 +56,17 @@ void gdt_init(void)
|
||||
{
|
||||
uint8_t loflags;
|
||||
|
||||
memset(&tss, 0, sizeof(tss));
|
||||
tss.ss0 = KERNEL_DS;
|
||||
tss.iomap_base = 0xFFFF; // Disable I/O bitmap
|
||||
tss.esp0 = 0xC0010000; /* kernel stack address (firstly defined in boot.asm)*/
|
||||
tss.cs = KERNEL_CS;
|
||||
tss.ds = KERNEL_DS;
|
||||
tss.es = KERNEL_DS;
|
||||
tss.fs = KERNEL_DS;
|
||||
tss.gs = KERNEL_DS;
|
||||
tss.ss = KERNEL_DS;
|
||||
|
||||
gdt_set_entry(0, 0, 0, 0, 0); /* null descriptor */
|
||||
|
||||
loflags = SD_CODE | SD_CD | SD_DPL0 | SD_PRESENT;
|
||||
@@ -56,8 +79,9 @@ void gdt_init(void)
|
||||
loflags = SD_DATA | SD_CD | SD_DPL3 | SD_PRESENT;
|
||||
gdt_set_entry(USER_DS, 0, 0xFFFFFFFF, loflags, SD_OPSIZE32 | SD_PAGE4KB);
|
||||
|
||||
loflags = SD_TSSPRESENT;
|
||||
gdt_set_entry(TSS, 0, sizeof(struct tss_entry_struct), loflags, SD_OPSIZE32);
|
||||
loflags = 0x89; // P=1, DPL=0, S=0 (system), Type=0x9 (32-bit TSS)
|
||||
gdt_set_entry(TSS, (uint32_t)&tss, sizeof(struct tss_entry_struct) - 1, SD_PRESENT | SD_DPL0 | SD_TSSPRESENT, 0);
|
||||
|
||||
load_gdt((uint32_t)&gdtr);
|
||||
flush_tss();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user