diff options
author | dzwdz | 2022-07-16 13:33:00 +0200 |
---|---|---|
committer | dzwdz | 2022-07-16 13:33:00 +0200 |
commit | 912d2e3c7eb1baa71dda2c0a28aa5809eaa96f27 (patch) | |
tree | 4e27f3538466d5fd63a311d50916039a7a15a485 /src/kernel/arch/i386/sysenter.s | |
parent | 1eeb66af44ab335888410d716d604e569f20866e (diff) |
amd64: barely boot into kernel code
Diffstat (limited to 'src/kernel/arch/i386/sysenter.s')
-rw-r--r-- | src/kernel/arch/i386/sysenter.s | 89 |
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 |