diff options
author | dzwdz | 2022-05-21 21:24:15 +0200 |
---|---|---|
committer | dzwdz | 2022-05-21 21:24:15 +0200 |
commit | ef52650c4a0723b242deb72ce2726f6846a6e986 (patch) | |
tree | bdf42a732d694a58cdae1ba8314ae98e096e2399 /src/kernel/arch/i386/sysenter.s | |
parent | e0101ecf0d2f29d8860e865e3f333803af918f2e (diff) |
kernel/i386: only map what's absolutely necessary in the user
Diffstat (limited to 'src/kernel/arch/i386/sysenter.s')
-rw-r--r-- | src/kernel/arch/i386/sysenter.s | 51 |
1 files changed, 30 insertions, 21 deletions
diff --git a/src/kernel/arch/i386/sysenter.s b/src/kernel/arch/i386/sysenter.s index ade69ec..70e9f13 100644 --- a/src/kernel/arch/i386/sysenter.s +++ b/src/kernel/arch/i386/sysenter.s @@ -8,26 +8,6 @@ .set IA32_SYSENTER_EIP, 0x176 .section .text -.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 - - // enable paging - mov %cr0, %eax - or $0x80000000, %eax - mov %eax, %cr0 - - // restore the registers - mov $_sysexit_regs, %esp - popal - sysexit - - .global sysenter_setup .type sysenter_setup, @function sysenter_setup: @@ -38,7 +18,7 @@ sysenter_setup: wrmsr mov $IA32_SYSENTER_ESP, %ecx - mov $_bss_end, %eax + mov $0, %eax // unused wrmsr mov $IA32_SYSENTER_EIP, %ecx @@ -47,6 +27,35 @@ sysenter_setup: ret + +.section .text.early + +.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 + popal + + // 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 */ |