Module Name:    src
Committed By:   martin
Date:           Tue Nov 25 15:07:37 UTC 2014

Modified Files:
        src/lib/libc/arch/x86_64/sys [netbsd-7]: ptrace.S

Log Message:
Pull up following revision(s) (requested by christos in ticket #263):
        lib/libc/arch/x86_64/sys/ptrace.S: revision 1.6
Fix ptrace %rcx corruption when pthread_errno() is used. Small example:
    #include <sys/types.h>
    #include <stdio.h>
    #include <sys/ptrace.h>
    int main(void) { ptrace(18, getpid(), NULL, 0xabcd); }
The -lpthread cases pases 0 instead of 0xabcd


To generate a diff of this commit:
cvs rdiff -u -r1.5 -r1.5.2.1 src/lib/libc/arch/x86_64/sys/ptrace.S

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/lib/libc/arch/x86_64/sys/ptrace.S
diff -u src/lib/libc/arch/x86_64/sys/ptrace.S:1.5 src/lib/libc/arch/x86_64/sys/ptrace.S:1.5.2.1
--- src/lib/libc/arch/x86_64/sys/ptrace.S:1.5	Thu May 22 15:01:57 2014
+++ src/lib/libc/arch/x86_64/sys/ptrace.S	Tue Nov 25 15:07:37 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: ptrace.S,v 1.5 2014/05/22 15:01:57 uebayasi Exp $	*/
+/*	$NetBSD: ptrace.S,v 1.5.2.1 2014/11/25 15:07:37 martin Exp $	*/
 
 /*-
  * Copyright (c) 1990 The Regents of the University of California.
@@ -36,7 +36,7 @@
 
 #include <machine/asm.h>
 #if defined(SYSLIBC_SCCS) && !defined(lint)
-	RCSID("$NetBSD: ptrace.S,v 1.5 2014/05/22 15:01:57 uebayasi Exp $")
+	RCSID("$NetBSD: ptrace.S,v 1.5.2.1 2014/11/25 15:07:37 martin Exp $")
 #endif /* SYSLIBC_SCCS and not lint */
 
 #include "SYS.h"
@@ -44,12 +44,21 @@
 	.globl	_C_LABEL(__errno)
 
 ENTRY(ptrace)
+	/*
+	 * The following code calls __errno() to set it to 0 before
+	 * calling ptrace(2). The libc version of __errno() does not use
+	 * any registers, but the libpthread version clobbers %rcx
+	 * before we get a chance to store it in %r10. So we save it
+	 * in %r10 and restore it.
+	 */
+	movq	%rcx, %r10
 #ifdef __PIC__
 	call	PIC_PLT(_C_LABEL(__errno))
 #else
 	call	_C_LABEL(__errno)
 #endif /* __PIC__ */
 	movl	$0,(%rax)
+	movq	%r10, %rcx
 	SYSTRAP(ptrace)
 	jc	err
 	ret

Reply via email to