summaryrefslogtreecommitdiff
path: root/src/kernel/arch/i386/sysenter.s
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/i386/sysenter.s
parent1eeb66af44ab335888410d716d604e569f20866e (diff)
amd64: barely boot into kernel code
Diffstat (limited to 'src/kernel/arch/i386/sysenter.s')
-rw-r--r--src/kernel/arch/i386/sysenter.s89
1 files changed, 0 insertions, 89 deletions
diff --git a/src/kernel/arch/i386/sysenter.s b/src/kernel/arch/i386/sysenter.s
deleted file mode 100644
index d04f839..0000000
--- a/src/kernel/arch/i386/sysenter.s
+++ /dev/null
@@ -1,89 +0,0 @@
-/* arch/i386/gdt.c */
-.set SEG_r0code, 1
-.set SEG_r3code, 3
-.set SEG_r3data, 4
-
-.set IA32_SYSENTER_CS, 0x174
-.set IA32_SYSENTER_ESP, 0x175
-.set IA32_SYSENTER_EIP, 0x176
-
-.section .text
-.global sysenter_setup
-.type sysenter_setup, @function
-sysenter_setup:
- xor %edx, %edx
-
- mov $(SEG_r0code << 3), %eax
- mov $IA32_SYSENTER_CS, %ecx
- wrmsr
-
- mov $IA32_SYSENTER_ESP, %ecx
- mov $0, %eax // unused
- wrmsr
-
- mov $IA32_SYSENTER_EIP, %ecx
- mov $sysenter_stage1, %eax
- wrmsr
-
- ret
-
-
-.section .shared
-
-.global stored_eax
-stored_eax:
-.long 0
-
-.global _sysexit_real
-.type _sysexit_real, @function
-_sysexit_real:
- mov $(SEG_r3data << 3 | 3), %ax
- mov %ax, %ds
- mov %ax, %es
- mov %ax, %fs
- mov %ax, %gs
-
- // restore the registers
- mov $_sysexit_regs, %esp
- pop %edi
- pop %esi
- pop %ebp
- add $4, %esp
- pop %ebx
- pop %edx
- pop %ecx
- pop %eax
-
- // enable paging
- mov %eax, stored_eax
- mov %cr0, %eax
- or $0x80000000, %eax
- mov %eax, %cr0
- mov stored_eax, %eax
-
- sysexit
-
-sysenter_stage1:
- cli /* prevent random IRQs in the middle of kernel code */
-
- // disable paging
- // I don't want to damage any of the registers passed in by the user,
- // so i'm using ESP as a temporary register. At this point there's nothing
- // useful in it, it's == _bss_end.
- mov %cr0, %esp
- and $0x7FFFFFFF, %esp // disable paging
- mov %esp, %cr0
-
- // save the registers
- mov $(_sysexit_regs + 32), %esp
- push %eax
- push %ecx
- push %edx
- push %ebx
- push $0x0 // pushal pushes %esp here, but that's worthless
- push %ebp
- push %esi
- push %edi
-
- mov $_bss_end, %esp
- jmp sysenter_stage2