aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrooks Davis <brooks@FreeBSD.org>2021-11-17 20:12:26 +0000
committerBrooks Davis <brooks@FreeBSD.org>2021-11-17 20:12:26 +0000
commitf19e3fd20601f0ff7fa3261fee339b46276b3d90 (patch)
tree6fe3453882e3e3f61f0d1a66f75143af118cb173
parentd257e57d18e6d1569fc255aa7a43981f6c8068fb (diff)
downloadsrc-f19e3fd20601f0ff7fa3261fee339b46276b3d90.tar.gz
src-f19e3fd20601f0ff7fa3261fee339b46276b3d90.zip
freebsd32: signed long corrections
Syscalls that take signed longs need to treat the 32-bit versions as signed int so that sign extension happens correctly. Improve decleration quality and add a few minimal syscall implementations. Reviewed by: kevans
-rw-r--r--sys/compat/freebsd32/freebsd32_misc.c27
-rw-r--r--sys/compat/freebsd32/freebsd32_proto.h25
-rw-r--r--sys/compat/freebsd32/freebsd32_syscall.h6
-rw-r--r--sys/compat/freebsd32/freebsd32_syscalls.c6
-rw-r--r--sys/compat/freebsd32/freebsd32_sysent.c6
-rw-r--r--sys/compat/freebsd32/freebsd32_systrace_args.c8
-rw-r--r--sys/compat/freebsd32/syscalls.master21
7 files changed, 72 insertions, 27 deletions
diff --git a/sys/compat/freebsd32/freebsd32_misc.c b/sys/compat/freebsd32/freebsd32_misc.c
index 4e69dc99b3b2..a165b47b2928 100644
--- a/sys/compat/freebsd32/freebsd32_misc.c
+++ b/sys/compat/freebsd32/freebsd32_misc.c
@@ -1913,6 +1913,14 @@ freebsd32_truncate(struct thread *td, struct freebsd32_truncate_args *uap)
PAIR32TO64(off_t, uap->length)));
}
+#ifdef COMPAT_43
+int
+ofreebsd32_truncate(struct thread *td, struct ofreebsd32_truncate_args *uap)
+{
+ return (kern_truncate(td, uap->path, UIO_USERSPACE, uap->length));
+}
+#endif
+
int
freebsd32_ftruncate(struct thread *td, struct freebsd32_ftruncate_args *uap)
{
@@ -1922,6 +1930,12 @@ freebsd32_ftruncate(struct thread *td, struct freebsd32_ftruncate_args *uap)
#ifdef COMPAT_43
int
+ofreebsd32_ftruncate(struct thread *td, struct ofreebsd32_ftruncate_args *uap)
+{
+ return (kern_ftruncate(td, uap->fd, uap->length));
+}
+
+int
ofreebsd32_getdirentries(struct thread *td,
struct ofreebsd32_getdirentries_args *uap)
{
@@ -3842,6 +3856,19 @@ freebsd32_ffclock_getestimate(struct thread *td,
}
#endif /* FFCLOCK */
+#ifdef COMPAT_43
+int
+ofreebsd32_sethostid(struct thread *td, struct ofreebsd32_sethostid_args *uap)
+{
+ int name[] = { CTL_KERN, KERN_HOSTID };
+ long hostid;
+
+ hostid = uap->hostid;
+ return (kernel_sysctl(td, name, nitems(name), NULL, NULL, &hostid,
+ sizeof(hostid), NULL, 0));
+}
+#endif
+
int
freebsd32_fspacectl(struct thread *td, struct freebsd32_fspacectl_args *uap)
{
diff --git a/sys/compat/freebsd32/freebsd32_proto.h b/sys/compat/freebsd32/freebsd32_proto.h
index 6c1dc013835d..ae3abe22dda4 100644
--- a/sys/compat/freebsd32/freebsd32_proto.h
+++ b/sys/compat/freebsd32/freebsd32_proto.h
@@ -179,7 +179,7 @@ struct freebsd32_msgrcv_args {
char msqid_l_[PADL_(int)]; int msqid; char msqid_r_[PADR_(int)];
char msgp_l_[PADL_(void *)]; void * msgp; char msgp_r_[PADR_(void *)];
char msgsz_l_[PADL_(size_t)]; size_t msgsz; char msgsz_r_[PADR_(size_t)];
- char msgtyp_l_[PADL_(long)]; long msgtyp; char msgtyp_r_[PADR_(long)];
+ char msgtyp_l_[PADL_(int32_t)]; int32_t msgtyp; char msgtyp_r_[PADR_(int32_t)];
char msgflg_l_[PADL_(int)]; int msgflg; char msgflg_r_[PADR_(int)];
};
struct freebsd32_clock_gettime_args {
@@ -932,7 +932,7 @@ int freebsd32_fspacectl(struct thread *, struct freebsd32_fspacectl_args *);
#endif
struct ofreebsd32_lseek_args {
char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)];
- char offset_l_[PADL_(int)]; int offset; char offset_r_[PADR_(int)];
+ char offset_l_[PADL_(int32_t)]; int32_t offset; char offset_r_[PADR_(int32_t)];
char whence_l_[PADL_(int)]; int whence; char whence_r_[PADR_(int)];
};
struct ofreebsd32_stat_args {
@@ -982,11 +982,22 @@ struct ofreebsd32_sendmsg_args {
char msg_l_[PADL_(const struct omsghdr32 *)]; const struct omsghdr32 * msg; char msg_r_[PADR_(const struct omsghdr32 *)];
char flags_l_[PADL_(int)]; int flags; char flags_r_[PADR_(int)];
};
+struct ofreebsd32_truncate_args {
+ char path_l_[PADL_(const char *)]; const char * path; char path_r_[PADR_(const char *)];
+ char length_l_[PADL_(int32_t)]; int32_t length; char length_r_[PADR_(int32_t)];
+};
+struct ofreebsd32_ftruncate_args {
+ char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)];
+ char length_l_[PADL_(int32_t)]; int32_t length; char length_r_[PADR_(int32_t)];
+};
+struct ofreebsd32_sethostid_args {
+ char hostid_l_[PADL_(int32_t)]; int32_t hostid; char hostid_r_[PADR_(int32_t)];
+};
struct ofreebsd32_getdirentries_args {
char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)];
char buf_l_[PADL_(char *)]; char * buf; char buf_r_[PADR_(char *)];
char count_l_[PADL_(u_int)]; u_int count; char count_r_[PADR_(u_int)];
- char basep_l_[PADL_(uint32_t *)]; uint32_t * basep; char basep_r_[PADR_(uint32_t *)];
+ char basep_l_[PADL_(int32_t *)]; int32_t * basep; char basep_r_[PADR_(int32_t *)];
};
#ifdef PAD64_REQUIRED
#else
@@ -1017,6 +1028,9 @@ int ofreebsd32_sigvec(struct thread *, struct ofreebsd32_sigvec_args *);
int ofreebsd32_sigstack(struct thread *, struct ofreebsd32_sigstack_args *);
int ofreebsd32_recvmsg(struct thread *, struct ofreebsd32_recvmsg_args *);
int ofreebsd32_sendmsg(struct thread *, struct ofreebsd32_sendmsg_args *);
+int ofreebsd32_truncate(struct thread *, struct ofreebsd32_truncate_args *);
+int ofreebsd32_ftruncate(struct thread *, struct ofreebsd32_ftruncate_args *);
+int ofreebsd32_sethostid(struct thread *, struct ofreebsd32_sethostid_args *);
int ofreebsd32_getdirentries(struct thread *, struct ofreebsd32_getdirentries_args *);
#endif /* COMPAT_43 */
@@ -1029,7 +1043,7 @@ int ofreebsd32_getdirentries(struct thread *, struct ofreebsd32_getdirentries_ar
#endif
struct freebsd4_freebsd32_getfsstat_args {
char buf_l_[PADL_(struct ostatfs32 *)]; struct ostatfs32 * buf; char buf_r_[PADR_(struct ostatfs32 *)];
- char bufsize_l_[PADL_(long)]; long bufsize; char bufsize_r_[PADR_(long)];
+ char bufsize_l_[PADL_(int32_t)]; int32_t bufsize; char bufsize_r_[PADR_(int32_t)];
char mode_l_[PADL_(int)]; int mode; char mode_r_[PADR_(int)];
};
struct freebsd4_freebsd32_statfs_args {
@@ -1390,8 +1404,11 @@ int freebsd11_freebsd32_fstatat(struct thread *, struct freebsd11_freebsd32_fsta
#define FREEBSD32_SYS_AUE_freebsd32_readv AUE_READV
#define FREEBSD32_SYS_AUE_freebsd32_writev AUE_WRITEV
#define FREEBSD32_SYS_AUE_freebsd32_settimeofday AUE_SETTIMEOFDAY
+#define FREEBSD32_SYS_AUE_ofreebsd32_truncate AUE_TRUNCATE
+#define FREEBSD32_SYS_AUE_ofreebsd32_ftruncate AUE_FTRUNCATE
#define FREEBSD32_SYS_AUE_freebsd32_utimes AUE_UTIMES
#define FREEBSD32_SYS_AUE_freebsd32_adjtime AUE_ADJTIME
+#define FREEBSD32_SYS_AUE_ofreebsd32_sethostid AUE_SYSCTL
#define FREEBSD32_SYS_AUE_ofreebsd32_getdirentries AUE_GETDIRENTRIES
#define FREEBSD32_SYS_AUE_freebsd4_freebsd32_statfs AUE_STATFS
#define FREEBSD32_SYS_AUE_freebsd4_freebsd32_fstatfs AUE_FSTATFS
diff --git a/sys/compat/freebsd32/freebsd32_syscall.h b/sys/compat/freebsd32/freebsd32_syscall.h
index 426221bf94eb..05dfb299e332 100644
--- a/sys/compat/freebsd32/freebsd32_syscall.h
+++ b/sys/compat/freebsd32/freebsd32_syscall.h
@@ -131,8 +131,8 @@
#define FREEBSD32_SYS_setreuid 126
#define FREEBSD32_SYS_setregid 127
#define FREEBSD32_SYS_rename 128
- /* 129 is old truncate */
- /* 130 is old ftruncate */
+ /* 129 is old freebsd32_truncate */
+ /* 130 is old freebsd32_ftruncate */
#define FREEBSD32_SYS_flock 131
#define FREEBSD32_SYS_mkfifo 132
#define FREEBSD32_SYS_sendto 133
@@ -145,7 +145,7 @@
#define FREEBSD32_SYS_freebsd32_adjtime 140
/* 141 is old getpeername */
/* 142 is old gethostid */
- /* 143 is obsolete sethostid */
+ /* 143 is old freebsd32_sethostid */
/* 144 is old getrlimit */
/* 145 is old setrlimit */
/* 146 is old killpg */
diff --git a/sys/compat/freebsd32/freebsd32_syscalls.c b/sys/compat/freebsd32/freebsd32_syscalls.c
index 1630992680a2..3206e069e85d 100644
--- a/sys/compat/freebsd32/freebsd32_syscalls.c
+++ b/sys/compat/freebsd32/freebsd32_syscalls.c
@@ -138,8 +138,8 @@ const char *freebsd32_syscallnames[] = {
"setreuid", /* 126 = setreuid */
"setregid", /* 127 = setregid */
"rename", /* 128 = rename */
- "compat.truncate", /* 129 = old truncate */
- "compat.ftruncate", /* 130 = old ftruncate */
+ "compat.freebsd32_truncate", /* 129 = old freebsd32_truncate */
+ "compat.freebsd32_ftruncate", /* 130 = old freebsd32_ftruncate */
"flock", /* 131 = flock */
"mkfifo", /* 132 = mkfifo */
"sendto", /* 133 = sendto */
@@ -152,7 +152,7 @@ const char *freebsd32_syscallnames[] = {
"freebsd32_adjtime", /* 140 = freebsd32_adjtime */
"compat.getpeername", /* 141 = old getpeername */
"compat.gethostid", /* 142 = old gethostid */
- "obs_sethostid", /* 143 = obsolete sethostid */
+ "compat.freebsd32_sethostid", /* 143 = old freebsd32_sethostid */
"compat.getrlimit", /* 144 = old getrlimit */
"compat.setrlimit", /* 145 = old setrlimit */
"compat.killpg", /* 146 = old killpg */
diff --git a/sys/compat/freebsd32/freebsd32_sysent.c b/sys/compat/freebsd32/freebsd32_sysent.c
index 76d402de3f5e..12fecbee75ab 100644
--- a/sys/compat/freebsd32/freebsd32_sysent.c
+++ b/sys/compat/freebsd32/freebsd32_sysent.c
@@ -191,8 +191,8 @@ struct sysent freebsd32_sysent[] = {
{ .sy_narg = AS(setreuid_args), .sy_call = (sy_call_t *)sys_setreuid, .sy_auevent = AUE_SETREUID, .sy_flags = SYF_CAPENABLED, .sy_thrcnt = SY_THR_STATIC }, /* 126 = setreuid */
{ .sy_narg = AS(setregid_args), .sy_call = (sy_call_t *)sys_setregid, .sy_auevent = AUE_SETREGID, .sy_flags = SYF_CAPENABLED, .sy_thrcnt = SY_THR_STATIC }, /* 127 = setregid */
{ .sy_narg = AS(rename_args), .sy_call = (sy_call_t *)sys_rename, .sy_auevent = AUE_RENAME, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 128 = rename */
- { compat(AS(otruncate_args),truncate), .sy_auevent = AUE_TRUNCATE, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 129 = old truncate */
- { compat(AS(oftruncate_args),ftruncate), .sy_auevent = AUE_FTRUNCATE, .sy_flags = SYF_CAPENABLED, .sy_thrcnt = SY_THR_STATIC }, /* 130 = old ftruncate */
+ { compat(AS(ofreebsd32_truncate_args),freebsd32_truncate), .sy_auevent = AUE_TRUNCATE, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 129 = old freebsd32_truncate */
+ { compat(AS(ofreebsd32_ftruncate_args),freebsd32_ftruncate), .sy_auevent = AUE_FTRUNCATE, .sy_flags = SYF_CAPENABLED, .sy_thrcnt = SY_THR_STATIC }, /* 130 = old freebsd32_ftruncate */
{ .sy_narg = AS(flock_args), .sy_call = (sy_call_t *)sys_flock, .sy_auevent = AUE_FLOCK, .sy_flags = SYF_CAPENABLED, .sy_thrcnt = SY_THR_STATIC }, /* 131 = flock */
{ .sy_narg = AS(mkfifo_args), .sy_call = (sy_call_t *)sys_mkfifo, .sy_auevent = AUE_MKFIFO, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 132 = mkfifo */
{ .sy_narg = AS(sendto_args), .sy_call = (sy_call_t *)sys_sendto, .sy_auevent = AUE_SENDTO, .sy_flags = SYF_CAPENABLED, .sy_thrcnt = SY_THR_STATIC }, /* 133 = sendto */
@@ -205,7 +205,7 @@ struct sysent freebsd32_sysent[] = {
{ .sy_narg = AS(freebsd32_adjtime_args), .sy_call = (sy_call_t *)freebsd32_adjtime, .sy_auevent = AUE_ADJTIME, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 140 = freebsd32_adjtime */
{ compat(AS(ogetpeername_args),getpeername), .sy_auevent = AUE_GETPEERNAME, .sy_flags = SYF_CAPENABLED, .sy_thrcnt = SY_THR_STATIC }, /* 141 = old getpeername */
{ compat(0,gethostid), .sy_auevent = AUE_SYSCTL, .sy_flags = SYF_CAPENABLED, .sy_thrcnt = SY_THR_STATIC }, /* 142 = old gethostid */
- { .sy_narg = 0, .sy_call = (sy_call_t *)nosys, .sy_auevent = AUE_NULL, .sy_flags = 0, .sy_thrcnt = SY_THR_ABSENT }, /* 143 = obsolete sethostid */
+ { compat(AS(ofreebsd32_sethostid_args),freebsd32_sethostid), .sy_auevent = AUE_SYSCTL, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 143 = old freebsd32_sethostid */
{ compat(AS(ogetrlimit_args),getrlimit), .sy_auevent = AUE_GETRLIMIT, .sy_flags = SYF_CAPENABLED, .sy_thrcnt = SY_THR_STATIC }, /* 144 = old getrlimit */
{ compat(AS(osetrlimit_args),setrlimit), .sy_auevent = AUE_SETRLIMIT, .sy_flags = SYF_CAPENABLED, .sy_thrcnt = SY_THR_STATIC }, /* 145 = old setrlimit */
{ compat(AS(okillpg_args),killpg), .sy_auevent = AUE_KILLPG, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 146 = old killpg */
diff --git a/sys/compat/freebsd32/freebsd32_systrace_args.c b/sys/compat/freebsd32/freebsd32_systrace_args.c
index f61641e3ab24..6ba992bed5c9 100644
--- a/sys/compat/freebsd32/freebsd32_systrace_args.c
+++ b/sys/compat/freebsd32/freebsd32_systrace_args.c
@@ -1093,7 +1093,7 @@ systrace_args(int sysnum, void *params, uint64_t *uarg, int *n_args)
iarg[0] = p->msqid; /* int */
uarg[1] = (intptr_t)p->msgp; /* void * */
uarg[2] = p->msgsz; /* size_t */
- iarg[3] = p->msgtyp; /* long */
+ iarg[3] = p->msgtyp; /* int32_t */
iarg[4] = p->msgflg; /* int */
*n_args = 5;
break;
@@ -3211,7 +3211,7 @@ systrace_args(int sysnum, void *params, uint64_t *uarg, int *n_args)
case 557: {
struct getfsstat_args *p = params;
uarg[0] = (intptr_t)p->buf; /* struct statfs * */
- iarg[1] = p->bufsize; /* long */
+ iarg[1] = p->bufsize; /* int32_t */
iarg[2] = p->mode; /* int */
*n_args = 3;
break;
@@ -5176,7 +5176,7 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *desc, size_t descsz)
p = "size_t";
break;
case 3:
- p = "long";
+ p = "int32_t";
break;
case 4:
p = "int";
@@ -8865,7 +8865,7 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *desc, size_t descsz)
p = "userland struct statfs *";
break;
case 1:
- p = "long";
+ p = "int32_t";
break;
case 2:
p = "int";
diff --git a/sys/compat/freebsd32/syscalls.master b/sys/compat/freebsd32/syscalls.master
index 410499e57609..2bcf84d3baf7 100644
--- a/sys/compat/freebsd32/syscalls.master
+++ b/sys/compat/freebsd32/syscalls.master
@@ -92,9 +92,9 @@
16 AUE_CHOWN NOPROTO { int chown(const char *path, int uid, int gid); }
17 AUE_NULL NOPROTO { void *break(char *nsize); }
18 AUE_GETFSSTAT COMPAT4 { int freebsd32_getfsstat( \
- struct ostatfs32 *buf, long bufsize, \
+ struct ostatfs32 *buf, int32_t bufsize, \
int mode); }
-19 AUE_LSEEK COMPAT { int freebsd32_lseek(int fd, int offset, \
+19 AUE_LSEEK COMPAT { int freebsd32_lseek(int fd, int32_t offset, \
int whence); }
20 AUE_GETPID NOPROTO { pid_t getpid(void); }
21 AUE_MOUNT NOPROTO { int mount(const char *type, \
@@ -274,9 +274,10 @@
127 AUE_SETREGID NOPROTO { int setregid(int rgid, int egid); }
128 AUE_RENAME NOPROTO { int rename(const char *from, \
const char *to); }
-129 AUE_TRUNCATE COMPAT|NOPROTO { int truncate(const char *path, \
- int length); }
-130 AUE_FTRUNCATE COMPAT|NOPROTO { int ftruncate(int fd, int length); }
+129 AUE_TRUNCATE COMPAT { int freebsd32_truncate(const char *path, \
+ int32_t length); }
+130 AUE_FTRUNCATE COMPAT { int freebsd32_ftruncate(int fd, \
+ int32_t length); }
131 AUE_FLOCK NOPROTO { int flock(int fd, int how); }
132 AUE_MKFIFO NOPROTO { int mkfifo(const char *path, mode_t mode); }
133 AUE_SENDTO NOPROTO { int sendto(int s, const void *buf, \
@@ -298,7 +299,7 @@
struct sockaddr *asa, \
__socklen_t *alen); }
142 AUE_SYSCTL COMPAT|NOPROTO { long gethostid(void); }
-143 AUE_SYSCTL OBSOL sethostid
+143 AUE_SYSCTL COMPAT { int freebsd32_sethostid(int32_t hostid); }
144 AUE_GETRLIMIT COMPAT|NOPROTO { int getrlimit(u_int which, \
struct orlimit *rlp); }
145 AUE_SETRLIMIT COMPAT|NOPROTO { int setrlimit(u_int which, \
@@ -323,7 +324,7 @@
; XXX this is a problem!!!
155 AUE_NFS_SVC UNIMPL nfssvc
156 AUE_GETDIRENTRIES COMPAT { int freebsd32_getdirentries(int fd, \
- char *buf, u_int count, uint32_t *basep); }
+ char *buf, u_int count, int32_t *basep); }
157 AUE_STATFS COMPAT4 { int freebsd32_statfs(const char *path, \
struct ostatfs32 *buf); }
158 AUE_FSTATFS COMPAT4 { int freebsd32_fstatfs(int fd, \
@@ -446,7 +447,7 @@
226 AUE_MSGSND NOSTD { int freebsd32_msgsnd(int msqid, const void *msgp, \
size_t msgsz, int msgflg); }
227 AUE_MSGRCV NOSTD { int freebsd32_msgrcv(int msqid, void *msgp, \
- size_t msgsz, long msgtyp, int msgflg); }
+ size_t msgsz, int32_t msgtyp, int msgflg); }
228 AUE_SHMAT NOSTD|NOPROTO { void *shmat(int shmid, const void *shmaddr, \
int shmflg); }
229 AUE_SHMCTL COMPAT7|NOSTD { int freebsd32_shmctl( \
@@ -747,7 +748,7 @@
394 AUE_NULL UNIMPL mac_syscall
395 AUE_GETFSSTAT COMPAT11|NOPROTO { int getfsstat( \
struct freebsd11_statfs *buf, \
- long bufsize, int mode); }
+ int32_t bufsize, int mode); }
396 AUE_STATFS COMPAT11|NOPROTO { int statfs(const char *path, \
struct statfs *buf); }
397 AUE_FSTATFS COMPAT11|NOPROTO { int fstatfs(int fd, \
@@ -1140,7 +1141,7 @@
struct statfs *buf); }
556 AUE_FSTATFS NOPROTO { int fstatfs(int fd, struct statfs *buf); }
557 AUE_GETFSSTAT NOPROTO { int getfsstat(struct statfs *buf, \
- long bufsize, int mode); }
+ int32_t bufsize, int mode); }
558 AUE_FHSTATFS NOPROTO { int fhstatfs(const struct fhandle *u_fhp, \
struct statfs *buf); }
#ifdef PAD64_REQUIRED