Re: [PATCH] [powerpc-next] Fix powerpc64 alignment of .toc section in kernel modules
Desnes Augusto Nunes do Rosáriowrites: ... > > Lastly, will you fix it up or do you want me to send a second version > then? Whatever is best for you. No that's fine I've done those changes, no need to send another version. cheers
Re: [PATCH] [powerpc-next] Fix powerpc64 alignment of .toc section in kernel modules
Hello Michael, On 12/07/2017 10:25 AM, Michael Ellerman wrote: Hi Desnes, Am I right that Alan largely wrote this patch? If so it should probably be From: him, so that he is the author in the git log. Yes, Alan Modra is the main author and I am just committing it with minor changes. Thus, the author change is necessary. Desnes Augusto Nunes do Rosariowrites: diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile index 1381693..c472f5b 100644 --- a/arch/powerpc/Makefile +++ b/arch/powerpc/Makefile @@ -63,6 +63,7 @@ UTS_MACHINE := $(subst $(space),,$(machine-y)) ifdef CONFIG_PPC32 KBUILD_LDFLAGS_MODULE += arch/powerpc/lib/crtsavres.o else +KBUILD_LDFLAGS_MODULE += -T arch/powerpc/kernel/module.lds This needs to be: KBUILD_LDFLAGS_MODULE += -T $(srctree)/arch/powerpc/kernel/module.lds Otherwise building with O=../build fails with: ld: cannot open linker script file arch/powerpc/kernel/module.lds: No such file or directory I'll fix it up. Indeed; this change is necessary to avoid any path errors. diff --git a/arch/powerpc/kernel/module_64.c b/arch/powerpc/kernel/module_64.c index 759104b..9b2c5c1 100644 --- a/arch/powerpc/kernel/module_64.c +++ b/arch/powerpc/kernel/module_64.c @@ -374,11 +377,13 @@ int module_frob_arch_sections(Elf64_Ehdr *hdr, } /* r2 is the TOC pointer: it actually points 0x8000 into the TOC (this - gives the value maximum span in an instruction which uses a signed - offset) */ + * gives the value maximum span in an instruction which uses a signed + * offset). Round down to a 256 byte boundary for the odd case where + * we are setting up r2 without a .toc section. + */ static inline unsigned long my_r2(const Elf64_Shdr *sechdrs, struct module *me) { - return sechdrs[me->arch.toc_section].sh_addr + 0x8000; + return (sechdrs[me->arch.toc_section].sh_addr & -256) + 0x8000; I think it's more typical in the kernel to write -256 as ~0xff. Again I can fix it up. Good to know! cheers Lastly, will you fix it up or do you want me to send a second version then? Whatever is best for you. Thank you for the review. -- Desnes Augusto Nunes do Rosário -- Linux Developer - IBM / Brazil M.Sc. in Electrical and Computer Engineering - UFRN (11) 9595-30-900 desn...@br.ibm.com
Re: [PATCH] [powerpc-next] Fix powerpc64 alignment of .toc section in kernel modules
Hi Desnes, Am I right that Alan largely wrote this patch? If so it should probably be From: him, so that he is the author in the git log. Desnes Augusto Nunes do Rosariowrites: > diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile > index 1381693..c472f5b 100644 > --- a/arch/powerpc/Makefile > +++ b/arch/powerpc/Makefile > @@ -63,6 +63,7 @@ UTS_MACHINE := $(subst $(space),,$(machine-y)) > ifdef CONFIG_PPC32 > KBUILD_LDFLAGS_MODULE += arch/powerpc/lib/crtsavres.o > else > +KBUILD_LDFLAGS_MODULE += -T arch/powerpc/kernel/module.lds This needs to be: KBUILD_LDFLAGS_MODULE += -T $(srctree)/arch/powerpc/kernel/module.lds Otherwise building with O=../build fails with: ld: cannot open linker script file arch/powerpc/kernel/module.lds: No such file or directory I'll fix it up. > diff --git a/arch/powerpc/kernel/module_64.c b/arch/powerpc/kernel/module_64.c > index 759104b..9b2c5c1 100644 > --- a/arch/powerpc/kernel/module_64.c > +++ b/arch/powerpc/kernel/module_64.c > @@ -374,11 +377,13 @@ int module_frob_arch_sections(Elf64_Ehdr *hdr, > } > > /* r2 is the TOC pointer: it actually points 0x8000 into the TOC (this > - gives the value maximum span in an instruction which uses a signed > - offset) */ > + * gives the value maximum span in an instruction which uses a signed > + * offset). Round down to a 256 byte boundary for the odd case where > + * we are setting up r2 without a .toc section. > + */ > static inline unsigned long my_r2(const Elf64_Shdr *sechdrs, struct module > *me) > { > - return sechdrs[me->arch.toc_section].sh_addr + 0x8000; > + return (sechdrs[me->arch.toc_section].sh_addr & -256) + 0x8000; I think it's more typical in the kernel to write -256 as ~0xff. Again I can fix it up. cheers