]> git.ipfire.org Git - thirdparty/glibc.git/blobdiff - sysdeps/unix/sysv/linux/x86_64/sysdep.h
2.5-18.1
[thirdparty/glibc.git] / sysdeps / unix / sysv / linux / x86_64 / sysdep.h
index fd92d7ae16d13d97c14bb17f02eaaff1e6f69487..5dfffca455a720af36eab6964bb2a027279b90fb 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001,02,03,04 Free Software Foundation, Inc.
+/* Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
 # define SYSCALL_ERROR_HANDLER                 \
 0:                                             \
   leaq rtld_errno(%rip), %rcx;                 \
-  xorq %rdx, %rdx;                             \
+  xorl %edx, %edx;                             \
   subq %rax, %rdx;                             \
   movl %edx, (%rcx);                           \
   orq $-1, %rax;                               \
 # define SYSCALL_ERROR_HANDLER                 \
 0:                                             \
   movq SYSCALL_ERROR_ERRNO@GOTTPOFF(%rip), %rcx;\
-  xorq %rdx, %rdx;                             \
+  xorl %edx, %edx;                             \
   subq %rax, %rdx;                             \
   movl %edx, %fs:(%rcx);                       \
   orq $-1, %rax;                               \
    Note that errno occupies only 4 bytes.  */
 # define SYSCALL_ERROR_HANDLER                 \
 0:                                             \
-  xorq %rdx, %rdx;                             \
+  xorl %edx, %edx;                             \
   subq %rax, %rdx;                             \
   pushq %rdx;                                  \
   cfi_adjust_cfa_offset(8);                    \
 #else /* Not _LIBC_REENTRANT.  */
 # define SYSCALL_ERROR_HANDLER                 \
 0:movq errno@GOTPCREL(%RIP), %rcx;             \
-  xorq %rdx, %rdx;                             \
+  xorl %edx, %edx;                             \
   subq %rax, %rdx;                             \
   movl %edx, (%rcx);                           \
   orq $-1, %rax;                               \
 #undef DO_CALL
 #define DO_CALL(syscall_name, args)            \
     DOARGS_##args                              \
-    movq $SYS_ify (syscall_name), %rax;                \
+    movl $SYS_ify (syscall_name), %eax;                \
     syscall;
 
 #define DOARGS_0 /* nothing */
 
 #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.  */
+# ifdef __ASSEMBLER__
+#  define PTR_MANGLE(reg)      xorq __pointer_chk_guard_local(%rip), reg
+#  define PTR_DEMANGLE(reg)    PTR_MANGLE (reg)
+# else
+#  define PTR_MANGLE(reg)      asm ("xorq __pointer_chk_guard_local(%%rip), %0"\
+                                    : "=r" (reg) : "0" (reg))
+#  define PTR_DEMANGLE(reg)    PTR_MANGLE (reg)
+# endif
+#else
+# ifdef __ASSEMBLER__
+#  define PTR_MANGLE(reg)      xorq %fs:POINTER_GUARD, reg
+#  define PTR_DEMANGLE(reg)    PTR_MANGLE (reg)
+# else
+#  define PTR_MANGLE(var)      asm ("xorq %%fs:%c2, %0"                      \
+                                    : "=r" (var)                             \
+                                    : "0" (var),                             \
+                                      "i" (offsetof (tcbhead_t,              \
+                                                     pointer_guard)))
+#  define PTR_DEMANGLE(var)    PTR_MANGLE (var)
+# endif
+#endif
+
 #endif /* linux/x86_64/sysdep.h */