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