Complete sys/procfs.h unification

Message ID alpine.DEB.2.21.1809211940070.20212@digraph.polyomino.org.uk
State New
Headers show
Series
  • Complete sys/procfs.h unification
Related show

Commit Message

Joseph Myers Sept. 21, 2018, 7:40 p.m.
This patch, relative to a tree with
<https://sourceware.org/ml/libc-alpha/2018-09/msg00216.html> and
<https://sourceware.org/ml/libc-alpha/2018-09/msg00362.html> (both
pending review) applied, completes the process of unifying
sys/procfs.h headers for architectures using the Linux kernel by
making alpha use the generic version.

That was previously deferred because alpha has different definitions
of prgregset_t and prfpregset_t from other architectures, so changing
to the common definitions would change C++ name mangling.  To avoid
such a change, a header bits/procfs-prregset.h is added, and alpha
gets its own version of that header.

Tested for x86_64 and x86, and with build-many-glibcs.py.

2018-09-21  Joseph Myers  <joseph@codesourcery.com>

	* sysdeps/unix/sysv/linux/sys/procfs.h: Include
	<bits/procfs-prregset.h>.
	(prgregset_t): Define using __prgregset_t.
	(prfpregset_t): Define using __prfpregset_t.
	* sysdeps/unix/sysv/linux/Makefile [$(subdir) = misc]
	(sysdep_headers): Add bits/procfs-prregset.h.
	* sysdeps/unix/sysv/linux/bits/procfs-prregset.h: New file.
	* sysdeps/unix/sysv/linux/alpha/bits/procfs-prregset.h: Likewise.
	* sysdeps/unix/sysv/linux/alpha/bits/procfs.h: Likewise.
	* sysdeps/unix/sysv/linux/alpha/sys/procfs.h: Remove file.

Comments

Adhemerval Zanella Sept. 25, 2018, 3:08 p.m. | #1
On 21/09/2018 16:40, Joseph Myers wrote:
> This patch, relative to a tree with
> <https://sourceware.org/ml/libc-alpha/2018-09/msg00216.html> and
> <https://sourceware.org/ml/libc-alpha/2018-09/msg00362.html> (both
> pending review) applied, completes the process of unifying
> sys/procfs.h headers for architectures using the Linux kernel by
> making alpha use the generic version.
> 
> That was previously deferred because alpha has different definitions
> of prgregset_t and prfpregset_t from other architectures, so changing
> to the common definitions would change C++ name mangling.  To avoid
> such a change, a header bits/procfs-prregset.h is added, and alpha
> gets its own version of that header.
> 
> Tested for x86_64 and x86, and with build-many-glibcs.py.

Another possible way to increase coverage is to add static asserts with
expected struct size and members offset.  It won't check the expected type
though, and it would require some more arch-specific code to add the
expected values.

> 
> 2018-09-21  Joseph Myers  <joseph@codesourcery.com>
> 
> 	* sysdeps/unix/sysv/linux/sys/procfs.h: Include
> 	<bits/procfs-prregset.h>.
> 	(prgregset_t): Define using __prgregset_t.
> 	(prfpregset_t): Define using __prfpregset_t.
> 	* sysdeps/unix/sysv/linux/Makefile [$(subdir) = misc]
> 	(sysdep_headers): Add bits/procfs-prregset.h.
> 	* sysdeps/unix/sysv/linux/bits/procfs-prregset.h: New file.
> 	* sysdeps/unix/sysv/linux/alpha/bits/procfs-prregset.h: Likewise.
> 	* sysdeps/unix/sysv/linux/alpha/bits/procfs.h: Likewise.
> 	* sysdeps/unix/sysv/linux/alpha/sys/procfs.h: Remove file.

LGTM, thanks.
Joseph Myers Sept. 25, 2018, 4:46 p.m. | #2
On Tue, 25 Sep 2018, Adhemerval Zanella wrote:

> Another possible way to increase coverage is to add static asserts with
> expected struct size and members offset.  It won't check the expected type
> though, and it would require some more arch-specific code to add the
> expected values.

For the record, here is the (unfinished) patch I prepared to test against 
<linux/elfcore.h>.  I then found the problem that the installed uapi 
<linux/elfcore.h> header doesn't actually work, so I couldn't then test if 
the logic in this test patch is actually correct and works when the two 
headers are in sync with each other.  (Obviously once linux/elfcore.h is 
fixed the test will need to become appropriately conditional on the 
version of kernel headers used.)

(I don't assert that the gen-as-const mechanism is necessarily optimal for 
this test - it does mean the data to be compared is unnecessarily 
generated at glibc build time rather than just at test time, for example.  
I think the gen-as-const machinery, involving as it does a combination of 
an awk script and a sed command in Makerules, would be an excellent 
candidate for moving to some common Python infrastructure for extracting 
the values of compile-time constants from C code which could then be used 
both in the glibc build and in test code checking various things about 
such constants, if we get consensus on requiring Python for the build.)

diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile
index 773aaea0e9..78b3667022 100644
--- a/sysdeps/unix/sysv/linux/Makefile
+++ b/sysdeps/unix/sysv/linux/Makefile
@@ -208,3 +208,11 @@ tests += tst-align-clone tst-getpid1 \
 	tst-thread-affinity-sched
 tests-internal += tst-setgetname
 endif
+
+ifeq ($(subdir),nptl_db)
+gen-as-const-headers += procfs-glibc.sym procfs-linux.sym
+tests-special += $(objpfx)tst-sys-procfs.out
+$(objpfx)tst-sys-procfs.out: $(common-objpfx)procfs-glibc.h \
+			     $(common-objpfx)procfs-linux.h
+	diff $^ > $@; $(evaluate-test)
+endif
diff --git a/sysdeps/unix/sysv/linux/procfs-glibc.sym b/sysdeps/unix/sysv/linux/procfs-glibc.sym
new file mode 100644
index 0000000000..bc062e12e1
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/procfs-glibc.sym
@@ -0,0 +1,73 @@
+#include <stddef.h>
+#include <sys/procfs.h>
+
+--
+
+#define MEMBER_SIZE(S, F) sizeof ((S) { 0 }.F)
+
+sizeof_elf_siginfo	sizeof (struct elf_siginfo)
+sizeof_elf_prstatus	sizeof (struct elf_prstatus)
+sizeof_elf_prpsinfo	sizeof (struct elf_prpsinfo)
+
+sizeof_elf_siginfo_si_signo	MEMBER_SIZE (struct elf_siginfo, si_signo)
+offset_elf_siginfo_si_signo	offsetof (struct elf_siginfo, si_signo)
+sizeof_elf_siginfo_si_code	MEMBER_SIZE (struct elf_siginfo, si_code)
+offset_elf_siginfo_si_code	offsetof (struct elf_siginfo, si_code)
+sizeof_elf_siginfo_si_errno	MEMBER_SIZE (struct elf_siginfo, si_errno)
+offset_elf_siginfo_si_errno	offsetof (struct elf_siginfo, si_errno)
+
+sizeof_elf_prstatus_pr_info	MEMBER_SIZE (struct elf_prstatus, pr_info)
+offset_elf_prstatus_pr_info	offsetof (struct elf_prstatus, pr_info)
+sizeof_elf_prstatus_pr_cursig	MEMBER_SIZE (struct elf_prstatus, pr_cursig)
+offset_elf_prstatus_pr_cursig	offsetof (struct elf_prstatus, pr_cursig)
+sizeof_elf_prstatus_pr_sigpend	MEMBER_SIZE (struct elf_prstatus, pr_sigpend)
+offset_elf_prstatus_pr_sigpend	offsetof (struct elf_prstatus, pr_sigpend)
+sizeof_elf_prstatus_pr_sighold	MEMBER_SIZE (struct elf_prstatus, pr_sighold)
+offset_elf_prstatus_pr_sighold	offsetof (struct elf_prstatus, pr_sighold)
+sizeof_elf_prstatus_pr_pid	MEMBER_SIZE (struct elf_prstatus, pr_pid)
+offset_elf_prstatus_pr_pid	offsetof (struct elf_prstatus, pr_pid)
+sizeof_elf_prstatus_pr_ppid	MEMBER_SIZE (struct elf_prstatus, pr_ppid)
+offset_elf_prstatus_pr_ppid	offsetof (struct elf_prstatus, pr_ppid)
+sizeof_elf_prstatus_pr_pgrp	MEMBER_SIZE (struct elf_prstatus, pr_pgrp)
+offset_elf_prstatus_pr_pgrp	offsetof (struct elf_prstatus, pr_pgrp)
+sizeof_elf_prstatus_pr_sid	MEMBER_SIZE (struct elf_prstatus, pr_sid)
+offset_elf_prstatus_pr_sid	offsetof (struct elf_prstatus, pr_sid)
+sizeof_elf_prstatus_pr_utime	MEMBER_SIZE (struct elf_prstatus, pr_utime)
+offset_elf_prstatus_pr_utime	offsetof (struct elf_prstatus, pr_utime)
+sizeof_elf_prstatus_pr_stime	MEMBER_SIZE (struct elf_prstatus, pr_stime)
+offset_elf_prstatus_pr_stime	offsetof (struct elf_prstatus, pr_stime)
+sizeof_elf_prstatus_pr_cutime	MEMBER_SIZE (struct elf_prstatus, pr_cutime)
+offset_elf_prstatus_pr_cutime	offsetof (struct elf_prstatus, pr_cutime)
+sizeof_elf_prstatus_pr_cstime	MEMBER_SIZE (struct elf_prstatus, pr_cstime)
+offset_elf_prstatus_pr_cstime	offsetof (struct elf_prstatus, pr_cstime)
+sizeof_elf_prstatus_pr_reg	MEMBER_SIZE (struct elf_prstatus, pr_reg)
+offset_elf_prstatus_pr_reg	offsetof (struct elf_prstatus, pr_reg)
+sizeof_elf_prstatus_pr_fpvalid	MEMBER_SIZE (struct elf_prstatus, pr_fpvalid)
+offset_elf_prstatus_pr_fpvalid	offsetof (struct elf_prstatus, pr_fpvalid)
+
+sizeof_elf_prpsinfo_pr_state	MEMBER_SIZE (struct elf_prpsinfo, pr_state)
+offset_elf_prpsinfo_pr_state	offsetof (struct elf_prpsinfo, pr_state)
+sizeof_elf_prpsinfo_pr_sname	MEMBER_SIZE (struct elf_prpsinfo, pr_sname)
+offset_elf_prpsinfo_pr_sname	offsetof (struct elf_prpsinfo, pr_sname)
+sizeof_elf_prpsinfo_pr_zomb	MEMBER_SIZE (struct elf_prpsinfo, pr_zomb)
+offset_elf_prpsinfo_pr_zomb	offsetof (struct elf_prpsinfo, pr_zomb)
+sizeof_elf_prpsinfo_pr_nice	MEMBER_SIZE (struct elf_prpsinfo, pr_nice)
+offset_elf_prpsinfo_pr_nice	offsetof (struct elf_prpsinfo, pr_nice)
+sizeof_elf_prpsinfo_pr_flag	MEMBER_SIZE (struct elf_prpsinfo, pr_flag)
+offset_elf_prpsinfo_pr_flag	offsetof (struct elf_prpsinfo, pr_flag)
+sizeof_elf_prpsinfo_pr_uid	MEMBER_SIZE (struct elf_prpsinfo, pr_uid)
+offset_elf_prpsinfo_pr_uid	offsetof (struct elf_prpsinfo, pr_uid)
+sizeof_elf_prpsinfo_pr_gid	MEMBER_SIZE (struct elf_prpsinfo, pr_gid)
+offset_elf_prpsinfo_pr_gid	offsetof (struct elf_prpsinfo, pr_gid)
+sizeof_elf_prpsinfo_pr_pid	MEMBER_SIZE (struct elf_prpsinfo, pr_pid)
+offset_elf_prpsinfo_pr_pid	offsetof (struct elf_prpsinfo, pr_pid)
+sizeof_elf_prpsinfo_pr_ppid	MEMBER_SIZE (struct elf_prpsinfo, pr_ppid)
+offset_elf_prpsinfo_pr_ppid	offsetof (struct elf_prpsinfo, pr_ppid)
+sizeof_elf_prpsinfo_pr_pgrp	MEMBER_SIZE (struct elf_prpsinfo, pr_pgrp)
+offset_elf_prpsinfo_pr_pgrp	offsetof (struct elf_prpsinfo, pr_pgrp)
+sizeof_elf_prpsinfo_pr_sid	MEMBER_SIZE (struct elf_prpsinfo, pr_sid)
+offset_elf_prpsinfo_pr_sid	offsetof (struct elf_prpsinfo, pr_sid)
+sizeof_elf_prpsinfo_pr_fname	MEMBER_SIZE (struct elf_prpsinfo, pr_fname)
+offset_elf_prpsinfo_pr_fname	offsetof (struct elf_prpsinfo, pr_fname)
+sizeof_elf_prpsinfo_pr_psargs	MEMBER_SIZE (struct elf_prpsinfo, pr_psargs)
+offset_elf_prpsinfo_pr_psargs	offsetof (struct elf_prpsinfo, pr_psargs)
diff --git a/sysdeps/unix/sysv/linux/procfs-linux.sym b/sysdeps/unix/sysv/linux/procfs-linux.sym
new file mode 100644
index 0000000000..f3ad298421
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/procfs-linux.sym
@@ -0,0 +1,73 @@
+#include <linux/elfcore.h>
+#include <stddef.h>
+
+--
+
+#define MEMBER_SIZE(S, F) sizeof ((S) { 0 }.F)
+
+sizeof_elf_siginfo	sizeof (struct elf_siginfo)
+sizeof_elf_prstatus	sizeof (struct elf_prstatus)
+sizeof_elf_prpsinfo	sizeof (struct elf_prpsinfo)
+
+sizeof_elf_siginfo_si_signo	MEMBER_SIZE (struct elf_siginfo, si_signo)
+offset_elf_siginfo_si_signo	offsetof (struct elf_siginfo, si_signo)
+sizeof_elf_siginfo_si_code	MEMBER_SIZE (struct elf_siginfo, si_code)
+offset_elf_siginfo_si_code	offsetof (struct elf_siginfo, si_code)
+sizeof_elf_siginfo_si_errno	MEMBER_SIZE (struct elf_siginfo, si_errno)
+offset_elf_siginfo_si_errno	offsetof (struct elf_siginfo, si_errno)
+
+sizeof_elf_prstatus_pr_info	MEMBER_SIZE (struct elf_prstatus, pr_info)
+offset_elf_prstatus_pr_info	offsetof (struct elf_prstatus, pr_info)
+sizeof_elf_prstatus_pr_cursig	MEMBER_SIZE (struct elf_prstatus, pr_cursig)
+offset_elf_prstatus_pr_cursig	offsetof (struct elf_prstatus, pr_cursig)
+sizeof_elf_prstatus_pr_sigpend	MEMBER_SIZE (struct elf_prstatus, pr_sigpend)
+offset_elf_prstatus_pr_sigpend	offsetof (struct elf_prstatus, pr_sigpend)
+sizeof_elf_prstatus_pr_sighold	MEMBER_SIZE (struct elf_prstatus, pr_sighold)
+offset_elf_prstatus_pr_sighold	offsetof (struct elf_prstatus, pr_sighold)
+sizeof_elf_prstatus_pr_pid	MEMBER_SIZE (struct elf_prstatus, pr_pid)
+offset_elf_prstatus_pr_pid	offsetof (struct elf_prstatus, pr_pid)
+sizeof_elf_prstatus_pr_ppid	MEMBER_SIZE (struct elf_prstatus, pr_ppid)
+offset_elf_prstatus_pr_ppid	offsetof (struct elf_prstatus, pr_ppid)
+sizeof_elf_prstatus_pr_pgrp	MEMBER_SIZE (struct elf_prstatus, pr_pgrp)
+offset_elf_prstatus_pr_pgrp	offsetof (struct elf_prstatus, pr_pgrp)
+sizeof_elf_prstatus_pr_sid	MEMBER_SIZE (struct elf_prstatus, pr_sid)
+offset_elf_prstatus_pr_sid	offsetof (struct elf_prstatus, pr_sid)
+sizeof_elf_prstatus_pr_utime	MEMBER_SIZE (struct elf_prstatus, pr_utime)
+offset_elf_prstatus_pr_utime	offsetof (struct elf_prstatus, pr_utime)
+sizeof_elf_prstatus_pr_stime	MEMBER_SIZE (struct elf_prstatus, pr_stime)
+offset_elf_prstatus_pr_stime	offsetof (struct elf_prstatus, pr_stime)
+sizeof_elf_prstatus_pr_cutime	MEMBER_SIZE (struct elf_prstatus, pr_cutime)
+offset_elf_prstatus_pr_cutime	offsetof (struct elf_prstatus, pr_cutime)
+sizeof_elf_prstatus_pr_cstime	MEMBER_SIZE (struct elf_prstatus, pr_cstime)
+offset_elf_prstatus_pr_cstime	offsetof (struct elf_prstatus, pr_cstime)
+sizeof_elf_prstatus_pr_reg	MEMBER_SIZE (struct elf_prstatus, pr_reg)
+offset_elf_prstatus_pr_reg	offsetof (struct elf_prstatus, pr_reg)
+sizeof_elf_prstatus_pr_fpvalid	MEMBER_SIZE (struct elf_prstatus, pr_fpvalid)
+offset_elf_prstatus_pr_fpvalid	offsetof (struct elf_prstatus, pr_fpvalid)
+
+sizeof_elf_prpsinfo_pr_state	MEMBER_SIZE (struct elf_prpsinfo, pr_state)
+offset_elf_prpsinfo_pr_state	offsetof (struct elf_prpsinfo, pr_state)
+sizeof_elf_prpsinfo_pr_sname	MEMBER_SIZE (struct elf_prpsinfo, pr_sname)
+offset_elf_prpsinfo_pr_sname	offsetof (struct elf_prpsinfo, pr_sname)
+sizeof_elf_prpsinfo_pr_zomb	MEMBER_SIZE (struct elf_prpsinfo, pr_zomb)
+offset_elf_prpsinfo_pr_zomb	offsetof (struct elf_prpsinfo, pr_zomb)
+sizeof_elf_prpsinfo_pr_nice	MEMBER_SIZE (struct elf_prpsinfo, pr_nice)
+offset_elf_prpsinfo_pr_nice	offsetof (struct elf_prpsinfo, pr_nice)
+sizeof_elf_prpsinfo_pr_flag	MEMBER_SIZE (struct elf_prpsinfo, pr_flag)
+offset_elf_prpsinfo_pr_flag	offsetof (struct elf_prpsinfo, pr_flag)
+sizeof_elf_prpsinfo_pr_uid	MEMBER_SIZE (struct elf_prpsinfo, pr_uid)
+offset_elf_prpsinfo_pr_uid	offsetof (struct elf_prpsinfo, pr_uid)
+sizeof_elf_prpsinfo_pr_gid	MEMBER_SIZE (struct elf_prpsinfo, pr_gid)
+offset_elf_prpsinfo_pr_gid	offsetof (struct elf_prpsinfo, pr_gid)
+sizeof_elf_prpsinfo_pr_pid	MEMBER_SIZE (struct elf_prpsinfo, pr_pid)
+offset_elf_prpsinfo_pr_pid	offsetof (struct elf_prpsinfo, pr_pid)
+sizeof_elf_prpsinfo_pr_ppid	MEMBER_SIZE (struct elf_prpsinfo, pr_ppid)
+offset_elf_prpsinfo_pr_ppid	offsetof (struct elf_prpsinfo, pr_ppid)
+sizeof_elf_prpsinfo_pr_pgrp	MEMBER_SIZE (struct elf_prpsinfo, pr_pgrp)
+offset_elf_prpsinfo_pr_pgrp	offsetof (struct elf_prpsinfo, pr_pgrp)
+sizeof_elf_prpsinfo_pr_sid	MEMBER_SIZE (struct elf_prpsinfo, pr_sid)
+offset_elf_prpsinfo_pr_sid	offsetof (struct elf_prpsinfo, pr_sid)
+sizeof_elf_prpsinfo_pr_fname	MEMBER_SIZE (struct elf_prpsinfo, pr_fname)
+offset_elf_prpsinfo_pr_fname	offsetof (struct elf_prpsinfo, pr_fname)
+sizeof_elf_prpsinfo_pr_psargs	MEMBER_SIZE (struct elf_prpsinfo, pr_psargs)
+offset_elf_prpsinfo_pr_psargs	offsetof (struct elf_prpsinfo, pr_psargs)

Patch

diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile
index db5b17fcb7..99d71ea296 100644
--- a/sysdeps/unix/sysv/linux/Makefile
+++ b/sysdeps/unix/sysv/linux/Makefile
@@ -41,7 +41,8 @@  sysdep_headers += sys/mount.h sys/acct.h sys/sysctl.h \
 		  bits/socket_type.h bits/syscall.h bits/sysctl.h \
 		  bits/mman-linux.h bits/mman-shared.h bits/ptrace-shared.h \
 		  bits/siginfo-arch.h bits/siginfo-consts-arch.h \
-		  bits/procfs.h bits/procfs-id.h bits/procfs-extra.h
+		  bits/procfs.h bits/procfs-id.h bits/procfs-extra.h \
+		  bits/procfs-prregset.h
 
 tests += tst-clone tst-clone2 tst-clone3 tst-fanotify tst-personality \
 	 tst-quota tst-sync_file_range tst-sysconf-iov_max tst-ttyname \
diff --git a/sysdeps/unix/sysv/linux/alpha/bits/procfs-prregset.h b/sysdeps/unix/sysv/linux/alpha/bits/procfs-prregset.h
new file mode 100644
index 0000000000..2f17e62a3f
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/alpha/bits/procfs-prregset.h
@@ -0,0 +1,25 @@ 
+/* Types of prgregset_t and prfpregset_t.  Alpha version.
+   Copyright (C) 2018 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
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef _SYS_PROCFS_H
+# error "Never include <bits/procfs-prregset.h> directly; use <sys/procfs.h> instead."
+#endif
+
+typedef gregset_t __prgregset_t;
+typedef fpregset_t __prfpregset_t;
diff --git a/sysdeps/unix/sysv/linux/alpha/bits/procfs.h b/sysdeps/unix/sysv/linux/alpha/bits/procfs.h
new file mode 100644
index 0000000000..4e7790b2ed
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/alpha/bits/procfs.h
@@ -0,0 +1,38 @@ 
+/* Types for registers for sys/procfs.h.  Alpha version.
+   Copyright (C) 1996-2018 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
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef _SYS_PROCFS_H
+# error "Never include <bits/procfs.h> directly; use <sys/procfs.h> instead."
+#endif
+
+#include <signal.h>
+#include <sys/ucontext.h>
+
+/*
+ * The OSF/1 version of <sys/procfs.h> makes gregset_t 46 entries long.
+ * I have no idea why that is so.  For now, we just leave it at 33
+ * (32 general regs + processor status word).
+ */
+#define ELF_NGREG       33
+#define ELF_NFPREG      32
+
+typedef unsigned long elf_greg_t;
+typedef elf_greg_t elf_gregset_t[ELF_NGREG];
+
+typedef double elf_fpreg_t;
+typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG];
diff --git a/sysdeps/unix/sysv/linux/alpha/sys/procfs.h b/sysdeps/unix/sysv/linux/alpha/sys/procfs.h
deleted file mode 100644
index a6cbb025fb..0000000000
--- a/sysdeps/unix/sysv/linux/alpha/sys/procfs.h
+++ /dev/null
@@ -1,127 +0,0 @@ 
-/* Copyright (C) 1996-2018 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
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library.  If not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#ifndef _SYS_PROCFS_H
-#define _SYS_PROCFS_H	1
-
-/* This is somehow modelled after the file of the same name on SysVr4
-   systems.  It provides a definition of the core file format for ELF
-   used on Linux.  */
-
-#include <features.h>
-#include <signal.h>
-#include <sys/time.h>
-#include <sys/types.h>
-#include <sys/ucontext.h>
-#include <sys/user.h>
-
-__BEGIN_DECLS
-
-/*
- * The OSF/1 version of <sys/procfs.h> makes gregset_t 46 entries long.
- * I have no idea why that is so.  For now, we just leave it at 33
- * (32 general regs + processor status word).
- */
-#define ELF_NGREG       33
-#define ELF_NFPREG      32
-
-typedef unsigned long elf_greg_t;
-typedef elf_greg_t elf_gregset_t[ELF_NGREG];
-
-typedef double elf_fpreg_t;
-typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG];
-
-struct elf_siginfo
-  {
-    int si_signo;			/* Signal number.  */
-    int si_code;			/* Extra code.  */
-    int si_errno;			/* Errno.  */
-  };
-
-/* Definitions to generate Intel SVR4-like core files.  These mostly
-   have the same names as the SVR4 types with "elf_" tacked on the
-   front to prevent clashes with linux definitions, and the typedef
-   forms have been avoided.  This is mostly like the SVR4 structure,
-   but more Linuxy, with things that Linux does not support and which
-   gdb doesn't really use excluded.  Fields present but not used are
-   marked with "XXX".  */
-struct elf_prstatus
-  {
-#if 0
-    long int pr_flags;			/* XXX Process flags.  */
-    short int pr_why;			/* XXX Reason for process halt.  */
-    short int pr_what;			/* XXX More detailed reason.  */
-#endif
-    struct elf_siginfo pr_info;		/* Info associated with signal.  */
-    short int pr_cursig;		/* Current signal.  */
-    unsigned long int pr_sigpend;	/* Set of pending signals.  */
-    unsigned long int pr_sighold;	/* Set of held signals.  */
-#if 0
-    stack_t pr_altstack;		/* Alternate stack info.  */
-    struct sigaction pr_action;		/* Signal action for current sig.  */
-#endif
-    __pid_t pr_pid;
-    __pid_t pr_ppid;
-    __pid_t pr_pgrp;
-    __pid_t pr_sid;
-    struct timeval pr_utime;		/* User time.  */
-    struct timeval pr_stime;		/* System time.  */
-    struct timeval pr_cutime;		/* Cumulative user time.  */
-    struct timeval pr_cstime;		/* Cumulative system time.  */
-#if 0
-    long int pr_instr;			/* Current instruction.  */
-#endif
-    elf_gregset_t pr_reg;		/* GP registers.  */
-    int pr_fpvalid;			/* True if math copro being used.  */
-  };
-
-
-#define ELF_PRARGSZ     (80)    /* Number of chars for args */
-
-struct elf_prpsinfo
-  {
-    char pr_state;			/* Numeric process state.  */
-    char pr_sname;			/* Char for pr_state.  */
-    char pr_zomb;			/* Zombie.  */
-    char pr_nice;			/* Nice val.  */
-    unsigned long int pr_flag;		/* Flags.  */
-    unsigned int pr_uid;
-    unsigned int pr_gid;
-    int pr_pid, pr_ppid, pr_pgrp, pr_sid;
-    /* Lots missing */
-    char pr_fname[16];			/* Filename of executable.  */
-    char pr_psargs[ELF_PRARGSZ];	/* Initial part of arg list.  */
-  };
-
-/* Addresses.  */
-typedef void *psaddr_t;
-
-/* Register sets.  Linux has different names.  */
-typedef gregset_t prgregset_t;
-typedef fpregset_t prfpregset_t;
-
-/* We don't have any differences between processes and threads,
-   therefore habe only ine PID type.  */
-typedef __pid_t lwpid_t;
-
-
-typedef struct elf_prstatus prstatus_t;
-typedef struct elf_prpsinfo prpsinfo_t;
-
-__END_DECLS
-
-#endif	/* sys/procfs.h */
diff --git a/sysdeps/unix/sysv/linux/bits/procfs-prregset.h b/sysdeps/unix/sysv/linux/bits/procfs-prregset.h
new file mode 100644
index 0000000000..01293400ef
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/bits/procfs-prregset.h
@@ -0,0 +1,25 @@ 
+/* Types of prgregset_t and prfpregset_t.  Generic Linux version.
+   Copyright (C) 2018 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
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef _SYS_PROCFS_H
+# error "Never include <bits/procfs-prregset.h> directly; use <sys/procfs.h> instead."
+#endif
+
+typedef elf_gregset_t __prgregset_t;
+typedef elf_fpregset_t __prfpregset_t;
diff --git a/sysdeps/unix/sysv/linux/sys/procfs.h b/sysdeps/unix/sysv/linux/sys/procfs.h
index 6ef577e291..b8fe489720 100644
--- a/sysdeps/unix/sysv/linux/sys/procfs.h
+++ b/sysdeps/unix/sysv/linux/sys/procfs.h
@@ -103,9 +103,11 @@  struct elf_prpsinfo
 /* Addresses.  */
 typedef void *psaddr_t;
 
+#include <bits/procfs-prregset.h>
+
 /* Register sets.  Linux has different names.  */
-typedef elf_gregset_t prgregset_t;
-typedef elf_fpregset_t prfpregset_t;
+typedef __prgregset_t prgregset_t;
+typedef __prfpregset_t prfpregset_t;
 
 /* We don't have any differences between processes and threads,
    therefore have only one PID type.  */