rumpk/hal/arch/riscv64/switch.S

95 lines
1.8 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