| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 | /* * 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 <common/sysdep.h>#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):			\	        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):			\	        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	#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);# 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;						\  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#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		#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		#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;	#endif#else	#define SYSCALL_ERROR_HANDLER	#define SYSCALL_ERROR __syscall_error#endif#endif	/* __ASSEMBLER__ */#endif //_LINUX_NDS32_SYSDEP_H
 |