From e1bd496b8faf26081cb008dd308f906ca46d8275 Mon Sep 17 00:00:00 2001 From: Mark Poliakov Date: Wed, 26 Mar 2025 14:36:04 +0200 Subject: [PATCH] WIP: Enter kernel tasks via exception return --- src/arch/aarch64/context.S | 20 +++++++++++++++++--- src/arch/riscv64/context.S | 11 +++++++++-- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/arch/aarch64/context.S b/src/arch/aarch64/context.S index b70d10e..10aafb8 100644 --- a/src/arch/aarch64/context.S +++ b/src/arch/aarch64/context.S @@ -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 diff --git a/src/arch/riscv64/context.S b/src/arch/riscv64/context.S index e743774..ae04e7b 100644 --- a/src/arch/riscv64/context.S +++ b/src/arch/riscv64/context.S @@ -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