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); }
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to