Mark Wielaard 7e31ec
commit 5df2dc63e96808afb1602d4338e30dbca560a656
Mark Wielaard 7e31ec
Author: Kyle McMartin <kyle@redhat.com>
Mark Wielaard 7e31ec
Date:   Mon Jun 9 21:06:26 2014 +0200
Mark Wielaard 7e31ec
Mark Wielaard 7e31ec
    aarch64: use <sys/user.h> defined register structures
Mark Wielaard 7e31ec
    
Mark Wielaard 7e31ec
    glibc now supplies these (compatible) structs instead of including the
Mark Wielaard 7e31ec
    kernel's <asm/ptrace.h> header, so let's use them. Annoyingly this will
Mark Wielaard 7e31ec
    cause new elfutils to FTBFS on old glibc, and vice versa. So include a
Mark Wielaard 7e31ec
    new configure check for the new struct names and use the old ones if
Mark Wielaard 7e31ec
    they are not avilable.
Mark Wielaard 7e31ec
    
Mark Wielaard 7e31ec
    Signed-off-by: Kyle McMartin <kyle@redhat.com>
Mark Wielaard 7e31ec
    Signed-off-by: Mark Wielaard <mjw@redhat.com>
Mark Wielaard 7e31ec
Kyle McMartin 2e16ca
diff --git a/backends/aarch64_initreg.c b/backends/aarch64_initreg.c
Mark Wielaard 7e31ec
index 2492d56..9706205 100644
Kyle McMartin 2e16ca
--- a/backends/aarch64_initreg.c
Kyle McMartin 2e16ca
+++ b/backends/aarch64_initreg.c
Mark Wielaard 7e31ec
@@ -1,5 +1,5 @@
Mark Wielaard 7e31ec
 /* Fetch live process registers from TID.
Mark Wielaard 7e31ec
-   Copyright (C) 2013 Red Hat, Inc.
Mark Wielaard 7e31ec
+   Copyright (C) 2013, 2014 Red Hat, Inc.
Mark Wielaard 7e31ec
    This file is part of elfutils.
Mark Wielaard 7e31ec
 
Mark Wielaard 7e31ec
    This file is free software; you can redistribute it and/or modify
Mark Wielaard 7e31ec
@@ -36,6 +36,11 @@
Mark Wielaard 7e31ec
 # include <linux/uio.h>
Mark Wielaard 7e31ec
 # include <sys/user.h>
Mark Wielaard 7e31ec
 # include <sys/ptrace.h>
Mark Wielaard 7e31ec
+/* Deal with old glibc defining user_pt_regs instead of user_regs_struct.  */
Mark Wielaard 7e31ec
+# ifndef HAVE_SYS_USER_REGS
Mark Wielaard 7e31ec
+#  define user_regs_struct user_pt_regs
Mark Wielaard 7e31ec
+#  define user_fpsimd_struct user_fpsimd_state
Mark Wielaard 7e31ec
+# endif
Mark Wielaard 7e31ec
 #endif
Mark Wielaard 7e31ec
 
Mark Wielaard 7e31ec
 #define BACKEND aarch64_
Mark Wielaard 7e31ec
@@ -51,7 +56,7 @@ aarch64_set_initial_registers_tid (pid_t tid __attribute__ ((unused)),
Kyle McMartin 2e16ca
 #else /* __aarch64__ */
Kyle McMartin 2e16ca
 
Kyle McMartin 2e16ca
   /* General registers.  */
Kyle McMartin 2e16ca
-  struct user_pt_regs gregs;
Kyle McMartin 2e16ca
+  struct user_regs_struct gregs;
Kyle McMartin 2e16ca
   struct iovec iovec;
Kyle McMartin 2e16ca
   iovec.iov_base = &gregs;
Kyle McMartin 2e16ca
   iovec.iov_len = sizeof (gregs);
Mark Wielaard 7e31ec
@@ -69,7 +74,7 @@ aarch64_set_initial_registers_tid (pid_t tid __attribute__ ((unused)),
Kyle McMartin 2e16ca
   /* ELR cannot be found.  */
Kyle McMartin 2e16ca
 
Kyle McMartin 2e16ca
   /* FP registers (only 64bits are used).  */
Kyle McMartin 2e16ca
-  struct user_fpsimd_state fregs;
Kyle McMartin 2e16ca
+  struct user_fpsimd_struct fregs;
Kyle McMartin 2e16ca
   iovec.iov_base = &fregs;
Kyle McMartin 2e16ca
   iovec.iov_len = sizeof (fregs);
Kyle McMartin 2e16ca
   if (ptrace (PTRACE_GETREGSET, tid, NT_FPREGSET, &iovec) != 0)
Kyle McMartin 2e16ca
diff --git a/backends/arm_initreg.c b/backends/arm_initreg.c
Mark Wielaard 7e31ec
index 5837383..a0a9be9 100644
Kyle McMartin 2e16ca
--- a/backends/arm_initreg.c
Kyle McMartin 2e16ca
+++ b/backends/arm_initreg.c
Mark Wielaard 7e31ec
@@ -40,6 +40,10 @@
Mark Wielaard 7e31ec
 # include <linux/uio.h>
Mark Wielaard 7e31ec
 # include <sys/user.h>
Mark Wielaard 7e31ec
 # include <sys/ptrace.h>
Mark Wielaard 7e31ec
+/* Deal with old glibc defining user_pt_regs instead of user_regs_struct.  */
Mark Wielaard 7e31ec
+# ifndef HAVE_SYS_USER_REGS
Mark Wielaard 7e31ec
+#  define user_regs_struct user_pt_regs
Mark Wielaard 7e31ec
+# endif
Mark Wielaard 7e31ec
 #endif
Mark Wielaard 7e31ec
 
Mark Wielaard 7e31ec
 #define BACKEND arm_
Mark Wielaard 7e31ec
@@ -67,7 +71,7 @@ arm_set_initial_registers_tid (pid_t tid __attribute__ ((unused)),
Kyle McMartin 2e16ca
 #elif defined __aarch64__
Kyle McMartin 2e16ca
   /* Compat mode: arm compatible code running on aarch64 */
Kyle McMartin 2e16ca
   int i;
Kyle McMartin 2e16ca
-  struct user_pt_regs gregs;
Kyle McMartin 2e16ca
+  struct user_regs_struct gregs;
Kyle McMartin 2e16ca
   struct iovec iovec;
Kyle McMartin 2e16ca
   iovec.iov_base = &gregs;
Kyle McMartin 2e16ca
   iovec.iov_len = sizeof (gregs);
Mark Wielaard 7e31ec
diff --git a/configure.ac b/configure.ac
Mark Wielaard 7e31ec
index 1d79597..f9c3c30 100644
Mark Wielaard 7e31ec
--- a/configure.ac
Mark Wielaard 7e31ec
+++ b/configure.ac
Mark Wielaard 7e31ec
@@ -301,6 +301,19 @@ eu_version=$(( (eu_version + 999) / 1000 ))
Mark Wielaard 7e31ec
 
Mark Wielaard 7e31ec
 AC_CHECK_SIZEOF(long)
Mark Wielaard 7e31ec
 
Mark Wielaard 7e31ec
+# On aarch64 before glibc 2.20 we would get the kernel user_pt_regs instead
Mark Wielaard 7e31ec
+# of the user_regs_struct from sys/user.h. They are structurally the same
Mark Wielaard 7e31ec
+# but we get either one or the other.
Mark Wielaard 7e31ec
+AC_CHECK_TYPE([struct user_regs_struct],
Mark Wielaard 7e31ec
+              [sys_user_has_user_regs=yes], [sys_user_has_user_regs=no],
Mark Wielaard 7e31ec
+              [[#include <sys/ptrace.h>]
Mark Wielaard 7e31ec
+               [#include <sys/time.h>]
Mark Wielaard 7e31ec
+               [#include <sys/user.h>]])
Mark Wielaard 7e31ec
+if test "$sys_user_has_user_regs" = "yes"; then
Mark Wielaard 7e31ec
+  AC_DEFINE(HAVE_SYS_USER_REGS, 1,
Mark Wielaard 7e31ec
+            [Define to 1 if <sys/user.h> defines struct user_regs_struct])
Mark Wielaard 7e31ec
+fi
Mark Wielaard 7e31ec
+
Mark Wielaard 7e31ec
 # On a 64-bit host where can can use $CC -m32, we'll run two sets of tests.
Mark Wielaard 7e31ec
 # Likewise in a 32-bit build on a host where $CC -m64 works.
Mark Wielaard 7e31ec
 utrace_BIARCH
Mark Wielaard 7e31ec
diff -ur elfutils-0.159.orig/configure elfutils-0.159/configure
Mark Wielaard 7e31ec
--- elfutils-0.159.orig/configure	2014-07-18 14:30:42.842641862 +0200
Mark Wielaard 7e31ec
+++ elfutils-0.159/configure	2014-07-18 14:31:24.142166792 +0200
Mark Wielaard 7e31ec
@@ -1939,6 +1939,60 @@
Mark Wielaard 7e31ec
   eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
Mark Wielaard 7e31ec
 
Mark Wielaard 7e31ec
 } # ac_fn_c_check_header_compile
Mark Wielaard 7e31ec
+
Mark Wielaard 7e31ec
+# ac_fn_c_check_type LINENO TYPE VAR INCLUDES
Mark Wielaard 7e31ec
+# -------------------------------------------
Mark Wielaard 7e31ec
+# Tests whether TYPE exists after having included INCLUDES, setting cache
Mark Wielaard 7e31ec
+# variable VAR accordingly.
Mark Wielaard 7e31ec
+ac_fn_c_check_type ()
Mark Wielaard 7e31ec
+{
Mark Wielaard 7e31ec
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
Mark Wielaard 7e31ec
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
Mark Wielaard 7e31ec
+$as_echo_n "checking for $2... " >&6; }
Mark Wielaard 7e31ec
+if eval \${$3+:} false; then :
Mark Wielaard 7e31ec
+  $as_echo_n "(cached) " >&6
Mark Wielaard 7e31ec
+else
Mark Wielaard 7e31ec
+  eval "$3=no"
Mark Wielaard 7e31ec
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
Mark Wielaard 7e31ec
+/* end confdefs.h.  */
Mark Wielaard 7e31ec
+$4
Mark Wielaard 7e31ec
+int
Mark Wielaard 7e31ec
+main ()
Mark Wielaard 7e31ec
+{
Mark Wielaard 7e31ec
+if (sizeof ($2))
Mark Wielaard 7e31ec
+	 return 0;
Mark Wielaard 7e31ec
+  ;
Mark Wielaard 7e31ec
+  return 0;
Mark Wielaard 7e31ec
+}
Mark Wielaard 7e31ec
+_ACEOF
Mark Wielaard 7e31ec
+if ac_fn_c_try_compile "$LINENO"; then :
Mark Wielaard 7e31ec
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
Mark Wielaard 7e31ec
+/* end confdefs.h.  */
Mark Wielaard 7e31ec
+$4
Mark Wielaard 7e31ec
+int
Mark Wielaard 7e31ec
+main ()
Mark Wielaard 7e31ec
+{
Mark Wielaard 7e31ec
+if (sizeof (($2)))
Mark Wielaard 7e31ec
+	    return 0;
Mark Wielaard 7e31ec
+  ;
Mark Wielaard 7e31ec
+  return 0;
Mark Wielaard 7e31ec
+}
Mark Wielaard 7e31ec
+_ACEOF
Mark Wielaard 7e31ec
+if ac_fn_c_try_compile "$LINENO"; then :
Mark Wielaard 7e31ec
+
Mark Wielaard 7e31ec
+else
Mark Wielaard 7e31ec
+  eval "$3=yes"
Mark Wielaard 7e31ec
+fi
Mark Wielaard 7e31ec
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
Mark Wielaard 7e31ec
+fi
Mark Wielaard 7e31ec
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
Mark Wielaard 7e31ec
+fi
Mark Wielaard 7e31ec
+eval ac_res=\$$3
Mark Wielaard 7e31ec
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
Mark Wielaard 7e31ec
+$as_echo "$ac_res" >&6; }
Mark Wielaard 7e31ec
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
Mark Wielaard 7e31ec
+
Mark Wielaard 7e31ec
+} # ac_fn_c_check_type
Mark Wielaard 7e31ec
 cat >config.log <<_ACEOF
Mark Wielaard 7e31ec
 This file contains any messages produced by compilers while
Mark Wielaard 7e31ec
 running configure, to aid debugging if configure makes a mistake.
Mark Wielaard 7e31ec
@@ -6233,6 +6287,25 @@
Mark Wielaard 7e31ec
 
Mark Wielaard 7e31ec
 
Mark Wielaard 7e31ec
 
Mark Wielaard 7e31ec
+# On aarch64 before glibc 2.20 we would get the kernel user_pt_regs instead
Mark Wielaard 7e31ec
+# of the user_regs_struct from sys/user.h. They are structurally the same
Mark Wielaard 7e31ec
+# but we get either one or the other.
Mark Wielaard 7e31ec
+ac_fn_c_check_type "$LINENO" "struct user_regs_struct" "ac_cv_type_struct_user_regs_struct" "#include <sys/ptrace.h>
Mark Wielaard 7e31ec
+               #include <sys/time.h>
Mark Wielaard 7e31ec
+               #include <sys/user.h>
Mark Wielaard 7e31ec
+"
Mark Wielaard 7e31ec
+if test "x$ac_cv_type_struct_user_regs_struct" = xyes; then :
Mark Wielaard 7e31ec
+  sys_user_has_user_regs=yes
Mark Wielaard 7e31ec
+else
Mark Wielaard 7e31ec
+  sys_user_has_user_regs=no
Mark Wielaard 7e31ec
+fi
Mark Wielaard 7e31ec
+
Mark Wielaard 7e31ec
+if test "$sys_user_has_user_regs" = "yes"; then
Mark Wielaard 7e31ec
+
Mark Wielaard 7e31ec
+$as_echo "#define HAVE_SYS_USER_REGS 1" >>confdefs.h
Mark Wielaard 7e31ec
+
Mark Wielaard 7e31ec
+fi
Mark Wielaard 7e31ec
+
Mark Wielaard 7e31ec
 # On a 64-bit host where can can use $CC -m32, we'll run two sets of tests.
Mark Wielaard 7e31ec
 # Likewise in a 32-bit build on a host where $CC -m64 works.
Mark Wielaard 7e31ec
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking $CC option for 32-bit word size" >&5
Mark Wielaard 7e31ec
--- elfutils-0.159.orig/config.h.in	2014-07-18 14:30:42.813641492 +0200
Mark Wielaard 7e31ec
+++ elfutils-0.159/config.h.in	2014-07-18 15:19:18.000000000 +0200
Mark Wielaard 7e31ec
@@ -27,6 +27,9 @@
Mark Wielaard 7e31ec
 /* Define to 1 if you have the <sys/types.h> header file. */
Mark Wielaard 7e31ec
 #undef HAVE_SYS_TYPES_H
Mark Wielaard 7e31ec
 
Mark Wielaard 7e31ec
+/* Define to 1 if <sys/user.h> defines struct user_regs_struct */
Mark Wielaard 7e31ec
+#undef HAVE_SYS_USER_REGS
Mark Wielaard 7e31ec
+
Mark Wielaard 7e31ec
 /* Define to 1 if you have the <unistd.h> header file. */
Mark Wielaard 7e31ec
 #undef HAVE_UNISTD_H
Mark Wielaard 7e31ec