rumpk/hal/arch/riscv64/switch.S

112 lines
2.3 KiB
ArmAsm
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* MARKUS MAIWALD (ARCHITECT) | VOXIS FORGE (AI)
RUMPK HAL // RISC-V 64 CONTEXT SWITCH (Boundaries Protected)
RISC-V LP64 ABI Saved Registers + Bounds:
- ra (return address)
- gp (global pointer)
- tp (thread pointer)
- s0-s11 (12 saved registers)
Frame: 16 regs * 8 = 128 bytes (16-byte aligned)
*/
.global cpu_switch_to
.type cpu_switch_to, @function
# void cpu_switch_to(uint64_t* prev_sp_ptr, uint64_t next_sp);
# a0 = prev_sp_ptr
# a1 = next_sp
cpu_switch_to:
# 1. Allocate Stack (128 bytes)
addi sp, sp, -128
# 2. Save Context
sd ra, 0(sp)
sd gp, 8(sp)
sd tp, 16(sp)
sd s0, 24(sp)
sd s1, 32(sp)
sd s2, 40(sp)
sd s3, 48(sp)
sd s4, 56(sp)
sd s5, 64(sp)
sd s6, 72(sp)
sd s7, 80(sp)
sd s8, 88(sp)
sd s9, 96(sp)
sd s10, 104(sp)
sd s11, 112(sp)
# 3. Save Old SP
sd sp, 0(a0)
# 4. Load New SP
mv sp, a1
# 5. Restore Context
ld ra, 0(sp)
ld gp, 8(sp)
ld tp, 16(sp)
ld s0, 24(sp)
ld s1, 32(sp)
ld s2, 40(sp)
ld s3, 48(sp)
ld s4, 56(sp)
ld s5, 64(sp)
ld s6, 72(sp)
ld s7, 80(sp)
ld s8, 88(sp)
ld s9, 96(sp)
ld s10, 104(sp)
ld s11, 112(sp)
addi sp, sp, 128
ret
/*
THE YIELD GUARD
Protects Kernel GP during subject-to-kernel yield calls.
*/
.global rumpk_yield_guard
.type rumpk_yield_guard, @function
rumpk_yield_guard:
# 1. Save Subject State
addi sp, sp, -16
sd gp, 0(sp)
sd ra, 8(sp)
# 2. Restore Kernel Global Pointer (Static Relocation)
.option push
.option norelax
la gp, __global_pointer$
.option pop
# 3. Call Nim Internal Logic
# (rumpk_yield_internal is a Nim cdecl proc)
call rumpk_yield_internal
# 4. Restore Subject State
ld gp, 0(sp)
ld ra, 8(sp)
addi sp, sp, 16
ret
.global rumpk_enter_userland
.type rumpk_enter_userland, @function
# void rumpk_enter_userland(uint64_t entry);
# a0 = entry
rumpk_enter_userland:
# 🏛 RESET STATE (Clean slate for the New Consciousness)
# We keep SP as is for now (it's the fiber stack)
# OR we point it to a dedicated User Stack if needed.
# Subject Entry usually handles its own stack init.
# Disable Supervisor Interrupts during handoff
csrw sie, zero
# Jump to the Summoned Body
jr a0