112 lines
2.3 KiB
ArmAsm
112 lines
2.3 KiB
ArmAsm
/* 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
|