Request for review/comments: 32-bit compat for non-x86 architectures

Nathan Whitehorn nwhitehorn at
Wed Mar 10 14:35:20 UTC 2010

Kostik Belousov wrote:
> On Tue, Mar 09, 2010 at 10:14:27PM -0600, Nathan Whitehorn wrote:
>> The patch at 
>> (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 

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.

More information about the freebsd-amd64 mailing list