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