WIP: Enter kernel tasks via exception return

This commit is contained in:
2025-03-26 14:36:04 +02:00
parent f57fd485c5
commit e1bd496b8f
2 changed files with 26 additions and 5 deletions
+17 -3
View File
@@ -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
+9 -2
View File
@@ -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