On 4 August 2014 17:45, Tom Musta <tommu...@gmail.com> wrote: > The argument to the mlockall system call is not necessarily the same on > all platforms and thus may require translation prior to passing to the > host. > > For example, PowerPC 64 bit platforms define values for MCL_CURRENT > (0x2000) and MCL_FUTURE (0x4000) which are different from Intel platforms > (0x1 and 0x2, respectively) > > Signed-off-by: Tom Musta <tommu...@gmail.com> > > diff --git a/linux-user/syscall.c b/linux-user/syscall.c > index 5660520..fea54be 100644 > --- a/linux-user/syscall.c > +++ b/linux-user/syscall.c > @@ -4934,6 +4934,34 @@ static inline abi_long > host_to_target_itimerspec(abi_ulong target_addr, > return 0; > } > > +#if defined(TARGET_NR_mlockall) > + > +#if defined(TARGET_PPC64) > +#define TARGET_MLOCKALL_MCL_CURRENT 0x2000 > +#define TARGET_MLOCKALL_MCL_FUTURE 0x4000 > +#endif
These shouldn't be here -- they ought to go in some header file in linux-user/ppc. > +static inline int target_to_host_mlockall_arg(int arg) > +{ > + int result = 0; > + > +#ifdef TARGET_MLOCKALL_MCL_CURRENT > + if (arg & TARGET_MLOCKALL_MCL_CURRENT) { > + result |= MCL_CURRENT; > + arg ^= TARGET_MLOCKALL_MCL_CURRENT; > + } > +#endif > +#ifdef TARGET_MLOCKALL_MCL_FUTURE > + if (arg & TARGET_MLOCKALL_MCL_FUTURE) { > + result |= MCL_FUTURE; > + arg ^= TARGET_MLOCKALL_MCL_FUTURE; > + } > +#endif Rather than conditionalizing all this on whether TARGET_MLOCKALL_* are defined we should just define them for all our target architectures. (Otherwise other-arch-on-PPC-host won't work.) The right values are: MCL_CURRENT: * PPC, SPARC, Alpha: 0x2000 * everything else: 1 MCL_FUTURE: * PPC, SPARC, Alpha: 0x4000 * everything else: 2 It's probably bogus to pass unknown flags through... (For once MIPS isn't the weirdo.) thanks -- PMM