Kostik Belousov wrote:
On Tue, Mar 09, 2010 at 10:14:27PM -0600, Nathan Whitehorn wrote:
The patch at http://people.freebsd.org/~nwhitehorn/compat_freebsd32.diff (pre-generated freebsd32 syscalls stuff is included, which will be done in two steps on commit) provides groundwork for supporting 32-bit compatibility for 64-bit MIPS and PowerPC systems. It has been tested on amd64 and powerpc64, and compile-tested on ia64. There are two main parts to the patch:

1) COMPAT_IA32 is renamed COMPAT_FREEBSD32, in analogy to COMPAT_LINUX32, etc. This requires updating kernel configurations, but is less painful than filling machine-independent bits of the kernel with #if defined(COMPAT_IA32) || defined(COMPAT_PPC32) || defined(COMPAT_MIPS32) || ..., and is no less descriptive than the old name.

2) Modifications to the freebsd32 compat layer to support big-endian architectures.

I would appreciate any comments, bugs, or test results on ia64.
-Nathan

This fragment
--- sys/kern/imgact_elf.c       (revision 204681)
+++ sys/kern/imgact_elf.c       (working copy)
@@ -75,7 +75,7 @@
 #include <machine/elf.h>
 #include <machine/md_var.h>
-#if defined(COMPAT_IA32) && __ELF_WORD_SIZE == 32
+#if (defined(__amd64__) || defined(__ia64__)) && __ELF_WORD_SIZE == 32
 #include <machine/fpu.h>
 #include <compat/ia32/ia32_reg.h>
 #endif
probably should be changed ? How are struct reg32 for !ia32 case is
brought into the imgact_elf ? Can it be unified for ia32 case ?
(Similar fragment is present in sys_process.c at least).
For !ia32, they are brought in machine/reg.h. You can see how that works here:
http://svn.freebsd.org/viewvc/base/projects/ppc64/sys/powerpc/include/reg.h?revision=204915&view=markup

I would be more than happy for them to be brought in the same way for amd64 and ia64. Since John Baldwin seems to want this too, I might roll a new version of the diff today or tomorrow that does that.
I do not understand how +#if !defined(PAD64_REQUIRED) && defined(__powerpc__)
etc lines are generated.
These end up in syscalls.master and take advantage of the syscalls generator propagating preprocessor statements through. 32-bit powerpc has an ABI quirk where 64-bit arguments are transmitted in "aligned" registers, so this adds some padding to those syscalls such that this is preserved. The !defined bit just protects against redefinition when one of the .c files generated from syscalls.master includes one of the header files.
You may want to change sysent->sv_flag SV_IA32 to SV_FREEBSD32, or add
SV_FREEBSD32. You might want to review SV_IA32 usage, if any.
We already have SV_ILP32, which is used pretty consistently for this. The patch includes a fix for the one erroneous use in sys/kern/kern_jail.c that I could find with grep -R SV_IA32 /sys.
-Nathan
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-emulation
To unsubscribe, send any mail to "[email protected]"

Reply via email to