Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/compat Handle MAP_ANON (0x100 in Solaris8, not 0x1000) p...



details:   https://anonhg.NetBSD.org/src/rev/40bd082d1441
branches:  trunk
changeset: 521887:40bd082d1441
user:      tv <tv%NetBSD.org@localhost>
date:      Thu Feb 07 23:22:24 2002 +0000

description:
Handle MAP_ANON (0x100 in Solaris8, not 0x1000) properly, by factoring out
the flags common to SVR4 and NetBSD, and mapping the rest manually.

diffstat:

 sys/compat/svr4/svr4_misc.c       |  34 ++++++++++++++++++++++++++++------
 sys/compat/svr4/svr4_mman.h       |  11 ++++++++++-
 sys/compat/svr4_32/svr4_32_misc.c |  34 ++++++++++++++++++++++++++++------
 3 files changed, 66 insertions(+), 13 deletions(-)

diffs (211 lines):

diff -r 20ced601f55f -r 40bd082d1441 sys/compat/svr4/svr4_misc.c
--- a/sys/compat/svr4/svr4_misc.c       Thu Feb 07 22:23:01 2002 +0000
+++ b/sys/compat/svr4/svr4_misc.c       Thu Feb 07 23:22:24 2002 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: svr4_misc.c,v 1.94 2001/11/18 13:29:29 jdolecek Exp $   */
+/*     $NetBSD: svr4_misc.c,v 1.95 2002/02/07 23:22:24 tv Exp $         */
 
 /*-
  * Copyright (c) 1994 The NetBSD Foundation, Inc.
@@ -44,7 +44,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: svr4_misc.c,v 1.94 2001/11/18 13:29:29 jdolecek Exp $");
+__KERNEL_RCSID(0, "$NetBSD: svr4_misc.c,v 1.95 2002/02/07 23:22:24 tv Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -101,6 +101,8 @@
 
 #include <uvm/uvm_extern.h>
 
+static int svr4_to_bsd_mmap_flags __P((int));
+
 static __inline clock_t timeval_to_clock_t __P((struct timeval *));
 static int svr4_setinfo        __P((struct proc *, int, svr4_siginfo_t *));
 
@@ -489,6 +491,24 @@
 }
 
 
+static int
+svr4_to_bsd_mmap_flags(f)
+       int f;
+{
+       int type = f & SVR4_MAP_TYPE;
+       int nf;
+
+       if (type != MAP_PRIVATE && type != MAP_SHARED)
+               return -1;
+
+       nf = f & SVR4_MAP_COPYFLAGS;
+       if (f & SVR4_MAP_ANON)
+               nf |= MAP_ANON;
+
+       return nf;
+}
+
+
 int
 svr4_sys_mmap(p, v, retval)
        struct proc *p;
@@ -498,7 +518,6 @@
        struct svr4_sys_mmap_args       *uap = v;
        struct sys_mmap_args     mm;
        void            *rp;
-#define _MAP_NEW       0x80000000
        /*
          * Verify the arguments.
          */
@@ -508,9 +527,11 @@
        if (SCARG(uap, len) == 0)
                return EINVAL;
 
+       if ((SCARG(&mm, flags) = svr4_to_bsd_mmap_flags(SCARG(uap, flags))) == -1)
+               return EINVAL;
+
        SCARG(&mm, prot) = SCARG(uap, prot);
        SCARG(&mm, len) = SCARG(uap, len);
-       SCARG(&mm, flags) = SCARG(uap, flags) & ~_MAP_NEW;
        SCARG(&mm, fd) = SCARG(uap, fd);
        SCARG(&mm, addr) = SCARG(uap, addr);
        SCARG(&mm, pos) = SCARG(uap, pos);
@@ -533,7 +554,6 @@
        struct svr4_sys_mmap64_args     *uap = v;
        struct sys_mmap_args     mm;
        void            *rp;
-#define _MAP_NEW       0x80000000
        /*
          * Verify the arguments.
          */
@@ -543,9 +563,11 @@
        if (SCARG(uap, len) == 0)
                return EINVAL;
 
+       if ((SCARG(&mm, flags) = svr4_to_bsd_mmap_flags(SCARG(uap, flags))) == -1)
+               return EINVAL;
+
        SCARG(&mm, prot) = SCARG(uap, prot);
        SCARG(&mm, len) = SCARG(uap, len);
-       SCARG(&mm, flags) = SCARG(uap, flags) & ~_MAP_NEW;
        SCARG(&mm, fd) = SCARG(uap, fd);
        SCARG(&mm, addr) = SCARG(uap, addr);
        SCARG(&mm, pos) = SCARG(uap, pos);
diff -r 20ced601f55f -r 40bd082d1441 sys/compat/svr4/svr4_mman.h
--- a/sys/compat/svr4/svr4_mman.h       Thu Feb 07 22:23:01 2002 +0000
+++ b/sys/compat/svr4/svr4_mman.h       Thu Feb 07 23:22:24 2002 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: svr4_mman.h,v 1.2 1999/04/06 02:55:24 tv Exp $ */
+/*     $NetBSD: svr4_mman.h,v 1.3 2002/02/07 23:22:24 tv Exp $ */
 
 /*-
  * Copyright (c) 1997 The NetBSD Foundation, Inc.
@@ -49,4 +49,13 @@
 #define SVR4_MC_LOCKAS         5
 #define SVR4_MC_UNLOCKAS       6
 
+/*
+ * Flags passed to traditional mmap() syscall.  The type (SHARED/PRIVATE)
+ * is the same as in NetBSD.
+ */
+
+#define SVR4_MAP_TYPE          0x00f
+#define SVR4_MAP_COPYFLAGS     0x07f   /* flags same as NetBSD */
+#define SVR4_MAP_ANON          0x100
+
 #endif /* !_SVR4_MMAN_H */
diff -r 20ced601f55f -r 40bd082d1441 sys/compat/svr4_32/svr4_32_misc.c
--- a/sys/compat/svr4_32/svr4_32_misc.c Thu Feb 07 22:23:01 2002 +0000
+++ b/sys/compat/svr4_32/svr4_32_misc.c Thu Feb 07 23:22:24 2002 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: svr4_32_misc.c,v 1.9 2001/11/13 02:09:29 lukem Exp $    */
+/*     $NetBSD: svr4_32_misc.c,v 1.10 2002/02/07 23:22:24 tv Exp $      */
 
 /*-
  * Copyright (c) 1994 The NetBSD Foundation, Inc.
@@ -44,7 +44,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: svr4_32_misc.c,v 1.9 2001/11/13 02:09:29 lukem Exp $");
+__KERNEL_RCSID(0, "$NetBSD: svr4_32_misc.c,v 1.10 2002/02/07 23:22:24 tv Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -101,6 +101,8 @@
 
 #include <uvm/uvm_extern.h>
 
+static int svr4_to_bsd_mmap_flags __P((int));
+
 static __inline clock_t timeval_to_clock_t __P((struct timeval *));
 static int svr4_32_setinfo     __P((struct proc *, int, svr4_32_siginfo_tp));
 
@@ -493,6 +495,24 @@
 }
 
 
+static int
+svr4_to_bsd_mmap_flags(f)
+       int f;
+{
+       int type = f & SVR4_MAP_TYPE;
+       int nf;
+
+       if (type != MAP_PRIVATE && type != MAP_SHARED)
+               return -1;
+
+       nf = f & SVR4_MAP_COPYFLAGS;
+       if (f & SVR4_MAP_ANON)
+       nf |= MAP_ANON;
+
+       return nf;
+}
+
+
 int
 svr4_32_sys_mmap(p, v, retval)
        struct proc *p;
@@ -503,7 +523,6 @@
        struct sys_mmap_args             mm;
        void                            *rp;
        int                              error;
-#define _MAP_NEW       0x80000000
        /*
          * Verify the arguments.
          */
@@ -513,9 +532,11 @@
        if (SCARG(uap, len) == 0)
                return EINVAL;
 
+       if ((SCARG(&mm, flags) = svr4_to_bsd_mmap_flags(SCARG(uap, flags))) == -1)
+               return EINVAL;
+
        SCARG(&mm, prot) = SCARG(uap, prot);
        SCARG(&mm, len) = SCARG(uap, len);
-       SCARG(&mm, flags) = SCARG(uap, flags) & ~_MAP_NEW;
        SCARG(&mm, fd) = SCARG(uap, fd);
        SCARG(&mm, addr) = (void *)(u_long)SCARG(uap, addr);
        SCARG(&mm, pos) = SCARG(uap, pos);
@@ -545,7 +566,6 @@
        struct sys_mmap_args             mm;
        void                            *rp;
        int                              error;
-#define _MAP_NEW       0x80000000
        /*
          * Verify the arguments.
          */
@@ -555,9 +575,11 @@
        if (SCARG(uap, len) == 0)
                return EINVAL;
 
+       if ((SCARG(&mm, flags) = svr4_to_bsd_mmap_flags(SCARG(uap, flags))) == -1)
+               return EINVAL;
+
        SCARG(&mm, prot) = SCARG(uap, prot);
        SCARG(&mm, len) = SCARG(uap, len);
-       SCARG(&mm, flags) = SCARG(uap, flags) & ~_MAP_NEW;
        SCARG(&mm, fd) = SCARG(uap, fd);
        SCARG(&mm, addr) = (void *)(u_long)SCARG(uap, addr);
        SCARG(&mm, pos) = SCARG(uap, pos);



Home | Main Index | Thread Index | Old Index