summaryrefslogtreecommitdiff
path: root/src/kernel/arch/i386/sysenter.s
diff options
context:
space:
mode:
authordzwdz2021-07-18 14:16:24 +0200
committerdzwdz2021-07-18 14:16:24 +0200
commited12953042ec38244f3ab93d67f4c2dea6f1fee3 (patch)
tree7984f01c156535fb57104db9cbcf0f8a9112b7ed /src/kernel/arch/i386/sysenter.s
parente333a43fb7c1e39418cfcc1be660d5006903c42a (diff)
move all kernel sources to src/kernel/
Diffstat (limited to 'src/kernel/arch/i386/sysenter.s')
-rw-r--r--src/kernel/arch/i386/sysenter.s31
1 files changed, 31 insertions, 0 deletions
diff --git a/src/kernel/arch/i386/sysenter.s b/src/kernel/arch/i386/sysenter.s
new file mode 100644
index 0000000..666c0f0
--- /dev/null
+++ b/src/kernel/arch/i386/sysenter.s
@@ -0,0 +1,31 @@
+/* arch/i386/gdt.c */
+.set SEG_r0code, 1
+.set SEG_r3code, 3
+.set SEG_r3data, 4
+
+.set IA32_SYSENTER_CS, 0x174
+
+.section .text
+.global sysexit
+.type sysexit, @function
+sysexit:
+ pop %ecx
+ pop %edx
+
+ mov $(SEG_r3data << 3 | 3), %ax
+ mov %ax, %ds
+ mov %ax, %es
+ mov %ax, %fs
+ mov %ax, %gs
+
+ sysexit
+
+
+.global sysenter_setup
+.type sysenter_setup, @function
+sysenter_setup:
+ xor %edx, %edx
+ mov $(SEG_r0code << 3), %eax
+ mov $IA32_SYSENTER_CS, %ecx
+ wrmsr
+ ret