diff options
| author | Hongliang Wang <wanghongliang@loongson.cn> | 2023-09-26 09:12:01 +0800 | 
|---|---|---|
| committer | Rich Felker <dalias@aerifal.cx> | 2024-02-16 09:33:10 -0500 | 
| commit | 522bd54edaa2fa404fd428f8ad0bcb0f0bec5639 (patch) | |
| tree | dfe88361bcbbd17ac53b8af36cb52337f21095e9 /src | |
| parent | 4a16ddf53e7c634169d0a649782f8a724611f263 (diff) | |
| download | musl-522bd54edaa2fa404fd428f8ad0bcb0f0bec5639.tar.gz | |
add loongarch64 port
Author: Xiaojuan Zhai <zhaixiaojuan@loongson.cn>
Author: Meidan Li <limeidan@loongson.cn>
Author: Guoqi Chen <chenguoqi@loongson.cn>
Author: Xiaolin Zhao <zhaoxiaolin@loongson.cn>
Author: Fan peng <fanpeng@loongson.cn>
Author: Jiantao Shan <shanjiantao@loongson.cn>
Author: Xuhui Qiang <qiangxuhui@loongson.cn>
Author: Jingyun Hua <huajingyun@loongson.cn>
Author: Liu xue <liuxue@loongson.cn>
Author: Hongliang Wang <wanghongliang@loongson.cn>
Diffstat (limited to 'src')
| -rw-r--r-- | src/fenv/loongarch64/fenv.S | 78 | ||||
| -rw-r--r-- | src/ldso/loongarch64/dlsym.s | 7 | ||||
| -rw-r--r-- | src/setjmp/loongarch64/longjmp.S | 32 | ||||
| -rw-r--r-- | src/setjmp/loongarch64/setjmp.S | 34 | ||||
| -rw-r--r-- | src/signal/loongarch64/restore.s | 10 | ||||
| -rw-r--r-- | src/signal/loongarch64/sigsetjmp.s | 25 | ||||
| -rw-r--r-- | src/thread/loongarch64/__set_thread_area.s | 7 | ||||
| -rw-r--r-- | src/thread/loongarch64/__unmapself.s | 7 | ||||
| -rw-r--r-- | src/thread/loongarch64/clone.s | 28 | ||||
| -rw-r--r-- | src/thread/loongarch64/syscall_cp.s | 29 | 
10 files changed, 257 insertions, 0 deletions
diff --git a/src/fenv/loongarch64/fenv.S b/src/fenv/loongarch64/fenv.S new file mode 100644 index 00000000..9c38599e --- /dev/null +++ b/src/fenv/loongarch64/fenv.S @@ -0,0 +1,78 @@ +#ifndef __loongarch_soft_float + +#ifdef BROKEN_LOONGARCH_FCSR_ASM +#define FCSR $r0 +#else +#define FCSR $fcsr0 +#endif + +.global feclearexcept +.type   feclearexcept,@function +feclearexcept: +	li.w    $t0, 0x1f0000 +	and     $a0, $a0, $t0 +	movfcsr2gr $t1, FCSR +	andn    $t1, $t1, $a0 +	movgr2fcsr FCSR, $t1 +	li.w    $a0, 0 +	jr      $ra + +.global feraiseexcept +.type   feraiseexcept,@function +feraiseexcept: +	li.w    $t0, 0x1f0000 +	and     $a0, $a0, $t0 +	movfcsr2gr $t1, FCSR +	or      $t1, $t1, $a0 +	movgr2fcsr FCSR, $t1 +	li.w    $a0, 0 +	jr      $ra + +.global fetestexcept +.type   fetestexcept,@function +fetestexcept: +	li.w    $t0, 0x1f0000 +	and     $a0, $a0, $t0 +	movfcsr2gr $t1, FCSR +	and     $a0, $t1, $a0 +	jr      $ra + +.global fegetround +.type   fegetround,@function +fegetround: +	movfcsr2gr $t0, FCSR +	andi    $a0, $t0, 0x300 +	jr      $ra + +.global __fesetround +.hidden __fesetround +.type   __fesetround,@function +__fesetround: +	li.w    $t0, 0x300 +	and     $a0, $a0, $t0 +	movfcsr2gr $t1, FCSR +	andn    $t1, $t1, $t0 +	or      $t1, $t1, $a0 +	movgr2fcsr FCSR, $t1 +	li.w    $a0, 0 +	jr      $ra + +.global fegetenv +.type   fegetenv,@function +fegetenv: +	movfcsr2gr $t0, FCSR +	st.w    $t0, $a0, 0 +	li.w    $a0, 0 +	jr      $ra + +.global fesetenv +.type   fesetenv,@function +fesetenv: +	addi.d  $t0, $a0, 1 +	beq     $t0, $r0, 1f +	ld.w    $t0, $a0, 0 +1:	movgr2fcsr FCSR, $t0 +	li.w    $a0, 0 +	jr      $ra + +#endif diff --git a/src/ldso/loongarch64/dlsym.s b/src/ldso/loongarch64/dlsym.s new file mode 100644 index 00000000..26fabcdb --- /dev/null +++ b/src/ldso/loongarch64/dlsym.s @@ -0,0 +1,7 @@ +.global dlsym +.hidden __dlsym +.type   dlsym,@function +dlsym: +	move      $a2, $ra +	la.global $t0, __dlsym +	jr        $t0 diff --git a/src/setjmp/loongarch64/longjmp.S b/src/setjmp/loongarch64/longjmp.S new file mode 100644 index 00000000..896d2e26 --- /dev/null +++ b/src/setjmp/loongarch64/longjmp.S @@ -0,0 +1,32 @@ +.global _longjmp +.global longjmp +.type   _longjmp,@function +.type   longjmp,@function +_longjmp: +longjmp: +	ld.d    $ra, $a0, 0 +	ld.d    $sp, $a0, 8 +	ld.d    $r21,$a0, 16 +	ld.d    $fp, $a0, 24 +	ld.d    $s0, $a0, 32 +	ld.d    $s1, $a0, 40 +	ld.d    $s2, $a0, 48 +	ld.d    $s3, $a0, 56 +	ld.d    $s4, $a0, 64 +	ld.d    $s5, $a0, 72 +	ld.d    $s6, $a0, 80 +	ld.d    $s7, $a0, 88 +	ld.d    $s8, $a0, 96 +#ifndef __loongarch_soft_float +	fld.d   $fs0, $a0, 104 +	fld.d   $fs1, $a0, 112 +	fld.d   $fs2, $a0, 120 +	fld.d   $fs3, $a0, 128 +	fld.d   $fs4, $a0, 136 +	fld.d   $fs5, $a0, 144 +	fld.d   $fs6, $a0, 152 +	fld.d   $fs7, $a0, 160 +#endif +	sltui   $a0, $a1, 1 +	add.d   $a0, $a0, $a1 +	jr      $ra diff --git a/src/setjmp/loongarch64/setjmp.S b/src/setjmp/loongarch64/setjmp.S new file mode 100644 index 00000000..d158a3d2 --- /dev/null +++ b/src/setjmp/loongarch64/setjmp.S @@ -0,0 +1,34 @@ +.global __setjmp +.global _setjmp +.global setjmp +.type __setjmp,@function +.type _setjmp,@function +.type setjmp,@function +__setjmp: +_setjmp: +setjmp: +	st.d    $ra, $a0, 0 +	st.d    $sp, $a0, 8 +	st.d    $r21,$a0, 16 +	st.d    $fp, $a0, 24 +	st.d    $s0, $a0, 32 +	st.d    $s1, $a0, 40 +	st.d    $s2, $a0, 48 +	st.d    $s3, $a0, 56 +	st.d    $s4, $a0, 64 +	st.d    $s5, $a0, 72 +	st.d    $s6, $a0, 80 +	st.d    $s7, $a0, 88 +	st.d    $s8, $a0, 96 +#ifndef __loongarch_soft_float +	fst.d   $fs0, $a0, 104 +	fst.d   $fs1, $a0, 112 +	fst.d   $fs2, $a0, 120 +	fst.d   $fs3, $a0, 128 +	fst.d   $fs4, $a0, 136 +	fst.d   $fs5, $a0, 144 +	fst.d   $fs6, $a0, 152 +	fst.d   $fs7, $a0, 160 +#endif +	move    $a0, $zero +	jr      $ra diff --git a/src/signal/loongarch64/restore.s b/src/signal/loongarch64/restore.s new file mode 100644 index 00000000..d90a8ebb --- /dev/null +++ b/src/signal/loongarch64/restore.s @@ -0,0 +1,10 @@ +.global __restore_rt +.global __restore +.hidden __restore_rt +.hidden __restore +.type   __restore_rt,@function +.type   __restore,@function +__restore_rt: +__restore: +	li.w    $a7, 139 +	syscall 0 diff --git a/src/signal/loongarch64/sigsetjmp.s b/src/signal/loongarch64/sigsetjmp.s new file mode 100644 index 00000000..9c0e3ae2 --- /dev/null +++ b/src/signal/loongarch64/sigsetjmp.s @@ -0,0 +1,25 @@ +.global sigsetjmp +.global __sigsetjmp +.type sigsetjmp,@function +.type __sigsetjmp,@function +sigsetjmp: +__sigsetjmp: +	beq     $a1, $zero, 1f +	st.d    $ra, $a0, 184 +	st.d    $s0, $a0, 200  #184+8+8 +	move    $s0, $a0 + +	la.global  $t0, setjmp +	jirl       $ra, $t0, 0 + +	move    $a1, $a0        # Return from 'setjmp' or 'longjmp' +	move    $a0, $s0 +	ld.d    $ra, $a0, 184 +	ld.d    $s0, $a0, 200 #184+8+8 + +.hidden __sigsetjmp_tail +	la.global  $t0, __sigsetjmp_tail +	jr         $t0 +1: +	la.global  $t0, setjmp +	jr         $t0 diff --git a/src/thread/loongarch64/__set_thread_area.s b/src/thread/loongarch64/__set_thread_area.s new file mode 100644 index 00000000..021307fc --- /dev/null +++ b/src/thread/loongarch64/__set_thread_area.s @@ -0,0 +1,7 @@ +.global __set_thread_area +.hidden __set_thread_area +.type   __set_thread_area,@function +__set_thread_area: +	move $tp, $a0 +	move $a0, $zero +	jr   $ra diff --git a/src/thread/loongarch64/__unmapself.s b/src/thread/loongarch64/__unmapself.s new file mode 100644 index 00000000..719ad056 --- /dev/null +++ b/src/thread/loongarch64/__unmapself.s @@ -0,0 +1,7 @@ +.global __unmapself +.type   __unmapself, @function +__unmapself: +	li.d    $a7, 215   # call munmap +	syscall 0 +	li.d    $a7, 93    # call exit +	syscall 0 diff --git a/src/thread/loongarch64/clone.s b/src/thread/loongarch64/clone.s new file mode 100644 index 00000000..e971ab4b --- /dev/null +++ b/src/thread/loongarch64/clone.s @@ -0,0 +1,28 @@ +#__clone(func, stack, flags, arg, ptid, tls, ctid) +#         a0,    a1,   a2,    a3,  a4,  a5,   a6 +# sys_clone(flags, stack, ptid, ctid, tls) +#            a0,    a1,   a2,    a3,  a4 + +.global __clone +.hidden __clone +.type __clone,@function +__clone: +	# Save function pointer and argument pointer on new thread stack +	addi.d  $a1, $a1, -16 +	st.d    $a0, $a1, 0     # save function pointer +	st.d    $a3, $a1, 8     # save argument pointer +	or      $a0, $a2, $zero +	or      $a2, $a4, $zero +	or      $a3, $a6, $zero +	or      $a4, $a5, $zero +	ori     $a7, $zero, 220 +	syscall 0               # call clone + +	beqz    $a0, 1f         # whether child process +	jirl    $zero, $ra, 0   # parent process return +1: +	ld.d    $t8, $sp, 0     # function pointer +	ld.d    $a0, $sp, 8     # argument pointer +	jirl    $ra, $t8, 0     # call the user's function +	ori     $a7, $zero, 93 +	syscall 0               # child process exit diff --git a/src/thread/loongarch64/syscall_cp.s b/src/thread/loongarch64/syscall_cp.s new file mode 100644 index 00000000..c057a97b --- /dev/null +++ b/src/thread/loongarch64/syscall_cp.s @@ -0,0 +1,29 @@ +.global __cp_begin +.hidden __cp_begin +.global __cp_end +.hidden __cp_end +.global __cp_cancel +.hidden __cp_cancel +.hidden __cancel +.global __syscall_cp_asm +.hidden __syscall_cp_asm +.type   __syscall_cp_asm,@function + +__syscall_cp_asm: +__cp_begin: +	ld.w $a0, $a0, 0 +	bnez $a0, __cp_cancel +	move $t8, $a1    # reserve system call number +	move $a0, $a2 +	move $a1, $a3 +	move $a2, $a4 +	move $a3, $a5 +	move $a4, $a6 +	move $a5, $a7 +	move $a7, $t8 +	syscall 0 +__cp_end: +	jr $ra +__cp_cancel: +	la.local $t8, __cancel +	jr $t8  | 
