Date: Fri, 26 Jan 2007 05:01:11 GMT From: Jung-uk Kim <jkim@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 113546 for review Message-ID: <200701260501.l0Q51Bp2035953@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=113546 Change 113546 by jkim@jkim_hammer on 2007/01/26 05:00:44 Stop mimicking Linux mmap behavior and use Linux/ia64 wisdom. Many Linux/i386 distros have shown different mmap behaviors. Affected files ... .. //depot/projects/linuxolator/src/sys/amd64/linux32/linux32_machdep.c#29 edit .. //depot/projects/linuxolator/src/sys/i386/linux/linux_machdep.c#23 edit Differences ... ==== //depot/projects/linuxolator/src/sys/amd64/linux32/linux32_machdep.c#29 (text+ko) ==== @@ -852,12 +852,14 @@ bsd_args.flags |= MAP_STACK; /* - * Linux has added READ_IMPLIES_EXEC personality but we do not support - * the feature yet. We just assume READ_IMPLIES_EXEC is always on. + * PROT_READ, PROT_WRITE, or PROT_EXEC implies PROT_READ and PROT_EXEC + * on Linux/i386. We do this to ensure maximum compatibility. + * Linux/ia64 does the same in i386 emulation mode. */ bsd_args.prot = linux_args->prot; - if (bsd_args.prot & PROT_READ) - bsd_args.prot |= PROT_EXEC; + if ((bsd_args.prot & PROT_WRITE) || + (bsd_args.prot & (PROT_READ | PROT_EXEC))) + bsd_args.prot |= PROT_READ | PROT_EXEC; if (linux_args->fd != -1) { /* @@ -977,9 +979,9 @@ bsd_args.addr = uap->addr; bsd_args.len = uap->len; bsd_args.prot = uap->prot; - /* XXX PROT_READ implies PROT_EXEC; see linux_mmap_common(). */ - if (bsd_args.prot & PROT_READ) - bsd_args.prot |= PROT_EXEC; + if ((bsd_args.prot & PROT_WRITE) || + (bsd_args.prot & (PROT_READ | PROT_EXEC))) + bsd_args.prot |= PROT_READ | PROT_EXEC; return (mprotect(td, &bsd_args)); } ==== //depot/projects/linuxolator/src/sys/i386/linux/linux_machdep.c#23 (text+ko) ==== @@ -653,12 +653,14 @@ bsd_args.flags |= MAP_STACK; /* - * Linux has added READ_IMPLIES_EXEC personality but we do not support - * the feature yet. We just assume READ_IMPLIES_EXEC is always on. + * PROT_READ, PROT_WRITE, or PROT_EXEC implies PROT_READ and PROT_EXEC + * on Linux/i386. We do this to ensure maximum compatibility. + * Linux/ia64 does the same in i386 emulation mode. */ bsd_args.prot = linux_args->prot; - if (bsd_args.prot & PROT_READ) - bsd_args.prot |= PROT_EXEC; + if ((bsd_args.prot & PROT_WRITE) || + (bsd_args.prot & (PROT_READ | PROT_EXEC))) + bsd_args.prot |= PROT_READ | PROT_EXEC; if (linux_args->fd != -1) { /* @@ -778,9 +780,9 @@ bsd_args.addr = uap->addr; bsd_args.len = uap->len; bsd_args.prot = uap->prot; - /* XXX PROT_READ implies PROT_EXEC; see linux_mmap_common(). */ - if (bsd_args.prot & PROT_READ) - bsd_args.prot |= PROT_EXEC; + if ((bsd_args.prot & PROT_WRITE) || + (bsd_args.prot & (PROT_READ | PROT_EXEC))) + bsd_args.prot |= PROT_READ | PROT_EXEC; return (mprotect(td, &bsd_args)); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200701260501.l0Q51Bp2035953>