WIP: Enter kernel tasks via exception return
This commit is contained in:
@@ -29,6 +29,9 @@
|
||||
|
||||
.pushsection .text
|
||||
|
||||
.set SPSR_ELx_I, (1 << 9)
|
||||
.set SPSR_ELx_EL1h, (0b0101)
|
||||
|
||||
__aa64_task_enter_user:
|
||||
// x0 == sp, ...
|
||||
ldr x0, [sp, #16 * 0]
|
||||
@@ -40,7 +43,8 @@ __aa64_task_enter_user:
|
||||
|
||||
msr elr_el1, x1
|
||||
|
||||
mov x1, #(1 << 9)
|
||||
// SPSR_ELx_M[4:0] = 0, a return to EL0, AArch64 mode
|
||||
mov x1, #SPSR_ELx_I
|
||||
msr spsr_el1, x1
|
||||
|
||||
mov lr, xzr
|
||||
@@ -57,9 +61,19 @@ __aa64_task_enter_kernel:
|
||||
ldr lr, [sp, #16]
|
||||
add sp, sp, #24
|
||||
|
||||
// TODO enter task via eret to EL1t
|
||||
msr elr_el1, x1
|
||||
|
||||
br x1
|
||||
// SPSR_ELx_M[4:0] = 0b100, a return to EL1t, AArch64 mode
|
||||
mov x1, #SPSR_ELx_EL1h
|
||||
orr x1, x1, #SPSR_ELx_I
|
||||
msr spsr_el1, x1
|
||||
|
||||
mov x1, xzr
|
||||
|
||||
dsb ish
|
||||
isb sy
|
||||
|
||||
eret
|
||||
|
||||
__aa64_switch_task:
|
||||
// x0 -- "dst" context
|
||||
|
||||
@@ -74,8 +74,15 @@ __rv64_task_enter_kernel:
|
||||
ld ra, 16(sp) // return address
|
||||
addi sp, sp, 24
|
||||
|
||||
// TODO S-mode -> S-mode return via sret
|
||||
jr t0
|
||||
// Set SPP to indicate a return to S-mode
|
||||
csrr t1, sstatus
|
||||
// TODO enable interrupts via SPIE
|
||||
// ori t0, t0, SSTATUS_SPIE
|
||||
ori t1, t1, SSTATUS_SPP
|
||||
csrw sstatus, t1
|
||||
csrw sepc, t0
|
||||
|
||||
sret
|
||||
|
||||
__rv64_switch_task:
|
||||
// a0 - new context
|
||||
|
||||
Reference in New Issue
Block a user