On Wed, Dec 16, 2015 at 04:58:20PM +0000, Catalin Marinas wrote: > On Wed, Dec 16, 2015 at 04:54:34PM +0100, Arnd Bergmann wrote: > > On Wednesday 16 December 2015 00:42:35 Yury Norov wrote: > > > > > > #ifdef CONFIG_COMPAT > > > -#define COMPAT_ELF_HWCAP (compat_elf_hwcap) > > > -#define COMPAT_ELF_HWCAP2 (compat_elf_hwcap2) > > > extern unsigned int compat_elf_hwcap, compat_elf_hwcap2; > > > +#define COMPAT_ELF_HWCAP \ > > > + (is_a32_compat_task() \ > > > + ? compat_elf_hwcap \ > > > + : elf_hwcap) > > > + > > > +#define COMPAT_ELF_HWCAP2 \ > > > + (is_a32_compat_task() \ > > > + ? compat_elf_hwcap2 \ > > > + : 0) > > > + > > > #endif > > > > I'm trying to understand how this is used. Are you compiling > > fs/compat_binfmt_elf.c twice to handle both 32-bit ELF types? > > It's the same compat_binfmt_elf.c which handles all 32-bit ELF types, > i.e. AArch32 and A64/ILP32. The above macros are not constants, so they > are evaluated every time a new ELF file is loaded. We do a similar trick > with COMPAT_SET_PERSONALITY in patch 11.
IIUC, we may have a problem with this. elf_hwcap is 64-bit long while elf_info[n] is 32-bit (Elf32_Addr), so we truncate AT_HWCAP if we ever go beyond bit 31. The above may need to look something like: #define COMPAT_ELF_HWCAP \ (is_a32_compat_task() \ ? compat_elf_hwcap \ : (u32)elf_hwcap) #define COMPAT_ELF_HWCAP2 \ (is_a32_compat_task() \ ? compat_elf_hwcap2 \ : (u32)(elf_hwcap >> 32)) -- Catalin -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/