summaryrefslogtreecommitdiffstats
path: root/libc/sysdeps/linux/cris/sysdep.h
diff options
context:
space:
mode:
Diffstat (limited to 'libc/sysdeps/linux/cris/sysdep.h')
-rw-r--r--libc/sysdeps/linux/cris/sysdep.h79
1 files changed, 55 insertions, 24 deletions
diff --git a/libc/sysdeps/linux/cris/sysdep.h b/libc/sysdeps/linux/cris/sysdep.h
index b441ff122..593e7772e 100644
--- a/libc/sysdeps/linux/cris/sysdep.h
+++ b/libc/sysdeps/linux/cris/sysdep.h
@@ -40,9 +40,13 @@
#define END(sym)
#endif
-#define C_SYMBOL_NAME(name) name
+#undef SYS_ify
+#define SYS_ify(syscall_name) (__NR_##syscall_name)
-#ifdef __ASSEMBLER__
+#ifdef __ASSEMBLER__
+
+#undef SYS_ify
+#define SYS_ify(syscall_name) __NR_##syscall_name
/* Syntactic details of assembly-code. */
@@ -54,24 +58,54 @@
of relying on hearsay. */
#define ALIGNARG(log2) log2
-#define ASM_GLOBAL_DIRECTIVE .globl
#define ASM_TYPE_DIRECTIVE(name,typearg) .type name,typearg
#define ASM_SIZE_DIRECTIVE(name) .size name,.-name
/* The non-PIC jump is preferred, since it does not stall, and does not
invoke generation of a PLT. These macros assume that $r0 is set up as
GOT register. */
+#ifdef __arch_v32
+#ifdef __PIC__
+#define PLTJUMP(_x) \
+ ba C_SYMBOL_NAME (_x):PLT @ \
+ nop
+
+#define PLTCALL(_x) \
+ bsr C_SYMBOL_NAME (_x):PLT @ \
+ nop
+
+#define SETUP_PIC \
+ subq 4,$sp @ \
+ move.d $r0,[$sp] @ \
+ lapc _GLOBAL_OFFSET_TABLE_,$r0
+
+#define TEARDOWN_PIC move.d [$sp+],$r0
+#else
+#define PLTJUMP(_x) \
+ ba C_SYMBOL_NAME (_x) @ \
+ nop
+
+#define PLTCALL(_x) \
+ bsr C_SYMBOL_NAME (_x) @ \
+ nop
+
+#define SETUP_PIC
+#define TEARDOWN_PIC
+#endif
+
+#else
+
#ifdef __PIC__
#define PLTJUMP(_x) \
- add.d C_SYMBOL_NAME (_x):PLT,$pc
+ add.d C_SYMBOL_NAME (_x):PLT,$pc
#define PLTCALL(_x) \
jsr [$r0+C_SYMBOL_NAME (_x):GOTPLT16]
#define SETUP_PIC \
- push $r0 @ \
+ push $r0 @ \
move.d $pc,$r0 @ \
- sub.d .:GOTOFF,$r0
+ sub.d .:GOTOFF,$r0
#define TEARDOWN_PIC pop $r0
#else
@@ -81,38 +115,35 @@
#define TEARDOWN_PIC
#endif
+#endif /* __arch_v32 */
+
/* Define an entry point visible from C. */
-#define ENTRY(name) \
+#define ENTRY(name) \
.text @ \
ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME (name) @ \
ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME (name), function) @ \
.align ALIGNARG (2) @ \
- C_LABEL(name) @ \
- CALL_MCOUNT
+ C_LABEL(name)
-#undef END
+#undef END
#define END(name) \
ASM_SIZE_DIRECTIVE (C_SYMBOL_NAME (name))
#define PSEUDO(name, syscall_name, args) \
- ENTRY (name) @ \
- DOARGS_##args @ \
- movu.w SYS_ify (syscall_name),$r9 @ \
- break 13 @ \
- cmps.w -4096,$r10 @ \
- bhs 0f @ \
- nop @ \
+ ENTRY (name) @ \
+ DOARGS_##args @ \
+ movu.w SYS_ify (syscall_name),$r9 @ \
+ break 13 @ \
+ cmps.w -4096,$r10 @ \
+ bhs 0f @ \
+ nop @ \
UNDOARGS_return_##args
#define PSEUDO_END(name) \
-0: @ \
- SETUP_PIC @ \
- PLTJUMP (__syscall_error) @ \
+0: @ \
+ SETUP_PIC @ \
+ PLTJUMP (__syscall_error) @ \
END (name)
-/* If compiled for profiling, do nothing */
-#define CALL_MCOUNT /* Do nothing. */
-
-
#endif /* __ASSEMBLER__ */
#endif /* _SYSDEP_H_ */