123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- From 0b4555370e3b615453ce002a375809870fe8d8ed Mon Sep 17 00:00:00 2001
- From: Stefan O'Rear <sorear@fastmail.com>
- Date: Thu, 3 Sep 2020 05:54:44 -0400
- Subject: [PATCH 13/16] riscv32: Add jmp_buf and sigreturn
- Largely copied from riscv64 but required recalculation of offsets.
- ---
- src/setjmp/riscv32/longjmp.S | 42 ++++++++++++++++++++++++++++++++++
- src/setjmp/riscv32/setjmp.S | 41 +++++++++++++++++++++++++++++++++
- src/signal/riscv32/restore.s | 8 +++++++
- src/signal/riscv32/sigsetjmp.s | 23 +++++++++++++++++++
- 4 files changed, 114 insertions(+)
- create mode 100644 src/setjmp/riscv32/longjmp.S
- create mode 100644 src/setjmp/riscv32/setjmp.S
- create mode 100644 src/signal/riscv32/restore.s
- create mode 100644 src/signal/riscv32/sigsetjmp.s
- diff --git a/src/setjmp/riscv32/longjmp.S b/src/setjmp/riscv32/longjmp.S
- new file mode 100644
- index 00000000..f9cb3318
- --- /dev/null
- +++ b/src/setjmp/riscv32/longjmp.S
- @@ -0,0 +1,42 @@
- +.global __longjmp
- +.global _longjmp
- +.global longjmp
- +.type __longjmp, %function
- +.type _longjmp, %function
- +.type longjmp, %function
- +__longjmp:
- +_longjmp:
- +longjmp:
- + lw s0, 0(a0)
- + lw s1, 4(a0)
- + lw s2, 8(a0)
- + lw s3, 12(a0)
- + lw s4, 16(a0)
- + lw s5, 20(a0)
- + lw s6, 24(a0)
- + lw s7, 28(a0)
- + lw s8, 32(a0)
- + lw s9, 36(a0)
- + lw s10, 40(a0)
- + lw s11, 44(a0)
- + lw sp, 48(a0)
- + lw ra, 52(a0)
- +
- +#ifndef __riscv_float_abi_soft
- + fld fs0, 56(a0)
- + fld fs1, 64(a0)
- + fld fs2, 72(a0)
- + fld fs3, 80(a0)
- + fld fs4, 88(a0)
- + fld fs5, 96(a0)
- + fld fs6, 104(a0)
- + fld fs7, 112(a0)
- + fld fs8, 120(a0)
- + fld fs9, 128(a0)
- + fld fs10, 136(a0)
- + fld fs11, 144(a0)
- +#endif
- +
- + seqz a0, a1
- + add a0, a0, a1
- + ret
- diff --git a/src/setjmp/riscv32/setjmp.S b/src/setjmp/riscv32/setjmp.S
- new file mode 100644
- index 00000000..8a75cf55
- --- /dev/null
- +++ b/src/setjmp/riscv32/setjmp.S
- @@ -0,0 +1,41 @@
- +.global __setjmp
- +.global _setjmp
- +.global setjmp
- +.type __setjmp, %function
- +.type _setjmp, %function
- +.type setjmp, %function
- +__setjmp:
- +_setjmp:
- +setjmp:
- + sw s0, 0(a0)
- + sw s1, 4(a0)
- + sw s2, 8(a0)
- + sw s3, 12(a0)
- + sw s4, 16(a0)
- + sw s5, 20(a0)
- + sw s6, 24(a0)
- + sw s7, 28(a0)
- + sw s8, 32(a0)
- + sw s9, 36(a0)
- + sw s10, 40(a0)
- + sw s11, 44(a0)
- + sw sp, 48(a0)
- + sw ra, 52(a0)
- +
- +#ifndef __riscv_float_abi_soft
- + fsd fs0, 56(a0)
- + fsd fs1, 64(a0)
- + fsd fs2, 72(a0)
- + fsd fs3, 80(a0)
- + fsd fs4, 88(a0)
- + fsd fs5, 96(a0)
- + fsd fs6, 104(a0)
- + fsd fs7, 112(a0)
- + fsd fs8, 120(a0)
- + fsd fs9, 128(a0)
- + fsd fs10, 136(a0)
- + fsd fs11, 144(a0)
- +#endif
- +
- + li a0, 0
- + ret
- diff --git a/src/signal/riscv32/restore.s b/src/signal/riscv32/restore.s
- new file mode 100644
- index 00000000..40012c75
- --- /dev/null
- +++ b/src/signal/riscv32/restore.s
- @@ -0,0 +1,8 @@
- +.global __restore
- +.type __restore, %function
- +__restore:
- +.global __restore_rt
- +.type __restore_rt, %function
- +__restore_rt:
- + li a7, 139 # SYS_rt_sigreturn
- + ecall
- diff --git a/src/signal/riscv32/sigsetjmp.s b/src/signal/riscv32/sigsetjmp.s
- new file mode 100644
- index 00000000..c1caeab1
- --- /dev/null
- +++ b/src/signal/riscv32/sigsetjmp.s
- @@ -0,0 +1,23 @@
- +.global sigsetjmp
- +.global __sigsetjmp
- +.type sigsetjmp, %function
- +.type __sigsetjmp, %function
- +sigsetjmp:
- +__sigsetjmp:
- + bnez a1, 1f
- + tail setjmp
- +1:
- +
- + sw ra, 152(a0)
- + sw s0, 164(a0)
- + mv s0, a0
- +
- + call setjmp
- +
- + mv a1, a0
- + mv a0, s0
- + lw s0, 164(a0)
- + lw ra, 152(a0)
- +
- +.hidden __sigsetjmp_tail
- + tail __sigsetjmp_tail
- --
- 2.29.2
|