Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 31 Dec 2006 13:21:27 -0600
From:      "Scot Hetzel" <swhetzel@gmail.com>
To:        "Divacky Roman" <xdivac02@stud.fit.vutbr.cz>
Cc:        Alexander Leidinger <Alexander@leidinger.net>, freebsd-emulation@freebsd.org
Subject:   Re: linuxolator: amd64 Linux Test Project failures
Message-ID:  <790a9fff0612311121l662736e0ud6d3220382af072a@mail.gmail.com>
In-Reply-To: <20061231142412.GA28462@stud.fit.vutbr.cz>
References:  <790a9fff0612290911t5ae69715gd2bf0dda0f9228f2@mail.gmail.com> <20061229213509.GA86839@stud.fit.vutbr.cz> <790a9fff0612291424g4ecbd088i7846d248851b3e63@mail.gmail.com> <20061230120722.GA36814@stud.fit.vutbr.cz> <790a9fff0612301926n1562d560r1f3fff9af4bdb138@mail.gmail.com> <790a9fff0612301955r35b16472r2429fbe3fce78228@mail.gmail.com> <20061231144257.61520dc8@Magellan.Leidinger.net> <20061231142412.GA28462@stud.fit.vutbr.cz>

next in thread | previous in thread | raw e-mail | index | archive | help

[-- Attachment #1 --]
On 12/31/06, Divacky Roman <xdivac02@stud.fit.vutbr.cz> wrote:
> On Sun, Dec 31, 2006 at 02:42:57PM +0100, Alexander Leidinger wrote:
> > Quoting "Scot Hetzel" <swhetzel@gmail.com> (Sat, 30 Dec 2006 21:55:37 -0600):
> >
> > > I think I found the problem,  I had wrongly assumed that the code was
> > > using (char *)-1 as the address to pass to the function.  Instead the
> > > code in access03, is using mmap to assign an address to variable
> > > bad_address.
> > >
> > > Below is the test program that shows that the problem is in mmap.
> >
> > http://lists.freebsd.org/pipermail/freebsd-emulation/2006-September/002625.html
>
> I guess what alexander wanted to say is that you should test the mmap patch
> that got commited to i386 mmap (see
> http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/i386/linux/linux_machdep.c.diff?r1=1.55&r2=1.56)
>
> and apply that to amd64 mmap and see if that fixes the issue you see..
>
> pls do that and inform us
>
That patch to mmap fixes the problems with mmap on amd64, and brings
the failed LTP testcases closer to the  i386 failed testcases.

Results of mmap fingerprinter:
  mmap1.txt - before mmap patch
  mmap2.txt - after mmap patch

Scot

-- 
DISCLAIMER:
No electrons were mamed while sending this message. Only slightly bruised.

[-- Attachment #2 --]
0001: mmap(0, 1024, PROT_NONE, MAP_SHARED, ...)
 for filemode O_RDONLY: mmap OK read: 0x41 write: sigsegv
0002: mmap(0, 1024, PROT_READ, MAP_SHARED, ...)
 for filemode O_RDONLY: mmap OK read: 0x41 write: sigsegv
0003: mmap(0, 1024, PROT_WRITE, MAP_SHARED, ...)
 for filemode O_RDONLY: mmap error (13)
0004: mmap(0, 1024, PROT_READ|PROT_WRITE, MAP_SHARED, ...)
 for filemode O_RDONLY: mmap error (13)
0005: mmap(0, 1024, PROT_NONE, MAP_PRIVATE, ...)
 for filemode O_RDONLY: mmap OK read: 0x41 write: sigsegv
0006: mmap(0, 1024, PROT_READ, MAP_PRIVATE, ...)
 for filemode O_RDONLY: mmap OK read: 0x41 write: sigsegv
0007: mmap(0, 1024, PROT_WRITE, MAP_PRIVATE, ...)
 for filemode O_RDONLY: mmap OK read: 0x41 write: OK
0008: mmap(0, 1024, PROT_READ|PROT_WRITE, MAP_PRIVATE, ...)
 for filemode O_RDONLY: mmap OK read: 0x41 write: OK
0009: mmap(0, 1024, PROT_NONE, MAP_SHARED, ...)
 for filemode O_WRONLY: mmap error (13)
0010: mmap(0, 1024, PROT_READ, MAP_SHARED, ...)
 for filemode O_WRONLY: mmap error (13)
0011: mmap(0, 1024, PROT_WRITE, MAP_SHARED, ...)
 for filemode O_WRONLY: mmap error (13)
0012: mmap(0, 1024, PROT_READ|PROT_WRITE, MAP_SHARED, ...)
 for filemode O_WRONLY: mmap error (13)
0013: mmap(0, 1024, PROT_NONE, MAP_PRIVATE, ...)
 for filemode O_WRONLY: mmap error (13)
0014: mmap(0, 1024, PROT_READ, MAP_PRIVATE, ...)
 for filemode O_WRONLY: mmap error (13)
0015: mmap(0, 1024, PROT_WRITE, MAP_PRIVATE, ...)
 for filemode O_WRONLY: mmap error (13)
0016: mmap(0, 1024, PROT_READ|PROT_WRITE, MAP_PRIVATE, ...)
 for filemode O_WRONLY: mmap error (13)
0017: mmap(0, 1024, PROT_NONE, MAP_SHARED, ...)
 for filemode O_RDWR: mmap OK read: 0x41 write: sigsegv
0018: mmap(0, 1024, PROT_READ, MAP_SHARED, ...)
 for filemode O_RDWR: mmap OK read: 0x41 write: sigsegv
0019: mmap(0, 1024, PROT_WRITE, MAP_SHARED, ...)
 for filemode O_RDWR: mmap OK read: 0x41 write: OK
0020: mmap(0, 1024, PROT_READ|PROT_WRITE, MAP_SHARED, ...)
 for filemode O_RDWR: mmap OK read: 0x42 write: OK
0021: mmap(0, 1024, PROT_NONE, MAP_PRIVATE, ...)
 for filemode O_RDWR: mmap OK read: 0x42 write: sigsegv
0022: mmap(0, 1024, PROT_READ, MAP_PRIVATE, ...)
 for filemode O_RDWR: mmap OK read: 0x42 write: sigsegv
0023: mmap(0, 1024, PROT_WRITE, MAP_PRIVATE, ...)
 for filemode O_RDWR: mmap OK read: 0x42 write: OK
0024: mmap(0, 1024, PROT_READ|PROT_WRITE, MAP_PRIVATE, ...)
 for filemode O_RDWR: mmap OK read: 0x42 write: OK
0025: mmap(0, 1024, PROT_NONE, MAP_ANON|MAP_SHARED, ...)
 for filemode anonymous: mmap OK read: 0x00 write: sigsegv
0026: mmap(0, 1024, PROT_READ, MAP_ANON|MAP_SHARED, ...)
 for filemode anonymous: mmap OK read: 0x00 write: sigsegv
0027: mmap(0, 1024, PROT_WRITE, MAP_ANON|MAP_SHARED, ...)
 for filemode anonymous: mmap OK read: 0x00 write: OK
0028: mmap(0, 1024, PROT_READ|PROT_WRITE, MAP_ANON|MAP_SHARED, ...)
 for filemode anonymous: mmap OK read: 0x00 write: OK
0029: mmap(0, 1024, PROT_NONE, MAP_ANON|MAP_PRIVATE, ...)
 for filemode anonymous: mmap OK read: 0x00 write: sigsegv
0030: mmap(0, 1024, PROT_READ, MAP_ANON|MAP_PRIVATE, ...)
 for filemode anonymous: mmap OK read: 0x00 write: sigsegv
0031: mmap(0, 1024, PROT_WRITE, MAP_ANON|MAP_PRIVATE, ...)
 for filemode anonymous: mmap OK read: 0x00 write: OK
0032: mmap(0, 1024, PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE, ...)
 for filemode anonymous: mmap OK read: 0x00 write: OK

[-- Attachment #3 --]
0001: mmap(0, 1024, PROT_NONE, MAP_SHARED, ...)
 for filemode O_RDONLY: mmap OK read: sigsegv write: sigsegv
0002: mmap(0, 1024, PROT_READ, MAP_SHARED, ...)
 for filemode O_RDONLY: mmap OK read: 0x41 write: sigsegv
0003: mmap(0, 1024, PROT_WRITE, MAP_SHARED, ...)
 for filemode O_RDONLY: mmap error (13)
0004: mmap(0, 1024, PROT_READ|PROT_WRITE, MAP_SHARED, ...)
 for filemode O_RDONLY: mmap error (13)
0005: mmap(0, 1024, PROT_NONE, MAP_PRIVATE, ...)
 for filemode O_RDONLY: mmap OK read: sigsegv write: sigsegv
0006: mmap(0, 1024, PROT_READ, MAP_PRIVATE, ...)
 for filemode O_RDONLY: mmap OK read: 0x41 write: sigsegv
0007: mmap(0, 1024, PROT_WRITE, MAP_PRIVATE, ...)
 for filemode O_RDONLY: mmap OK read: sigsegv write: OK
0008: mmap(0, 1024, PROT_READ|PROT_WRITE, MAP_PRIVATE, ...)
 for filemode O_RDONLY: mmap OK read: 0x41 write: OK
0009: mmap(0, 1024, PROT_NONE, MAP_SHARED, ...)
 for filemode O_WRONLY: mmap error (13)
0010: mmap(0, 1024, PROT_READ, MAP_SHARED, ...)
 for filemode O_WRONLY: mmap error (13)
0011: mmap(0, 1024, PROT_WRITE, MAP_SHARED, ...)
 for filemode O_WRONLY: mmap error (13)
0012: mmap(0, 1024, PROT_READ|PROT_WRITE, MAP_SHARED, ...)
 for filemode O_WRONLY: mmap error (13)
0013: mmap(0, 1024, PROT_NONE, MAP_PRIVATE, ...)
 for filemode O_WRONLY: mmap error (13)
0014: mmap(0, 1024, PROT_READ, MAP_PRIVATE, ...)
 for filemode O_WRONLY: mmap error (13)
0015: mmap(0, 1024, PROT_WRITE, MAP_PRIVATE, ...)
 for filemode O_WRONLY: mmap error (13)
0016: mmap(0, 1024, PROT_READ|PROT_WRITE, MAP_PRIVATE, ...)
 for filemode O_WRONLY: mmap error (13)
0017: mmap(0, 1024, PROT_NONE, MAP_SHARED, ...)
 for filemode O_RDWR: mmap OK read: sigsegv write: sigsegv
0018: mmap(0, 1024, PROT_READ, MAP_SHARED, ...)
 for filemode O_RDWR: mmap OK read: 0x41 write: sigsegv
0019: mmap(0, 1024, PROT_WRITE, MAP_SHARED, ...)
 for filemode O_RDWR: mmap OK read: sigsegv write: OK
0020: mmap(0, 1024, PROT_READ|PROT_WRITE, MAP_SHARED, ...)
 for filemode O_RDWR: mmap OK read: 0x42 write: OK
0021: mmap(0, 1024, PROT_NONE, MAP_PRIVATE, ...)
 for filemode O_RDWR: mmap OK read: sigsegv write: sigsegv
0022: mmap(0, 1024, PROT_READ, MAP_PRIVATE, ...)
 for filemode O_RDWR: mmap OK read: 0x42 write: sigsegv
0023: mmap(0, 1024, PROT_WRITE, MAP_PRIVATE, ...)
 for filemode O_RDWR: mmap OK read: sigsegv write: OK
0024: mmap(0, 1024, PROT_READ|PROT_WRITE, MAP_PRIVATE, ...)
 for filemode O_RDWR: mmap OK read: 0x42 write: OK
0025: mmap(0, 1024, PROT_NONE, MAP_ANON|MAP_SHARED, ...)
 for filemode anonymous: mmap OK read: sigsegv write: sigsegv
0026: mmap(0, 1024, PROT_READ, MAP_ANON|MAP_SHARED, ...)
 for filemode anonymous: mmap OK read: 0x00 write: sigsegv
0027: mmap(0, 1024, PROT_WRITE, MAP_ANON|MAP_SHARED, ...)
 for filemode anonymous: mmap OK read: sigsegv write: OK
0028: mmap(0, 1024, PROT_READ|PROT_WRITE, MAP_ANON|MAP_SHARED, ...)
 for filemode anonymous: mmap OK read: 0x00 write: OK
0029: mmap(0, 1024, PROT_NONE, MAP_ANON|MAP_PRIVATE, ...)
 for filemode anonymous: mmap OK read: sigsegv write: sigsegv
0030: mmap(0, 1024, PROT_READ, MAP_ANON|MAP_PRIVATE, ...)
 for filemode anonymous: mmap OK read: 0x00 write: sigsegv
0031: mmap(0, 1024, PROT_WRITE, MAP_ANON|MAP_PRIVATE, ...)
 for filemode anonymous: mmap OK read: sigsegv write: OK
0032: mmap(0, 1024, PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE, ...)
 for filemode anonymous: mmap OK read: 0x00 write: OK

[-- Attachment #4 --]
Index: linux32_machdep.c
===================================================================
RCS file: /home/ncvs/src/sys/amd64/linux32/linux32_machdep.c,v
retrieving revision 1.23
diff -u -r1.23 linux32_machdep.c
--- linux32_machdep.c	20 Dec 2006 20:17:34 -0000	1.23
+++ linux32_machdep.c	31 Dec 2006 17:30:41 -0000
@@ -34,6 +34,8 @@
 #include <sys/param.h>
 #include <sys/kernel.h>
 #include <sys/systm.h>
+#include <sys/file.h>
+#include <sys/fcntl.h>
 #include <sys/clock.h>
 #include <sys/imgact.h>
 #include <sys/limits.h>
@@ -728,9 +778,20 @@
 		off_t pos;
 	} */ bsd_args;
 	int error;
+	struct file *fp;
 
 	error = 0;
 	bsd_args.flags = 0;
+	fp = NULL;
+
+	/*
+	 * Linux mmap(2):
+	 * You must specify exactly one of MAP_SHARED and MAP_PRIVATE
+	 */
+	if (! ((linux_args->flags & LINUX_MAP_SHARED) ^
+	    (linux_args->flags & LINUX_MAP_PRIVATE)))
+		return (EINVAL);
+
 	if (linux_args->flags & LINUX_MAP_SHARED)
 		bsd_args.flags |= MAP_SHARED;
 	if (linux_args->flags & LINUX_MAP_PRIVATE)
@@ -813,17 +874,39 @@
 		bsd_args.addr = (caddr_t)PTRIN(linux_args->addr);
 		bsd_args.len  = linux_args->len;
 	}
-	/*
-	 * XXX i386 Linux always emulator forces PROT_READ on (why?)
-	 * so we do the same. We add PROT_EXEC to work around buggy
-	 * applications (e.g. Java) that take advantage of the fact
-	 * that execute permissions are not enforced by x86 CPUs.
-	 */
-	bsd_args.prot = linux_args->prot | PROT_EXEC | PROT_READ;
+
+	bsd_args.prot = linux_args->prot;
 	if (linux_args->flags & LINUX_MAP_ANON)
 		bsd_args.fd = -1;
-	else
+	else {
+		/*
+		 * Linux follows Solaris mmap(2) description:
+		 * The file descriptor fildes is opened with
+		 * read permission, regardless of the
+		 * protection options specified.
+		 * If PROT_WRITE is specified, the application
+		 * must have opened the file descriptor
+		 * fildes with write permission unless
+		 * MAP_PRIVATE is specified in the flag
+		 * argument as described below.
+		 */
+
+		if ((error = fget(td, linux_args->fd, &fp)) != 0)
+			return (error);
+		if (fp->f_type != DTYPE_VNODE) {
+			fdrop(fp, td);
+			return (EINVAL);
+		}
+
+		/* Linux mmap() just fails for O_WRONLY files */
+		if (! (fp->f_flag & FREAD)) {
+			fdrop(fp, td);
+			return (EACCES);
+		}
+
 		bsd_args.fd = linux_args->fd;
+		fdrop(fp, td);
+	}
 	bsd_args.pos = (off_t)linux_args->pgoff * PAGE_SIZE;
 	bsd_args.pad = 0;
 

Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?790a9fff0612311121l662736e0ud6d3220382af072a>