about summary refs log tree commit diff
path: root/sysdeps/unix/sysv/linux/riscv/makecontext.c
diff options
context:
space:
mode:
authorZack Weinberg <zackw@panix.com>2019-06-11 13:05:02 -0400
committerZack Weinberg <zackw@panix.com>2020-01-08 14:17:46 -0500
commit536eef52c5c6bae9939aa5b591b914273e731a13 (patch)
treed5df4847c9a68195309d362d3b87d7610a54ff19 /sysdeps/unix/sysv/linux/riscv/makecontext.c
parent9e32bbc2da1644f4ec9c1428faf98ed6ad508e4a (diff)
downloadglibc-zack/no-nested-includes.tar.gz
glibc-zack/no-nested-includes.tar.xz
glibc-zack/no-nested-includes.zip
Rename sys/ucontext.h to bits/ucontext.h. zack/no-nested-includes
sys/ucontext.h is effectively a bits header.  Its contents are
extremely system-specific, and it’s strongly associated with a
specific public header (ucontext.h) that provides a superset of its
definitions, but there are other public headers that also require some
of its definitions.  This patch therefore moves it into the bits/
namespace and adjusts all the headers that refer to it.  In case there
are external users, a stub is added that includes ucontext.h.

Most of the fallout changes are trivial, but aarch64, ia64 and riscv
need a little more work.  aarch64 sys/ucontext.h (now bits/ucontext.h)
was including sys/procfs.h for the definition of elf_greg_t etc;
the simplest fix is to have it include bits/procfs.h instead (and then
that needs to include sys/user.h for user_regs_struct).  This is not
ideal but fixing it properly would require disentangling all of the
debugger interface headers which is more than I’m up for at the moment.

ia64 bits/ptrace.h and bits/procfs.h were both including
bits/sigcontext.h, which is only licensed to be included from
signal.h.  (I’m not sure how this ever worked, or why it broke with
this patch and not some previous one.)  This is fixed by creating
another single-type header, bits/types/__ia64_fpreg.h, which provides
the only thing they need from bits/sigcontext.h.

s/u/s/l/riscv/makecontext.c was defining makecontext with a function
head that didn’t agree with its official prototype (in ucontext.h);
formerly that file did not include ucontext.h, only sys/ucontext.h,
so we were getting away with it, but it’s still wrong.  Making the
function head match the prototype actually simplifies the code.

	* sysdeps/generic/sys/ucontext.h: Move to top level bits/ucontext.h.
	Adjust multiple inclusion guard.
	* sysdeps/arm/sys/ucontext.h: Move to sysdeps/arm/bits/ucontext.h.
	Adjust multiple inclusion guard.
	* sysdeps/i386/sys/ucontext.h: Similarly.
	* sysdeps/m68k/sys/ucontext.h: Similarly.
	* sysdeps/mips/sys/ucontext.h: Similarly.
	* sysdeps/unix/sysv/linux/aarch64/sys/ucontext.h: Similarly.
	* sysdeps/unix/sysv/linux/alpha/sys/ucontext.h: Similarly.
	* sysdeps/unix/sysv/linux/arm/sys/ucontext.h: Similarly.
	* sysdeps/unix/sysv/linux/csky/sys/ucontext.h: Similarly.
	* sysdeps/unix/sysv/linux/hppa/sys/ucontext.h: Similarly.
	* sysdeps/unix/sysv/linux/ia64/sys/ucontext.h: Similarly.
	* sysdeps/unix/sysv/linux/m68k/sys/ucontext.h: Similarly.
	* sysdeps/unix/sysv/linux/microblaze/sys/ucontext.h: Similarly.
	* sysdeps/unix/sysv/linux/mips/sys/ucontext.h: Similarly.
	* sysdeps/unix/sysv/linux/nios2/sys/ucontext.h: Similarly.
	* sysdeps/unix/sysv/linux/powerpc/sys/ucontext.h: Similarly.
	* sysdeps/unix/sysv/linux/riscv/sys/ucontext.h: Similarly.
	* sysdeps/unix/sysv/linux/s390/sys/ucontext.h: Similarly.
	* sysdeps/unix/sysv/linux/sh/sys/ucontext.h: Similarly.
	* sysdeps/unix/sysv/linux/sparc/sys/ucontext.h: Similarly.
	* sysdeps/unix/sysv/linux/x86/sys/ucontext.h: Similarly.
	* stdlib/Makefile: Install bits/ucontext.h.

	* stdlib/sys/ucontext.h: New backward compatibility stub header,
	includes ucontext.h.
	* include/sys/ucontext.h: New wrapper.

	* sysdeps/unix/sysv/linux/aarch64/bits/procfs.h: Allow inclusion
	by bits/ucontext.h as well as sys/procfs.h.  Include sys/user.h.
	* sysdeps/unix/sysv/linux/aarch64/bits/ucontext.h: Include
	bits/procfs.h instead of sys/procfs.h.

	* sysdeps/unix/sysv/linux/ia64/bits/types/__ia64_fpreg.h:
	New file, contents factored out of ia64/bits/sigcontext.h and
	ia64/bits/ucontext.h.
	* sysdeps/unix/sysv/linux/ia64/Makefile:
	Install bits/types/__ia64_fpreg.h.  Merge subdir=misc blocks.
	* sysdeps/unix/sysv/linux/ia64/bits/sigcontext.h
	* sysdeps/unix/sysv/linux/ia64/bits/ucontext.h:
	Include bits/types/__ia64_fpreg.h for struct ia64_fpreg.

	* sysdeps/unix/sysv/linux/ia64/bits/procfs.h:
	Include bits/types/__ia64_fpreg.h for struct ia64_fpreg.
	Don’t include bits/sigcontext.h or bits/ucontext.h.
	* sysdeps/unix/sysv/linux/ia64/sys/ptrace.h:
	Don’t include bits/sigcontext.h.

	* sysdeps/unix/sysv/linux/riscv/makecontext.c: Include
	ucontext.h, not sys/ucontext.h. Correct function head to match
	prototype in ucontext.h.  Use va_arg to retrieve all arguments
	past argc.

	* sysdeps/unix/sysv/linux/s390/tst-ptrace-singleblock.c:
	Sort list of includes.

	* signal/signal.h, stdlib/ucontext.h
	* sysdeps/unix/sysv/linux/alpha/bits/procfs-prregset.h
	* sysdeps/unix/sysv/linux/ia64/sys/ptrace.h
	* sysdeps/unix/sysv/linux/riscv/bits/procfs.h
	* sysdeps/unix/sysv/linux/s390/bits/procfs.h:
	Include bits/ucontext.h, not sys/ucontext.h.

	* sysdeps/unix/sysv/linux/aarch64/sigcontextinfo.h
	* sysdeps/unix/sysv/linux/arm/sigcontextinfo.h
	* sysdeps/unix/sysv/linux/nios2/sigcontextinfo.h
	* sysdeps/unix/sysv/linux/riscv/sigcontextinfo.h:
	Include signal.h, not sys/ucontext.h.

	* sysdeps/unix/sysv/linux/arm/register-dump.h
	* sysdeps/unix/sysv/linux/csky/register-dump.h:
	Include ucontext.h, not sys/ucontext.h.

	* sysdeps/unix/sysv/linux/aarch64/ucontext_i.sym
	* sysdeps/unix/sysv/linux/alpha/ucontext-offsets.sym
	* sysdeps/unix/sysv/linux/arm/ucontext_i.sym
	* sysdeps/unix/sysv/linux/csky/abiv2/ucontext_i.sym
	* sysdeps/unix/sysv/linux/hppa/ucontext_i.sym
	* sysdeps/unix/sysv/linux/i386/ucontext_i.sym
	* sysdeps/unix/sysv/linux/ia64/sigcontext-offsets.sym
	* sysdeps/unix/sysv/linux/m68k/m680x0/ucontext_i.sym
	* sysdeps/unix/sysv/linux/powerpc/powerpc32/ucontext_i.sym
	* sysdeps/unix/sysv/linux/powerpc/powerpc64/ucontext_i.sym
	* sysdeps/unix/sysv/linux/mips/ucontext_i.sym
	* sysdeps/unix/sysv/linux/nios2/ucontext_i.sym
	* sysdeps/unix/sysv/linux/riscv/ucontext_i.sym
	* sysdeps/unix/sysv/linux/s390/ucontext_i.sym
	* sysdeps/unix/sysv/linux/sh/sh3/ucontext_i.sym
	* sysdeps/unix/sysv/linux/sh/sh4/ucontext_i.sym
	* sysdeps/unix/sysv/linux/sparc/sparc32/ucontext_i.sym
	* sysdeps/unix/sysv/linux/x86_64/ucontext_i.sym:
	Include stddef.h and signal.h; don’t include any other headers.

	* scripts/check-obsolete-constructs.py (HEADER_ALLOWED_INCLUDES)
	(SYSDEP_ALLOWED_INCLUDES): Update.
Diffstat (limited to 'sysdeps/unix/sysv/linux/riscv/makecontext.c')
-rw-r--r--sysdeps/unix/sysv/linux/riscv/makecontext.c18
1 files changed, 5 insertions, 13 deletions
diff --git a/sysdeps/unix/sysv/linux/riscv/makecontext.c b/sysdeps/unix/sysv/linux/riscv/makecontext.c
index 7ae5e2cd07..bce27fdf45 100644
--- a/sysdeps/unix/sysv/linux/riscv/makecontext.c
+++ b/sysdeps/unix/sysv/linux/riscv/makecontext.c
@@ -18,14 +18,12 @@
 
 #include <sysdep.h>
 #include <sys/asm.h>
-#include <sys/ucontext.h>
+#include <ucontext.h>
 #include <stdarg.h>
 #include <assert.h>
 
 void
-__makecontext (ucontext_t *ucp, void (*func) (void), int argc,
-	       long int a0, long int a1, long int a2, long int a3, long int a4,
-	       ...)
+__makecontext (ucontext_t *ucp, void (*func) (void), int argc, ...)
 {
   extern void __start_context (void) attribute_hidden;
   long int i, sp;
@@ -47,19 +45,13 @@ __makecontext (ucontext_t *ucp, void (*func) (void), int argc,
   ucp->uc_mcontext.__gregs[REG_PC] = (long int) &__start_context;
 
   /* Put args in a0-a7, then put any remaining args on the stack.  */
-  ucp->uc_mcontext.__gregs[REG_A0 + 0] = a0;
-  ucp->uc_mcontext.__gregs[REG_A0 + 1] = a1;
-  ucp->uc_mcontext.__gregs[REG_A0 + 2] = a2;
-  ucp->uc_mcontext.__gregs[REG_A0 + 3] = a3;
-  ucp->uc_mcontext.__gregs[REG_A0 + 4] = a4;
-
-  if (__glibc_unlikely (argc > 5))
+  if (argc > 0)
     {
       va_list vl;
-      va_start (vl, a4);
+      va_start (vl, argc);
 
       long reg_args = argc < REG_NARGS ? argc : REG_NARGS;
-      for (i = 5; i < reg_args; i++)
+      for (i = 0; i < reg_args; i++)
         ucp->uc_mcontext.__gregs[REG_A0 + i] = va_arg (vl, long);
 
       long int stack_args = argc - reg_args;