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>
