John Baldwin schrieb am 2009-10-21:
> On Wednesday 21 October 2009 11:51:04 am Alexander Best wrote:
> > although the mmap(2) manual states in section MAP_ANON:

> > "The offset argument is ignored."

> > this doesn't seem to be true. running

> > printf("%p\n", mmap((void*)0x1000, 0x1000, PROT_NONE, MAP_ANON, -1,
> > 0x12345678));

> > and

> > printf("%p\n", mmap((void*)0x1000, 0x1000, PROT_NONE, MAP_ANON, -1,
> > 0));

> > produces different outputs. i've attached a patch to solve the
> > problem. the
> > patch is similar to the one proposed in this PR, but should apply
> > cleanly to
> > CURRENT: http://www.freebsd.org/cgi/query-pr.cgi?pr=kern/71258

> A simpler patch would be to simply set pos = 0 below the MAP_STACK
> line if
> MAP_ANON is set.

how about the following patch. problem seems to be that pos = 0 needs to be
set before pageoff is being calculated.

i've tested mmap with MAP_STACK and the offset gets discarded just as
documented in mmap(2). with the patch the offset handling with MAP_ANON and
MAP_STACK (implies MAP_ANON) are the same.

another short question:

why does the second call when doing

        printf("%p\n", mmap((void*)0x1000, 0x1000, PROT_READ|PROT_WRITE,
        MAP_STACK, -1, 0x0));
        printf("%p\n", mmap((void*)0x1000, 0x1000, PROT_READ|PROT_WRITE,
        MAP_STACK, -1, 0x0));

fail? doesn't MAP_STACK allow mapping the same region twice?

        printf("%p\n", mmap((void*)0x1000, 0x1000, PROT_READ|PROT_WRITE,
        MAP_STACK, -1, 0x0));
        printf("%p\n", mmap((void*)0x2000, 0x1000, PROT_READ|PROT_WRITE,
        MAP_STACK, -1, 0x0));

works just as expected.

cheers.
alex
--- /usr/src/sys/vm/vm_mmap.c   2009-10-28 21:37:53.000000000 +0100
+++ ./vm_mmap.c 2009-10-31 03:22:44.000000000 +0100
@@ -241,9 +241,11 @@
                    ((prot & (PROT_READ | PROT_WRITE)) != (PROT_READ | 
PROT_WRITE)))
                        return (EINVAL);
                flags |= MAP_ANON;
-               pos = 0;
        }
 
+       if (flags & MAP_ANON)
+               pos = 0;
+
        /*
         * Align the file position to a page boundary,
         * and save its page offset component.
@@ -300,7 +302,6 @@
                handle = NULL;
                handle_type = OBJT_DEFAULT;
                maxprot = VM_PROT_ALL;
-               pos = 0;
        } else {
                /*
                 * Mapping file, get fp for validation and
_______________________________________________
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to "freebsd-hackers-unsubscr...@freebsd.org"

Reply via email to