svn commit: r340388 - in stable/12/sys: compat/freebsd32 kern
Brooks Davis
brooks at FreeBSD.org
Mon Nov 12 21:51:38 UTC 2018
Author: brooks
Date: Mon Nov 12 21:51:36 2018
New Revision: 340388
URL: https://svnweb.freebsd.org/changeset/base/340388
Log:
MFC r340302:
Fix freebsd32 mknod(at).
As dev_t is now a 64-bit integer, it requires special handling as a
system call argument. 64-bit arguments are split between two 64-bit
integers due to the way arguments are promoted to allow reuse of most
system call implementations. They must be reassembled before use.
Further, 64-bit arguments at an odd offset (counting from zero) are
padded and slid to the next slot on powerpc and mips. Fix the
non-COMPAT11 system call by adding a freebsd32_mknodat() and
appropriately padded declerations.
The COMPAT11 system calls are fully compatible with the 64-bit
implementations so remove the freebsd32_ versions.
Use uint32_t consistently as the type of the old dev_t. This matches
the old definition.
Reviewed by: kib
Approved by: re (gjb)
Sponsored by: DARPA, AFRL
Differential Revision: https://reviews.freebsd.org/D17928
Modified:
stable/12/sys/compat/freebsd32/freebsd32_misc.c
stable/12/sys/compat/freebsd32/syscalls.master
stable/12/sys/kern/syscalls.master
Directory Properties:
stable/12/ (props changed)
Modified: stable/12/sys/compat/freebsd32/freebsd32_misc.c
==============================================================================
--- stable/12/sys/compat/freebsd32/freebsd32_misc.c Mon Nov 12 21:01:28 2018 (r340387)
+++ stable/12/sys/compat/freebsd32/freebsd32_misc.c Mon Nov 12 21:51:36 2018 (r340388)
@@ -463,25 +463,14 @@ freebsd32_fexecve(struct thread *td, struct freebsd32_
return (error);
}
-#if defined(COMPAT_FREEBSD11)
-int
-freebsd11_freebsd32_mknod(struct thread *td,
- struct freebsd11_freebsd32_mknod_args *uap)
-{
- return (kern_mknodat(td, AT_FDCWD, uap->path, UIO_USERSPACE, uap->mode,
- uap->dev));
-}
-
int
-freebsd11_freebsd32_mknodat(struct thread *td,
- struct freebsd11_freebsd32_mknodat_args *uap)
+freebsd32_mknodat(struct thread *td, struct freebsd32_mknodat_args *uap)
{
- return (kern_mknodat(td, uap->fd, uap->path, UIO_USERSPACE, uap->mode,
- uap->dev));
+ return (kern_mknodat(td, uap->fd, uap->path, UIO_USERSPACE,
+ uap->mode, PAIR32TO64(dev_t, uap->dev)));
}
-#endif /* COMPAT_FREEBSD11 */
int
freebsd32_mprotect(struct thread *td, struct freebsd32_mprotect_args *uap)
Modified: stable/12/sys/compat/freebsd32/syscalls.master
==============================================================================
--- stable/12/sys/compat/freebsd32/syscalls.master Mon Nov 12 21:01:28 2018 (r340387)
+++ stable/12/sys/compat/freebsd32/syscalls.master Mon Nov 12 21:51:36 2018 (r340388)
@@ -83,8 +83,8 @@
11 AUE_NULL OBSOL execv
12 AUE_CHDIR NOPROTO { int chdir(char *path); }
13 AUE_FCHDIR NOPROTO { int fchdir(int fd); }
-14 AUE_MKNOD COMPAT11 { int freebsd32_mknod(char *path, \
- int mode, int dev); }
+14 AUE_MKNOD COMPAT11|NOPROTO { int mknod(char *path, \
+ int mode, uint32_t dev); }
15 AUE_CHMOD NOPROTO { int chmod(char *path, int mode); }
16 AUE_CHOWN NOPROTO { int chown(char *path, int uid, int gid); }
17 AUE_NULL NOPROTO { caddr_t break(char *nsize); }
@@ -943,7 +943,7 @@
mode_t mode); }
497 AUE_MKFIFOAT NOPROTO { int mkfifoat(int fd, char *path, \
mode_t mode); }
-498 AUE_MKNODAT COMPAT11 { int freebsd32_mknodat(int fd, char *path, \
+498 AUE_MKNODAT COMPAT11|NOPROTO { int mknodat(int fd, char *path, \
mode_t mode, uint32_t dev); }
499 AUE_OPENAT_RWTC NOPROTO { int openat(int fd, char *path, int flag, \
mode_t mode); }
@@ -1095,8 +1095,15 @@
long bufsize, int mode); }
558 AUE_FHSTATFS NOPROTO { int fhstatfs(const struct fhandle *u_fhp, \
struct statfs32 *buf); }
-559 AUE_MKNODAT NOPROTO { int mknodat(int fd, char *path, mode_t mode, \
- dev_t dev); }
+#ifdef PAD64_REQUIRED
+559 AUE_MKNODAT STD { int freebsd32_mknodat(int fd, \
+ char *path, mode_t mode, \
+ int pad, uint32_t dev1, uint32_t dev2); }
+#else
+559 AUE_MKNODAT STD { int freebsd32_mknodat(int fd, \
+ char *path, mode_t mode, \
+ uint32_t dev1, uint32_t dev2); }
+#endif
560 AUE_KEVENT STD { int freebsd32_kevent(int fd, \
const struct kevent32 *changelist, \
int nchanges, \
Modified: stable/12/sys/kern/syscalls.master
==============================================================================
--- stable/12/sys/kern/syscalls.master Mon Nov 12 21:01:28 2018 (r340387)
+++ stable/12/sys/kern/syscalls.master Mon Nov 12 21:51:36 2018 (r340388)
@@ -114,7 +114,7 @@
12 AUE_CHDIR STD { int chdir(_In_z_ char *path); }
13 AUE_FCHDIR STD { int fchdir(int fd); }
14 AUE_MKNOD COMPAT11 { int mknod(_In_z_ char *path, int mode, \
- int dev); }
+ uint32_t dev); }
15 AUE_CHMOD STD { int chmod(_In_z_ char *path, int mode); }
16 AUE_CHOWN STD { int chown(_In_z_ char *path, \
int uid, int gid); }
More information about the svn-src-stable
mailing list