summaryrefslogtreecommitdiff
path: root/src/kernel/arch/amd64/sysenter.c
diff options
context:
space:
mode:
authordzwdz2022-07-16 13:33:00 +0200
committerdzwdz2022-07-16 13:33:00 +0200
commit912d2e3c7eb1baa71dda2c0a28aa5809eaa96f27 (patch)
tree4e27f3538466d5fd63a311d50916039a7a15a485 /src/kernel/arch/amd64/sysenter.c
parent1eeb66af44ab335888410d716d604e569f20866e (diff)
amd64: barely boot into kernel code
Diffstat (limited to 'src/kernel/arch/amd64/sysenter.c')
-rw-r--r--src/kernel/arch/amd64/sysenter.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/src/kernel/arch/amd64/sysenter.c b/src/kernel/arch/amd64/sysenter.c
new file mode 100644
index 0000000..e42ec7d
--- /dev/null
+++ b/src/kernel/arch/amd64/sysenter.c
@@ -0,0 +1,27 @@
+#include <kernel/arch/generic.h>
+#include <kernel/arch/amd64/sysenter.h>
+#include <kernel/proc.h>
+#include <shared/syscalls.h>
+
+struct registers _sysexit_regs;
+
+void sysexit(struct registers regs) {
+ _sysexit_regs = regs;
+ _sysexit_regs.ecx = (uintptr_t) regs.esp;
+ _sysexit_regs.edx = (uintptr_t) regs.eip;
+ _sysexit_real();
+ __builtin_unreachable();
+}
+
+_Noreturn void sysenter_stage2(void) {
+ kprintf("ring0 again!\n");
+ struct registers *regs = &process_current->regs;
+
+ *regs = _sysexit_regs; // save the registers
+ regs->esp = (userptr_t) regs->ecx; // fix them up
+ regs->eip = (userptr_t) regs->edx;
+
+ _syscall(regs->eax, regs->ebx,
+ regs->esi, regs->edi, (uintptr_t)regs->ebp);
+ process_switch_any();
+}