Cleanup usermode jump
This commit is contained in:
parent
e50e6d2e4f
commit
31fdc8f175
|
@ -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!();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue