From fb69c7b05894cee2b8bb691ead948798a0674059 Mon Sep 17 00:00:00 2001 From: Loic Guegan Date: Fri, 30 Apr 2021 10:43:44 +0200 Subject: Setup TSS segment --- src/boucane.cc | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) (limited to 'src/boucane.cc') diff --git a/src/boucane.cc b/src/boucane.cc index 060f9cd..96c9ba7 100644 --- a/src/boucane.cc +++ b/src/boucane.cc @@ -19,8 +19,33 @@ u64 kvar_terminus_psf_start; u64 kvar_terminus_psf_end; u64 kvar_logo_bmp_start; u64 kvar_logo_bmp_end; +TSS kvar_tss; void (*printk)(char *str,...)=printf; +extern u64 gdt64_tss; + +void configure_tss(){ + u64 tss_addr=(u64)&kvar_tss; + u32 desc1=(tss_addr&0xFFFF)<<16|(sizeof(TSS)&0xFFFF); + tss_addr>>=16; + u32 desc2=(tss_addr&0xFF)|((tss_addr>>8)<<24); + tss_addr>>=16; + u32 desc3=tss_addr; + + // Options + u32 options=0b1001; // 64-bits TSS type + options|=(0b1000<<4); // Present + + // Configure GDT + u32 *gdt_entry=(u32*)&gdt64_tss; + gdt_entry[0]=desc1; + gdt_entry[1]=desc2|(options<<8); + gdt_entry[2]=desc3; + gdt_entry[3]=0; + + // Configure segment + kvar_tss.rsp0=(u64)VIRT(kvar_stack_pma); +} extern "C" void boucane(u64 mb_info){ // Init linker variables @@ -35,6 +60,7 @@ extern "C" void boucane(u64 mb_info){ asm volatile ("movq $res_binary_res_logo_bmp_end, %0":"=m"(kvar_logo_bmp_end)); // Init data structures + configure_tss(); asm volatile ("call load_gdt"); paging_enable(); memtext_init(); @@ -74,5 +100,8 @@ extern "C" void boucane(u64 mb_info){ mem/=1024; printk("RAM:%dMB\n", mem); } + + printk("%x",&kvar_tss); + DUMP(&gdt64_tss); while(1); } \ No newline at end of file -- cgit v1.2.3