summaryrefslogtreecommitdiff
path: root/kernel/syscall.asm
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/syscall.asm')
-rw-r--r--kernel/syscall.asm88
1 files changed, 0 insertions, 88 deletions
diff --git a/kernel/syscall.asm b/kernel/syscall.asm
deleted file mode 100644
index c293402..0000000
--- a/kernel/syscall.asm
+++ /dev/null
@@ -1,88 +0,0 @@
-bits 64
-
-global start_user_mode
-
-section .text
-
-extern do_syscall
-
-syscall_entry:
- mov r11, rsp
- mov rsp, 0xfffffffffffff000
- push r11
- push rcx
-
- push rdx
- push rsi
- push rdi
- push rax
-
- mov rdi, rsp
- lea rsi, [rsp + 8]
- lea rdx, [rsp + 16]
- lea rcx, [rsp + 24]
-
- call do_syscall
-
- pop rax
- pop rdi
- pop rsi
- pop rdx
-
- xor r8, r8
- xor r9, r9
- xor r10, r10
- xor r11, r11
- or r11, 0x200
- pop rcx
- pop rsp
-
- o64 sysret
-
-start_user_mode:
-;intended rip in rdi
-;intended rsp in rsi
-;intended p4_paddr in rdx
-
- mov rax, rdx
- mov cr3, rax
-
- ;efer <- efer | 0x1
- mov rcx, 0xc0000080
- rdmsr
- or al, 1
- wrmsr
-
- ;lstar <- syscall_entry
- mov rdx, syscall_entry
- mov eax, edx
- shr rdx, 32
- mov ecx, 0xc0000082
- wrmsr
-
- ;star <- 0x0030.0028.0000.0000
- mov edx, 0x00300028
- xor eax, eax
- mov ecx, 0xc0000081
- wrmsr
-
- mov rcx, rdi
- mov rsp, rsi
- xor r11, r11
- or r11, 0x200
-
- xor rax, rax
- xor rbx, rbx
- xor rdx, rdx
- xor rdi, rdi
- xor rsi, rsi
- xor rbp, rbp
- xor r8, r8
- xor r9, r9
- xor r10, r10
- xor r12, r12
- xor r13, r13
- xor r14, r14
- xor r15, r15
-
- o64 sysret