aboutsummaryrefslogtreecommitdiff
path: root/src/boucane.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/boucane.cc')
-rw-r--r--src/boucane.cc29
1 files changed, 29 insertions, 0 deletions
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