git: 1544e0f5d1f1 - main - syscallarg_t: Add a type for system call arguments

From: Brooks Davis <brooks_at_FreeBSD.org>
Date: Wed, 12 Jan 2022 22:51:53 UTC
The branch main has been updated by brooks:

URL: https://cgit.FreeBSD.org/src/commit/?id=1544e0f5d1f1e3b8c10a64cb899a936976ca7ea4

commit 1544e0f5d1f1e3b8c10a64cb899a936976ca7ea4
Author:     Brooks Davis <brooks@FreeBSD.org>
AuthorDate: 2022-01-12 22:50:06 +0000
Commit:     Brooks Davis <brooks@FreeBSD.org>
CommitDate: 2022-01-12 22:51:25 +0000

    syscallarg_t: Add a type for system call arguments
    
    This more clearly differentiates system call arguments from integer
    registers and return values. On current architectures it has no effect,
    but on architectures where pointers are not integers (CHERI) and may
    not even share registers (CHERI-MIPS) it is necessiary to differentiate
    between system call arguments (syscallarg_t) and integer register values
    (register_t).
    
    Obtained from:  CheriBSD
    
    Reviewed by:    imp, kib
    Differential Revision:  https://reviews.freebsd.org/D33780
---
 sys/amd64/amd64/trap.c     |  2 +-
 sys/arm/arm/syscall.c      |  6 +++---
 sys/arm64/arm64/trap.c     |  4 ++--
 sys/kern/kern_ktrace.c     |  2 +-
 sys/kern/sys_process.c     |  4 ++--
 sys/riscv/riscv/trap.c     |  4 ++--
 sys/sys/ktrace.h           |  2 +-
 sys/sys/proc.h             |  2 +-
 sys/sys/ptrace.h           |  2 +-
 sys/sys/types.h            |  2 ++
 sys/tools/makesyscalls.lua | 10 +++++-----
 sys/vm/vm_mmap.c           |  2 +-
 usr.bin/truss/syscall.h    |  8 ++++----
 usr.bin/truss/syscalls.c   |  4 ++--
 usr.bin/truss/truss.h      |  2 +-
 15 files changed, 29 insertions(+), 27 deletions(-)

diff --git a/sys/amd64/amd64/trap.c b/sys/amd64/amd64/trap.c
index ff4bccebed5b..bebc8cc117dc 100644
--- a/sys/amd64/amd64/trap.c
+++ b/sys/amd64/amd64/trap.c
@@ -1011,7 +1011,7 @@ cpu_fetch_syscall_args_fallback(struct thread *td, struct syscall_args *sa)
 {
 	struct proc *p;
 	struct trapframe *frame;
-	register_t *argp;
+	syscallarg_t *argp;
 	caddr_t params;
 	int reg, regcnt, error;
 
diff --git a/sys/arm/arm/syscall.c b/sys/arm/arm/syscall.c
index a635de0ec716..c083bf552eb5 100644
--- a/sys/arm/arm/syscall.c
+++ b/sys/arm/arm/syscall.c
@@ -100,7 +100,7 @@ int
 cpu_fetch_syscall_args(struct thread *td)
 {
 	struct proc *p;
-	register_t *ap;
+	syscallarg_t *ap;
 	struct syscall_args *sa;
 	u_int nap;
 	int error;
@@ -124,10 +124,10 @@ cpu_fetch_syscall_args(struct thread *td)
 	else
 		sa->callp = &p->p_sysent->sv_table[sa->code];
 	error = 0;
-	memcpy(sa->args, ap, nap * sizeof(register_t));
+	memcpy(sa->args, ap, nap * sizeof(*sa->args));
 	if (sa->callp->sy_narg > nap) {
 		error = copyin((void *)td->td_frame->tf_usr_sp, sa->args +
-		    nap, (sa->callp->sy_narg - nap) * sizeof(register_t));
+		    nap, (sa->callp->sy_narg - nap) * sizeof(*sa->args));
 	}
 	if (error == 0) {
 		td->td_retval[0] = 0;
diff --git a/sys/arm64/arm64/trap.c b/sys/arm64/arm64/trap.c
index 3e4bc196e194..4aa788bea941 100644
--- a/sys/arm64/arm64/trap.c
+++ b/sys/arm64/arm64/trap.c
@@ -134,7 +134,7 @@ int
 cpu_fetch_syscall_args(struct thread *td)
 {
 	struct proc *p;
-	register_t *ap, *dst_ap;
+	syscallarg_t *ap, *dst_ap;
 	struct syscall_args *sa;
 
 	p = td->td_proc;
@@ -159,7 +159,7 @@ cpu_fetch_syscall_args(struct thread *td)
 	KASSERT(sa->callp->sy_narg <= nitems(sa->args),
 	    ("Syscall %d takes too many arguments", sa->code));
 
-	memcpy(dst_ap, ap, (nitems(sa->args) - 1) * sizeof(register_t));
+	memcpy(dst_ap, ap, (nitems(sa->args) - 1) * sizeof(*dst_ap));
 
 	td->td_retval[0] = 0;
 	td->td_retval[1] = 0;
diff --git a/sys/kern/kern_ktrace.c b/sys/kern/kern_ktrace.c
index 5371f73672a0..d8db964ada05 100644
--- a/sys/kern/kern_ktrace.c
+++ b/sys/kern/kern_ktrace.c
@@ -524,7 +524,7 @@ ktr_get_tracevp(struct proc *p, bool ref)
 }
 
 void
-ktrsyscall(int code, int narg, register_t args[])
+ktrsyscall(int code, int narg, syscallarg_t args[])
 {
 	struct ktr_request *req;
 	struct ktr_syscall *ktp;
diff --git a/sys/kern/sys_process.c b/sys/kern/sys_process.c
index 2c212edd0ae7..a708ed2bde19 100644
--- a/sys/kern/sys_process.c
+++ b/sys/kern/sys_process.c
@@ -474,7 +474,7 @@ sys_ptrace(struct thread *td, struct ptrace_args *uap)
 		struct dbreg dbreg;
 		struct fpreg fpreg;
 		struct reg reg;
-		char args[sizeof(td->td_sa.args)];
+		syscallarg_t args[nitems(td->td_sa.args)];
 		struct ptrace_sc_ret psr;
 		int ptevents;
 	} r;
@@ -1010,7 +1010,7 @@ kern_ptrace(struct thread *td, int req, pid_t pid, void *addr, int data)
 		/* See the explanation in linux_ptrace_get_syscall_info(). */
 		bcopy(td2->td_sa.args, addr, SV_PROC_ABI(td->td_proc) ==
 		    SV_ABI_LINUX ? sizeof(td2->td_sa.args) :
-		    td2->td_sa.callp->sy_narg * sizeof(register_t));
+		    td2->td_sa.callp->sy_narg * sizeof(syscallarg_t));
 		break;
 
 	case PT_GET_SC_RET:
diff --git a/sys/riscv/riscv/trap.c b/sys/riscv/riscv/trap.c
index 8eb52fcc5337..4bd6d766ec39 100644
--- a/sys/riscv/riscv/trap.c
+++ b/sys/riscv/riscv/trap.c
@@ -94,7 +94,7 @@ int
 cpu_fetch_syscall_args(struct thread *td)
 {
 	struct proc *p;
-	register_t *ap, *dst_ap;
+	syscallarg_t *ap, *dst_ap;
 	struct syscall_args *sa;
 
 	p = td->td_proc;
@@ -119,7 +119,7 @@ cpu_fetch_syscall_args(struct thread *td)
 	KASSERT(sa->callp->sy_narg <= nitems(sa->args),
 	    ("Syscall %d takes too many arguments", sa->code));
 
-	memcpy(dst_ap, ap, (NARGREG - 1) * sizeof(register_t));
+	memcpy(dst_ap, ap, (NARGREG - 1) * sizeof(*dst_ap));
 
 	td->td_retval[0] = 0;
 	td->td_retval[1] = 0;
diff --git a/sys/sys/ktrace.h b/sys/sys/ktrace.h
index 283a95c36d6c..d00981a93d24 100644
--- a/sys/sys/ktrace.h
+++ b/sys/sys/ktrace.h
@@ -284,7 +284,7 @@ void	ktrpsig(int, sig_t, sigset_t *, int);
 void	ktrfault(vm_offset_t, int);
 void	ktrfaultend(int);
 void	ktrgenio(int, enum uio_rw, struct uio *, int);
-void	ktrsyscall(int, int narg, register_t args[]);
+void	ktrsyscall(int, int narg, syscallarg_t args[]);
 void	ktrsysctl(int *name, u_int namelen);
 void	ktrsysret(int, int, register_t);
 void	ktrprocctor(struct proc *);
diff --git a/sys/sys/proc.h b/sys/sys/proc.h
index ff97bfbd54a9..312adc517aee 100644
--- a/sys/sys/proc.h
+++ b/sys/sys/proc.h
@@ -357,7 +357,7 @@ struct thread {
 	} td_state;			/* (t) thread state */
 	/* Note: td_state must be accessed using TD_{GET,SET}_STATE(). */
 	union {
-		register_t	tdu_retval[2];
+		syscallarg_t	tdu_retval[2];
 		off_t		tdu_off;
 	} td_uretoff;			/* (k) Syscall aux returns. */
 #define td_retval	td_uretoff.tdu_retval
diff --git a/sys/sys/ptrace.h b/sys/sys/ptrace.h
index 1e7c1c71056b..c4be99c52073 100644
--- a/sys/sys/ptrace.h
+++ b/sys/sys/ptrace.h
@@ -160,7 +160,7 @@ struct ptrace_lwpinfo32 {
 
 /* Argument structure for PT_GET_SC_RET. */
 struct ptrace_sc_ret {
-	register_t	sr_retval[2];	/* Only valid if sr_error == 0. */
+	syscallarg_t	sr_retval[2];	/* Only valid if sr_error == 0. */
 	int		sr_error;
 };
 
diff --git a/sys/sys/types.h b/sys/sys/types.h
index 66f11aa3e31d..d37ab8b823dc 100644
--- a/sys/sys/types.h
+++ b/sys/sys/types.h
@@ -270,6 +270,8 @@ typedef	__vm_size_t	vm_size_t;
 
 typedef __rman_res_t    rman_res_t;
 
+typedef __register_t	syscallarg_t;
+
 #ifdef _KERNEL
 typedef	int		boolean_t;
 typedef	struct _device	*device_t;
diff --git a/sys/tools/makesyscalls.lua b/sys/tools/makesyscalls.lua
index 178869d03b0e..ec79ae30d130 100644
--- a/sys/tools/makesyscalls.lua
+++ b/sys/tools/makesyscalls.lua
@@ -860,7 +860,7 @@ local function handle_noncompat(sysnum, thr_flag, flags, sysflags, rettype,
 			write_line("sysarg", "};\n")
 		else
 			write_line("sysarg", string.format(
-			    "struct %s {\n\tregister_t dummy;\n};\n", argalias))
+			    "struct %s {\n\tsyscallarg_t dummy;\n};\n", argalias))
 		end
 	end
 
@@ -986,7 +986,7 @@ local function handle_compat(sysnum, thr_flag, flags, sysflags, rettype,
 		write_line(out, "};\n")
 	elseif flags & nargflags == 0 then
 		write_line("sysarg", string.format(
-		    "struct %s {\n\tregister_t dummy;\n};\n", argalias))
+		    "struct %s {\n\tsyscallarg_t dummy;\n};\n", argalias))
 	end
 	if flags & dprotoflags == 0 then
 		write_line(outdcl, string.format(
@@ -1439,8 +1439,8 @@ struct proc;
 
 struct thread;
 
-#define	PAD_(t)	(sizeof(register_t) <= sizeof(t) ? \
-		0 : sizeof(register_t) - sizeof(t))
+#define	PAD_(t)	(sizeof(syscallarg_t) <= sizeof(t) ? \
+		0 : sizeof(syscallarg_t) - sizeof(t))
 
 #if BYTE_ORDER == LITTLE_ENDIAN
 #define	PADL_(t)	0
@@ -1530,7 +1530,7 @@ systrace_return_setargdesc(int sysnum, int ndx, char *desc, size_t descsz)
 process_sysfile(sysfile)
 
 write_line("sysinc",
-    "\n#define AS(name) (sizeof(struct name) / sizeof(register_t))\n")
+    "\n#define AS(name) (sizeof(struct name) / sizeof(syscallarg_t))\n")
 
 for _, v in pairs(compat_options) do
 	if v["count"] > 0 then
diff --git a/sys/vm/vm_mmap.c b/sys/vm/vm_mmap.c
index 8ad049ed6d5e..db9a32d1c9bc 100644
--- a/sys/vm/vm_mmap.c
+++ b/sys/vm/vm_mmap.c
@@ -420,7 +420,7 @@ kern_mmap(struct thread *td, const struct mmap_req *mrp)
 	}
 
 	if (error == 0)
-		td->td_retval[0] = (register_t) (addr + pageoff);
+		td->td_retval[0] = addr + pageoff;
 done:
 	if (fp)
 		fdrop(fp, td);
diff --git a/usr.bin/truss/syscall.h b/usr.bin/truss/syscall.h
index 7a403d5b680d..ba3a4a50a929 100644
--- a/usr.bin/truss/syscall.h
+++ b/usr.bin/truss/syscall.h
@@ -227,7 +227,7 @@ struct syscall {
 };
 
 struct syscall *get_syscall(struct threadinfo *, u_int, u_int);
-char *print_arg(struct syscall_arg *, unsigned long *, register_t *,
+char *print_arg(struct syscall_arg *, unsigned long *, syscallarg_t *,
     struct trussinfo *);
 
 /*
@@ -251,8 +251,8 @@ char *print_arg(struct syscall_arg *, unsigned long *, register_t *,
 #define LINUX_SENDMSG		16
 #define LINUX_RECVMSG		17
 
-#define PAD_(t) (sizeof(register_t) <= sizeof(t) ? \
-    0 : sizeof(register_t) - sizeof(t))
+#define PAD_(t) (sizeof(syscallarg_t) <= sizeof(t) ? \
+    0 : sizeof(syscallarg_t) - sizeof(t))
 
 #if BYTE_ORDER == LITTLE_ENDIAN
 #define PADL_(t)	0
@@ -271,5 +271,5 @@ struct linux_socketcall_args {
 };
 
 void print_syscall(struct trussinfo *);
-void print_syscall_ret(struct trussinfo *, int, register_t *);
+void print_syscall_ret(struct trussinfo *, int, syscallarg_t *);
 void print_summary(struct trussinfo *trussinfo);
diff --git a/usr.bin/truss/syscalls.c b/usr.bin/truss/syscalls.c
index 586b583c3209..e538fa713df6 100644
--- a/usr.bin/truss/syscalls.c
+++ b/usr.bin/truss/syscalls.c
@@ -1556,7 +1556,7 @@ user_ptr32_to_psaddr(int32_t user_pointer)
  * an array of all of the system call arguments.
  */
 char *
-print_arg(struct syscall_arg *sc, unsigned long *args, register_t *retval,
+print_arg(struct syscall_arg *sc, unsigned long *args, syscallarg_t *retval,
     struct trussinfo *trussinfo)
 {
 	FILE *fp;
@@ -2729,7 +2729,7 @@ print_syscall(struct trussinfo *trussinfo)
 }
 
 void
-print_syscall_ret(struct trussinfo *trussinfo, int error, register_t *retval)
+print_syscall_ret(struct trussinfo *trussinfo, int error, syscallarg_t *retval)
 {
 	struct timespec timediff;
 	struct threadinfo *t;
diff --git a/usr.bin/truss/truss.h b/usr.bin/truss/truss.h
index a3ce8f27d953..4d2680cd4913 100644
--- a/usr.bin/truss/truss.h
+++ b/usr.bin/truss/truss.h
@@ -81,7 +81,7 @@ struct current_syscall {
 	struct syscall *sc;
 	unsigned int number;
 	unsigned int nargs;
-	unsigned long args[10];
+	syscallarg_t args[10];
 	char *s_args[10];	/* the printable arguments */
 };