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/sysdep.h | 321 +++++++++++++------------------------- 1 file changed, 107 insertions(+), 214 deletions(-) (limited to 'libc/sysdeps/linux/nds32/sysdep.h') diff --git a/libc/sysdeps/linux/nds32/sysdep.h b/libc/sysdeps/linux/nds32/sysdep.h index 7472a99d4..340797858 100644 --- a/libc/sysdeps/linux/nds32/sysdep.h +++ b/libc/sysdeps/linux/nds32/sysdep.h @@ -1,148 +1,96 @@ -//#include +/* + * Copyright (C) 2016-2017 Andes Technology, Inc. + * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. + */ + +#ifndef _LINUX_NDS32_SYSDEP_H +#define _LINUX_NDS32_SYSDEP_H 1 + +#include + #ifdef __ASSEMBLER__ /* Define an entry point visible from C. */ -#ifdef PIC -#define ENTRY(name) \ +# ifdef PIC +# define ENTRY(name) \ .pic \ .align 2; \ .globl C_SYMBOL_NAME(name); \ .func C_SYMBOL_NAME(name); \ .type C_SYMBOL_NAME(name), @function; \ -C_SYMBOL_NAME(name): -#else -#define ENTRY(name) \ +C_SYMBOL_NAME(name): \ + cfi_startproc; + +# else +# define ENTRY(name) \ .align 2; \ .globl C_SYMBOL_NAME(name); \ .func C_SYMBOL_NAME(name); \ .type C_SYMBOL_NAME(name), @function; \ -C_SYMBOL_NAME(name): -#endif +C_SYMBOL_NAME(name): \ + cfi_startproc; +# endif #undef END #define END(name) \ + cfi_endproc; \ .endfunc; \ .size C_SYMBOL_NAME(name), .-C_SYMBOL_NAME(name) /* If compiled for profiling, call `mcount' at the start of each function. */ -#ifdef HAVE_ELF +# ifdef HAVE_ELF #undef NO_UNDERSCORES #define NO_UNDERSCORES -#endif +# endif -#ifdef NO_UNDERSCORES +# ifdef NO_UNDERSCORES #define syscall_error __syscall_error -#endif +# endif #define SYS_ify(syscall_name) (__NR_##syscall_name) #define __do_syscall(syscall_name) \ syscall SYS_ify(syscall_name); -#define SYSCALL_ERROR_HANDLER -#define SYSCALL_ERROR __syscall_error - - -#ifdef PIC -#ifdef __NDS32_N1213_43U1H__ -#ifdef NDS_ABI_V0 -#define PSEUDO(name, syscall_name, args) \ - .pic; \ - .align 2; \ - 1: ret; \ - 99: addi $r0, $lp, 0; \ - jal 1b; \ - sethi $r1, hi20(_GLOBAL_OFFSET_TABLE_); \ - ori $r1, $r1, lo12(_GLOBAL_OFFSET_TABLE_+4); \ - add $r1, $lp, $r1; \ - addi $lp, $r0, 0; \ - sethi $r15, hi20(SYSCALL_ERROR@PLT); \ - ori $r15, $r15, lo12(SYSCALL_ERROR@PLT); \ - add $r15, $r15, $r1; \ - jr $r15; \ - nop; \ - ENTRY(name); \ - __do_syscall(syscall_name); \ - bgez $r5, 2f; \ - sltsi $r0, $r5, -4096; \ - beqz $r0, 99b; \ - 2: -#else -#define PSEUDO(name, syscall_name, args) \ - .pic; \ - .align 2; \ - 1: ret; \ - 99: addi $r2, $lp, 0; \ - jal 1b; \ - sethi $r1, hi20(_GLOBAL_OFFSET_TABLE_); \ - ori $r1, $r1, lo12(_GLOBAL_OFFSET_TABLE_+4); \ - add $r1, $lp, $r1; \ - addi $lp, $r2, 0; \ - sethi $r15, hi20(SYSCALL_ERROR@PLT); \ - ori $r15, $r15, lo12(SYSCALL_ERROR@PLT); \ - add $r15, $r15, $r1; \ - jr $r15; \ - nop; \ - ENTRY(name); \ - __do_syscall(syscall_name); \ - bgez $r0, 2f; \ - sltsi $r1, $r0, -4096; \ - beqz $r1, 99b; \ - 2: -#endif -#else -#define PSEUDO(name, syscall_name, args) \ - .pic; \ - .align 2; \ - 99: mfusr $r15, $PC; \ - sethi $r1, hi20(_GLOBAL_OFFSET_TABLE_ + 4); \ +# ifdef PIC +# define PSEUDO(name, syscall_name, args) \ + .pic; \ + .align 2; \ + 99: mfusr $r15, $PC; \ + sethi $r1, hi20(_GLOBAL_OFFSET_TABLE_ + 4); \ ori $r1, $r1, lo12(_GLOBAL_OFFSET_TABLE_ + 8); \ - add $r1, $r15, $r1; \ - sethi $r15, hi20(SYSCALL_ERROR@PLT); \ - ori $r15, $r15, lo12(SYSCALL_ERROR@PLT); \ - add $r15, $r15, $r1; \ - jr $r15; \ - nop; \ - ENTRY(name); \ - __do_syscall(syscall_name); \ - bgez $r0, 2f; \ - sltsi $r1, $r0, -4096; \ - beqz $r1, 99b; \ + add $r1, $r15, $r1; \ + sethi $r15, hi20(SYSCALL_ERROR@PLT); \ + ori $r15, $r15, lo12(SYSCALL_ERROR@PLT); \ + add $r15, $r15, $r1; \ + jr $r15; \ + nop; \ + ENTRY(name); \ + __do_syscall(syscall_name); \ + bgez $r0, 2f; \ + sltsi $r1, $r0, -4096; \ + beqz $r1, 99b; \ 2: -#endif -#else -#ifdef OLD2_ABI -#define PSEUDO(name, syscall_name, args) \ - .align 2; \ - 99: j SYSCALL_ERROR; \ - nop; \ - ENTRY(name); \ - __do_syscall(syscall_name); \ - bgez $r5, 2f; \ - sltsi $r0, $r5, -4096; \ - beqz $r0, 99b; \ +# else +# define PSEUDO(name, syscall_name, args) \ + .align 2; \ + 99: j SYSCALL_ERROR; \ + nop; \ + ENTRY(name); \ + __do_syscall(syscall_name); \ + bgez $r0, 2f; \ + sltsi $r1, $r0, -4096; \ + beqz $r1, 99b; \ 2: -#else -#define PSEUDO(name, syscall_name, args) \ - .align 2; \ - 99: j SYSCALL_ERROR; \ - nop; \ - ENTRY(name); \ - __do_syscall(syscall_name); \ - bgez $r0, 2f; \ - sltsi $r1, $r0, -4096; \ - beqz $r1, 99b; \ - 2: -#endif -#endif +# endif -#define PSEUDO_NOERRNO(name, syscall_name, args) \ - ENTRY(name); \ +#define PSEUDO_NOERRNO(name, syscall_name, args) \ + ENTRY(name); \ __do_syscall(syscall_name); #undef PSEUDO_END -#define PSEUDO_END(sym) \ - SYSCALL_ERROR_HANDLER \ +#define PSEUDO_END(sym) \ + SYSCALL_ERROR_HANDLER \ END(sym) #undef PSEUDO_END_ERRVAL @@ -152,120 +100,65 @@ C_SYMBOL_NAME(name): #define ret_ERRVAL ret -#define ret_NOERRNO ret +#define ret_NOERRNO ret #if defined NOT_IN_libc #define SYSCALL_ERROR __local_syscall_error #ifdef PIC - #ifdef __NDS32_N1213_43U1H__ - #ifdef NDS_ABI_V0 - #define SYSCALL_ERROR_HANDLER \ - __local_syscall_error: pushm $gp, $lp, $sp; \ - jal 1f; \ - sethi $gp, hi20(_GLOBAL_OFFSET_TABLE_); \ - ori $gp, $gp, lo12(_GLOBAL_OFFSET_TABLE_+4); \ - add $gp, $gp, $lp; \ - neg $r5, $r5; \ - push $r5; \ - addi $sp, $sp, -28; \ - bal C_SYMBOL_NAME(__errno_location@PLT); \ - addi $sp, $sp, 28; \ - pop $r1; \ - swi $r1, [$r5]; \ - li $r5, -1; \ - popm $gp, $lp, $sp; \ - 1: ret; - #else - #define SYSCALL_ERROR_HANDLER \ - __local_syscall_error: pushm $gp, $lp, $sp; \ - jal 1f; \ - sethi $gp, hi20(_GLOBAL_OFFSET_TABLE_); \ - ori $gp, $gp, lo12(_GLOBAL_OFFSET_TABLE_+4); \ - add $gp, $gp, $lp; \ - neg $r0, $r0; \ - push $r0; \ - #if defined(NDS32_ABI_2) || defined(NDS32_ABI_2FP) \ - addi $sp, $sp, -4; \ - #else \ - addi $sp, $sp, -28; \ - #endif \ - bal C_SYMBOL_NAME(__errno_location@PLT); \ - #if defined(NDS32_ABI_2) || defined(NDS32_ABI_2FP) \ - addi $sp, $sp, 4; \ - #else \ - addi $sp, $sp, 28; \ - #endif \ - pop $r1; \ - swi $r1, [$r0]; \ - li $r0, -1; \ - popm $gp, $lp, $sp; \ - 1: ret; - #endif - #else - #define SYSCALL_ERROR_HANDLER \ - __local_syscall_error: pushm $gp, $lp, $sp; \ - mfusr $r15, $PC; \ - sethi $gp, hi20(_GLOBAL_OFFSET_TABLE_+4); \ - ori $gp, $gp, lo12(_GLOBAL_OFFSET_TABLE_+8); \ - add $gp, $gp, $r15; \ - neg $r0, $r0; \ - push $r0; \ - #if defined(NDS32_ABI_2) || defined(NDS32_ABI_2FP) \ - addi $sp, $sp, -4; \ - #else \ - addi $sp, $sp, -28; \ - #endif \ - bal C_SYMBOL_NAME(__errno_location@PLT); \ - #if defined(NDS32_ABI_2) || defined(NDS32_ABI_2FP) \ - addi $sp, $sp, 4; \ - #else \ - addi $sp, $sp, 28; \ - #endif \ - pop $r1; \ - swi $r1, [$r0]; \ - li $r0, -1; \ - popm $gp, $lp, $sp; \ - 1: ret; - #endif + #define SYSCALL_ERROR_HANDLER \ + __local_syscall_error: \ + pushm $gp, $lp; \ + cfi_adjust_cfa_offset(8) \ + cfi_rel_offset(gp, 0) \ + cfi_rel_offset(lp, 4) \ + mfusr $r15, $PC; \ + sethi $gp, hi20(_GLOBAL_OFFSET_TABLE_+4); \ + ori $gp, $gp, lo12(_GLOBAL_OFFSET_TABLE_+8); \ + add $gp, $gp, $r15; \ + neg $r0, $r0; \ + push $r0; \ + cfi_adjust_cfa_offset(4) \ + cfi_rel_offset(r0, 0) \ + addi $sp, $sp, -4; \ + bal C_SYMBOL_NAME(__errno_location@PLT); \ + addi $sp, $sp, 4; \ + pop $r1; \ + cfi_adjust_cfa_offset(-4); \ + cfi_restore(r1); \ + swi $r1, [$r0]; \ + li $r0, -1; \ + popm $gp, $lp; \ + cfi_adjust_cfa_offset(-8); \ + cfi_restore(lp); \ + cfi_restore(gp); \ + 1: ret; #else - #ifdef NDS_ABI_V0 - #define SYSCALL_ERROR_HANDLER \ - __local_syscall_error: push $lp; \ - neg $r5, $r5; \ - push $r5; \ - addi $sp, $sp, -28; \ - bal C_SYMBOL_NAME(__errno_location); \ - addi $sp, $sp, 28; \ - pop $r1; \ - swi $r1, [$r5]; \ - li $r5, -1; \ - pop $lp; \ + #define SYSCALL_ERROR_HANDLER \ + __local_syscall_error: \ + push $lp; \ + cfi_adjust_cfa_offset(4) \ + cfi_rel_offset(lp, 0) \ + neg $r0, $r0; \ + push $r0; \ + cfi_adjust_cfa_offset(4) \ + cfi_rel_offset(r0, 0) \ + addi $sp, $sp, -4; \ + bal C_SYMBOL_NAME(__errno_location); \ + addi $sp, $sp, 4; \ + pop $r1; \ + cfi_adjust_cfa_offset(-4); \ + cfi_restore(r1); \ + swi $r1, [$r0]; \ + li $r0, -1; \ + pop $lp; \ + cfi_adjust_cfa_offset(-4); \ + cfi_restore(lp); \ ret; - #else - #define SYSCALL_ERROR_HANDLER \ - __local_syscall_error: push $lp; \ - neg $r0, $r0; \ - push $r0; \ - #if defined(NDS32_ABI_2) || defined(NDS32_ABI_2FP) \ - addi $sp, $sp, -4; \ - #else \ - addi $sp, $sp, -28; \ - #endif \ - bal C_SYMBOL_NAME(__errno_location); \ - #if defined(NDS32_ABI_2) || defined(NDS32_ABI_2FP) \ - addi $sp, $sp, 4; \ - #else \ - addi $sp, $sp, 28; \ - #endif \ - pop $r1; \ - swi $r1, [$r0]; \ - li $r0, -1; \ - pop $lp; \ - ret; - #endif #endif #else #define SYSCALL_ERROR_HANDLER #define SYSCALL_ERROR __syscall_error #endif + #endif /* __ASSEMBLER__ */ +#endif //_LINUX_NDS32_SYSDEP_H -- cgit v1.2.3