From 3305f758cadeaafb6559ddd1219c1bb0b3c8189b Mon Sep 17 00:00:00 2001 From: Simon Schubert Date: Thu, 27 Jul 2006 00:44:27 +0000 Subject: [PATCH] Correct TLS and PIC addressing --- lib/libc/amd64/sys/cerror.S | 25 ++++++++++++++++--------- lib/libc/amd64/sys/ptrace.S | 21 ++++++++++++++++----- 2 files changed, 32 insertions(+), 14 deletions(-) diff --git a/lib/libc/amd64/sys/cerror.S b/lib/libc/amd64/sys/cerror.S index aac9847cef..f66eb006cc 100644 --- a/lib/libc/amd64/sys/cerror.S +++ b/lib/libc/amd64/sys/cerror.S @@ -35,7 +35,7 @@ * * @(#)cerror.s 5.1 (Berkeley) 4/23/90 * $FreeBSD: src/lib/libc/amd64/sys/cerror.S,v 1.13 2003/04/30 18:16:33 peter Exp $ - * $DragonFly: src/lib/libc/amd64/sys/cerror.S,v 1.1 2004/02/02 05:43:14 dillon Exp $ + * $DragonFly: src/lib/libc/amd64/sys/cerror.S,v 1.2 2006/07/27 00:44:27 corecode Exp $ */ #include @@ -44,16 +44,23 @@ .globl HIDENAME(cerror) - /* - * The __error() function is thread aware. For non-threaded - * programs and the initial threaded in threaded programs, - * it returns a pointer to the global errno variable. - */ - .globl CNAME(__error) - .type CNAME(__error),@function HIDENAME(cerror): +#ifdef PIC pushq %rax - call PIC_PLT(CNAME(__error)) +# ifdef __thread + movq PIC_GOT(CNAME(errno)),%rax +# else + leaq errno@TLSGD(%rip),%rdi + call __tls_get_addr@PLT +# endif +#else +# ifdef __thread + leaq CNAME(errno)(%rip),%rax +# else + movq errno@GOTTPOFF(%rip),%rax + addq %fs:0,%rax +# endif +#endif popq %rcx movq %rcx,(%rax) movq $-1,%rax diff --git a/lib/libc/amd64/sys/ptrace.S b/lib/libc/amd64/sys/ptrace.S index c157928ccc..2953517e0c 100644 --- a/lib/libc/amd64/sys/ptrace.S +++ b/lib/libc/amd64/sys/ptrace.S @@ -35,20 +35,31 @@ * * @(#)ptrace.s 5.1 (Berkeley) 4/23/90 * $FreeBSD: src/lib/libc/amd64/sys/ptrace.S,v 1.11 2003/05/24 17:35:23 peter Exp $ - * $DragonFly: src/lib/libc/amd64/sys/ptrace.S,v 1.1 2004/02/02 05:43:14 dillon Exp $ + * $DragonFly: src/lib/libc/amd64/sys/ptrace.S,v 1.2 2006/07/27 00:44:27 corecode Exp $ */ #include #include "SYS.h" ENTRY(ptrace) - xorl %eax,%eax #ifdef PIC - movq PIC_GOT(CNAME(errno)),%r8 - movl %eax,(%r8) +# ifdef __thread + movq PIC_GOT(CNAME(errno)),%rax +# else + pushq %rdi + leaq errno@TLSGD(%rip),%rdi + call __tls_get_addr@PLT + popq %rdi +# endif #else - movl %eax,CNAME(errno)(%rip) +# ifdef __thread + leaq CNAME(errno)(%rip),%rax +# else + movq errno@GOTTPOFF(%rip),%rax + addq %fs:0,%rax +# endif #endif + movl $0,(%rax) mov $SYS_ptrace,%eax KERNCALL jb err -- 2.41.0