Re: [PATCH] [powerpc-next] Fix powerpc64 alignment of .toc section in kernel modules

2017-12-08 Thread Michael Ellerman
Desnes Augusto Nunes do Rosário  writes:
...
>
> 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

2017-12-07 Thread Desnes Augusto Nunes do Rosário

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 Rosario  writes:

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

2017-12-07 Thread Michael Ellerman
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 Rosario  writes:
> 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