summaryrefslogtreecommitdiff
path: root/Source/Kernel/SyscallManager
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Kernel/SyscallManager')
-rw-r--r--Source/Kernel/SyscallManager/IDT.ns.h1
-rw-r--r--Source/Kernel/SyscallManager/IDT.wtf.asm6
2 files changed, 7 insertions, 0 deletions
diff --git a/Source/Kernel/SyscallManager/IDT.ns.h b/Source/Kernel/SyscallManager/IDT.ns.h
index e73a885..ea8372a 100644
--- a/Source/Kernel/SyscallManager/IDT.ns.h
+++ b/Source/Kernel/SyscallManager/IDT.ns.h
@@ -4,6 +4,7 @@
#include <common.h>
struct registers_t {
+ u32int cr3; //Page directory
u32int ds; // Data segment selector
u32int edi, esi, ebp, esp, ebx, edx, ecx, eax; // Pushed by pusha.
u32int int_no, err_code; // Interrupt number and error code (if applicable)
diff --git a/Source/Kernel/SyscallManager/IDT.wtf.asm b/Source/Kernel/SyscallManager/IDT.wtf.asm
index b94612e..630b2fb 100644
--- a/Source/Kernel/SyscallManager/IDT.wtf.asm
+++ b/Source/Kernel/SyscallManager/IDT.wtf.asm
@@ -116,8 +116,14 @@ interrupt_common_stub:
mov fs, ax
mov gs, ax
+ mov eax, cr3
+ push eax
+
call interrupt_handler
+ pop eax
+ mov cr3, eax
+
pop eax ; reload the original data segment descriptor
mov ds, ax
mov es, ax