summaryrefslogtreecommitdiff
path: root/Source/Kernel/SyscallManager
diff options
context:
space:
mode:
authorAlexis211 <alexis211@gmail.com>2009-10-23 08:13:50 +0200
committerAlexis211 <alexis211@gmail.com>2009-10-23 08:13:50 +0200
commitdf179c18baab4b5d85a283924fb23dfee7ea7fdb (patch)
tree626168e219b883a4a13f3b7ab512ece91ebdc3c4 /Source/Kernel/SyscallManager
parent6a8a4b7e9affb35851a8f5c27a81c707a3090954 (diff)
parent5e5b36b281d951433d8db71ae898a9dc3272384a (diff)
downloadMelon-df179c18baab4b5d85a283924fb23dfee7ea7fdb.tar.gz
Melon-df179c18baab4b5d85a283924fb23dfee7ea7fdb.zip
Merge branch 'master' into usermgmt
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