diff options
| author | Fabian Imhof <fabian.imhof@ost.ch> | 2025-04-27 10:21:29 +0000 |
|---|---|---|
| committer | Fabian Imhof <fabian.imhof@ost.ch> | 2025-04-27 10:21:29 +0000 |
| commit | c865eff02ae1978b4f665432d853374d1ffacecf (patch) | |
| tree | 210f93b7092d11f72018c2b7999f31555eef2968 /arch/x86_64/src/boot | |
| parent | 5f149faeb9d41bb56733075b0e56908b3731d38d (diff) | |
| download | teachos-c865eff02ae1978b4f665432d853374d1ffacecf.tar.xz teachos-c865eff02ae1978b4f665432d853374d1ffacecf.zip | |
create trampoline for syscall
Diffstat (limited to 'arch/x86_64/src/boot')
| -rw-r--r-- | arch/x86_64/src/boot/boot.s | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/arch/x86_64/src/boot/boot.s b/arch/x86_64/src/boot/boot.s index 7932045..24b38ca 100644 --- a/arch/x86_64/src/boot/boot.s +++ b/arch/x86_64/src/boot/boot.s @@ -352,6 +352,31 @@ prepare_page_maps: .section .boot_text, "ax", @progbits .code64 +syscall_target: + iretq + +.global syscall_trampoline +syscall_trampoline: + /* Write target function pointer in IA32_LSTAR MSR */ + mov $0xC0000082, %ecx /* IA32_LSTAR MSR */ + lea [syscall_target], %rax + lea [syscall_target], %rdx + shr $32, %rdx + wrmsr + + /* Write ... in IA32_LSTAR MSR */ + mov $0xC0000084, %ecx /* IA32_FMASK MSR */ + mov $0x0, %rax /* ... lower 32 bits */ + mov $0x0, %rdx /* ... upper 32 bits */ + wrmsr + + /* Write Segment selector in IA32_STAR MSR */ + mov $0xC0000081, %ecx /* IA32_STAR MSR */ + mov $0x10, %rax /* SS lower 32 bits */ + mov $0x0, %rdx /* SS upper 32 bits */ + wrmsr + + _transition_to_long_mode: xor %rax, %rax mov %rax, %ss |
