summaryrefslogtreecommitdiff
path: root/src/kernel/trap/trampoline.S
diff options
context:
space:
mode:
authorRichard Qin <richard.qin.x@gmail.com>2025-12-27 21:56:42 +0800
committerRichard Qin <richard.qin.x@gmail.com>2025-12-27 21:56:42 +0800
commit7ececbe2818510a8acaa2a2e513085c768b14d15 (patch)
treed884b6ad1b7e28bc22528b8433a80456fa1f7895 /src/kernel/trap/trampoline.S
parentbe71d44b9dfcf65fba3394fbd3dc2b3e06962897 (diff)
downloadlume-7ececbe2818510a8acaa2a2e513085c768b14d15.tar.gz
lume-7ececbe2818510a8acaa2a2e513085c768b14d15.tar.xz
feat: Implement the first user program of the lume OS
Diffstat (limited to 'src/kernel/trap/trampoline.S')
-rw-r--r--src/kernel/trap/trampoline.S98
1 files changed, 98 insertions, 0 deletions
diff --git a/src/kernel/trap/trampoline.S b/src/kernel/trap/trampoline.S
new file mode 100644
index 0000000..478d345
--- /dev/null
+++ b/src/kernel/trap/trampoline.S
@@ -0,0 +1,98 @@
+.section .text
+.globl trampoline
+.globl uservec
+.globl userret
+
+.align 12
+trampoline:
+.align 4
+uservec:
+
+ csrrw a0, sscratch, a0
+
+ sd ra, 40(a0)
+ sd sp, 48(a0)
+ sd gp, 56(a0)
+ sd tp, 64(a0)
+ sd t0, 72(a0)
+ sd t1, 80(a0)
+ sd t2, 88(a0)
+ sd s0, 96(a0)
+ sd s1, 104(a0)
+ sd a1, 120(a0)
+ sd a2, 128(a0)
+ sd a3, 136(a0)
+ sd a4, 144(a0)
+ sd a5, 152(a0)
+ sd a6, 160(a0)
+ sd a7, 168(a0)
+ sd s2, 176(a0)
+ sd s3, 184(a0)
+ sd s4, 192(a0)
+ sd s5, 200(a0)
+ sd s6, 208(a0)
+ sd s7, 216(a0)
+ sd s8, 224(a0)
+ sd s9, 232(a0)
+ sd s10, 240(a0)
+ sd s11, 248(a0)
+ sd t3, 256(a0)
+ sd t4, 264(a0)
+ sd t5, 272(a0)
+ sd t6, 280(a0)
+
+ csrr t0, sscratch
+ sd t0, 112(a0)
+
+ ld sp, 8(a0)
+ ld tp, 32(a0)
+ ld t0, 16(a0)
+ ld t1, 0(a0)
+
+ csrw satp, t1
+ sfence.vma zero, zero
+
+ jr t0
+
+.align 4
+userret:
+
+ csrw satp, a1
+ sfence.vma zero, zero
+
+ csrw sscratch, a0
+
+ ld ra, 40(a0)
+ ld sp, 48(a0)
+ ld gp, 56(a0)
+ ld tp, 64(a0)
+ ld t0, 72(a0)
+ ld t1, 80(a0)
+ ld t2, 88(a0)
+ ld s0, 96(a0)
+ ld s1, 104(a0)
+ ld a1, 120(a0)
+ ld a2, 128(a0)
+ ld a3, 136(a0)
+ ld a4, 144(a0)
+ ld a5, 152(a0)
+ ld a6, 160(a0)
+ ld a7, 168(a0)
+ ld s2, 176(a0)
+ ld s3, 184(a0)
+ ld s4, 192(a0)
+ ld s5, 200(a0)
+ ld s6, 208(a0)
+ ld s7, 216(a0)
+ ld s8, 224(a0)
+ ld s9, 232(a0)
+ ld s10, 240(a0)
+ ld s11, 248(a0)
+ ld t3, 256(a0)
+ ld t4, 264(a0)
+ ld t5, 272(a0)
+ ld t6, 280(a0)
+
+ ld a0, 112(a0)
+
+ sret \ No newline at end of file