/* 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