[Arm-dev] backport request to fix a glibc bug in CentOS 7 aarch64

Thu Oct 15 17:15:21 UTC 2015
Stefano Stabellini <stefano.stabellini at eu.citrix.com>

On Wed, 14 Oct 2015, Jim Perrin wrote:
> On 10/13/2015 03:47 PM, Jim Perrin wrote:
> > 
> > 
> > On 10/13/2015 05:13 AM, Stefano Stabellini wrote:
> > 
> >> Any chances we can have that patch in the CentOS 7 aarch64 glibc?
> > 
> > I'll take a look at including it, if you'd be willing to test it out
> > before we consider pushing it as an update.
> > 
> > 
> 
> This patch does not apply to our existing glibc package as there is no
> sysdeps/unix/sysv/linux/aarch64/* to update. If you can come up with a
> patch that addresses the issue you're trying to fix, we can give it a shot.

The same code leaves under ports/ in our glibc package. I have prepended
ports/ in the patch filenames (see below) and it works fine.


diff --git a/ports/sysdeps/unix/sysv/linux/aarch64/sys/procfs.h b/ports/sysdeps/unix/sysv/linux/aarch64/sys/procfs.h
index b02af8a..211227c 100644
--- a/ports/sysdeps/unix/sysv/linux/aarch64/sys/procfs.h
+++ b/ports/sysdeps/unix/sysv/linux/aarch64/sys/procfs.h
@@ -33,17 +33,6 @@
 #include <sys/types.h>
 #include <sys/user.h>
 
-/* We need to see the definition of struct pt_regs but do not want the
-   linux PTRACE_* defines since they conflict with the generic eglibc
-   definitions in sys/ptrace.h Hence the undef's below.  */
-#include <asm/ptrace.h>
-
-#undef PTRACE_GET_THREAD_AREA
-#undef PTRACE_GETHBPREGS
-#undef PTRACE_SETHBPREGS
-
-#include <sys/user.h>
-
 __BEGIN_DECLS
 
 /* Type for a general-purpose register.  */
@@ -53,11 +42,11 @@ typedef unsigned long elf_greg_t;
    pt_regs' directly in the typedef, but tradition says that
    the register set is an array, which does have some peculiar
    semantics, so leave it that way.  */
-#define ELF_NGREG (sizeof (struct user_pt_regs) / sizeof(elf_greg_t))
+#define ELF_NGREG (sizeof (struct user_regs_struct) / sizeof(elf_greg_t))
 typedef elf_greg_t elf_gregset_t[ELF_NGREG];
 
 /* Register set for the floating-point registers.  */
-typedef struct user_fpsimd_state elf_fpregset_t;
+typedef struct user_fpsimd_struct elf_fpregset_t;
 
 /* Signal info.  */
 struct elf_siginfo
diff --git a/ports/sysdeps/unix/sysv/linux/aarch64/sys/user.h b/ports/sysdeps/unix/sysv/linux/aarch64/sys/user.h
index eceeb38..0ca2715 100644
--- a/ports/sysdeps/unix/sysv/linux/aarch64/sys/user.h
+++ b/ports/sysdeps/unix/sysv/linux/aarch64/sys/user.h
@@ -19,13 +19,19 @@
 #ifndef _SYS_USER_H
 #define _SYS_USER_H	1
 
-/* We need to see the definition of struct pt_regs but do not want the
-   linux PTRACE_* defines since they conflict with the generic glibc
-   definitions in sys/ptrace.h Hence the undef's below.  */
-#include <asm/ptrace.h>
-
-#undef PTRACE_GET_THREAD_AREA
-#undef PTRACE_GETHBPREGS
-#undef PTRACE_SETHBPREGS
+struct user_regs_struct
+{
+  unsigned long long regs[31];
+  unsigned long long sp;
+  unsigned long long pc;
+  unsigned long long pstate;
+};
+
+struct user_fpsimd_struct
+{
+  __uint128_t  vregs[32];
+  unsigned int fpsr;
+  unsigned int fpcr;
+};
 
 #endif