Cleanup usermode jump

This commit is contained in:
Jeremy Soller 2016-09-12 17:52:38 -06:00
parent e50e6d2e4f
commit 31fdc8f175

View file

@ -187,23 +187,24 @@ pub unsafe extern fn kstart_ap(cpu_id: usize, page_table: usize, stack_start: us
pub unsafe fn usermode(ip: usize, sp: usize) -> ! { pub unsafe fn usermode(ip: usize, sp: usize) -> ! {
// Go to usermode // Go to usermode
asm!("mov rax, 0x2B # Set segment pointers asm!("xchg bx, bx
mov ds, ax mov ds, ax
mov es, ax mov es, ax
mov fs, ax mov fs, ax
mov gs, ax mov gs, ax
push rax
push rax # Push stack segment push rbx
push rbx # Push stack pointer push rcx
mov rax, 3 << 12 | 1 << 9 # Set IOPL and interrupt enable flag push rdx
push rax # Push rflags push rsi
mov rax, 0x23
push rax # Push code segment
push rcx # Push rip
iretq" iretq"
: : // No output because it never returns
: "{rbx}"(sp), "{rcx}"(ip) : "{rax}"(gdt::GDT_USER_DATA << 3 | 3), // Stack segment
: "rax", "sp" "{rbx}"(sp), // Stack pointer
"{rcx}"(3 << 12 | 1 << 9), // Flags - Set IOPL and interrupt enable flag
"{rdx}"(gdt::GDT_USER_CODE << 3 | 3), // Code segment
"{rsi}"(ip) // IP
: // No clobers because it never returns
: "intel", "volatile"); : "intel", "volatile");
unreachable!(); unreachable!();
} }