diff options
Diffstat (limited to 'src/utils/gdt.c')
| -rw-r--r-- | src/utils/gdt.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/src/utils/gdt.c b/src/utils/gdt.c index fd86f5f..c380283 100644 --- a/src/utils/gdt.c +++ b/src/utils/gdt.c @@ -5,7 +5,7 @@ struct GDT_REGISTER GDTR = { 0, 0 }; GDT_TSS TSS; void gdt_memcpy(){ - GDTR.limit=8*8; // Each entry is 8 bytes and 8 entries + GDTR.limit=8*GDT_MAX_ENTRIES; // Each entry is 8 bytes and 8 entries GDTR.base=0x800; gdt_write_entry((GDT_ENTRY){0,0,0,0},0); // First one must be null @@ -60,12 +60,10 @@ void gdt_memcpy(){ // Init TSS segment TSS.t_reserved=0; TSS.io_map=0; - TSS.ss0=0x18; - TSS.esp0=0x50000; GDT_ENTRY tss_desc; tss_desc.base=(u32)&TSS; // Not used in stack descriptor - tss_desc.limit=0x68; // Define how much entry it can contains + tss_desc.limit=0x68; // Define how much bytes it occupies tss_desc.flags=0; tss_desc.access=0x89 | GDT_PRVL_3; // Note that 0x89 is specific to TSS! gdt_write_entry(tss_desc, 7); @@ -89,3 +87,12 @@ void gdt_write_entry(GDT_ENTRY entry, u32 id){ // Copy descriptor into memory memcpy(descriptor,(void*)GDTR.base+8*id,8); // Each entry is 64 bits (8 bytes) } + +int gdt_user_ds_base(){ + char *addr=(char*)GDTR.base+48; + int *base0_15=(int*)addr+2; + int *base16_31=(int*)addr+7; + int base0_15_content=*base0_15 & 0xFFFF; + int base16_21_content=*base16_31 & 0xFFFF; + return(base16_21_content<<16 & base0_15_content); +}
\ No newline at end of file |
