aboutsummaryrefslogtreecommitdiff
path: root/src/utils/gdt.c
diff options
context:
space:
mode:
authorLoic Guegan <manzerbredes@mailbox.org>2021-04-10 17:24:13 +0200
committerLoic Guegan <manzerbredes@mailbox.org>2021-04-10 17:24:13 +0200
commit242fe4a5752bf66ae4c00438f5e9ce66b0774c38 (patch)
treed27d2e1fda93643eaaf249e05a6f3a35e07a67f0 /src/utils/gdt.c
parentc6aa00eea71c91a219dae8688530ff0a3b83bcd4 (diff)
Enable tasks execution and syscalls
Diffstat (limited to 'src/utils/gdt.c')
-rw-r--r--src/utils/gdt.c15
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