From ee92c0fe5c1b9d59508273916e2c9a75b68dbc13 Mon Sep 17 00:00:00 2001 From: Waldemar Brodkorb Date: Thu, 21 Apr 2016 01:25:29 +0200 Subject: nds32: add support for new architecture Add support for Andes Technology NDS32 architecture. See here http://www.andestech.com/en/index/index.htm for more informaton. Verification of the port from an older uClibc port was done on a sponsored AG101p board. The testsuite only has 5 errors, three are related to an existing bug in dlclose() with LT.old, also happening on cris32 and m68k. Failures to fallocate/posix_fallocate are unresolved. Thanks to Andes Technology sponsoring the hardware and being very helpful while doing the uClibc-ng porting. Signed-off-by: Waldemar Brodkorb --- libc/sysdeps/linux/nds32/sysdep.h | 271 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 271 insertions(+) create mode 100644 libc/sysdeps/linux/nds32/sysdep.h (limited to 'libc/sysdeps/linux/nds32/sysdep.h') diff --git a/libc/sysdeps/linux/nds32/sysdep.h b/libc/sysdeps/linux/nds32/sysdep.h new file mode 100644 index 000000000..7472a99d4 --- /dev/null +++ b/libc/sysdeps/linux/nds32/sysdep.h @@ -0,0 +1,271 @@ +//#include +#ifdef __ASSEMBLER__ +/* Define an entry point visible from C. */ +#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) \ + .align 2; \ + .globl C_SYMBOL_NAME(name); \ + .func C_SYMBOL_NAME(name); \ + .type C_SYMBOL_NAME(name), @function; \ +C_SYMBOL_NAME(name): +#endif + +#undef END +#define END(name) \ + .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 + #undef NO_UNDERSCORES + #define NO_UNDERSCORES +#endif + +#ifdef NO_UNDERSCORES + #define syscall_error __syscall_error +#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); \ + 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; \ + 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; \ + 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 + + +#define PSEUDO_NOERRNO(name, syscall_name, args) \ + ENTRY(name); \ + __do_syscall(syscall_name); + +#undef PSEUDO_END +#define PSEUDO_END(sym) \ + SYSCALL_ERROR_HANDLER \ + END(sym) + +#undef PSEUDO_END_ERRVAL +#define PSEUDO_END_ERRVAL(sym) END(sym) + +#define PSEUDO_ERRVAL(name, syscall_name, args) PSEUDO_NOERRNO(name, syscall_name, args) + +#define ret_ERRVAL 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 + #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; \ + 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__ */ -- cgit v1.2.3