|
@@ -273,5 +273,24 @@
|
|
|
.align 2; \
|
|
|
1: .long SYS_ify (syscall_name); \
|
|
|
2:
|
|
|
-
|
|
|
#endif /* __ASSEMBLER__ */
|
|
|
+
|
|
|
+/* Pointer mangling support. */
|
|
|
+#if defined NOT_IN_libc && defined IS_IN_rtld
|
|
|
+/* We cannot use the thread descriptor because in ld.so we use setjmp
|
|
|
+ earlier than the descriptor is initialized. Using a global variable
|
|
|
+ is too complicated here since we have no PC-relative addressing mode. */
|
|
|
+#else
|
|
|
+# ifdef __ASSEMBLER__
|
|
|
+# define PTR_MANGLE(reg, tmp) \
|
|
|
+ stc gbr,tmp; mov.l @(POINTER_GUARD,tmp),tmp; xor tmp,reg
|
|
|
+# define PTR_MANGLE2(reg, tmp) xor tmp,reg
|
|
|
+# define PTR_DEMANGLE(reg, tmp) PTR_MANGLE (reg, tmp)
|
|
|
+# define PTR_DEMANGLE2(reg, tmp) PTR_MANGLE2 (reg, tmp)
|
|
|
+# else
|
|
|
+# define PTR_MANGLE(var) \
|
|
|
+ (var) = (void *) ((uintptr_t) (var) ^ THREAD_GET_POINTER_GUARD ())
|
|
|
+# define PTR_DEMANGLE(var) PTR_MANGLE (var)
|
|
|
+# endif
|
|
|
+#endif
|
|
|
+
|