summaryrefslogtreecommitdiff
path: root/na/arch/riscv/trap/swtch.S
diff options
context:
space:
mode:
Diffstat (limited to 'na/arch/riscv/trap/swtch.S')
-rw-r--r--na/arch/riscv/trap/swtch.S40
1 files changed, 40 insertions, 0 deletions
diff --git a/na/arch/riscv/trap/swtch.S b/na/arch/riscv/trap/swtch.S
new file mode 100644
index 0000000..4393505
--- /dev/null
+++ b/na/arch/riscv/trap/swtch.S
@@ -0,0 +1,40 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/* Copyright (C) 2026 Richard Qin */
+
+ .section .text
+ .globl context_switch
+ .align 2
+# void context_switch(Context* old_ctx, Context* next_ctx);
+# a0 = old_ctx_ptr, a1 = next_ctx_ptr
+context_switch:
+ sd ra, 0(a0)
+ sd sp, 8(a0)
+ sd s0, 16(a0)
+ sd s1, 24(a0)
+ sd s2, 32(a0)
+ sd s3, 40(a0)
+ sd s4, 48(a0)
+ sd s5, 56(a0)
+ sd s6, 64(a0)
+ sd s7, 72(a0)
+ sd s8, 80(a0)
+ sd s9, 88(a0)
+ sd s10, 96(a0)
+ sd s11, 104(a0)
+
+ ld ra, 0(a1)
+ ld sp, 8(a1)
+ ld s0, 16(a1)
+ ld s1, 24(a1)
+ ld s2, 32(a1)
+ ld s3, 40(a1)
+ ld s4, 48(a1)
+ ld s5, 56(a1)
+ ld s6, 64(a1)
+ ld s7, 72(a1)
+ ld s8, 80(a1)
+ ld s9, 88(a1)
+ ld s10, 96(a1)
+ ld s11, 104(a1)
+
+ ret \ No newline at end of file