From 6af3332a4cbd1ffbc81f74759ef7c5e1a87d2e10 Mon Sep 17 00:00:00 2001 From: Vincent Ren-Wei Chen Date: Tue, 17 Jan 2017 07:31:24 +0100 Subject: nds32: add NPTL/TLS, *context function, libm changes and code cleanup This commit includes following features. 1. Support NPTL/TLS 2. Add libm function which is used to handle FP rounding and excpetions (ex: fclrexcpt,fedisblxcpti,feenablxcpt... ) 3. Add *context function for operating user context (ex: setcontext,getcontext,makecontext... ) 4. Change the return flow from signal handler 5. Cleanup of old code The testsuite only has 2 errors, tst-cpuclock1 and tst-cputimer1, which are related to timing accuracy. (math and locale tests are disabled) Signed-off-by: Vincent Ren-Wei Chen --- libc/sysdeps/linux/nds32/setcontext.S | 85 +++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 libc/sysdeps/linux/nds32/setcontext.S (limited to 'libc/sysdeps/linux/nds32/setcontext.S') diff --git a/libc/sysdeps/linux/nds32/setcontext.S b/libc/sysdeps/linux/nds32/setcontext.S new file mode 100644 index 000000000..f9265328f --- /dev/null +++ b/libc/sysdeps/linux/nds32/setcontext.S @@ -0,0 +1,85 @@ +/* + * Copyright (C) 2016-2017 Andes Technology, Inc. + * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. + */ + +#include + +#include "ucontext_i.h" + +ENTRY(__setcontext) + move $r4, $r0 + +#ifdef __NDS32_ABI_2FP_PLUS__ + addi $r0, $r4, UCONTEXT_FDREGS + + /* Case switch for $r20 as $fpcfg.freg. */ + beqz $r20, .LCFG0 /* Branch if $fpcfg.freg = 0b00. */ + xori $r15, $r20, #0b10 + beqz $r15, .LCFG2 /* Branch if $fpcfg.freg = 0b10. */ + srli $r20, $r20, #0b01 + beqz $r20, .LCFG1 /* Branch if $fpcfg.freg = 0b01. */ + /* Fall-through if $fpcfg.freg = 0b11. */ +.LCFG3: + fldi $fd31, [$r0 + 248] + fldi $fd30, [$r0 + 240] + fldi $fd29, [$r0 + 232] + fldi $fd28, [$r0 + 224] + fldi $fd27, [$r0 + 216] + fldi $fd26, [$r0 + 208] + fldi $fd25, [$r0 + 200] + fldi $fd24, [$r0 + 192] +.LCFG2: + fldi $fd10, [$r0 + 80] + fldi $fd9, [$r0 + 72] + fldi $fd8, [$r0 + 64] +.LCFG1: + fldi $fd7, [$r0 + 56] + fldi $fd6, [$r0 + 48] + fldi $fd5, [$r0 + 40] + fldi $fd4, [$r0 + 32] +.LCFG0: + fldi $fd3, [$r0 + 24] + /*save fpcsr*/ + lwi $r1, [$r0 + 0x100] + fmtcsr $r1 +#endif /* __NDS32_ABI_2FP_PLUS__ */ + + /* sigprocmask (SIG_BLOCK, &sc->sc_mask, NULL). */ + move $r0, SIG_SETMASK + addi $r1, $r4, UCONTEXT_SIGMASK + move $r2, 0 + move $r3, _NSIG8 + syscall SYS_ify(rt_sigprocmask) + bnez $r0, 1f + + move $r0, $r4 + addi $r15, $r4, UCONTEXT_GREGS + 4 + lmw.bim $r1, [$r15], $r14 + addi $r15, $r15, 4 + lmw.bim $r16, [$r15], $r25, #0xf + lwi $r15, [$r0 + UCONTEXT_PC] + push $r1 + cfi_adjust_cfa_offset (4) + move $r1, $r0 + lwi $r0, [$r1 + UCONTEXT_GREGS] + pop $r1 + cfi_adjust_cfa_offset (-4) + jr $r15 +1: + move $r0, -1 + ret +END(__setcontext) + +weak_alias (__setcontext, setcontext) +libc_hidden_def(__setcontext) + +ENTRY (__startcontext) + move $r0, $r6 + beqz $r0, 1f + jal HIDDEN_JUMPTARGET(__setcontext) +1: + move $r0, 0 + j HIDDEN_JUMPTARGET(exit) +END (__startcontext) + -- cgit v1.2.3