On Thu, Jun 26, 2014 at 12:28:18PM -0700, Matthew Dempsky wrote:
> I just reviewed our mmap(2) flags to compare them against Linux,
> FreeBSD, Solaris, and Darwin's flags.  Of the flags listed below, none
> of them are specified by POSIX, and none of them do anything
> interesting on OpenBSD: MAP_COPY just gets rewritten to MAP_PRIVATE,
> and the rest are silently ignored by UVM.

Feedback so far is the useless flags should go away.  Diff below is a
first step towards this:

1. MAP_COPY is redefined as an alias for MAP_PRIVATE, and the other
useless MAP_* flags are redefined to 0.  They're also hidden from the
kernel to make sure no kernel code accidentally depends on them still.

2. Adds COMPAT_O55_MAP_COPY so we can stay binary compatible with any
OpenBSD 5.5 programs that still use MAP_COPY (probably none, but it's
trivial to do), and COMPAT_O55_MAP_NOOPMASK just to keep track of
which bits were previously reserved for do-nothing flags.

3. Reshuffles the defines a little bit so the order makes more sense.

Followup patch will add a deprecation warning for the MAP_* flags, but
I think that'll need some ports testing, whereas this should be safe
to commit now.

ok?

Index: sys/mman.h
===================================================================
RCS file: /home/matthew/cvs-mirror/cvs/src/sys/sys/mman.h,v
retrieving revision 1.24
diff -u -p -r1.24 mman.h
--- sys/mman.h  13 Jun 2014 01:48:52 -0000      1.24
+++ sys/mman.h  26 Jun 2014 23:54:28 -0000
@@ -50,32 +50,43 @@
  */
 #define        MAP_SHARED      0x0001  /* share changes */
 #define        MAP_PRIVATE     0x0002  /* changes are private */
-#define        MAP_COPY        0x0004  /* "copy" region at mmap time */
+
+/*
+ * Mapping type
+ */
+#define        MAP_FILE        0x0000  /* map from file (default) */
+#define        MAP_ANON        0x1000  /* allocated from memory, swap space */
 
 /*
  * Other flags
  */
-#define        MAP_FIXED        0x0010 /* map addr must be exactly as 
requested */
-#define        MAP_RENAME       0x0020 /* Sun: rename private pages to file */
-#define        MAP_NORESERVE    0x0040 /* Sun: don't reserve needed swap area 
*/
-#define        MAP_INHERIT      0x0080 /* region is retained after exec */
-#define        MAP_NOEXTEND     0x0100 /* for MAP_FILE, don't change file size 
*/
-#define        MAP_HASSEMAPHORE 0x0200 /* region may contain semaphores */
-#define        MAP_TRYFIXED     0x0400 /* attempt hint address, even within 
heap */
+#define        MAP_FIXED       0x0010  /* map addr must be exactly as 
requested */
+#define        __MAP_NOREPLACE 0x0800  /* fail if address not available */
 
-#define        __MAP_NOREPLACE  0x0800 /* fail if address not available */
+#ifdef _KERNEL
+#define COMPAT_O55_MAP_COPY    0x0004  /* alias for MAP_PRIVATE */
+#define COMPAT_O55_MAP_NOOPMASK        0x07e0  /* formerly reserved flag bits 
*/
+#endif
+
+#define        MAP_FLAGMASK    0x1ff7
 
+#ifndef _KERNEL
 /*
- * Error return from mmap()
+ * Deprecated flags with no significant meaning on OpenBSD.
  */
-#define MAP_FAILED     ((void *)-1)
+#define        MAP_COPY                MAP_PRIVATE
+#define        MAP_HASSEMAPHORE        0
+#define        MAP_INHERIT             0
+#define        MAP_NOEXTEND            0
+#define        MAP_NORESERVE           0
+#define        MAP_RENAME              0
+#define        MAP_TRYFIXED            0
+#endif
 
 /*
- * Mapping type
+ * Error return from mmap()
  */
-#define        MAP_FILE        0x0000  /* map from file (default) */
-#define        MAP_ANON        0x1000  /* allocated from memory, swap space */
-#define        MAP_FLAGMASK    0x1ff7
+#define MAP_FAILED     ((void *)-1)
 
 /*
  * POSIX memory advisory values.
Index: uvm/uvm_mmap.c
===================================================================
RCS file: /home/matthew/cvs-mirror/cvs/src/sys/uvm/uvm_mmap.c,v
retrieving revision 1.94
diff -u -p -r1.94 uvm_mmap.c
--- uvm/uvm_mmap.c      13 Apr 2014 23:14:15 -0000      1.94
+++ uvm/uvm_mmap.c      26 Jun 2014 23:49:39 -0000
@@ -345,8 +345,8 @@ sys_mmap(struct proc *p, void *v, regist
                return (EINVAL);
        if ((flags & MAP_FLAGMASK) != flags)
                return (EINVAL);
-       if (flags & MAP_COPY)
-               flags = (flags & ~MAP_COPY) | MAP_PRIVATE;
+       if (flags & COMPAT_O55_MAP_COPY)
+               flags = (flags & ~COMPAT_O55_MAP_COPY) | MAP_PRIVATE;
        if ((flags & (MAP_SHARED|MAP_PRIVATE)) == (MAP_SHARED|MAP_PRIVATE))
                return (EINVAL);
        if ((flags & (MAP_FIXED|__MAP_NOREPLACE)) == __MAP_NOREPLACE)

Reply via email to