Message ID | 1453736525-1959191-2-git-send-email-arnd@arndb.de |
---|---|
State | Accepted |
Commit | 129f6c4820dd68be26b516ba6d6e471e63855d47 |
Headers | show |
On Friday 04 March 2016 16:22:03 Brian Norris wrote: > Hi Arnd, > > On Sat, Mar 05, 2016 at 01:19:21AM +0100, Arnd Bergmann wrote: > > On Friday 04 March 2016 16:02:25 Brian Norris wrote: > > > On Mon, Jan 25, 2016 at 04:41:50PM +0100, Arnd Bergmann wrote: > > > > When XIP_KERNEL is enabled, some functions are defined in the .data > > > > ELF section because we require them to be in RAM whenever we communicate > > > > with the flash chip. However this causes problems when FTRACE is > > > > enabled and gcc emits calls to __gnu_mcount_nc in the function > > > > prolog: > > > > > > > > drivers/built-in.o: In function `cfi_chip_setup': > > > > :(.data+0x272fc): relocation truncated to fit: R_ARM_CALL against symbol `__gnu_mcount_nc' defined in .text section in arch/arm/kernel/built-in.o > > > > drivers/built-in.o: In function `cfi_probe_chip': > > > > :(.data+0x27de8): relocation truncated to fit: R_ARM_CALL against symbol `__gnu_mcount_nc' defined in .text section in arch/arm/kernel/built-in.o > > > > /tmp/ccY172rP.s: Assembler messages: > > > > /tmp/ccY172rP.s:70: Warning: ignoring changed section attributes for .data > > > > /tmp/ccY172rP.s: Error: 1 warning, treating warnings as errors > > > > make[5]: *** [drivers/mtd/chips/cfi_probe.o] Error 1 > > > > /tmp/ccK4rjeO.s: Assembler messages: > > > > /tmp/ccK4rjeO.s:421: Warning: ignoring changed section attributes for .data > > > > /tmp/ccK4rjeO.s: Error: 1 warning, treating warnings as errors > > > > make[5]: *** [drivers/mtd/chips/cfi_util.o] Error 1 > > > > /tmp/ccUvhCYR.s: Assembler messages: > > > > /tmp/ccUvhCYR.s:1895: Warning: ignoring changed section attributes for .data > > > > /tmp/ccUvhCYR.s: Error: 1 warning, treating warnings as errors > > > > > > Can you provide a sample .config that DOES build correctly with > > > XIP_KERNEL enabled + this patch? My first attempt yields some other > > > failures I don't care to fixup right now... > > > > > > Anyway, I don't doubt you have a good fix here, so I can probably take > > > it. Any review from others would be welcome though. > > > > I found the config in the attachment in my logs. > > Thanks... > > > To get this config working, I also needed this hunk from my set of > > old unsubmitted patches: > > ...but, does anyone care about XIP / MTD_XIP then, if the first two > examples we have both have long-standing build issues? > Probably not. I just checked the third user (omap1), and it seems that one has been broken since 2009 with 941132606c76 ("OMAP: Remove OMAP_IO_ADDRESS, use OMAP1_IO_ADDRESS and OMAP2_IO_ADDRESS instead"), when Tony replaced the inline omap_readl() with an extern function, thus breaking the implementation of xip_irqpending() that must be inlined. The other two have apparently been broken since 2011, by other patches that also broke compilation. Arnd ______________________________________________________ Linux MTD discussion mailing list http://lists.infradead.org/mailman/listinfo/linux-mtd/
On Saturday 05 March 2016, Robert Jarzmik wrote: > Arnd Bergmann <arnd@arndb.de> writes: > > > I guess we can bring back the macros for the case that MTD_XIP and XIP_KERNEL > > are both enabled. > > > > Arnd > I wouldn't have ICMR and ICIP exposed to drivers, Eric's original move looks > corect to me. Yes, it's a reasonable cleanup that we have done in many places, except this one introduced a regression for MTD_XIP. > On the other hand, I'm wondering if xip_irqpending(), xip_currtime() and > xip_cpu_idle() should be declared as functions in mtd-xip.h, and be part of > something like arch/arm/mach-pxa/xip.c ... They have to at least be marked __xipram and must not reference anything in .text or .rodata, but there might be additional requirements. Arnd ______________________________________________________ Linux MTD discussion mailing list http://lists.infradead.org/mailman/listinfo/linux-mtd/
diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h index c4bd0e2c173c..73a2c72e4252 100644 --- a/include/asm-generic/vmlinux.lds.h +++ b/include/asm-generic/vmlinux.lds.h @@ -199,6 +199,7 @@ /* .data section */ #define DATA_DATA \ + *(.xiptext) \ *(.data) \ *(.ref.data) \ *(.data..shared_aligned) /* percpu related */ \ diff --git a/include/linux/mtd/xip.h b/include/linux/mtd/xip.h index abed4dec5c2f..e373690cce0a 100644 --- a/include/linux/mtd/xip.h +++ b/include/linux/mtd/xip.h @@ -30,7 +30,9 @@ * obviously not be running from flash. The __xipram is therefore marking * those functions so they get relocated to ram. */ -#define __xipram noinline __attribute__ ((__section__ (".data"))) +#ifdef CONFIG_XIP_KERNEL +#define __xipram noinline __attribute__ ((__section__ (".xiptext"))) +#endif /* * Each architecture has to provide the following macros. They must access @@ -90,10 +92,10 @@ #define xip_cpu_idle() do { } while (0) #endif -#else +#endif /* CONFIG_MTD_XIP */ +#ifndef __xipram #define __xipram - -#endif /* CONFIG_MTD_XIP */ +#endif #endif /* __LINUX_MTD_XIP_H__ */
When XIP_KERNEL is enabled, some functions are defined in the .data ELF section because we require them to be in RAM whenever we communicate with the flash chip. However this causes problems when FTRACE is enabled and gcc emits calls to __gnu_mcount_nc in the function prolog: drivers/built-in.o: In function `cfi_chip_setup': :(.data+0x272fc): relocation truncated to fit: R_ARM_CALL against symbol `__gnu_mcount_nc' defined in .text section in arch/arm/kernel/built-in.o drivers/built-in.o: In function `cfi_probe_chip': :(.data+0x27de8): relocation truncated to fit: R_ARM_CALL against symbol `__gnu_mcount_nc' defined in .text section in arch/arm/kernel/built-in.o /tmp/ccY172rP.s: Assembler messages: /tmp/ccY172rP.s:70: Warning: ignoring changed section attributes for .data /tmp/ccY172rP.s: Error: 1 warning, treating warnings as errors make[5]: *** [drivers/mtd/chips/cfi_probe.o] Error 1 /tmp/ccK4rjeO.s: Assembler messages: /tmp/ccK4rjeO.s:421: Warning: ignoring changed section attributes for .data /tmp/ccK4rjeO.s: Error: 1 warning, treating warnings as errors make[5]: *** [drivers/mtd/chips/cfi_util.o] Error 1 /tmp/ccUvhCYR.s: Assembler messages: /tmp/ccUvhCYR.s:1895: Warning: ignoring changed section attributes for .data /tmp/ccUvhCYR.s: Error: 1 warning, treating warnings as errors Specifically, this does not work because the .data section is not marked executable, which leads LD to not generate trampolines for long calls. This moves the __xipram functions into their own .xiptext section instead. The section is still placed next to .data and located in RAM but is marked executable, which avoids the build errors. Also, we only need to place the XIP functions into a separate section if both CONFIG_XIP_KERNEL and CONFIG_MTD_XIP are set: When only MTD_XIP is used, the whole kernel is still in RAM and we do not need to worry about pulling out the rug under it. When only XIP_KERNEL but not MTD_XIP is set, the kernel is in some form of ROM, but we never write to it. Signed-off-by: Arnd Bergmann <arnd@arndb.de> --- include/asm-generic/vmlinux.lds.h | 1 + include/linux/mtd/xip.h | 10 ++++++---- 2 files changed, 7 insertions(+), 4 deletions(-) -- 2.7.0 ______________________________________________________ Linux MTD discussion mailing list http://lists.infradead.org/mailman/listinfo/linux-mtd/