Linux emulation on FreeBSD AMD64

Kostik Belousov kostikbel at gmail.com
Mon Nov 5 05:46:43 PST 2007


On Mon, Nov 05, 2007 at 02:41:38PM +0200, Valery V.Chikalov wrote:
> Kostik Belousov wrote:
> >On Sun, Nov 04, 2007 at 07:50:50PM +0200, Valery V.Chikalov wrote:
> >>Kostik Belousov wrote:
> >>[...]
> >>
> >>Index: vmparam.h
> >>===================================================================
> >>RCS file: /home/ncvs/src/sys/amd64/include/vmparam.h,v
> >>retrieving revision 1.49
> >>diff -u -r1.49 vmparam.h
> >>--- vmparam.h	25 Sep 2007 06:25:04 -0000	1.49
> >>+++ vmparam.h	4 Nov 2007 14:43:39 -0000
> >>@@ -45,6 +45,10 @@
> >> #ifndef _MACHINE_VMPARAM_H_
> >> #define	_MACHINE_VMPARAM_H_ 1
> >>
> >>+#ifdef	COMPAT_IA32
> >>+#define VM_PROT_READ_IS_EXEC    /* if you can read -- then you can exec 
> >>*/
> >>+#endif
> >>+
> >No, this is wrong fix. It changes the ABI for freebsd binaries, and does
> >this not only for SysV shm, but for any readable mapping.
> >
> >Instead, the following things shall be made:
> 
> Thanks, will try to do it this way.
> 
> But, just for curiosity and for my education.
> 
> My point from teh beginning was: we must find differences between linux 
> emulations in __i386__ and __amd64__(dont take it too literally, I dont 
> mean diff /sys/i386/xxx /sys/amd64/xxx :-)), because oracle is running 
> perfectly in __i386__ mode and failed to run in __amd64__.
> 
> On the first glance such difference was found: VM_PROT_READ_IS_EXEC is 
> defined in /sys/[i386|arm]/include/vmparam.h but not in 
> /sys/amd64/include/vmparam.h.
AMD64 (and, in fact, some i386, when running in PAE mode) has so-called
execution-disable bit in the page protection attributes. The patch would
make the PROT_READ == PROT_READ | PROT_EXEC unconditionally.

> 
> But:
> 1) you claim that this is wrong.
>    So, why? Why this is right for i386|arm and wrong for amd64.
> 
> > 1. linux_shmat() shall call kern_shmat().
> > 2. kern_shmat() shall take the flag that would force the read mapping
> >    to be also executable.
> > 3. this flag shall be set when kern_shmat() is called from linux_shmat(),
> >    and not set when called from shmat().
> 
> Why this is not applicable to i386 mode?
Good question, I did  not looked into the details of handling PROT_EXEC
on i386 when nx bit is supported. FreeBSD definitely ignores PT_GNU_STACK
for non-executable stacks, I am not sure what could break with this on i386.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 187 bytes
Desc: not available
Url : http://lists.freebsd.org/pipermail/freebsd-emulation/attachments/20071105/84e85736/attachment.pgp


More information about the freebsd-emulation mailing list