2022-08-20 17:03:06

by Masahiro Yamada

[permalink] [raw]
Subject: [PATCH] powerpc: align syscall table for ppc32

Christophe Leroy reported that commit 7b4537199a4a ("kbuild: link
symbol CRCs at final link, removing CONFIG_MODULE_REL_CRCS") broke
mpc85xx_defconfig + CONFIG_RELOCATABLE=y.

LD vmlinux
SYSMAP System.map
SORTTAB vmlinux
CHKREL vmlinux
WARNING: 451 bad relocations
c0b312a9 R_PPC_UADDR32 .head.text-0x3ff9ed54
c0b312ad R_PPC_UADDR32 .head.text-0x3ffac224
c0b312b1 R_PPC_UADDR32 .head.text-0x3ffb09f4
c0b312b5 R_PPC_UADDR32 .head.text-0x3fe184dc
c0b312b9 R_PPC_UADDR32 .head.text-0x3fe183a8
...

The compiler emits a bunch of R_PPC_UADDR32, which is not supported by
arch/powerpc/kernel/reloc_32.S.

The reason is there exists an unaligned symbol.

$ powerpc-linux-gnu-nm -n vmlinux
...
c0b31258 d spe_aligninfo
c0b31298 d __func__.0
c0b312a9 D sys_call_table
c0b319b8 d __func__.0

Commit 7b4537199a4a is not the root cause. Even before that, I can
reproduce the same issue for mpc85xx_defconfig + CONFIG_RELOCATABLE=y
+ CONFIG_MODVERSIONS=n.

It is just that nobody did not notice it because when CONFIG_MODVERSIONS
is enabled, a __crc_* symbol inserted before sys_call_table was hiding
the unalignment issue.

I checked the commit history, but I could not understand commit
46b45b10f142 ("[POWERPC] Align the sys_call_table").

It said 'Our _GLOBAL macro does a ".align 2" so the alignment is fine
for 32 bit'. I checked the _GLOBAL in include/asm-powerpc/ppc_asm.h
at that time. _GLOBAL specifies ".align 2" for ppc64, but no .align
for ppc32.

Commit c857c43b34ec ("powerpc: Don't use a function descriptor for
system call table") removed _GLOBAL from the syscall table.

Anyway, adding alignment to the syscall table for ppc32 fixes the issue.

I am not giving Fixes tag because I do not know since when it has been
broken, but presumably it has been for a long while.

Link: https://lore.kernel.org/lkml/[email protected]/
Reported-by: Christophe Leroy <[email protected]>
Signed-off-by: Masahiro Yamada <[email protected]>
---

arch/powerpc/kernel/systbl.S | 1 +
1 file changed, 1 insertion(+)

diff --git a/arch/powerpc/kernel/systbl.S b/arch/powerpc/kernel/systbl.S
index cb3358886203..6c1db3b6de2d 100644
--- a/arch/powerpc/kernel/systbl.S
+++ b/arch/powerpc/kernel/systbl.S
@@ -18,6 +18,7 @@
.p2align 3
#define __SYSCALL(nr, entry) .8byte entry
#else
+ .p2align 2
#define __SYSCALL(nr, entry) .long entry
#endif

--
2.34.1


2022-08-20 17:56:19

by Christophe Leroy

[permalink] [raw]
Subject: Re: [PATCH] powerpc: align syscall table for ppc32



Le 20/08/2022 à 18:51, Masahiro Yamada a écrit :
> Christophe Leroy reported that commit 7b4537199a4a ("kbuild: link
> symbol CRCs at final link, removing CONFIG_MODULE_REL_CRCS") broke
> mpc85xx_defconfig + CONFIG_RELOCATABLE=y.
>
> LD vmlinux
> SYSMAP System.map
> SORTTAB vmlinux
> CHKREL vmlinux
> WARNING: 451 bad relocations
> c0b312a9 R_PPC_UADDR32 .head.text-0x3ff9ed54
> c0b312ad R_PPC_UADDR32 .head.text-0x3ffac224
> c0b312b1 R_PPC_UADDR32 .head.text-0x3ffb09f4
> c0b312b5 R_PPC_UADDR32 .head.text-0x3fe184dc
> c0b312b9 R_PPC_UADDR32 .head.text-0x3fe183a8
> ...
>
> The compiler emits a bunch of R_PPC_UADDR32, which is not supported by
> arch/powerpc/kernel/reloc_32.S.
>
> The reason is there exists an unaligned symbol.
>
> $ powerpc-linux-gnu-nm -n vmlinux
> ...
> c0b31258 d spe_aligninfo
> c0b31298 d __func__.0
> c0b312a9 D sys_call_table
> c0b319b8 d __func__.0
>
> Commit 7b4537199a4a is not the root cause. Even before that, I can
> reproduce the same issue for mpc85xx_defconfig + CONFIG_RELOCATABLE=y
> + CONFIG_MODVERSIONS=n.
>
> It is just that nobody did not notice it because when CONFIG_MODVERSIONS
> is enabled, a __crc_* symbol inserted before sys_call_table was hiding
> the unalignment issue.
>
> I checked the commit history, but I could not understand commit
> 46b45b10f142 ("[POWERPC] Align the sys_call_table").
>
> It said 'Our _GLOBAL macro does a ".align 2" so the alignment is fine
> for 32 bit'. I checked the _GLOBAL in include/asm-powerpc/ppc_asm.h
> at that time. _GLOBAL specifies ".align 2" for ppc64, but no .align
> for ppc32.
>
> Commit c857c43b34ec ("powerpc: Don't use a function descriptor for
> system call table") removed _GLOBAL from the syscall table.
>
> Anyway, adding alignment to the syscall table for ppc32 fixes the issue.
>
> I am not giving Fixes tag because I do not know since when it has been
> broken, but presumably it has been for a long while.
>
> Link: https://lore.kernel.org/lkml/[email protected]/
> Reported-by: Christophe Leroy <[email protected]>
> Signed-off-by: Masahiro Yamada <[email protected]>

Tested-by: Christophe Leroy <[email protected]>

> ---
>
> arch/powerpc/kernel/systbl.S | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/arch/powerpc/kernel/systbl.S b/arch/powerpc/kernel/systbl.S
> index cb3358886203..6c1db3b6de2d 100644
> --- a/arch/powerpc/kernel/systbl.S
> +++ b/arch/powerpc/kernel/systbl.S
> @@ -18,6 +18,7 @@
> .p2align 3
> #define __SYSCALL(nr, entry) .8byte entry
> #else
> + .p2align 2
> #define __SYSCALL(nr, entry) .long entry
> #endif
>

2022-08-25 08:26:47

by Michael Ellerman

[permalink] [raw]
Subject: Re: [PATCH] powerpc: align syscall table for ppc32

Masahiro Yamada <[email protected]> writes:
> Christophe Leroy reported that commit 7b4537199a4a ("kbuild: link
> symbol CRCs at final link, removing CONFIG_MODULE_REL_CRCS") broke
> mpc85xx_defconfig + CONFIG_RELOCATABLE=y.
>
> LD vmlinux
> SYSMAP System.map
> SORTTAB vmlinux
> CHKREL vmlinux
> WARNING: 451 bad relocations
> c0b312a9 R_PPC_UADDR32 .head.text-0x3ff9ed54
> c0b312ad R_PPC_UADDR32 .head.text-0x3ffac224
> c0b312b1 R_PPC_UADDR32 .head.text-0x3ffb09f4
> c0b312b5 R_PPC_UADDR32 .head.text-0x3fe184dc
> c0b312b9 R_PPC_UADDR32 .head.text-0x3fe183a8
> ...
>
> The compiler emits a bunch of R_PPC_UADDR32, which is not supported by
> arch/powerpc/kernel/reloc_32.S.
>
> The reason is there exists an unaligned symbol.
>
> $ powerpc-linux-gnu-nm -n vmlinux
> ...
> c0b31258 d spe_aligninfo
> c0b31298 d __func__.0
> c0b312a9 D sys_call_table
> c0b319b8 d __func__.0
>
> Commit 7b4537199a4a is not the root cause. Even before that, I can
> reproduce the same issue for mpc85xx_defconfig + CONFIG_RELOCATABLE=y
> + CONFIG_MODVERSIONS=n.
>
> It is just that nobody did not notice it because when CONFIG_MODVERSIONS
> is enabled, a __crc_* symbol inserted before sys_call_table was hiding
> the unalignment issue.
>
> I checked the commit history, but I could not understand commit
> 46b45b10f142 ("[POWERPC] Align the sys_call_table").
>
> It said 'Our _GLOBAL macro does a ".align 2" so the alignment is fine
> for 32 bit'. I checked the _GLOBAL in include/asm-powerpc/ppc_asm.h
> at that time. _GLOBAL specifies ".align 2" for ppc64, but no .align
> for ppc32.
>
> Commit c857c43b34ec ("powerpc: Don't use a function descriptor for
> system call table") removed _GLOBAL from the syscall table.
>
> Anyway, adding alignment to the syscall table for ppc32 fixes the issue.
>
> I am not giving Fixes tag because I do not know since when it has been
> broken, but presumably it has been for a long while.

Thanks.

I trimmed the change log a bit just to say ~= it's been broken for ever,
and added a Cc to stable.

cheers

2022-08-25 14:05:28

by Masahiro Yamada

[permalink] [raw]
Subject: Re: [PATCH] powerpc: align syscall table for ppc32

On Thu, Aug 25, 2022 at 4:53 PM Michael Ellerman <[email protected]> wrote:
>
> Masahiro Yamada <[email protected]> writes:
> > Christophe Leroy reported that commit 7b4537199a4a ("kbuild: link
> > symbol CRCs at final link, removing CONFIG_MODULE_REL_CRCS") broke
> > mpc85xx_defconfig + CONFIG_RELOCATABLE=y.
> >
> > LD vmlinux
> > SYSMAP System.map
> > SORTTAB vmlinux
> > CHKREL vmlinux
> > WARNING: 451 bad relocations
> > c0b312a9 R_PPC_UADDR32 .head.text-0x3ff9ed54
> > c0b312ad R_PPC_UADDR32 .head.text-0x3ffac224
> > c0b312b1 R_PPC_UADDR32 .head.text-0x3ffb09f4
> > c0b312b5 R_PPC_UADDR32 .head.text-0x3fe184dc
> > c0b312b9 R_PPC_UADDR32 .head.text-0x3fe183a8
> > ...
> >
> > The compiler emits a bunch of R_PPC_UADDR32, which is not supported by
> > arch/powerpc/kernel/reloc_32.S.
> >
> > The reason is there exists an unaligned symbol.
> >
> > $ powerpc-linux-gnu-nm -n vmlinux
> > ...
> > c0b31258 d spe_aligninfo
> > c0b31298 d __func__.0
> > c0b312a9 D sys_call_table
> > c0b319b8 d __func__.0
> >
> > Commit 7b4537199a4a is not the root cause. Even before that, I can
> > reproduce the same issue for mpc85xx_defconfig + CONFIG_RELOCATABLE=y
> > + CONFIG_MODVERSIONS=n.
> >
> > It is just that nobody did not notice it because when CONFIG_MODVERSIONS



I wrote weird English (double negation)


nobody did not notice --> nobody noticed



Please fix it if you have not yet.


Thank you.





> > is enabled, a __crc_* symbol inserted before sys_call_table was hiding
> > the unalignment issue.
> >
> > I checked the commit history, but I could not understand commit
> > 46b45b10f142 ("[POWERPC] Align the sys_call_table").
> >
> > It said 'Our _GLOBAL macro does a ".align 2" so the alignment is fine
> > for 32 bit'. I checked the _GLOBAL in include/asm-powerpc/ppc_asm.h
> > at that time. _GLOBAL specifies ".align 2" for ppc64, but no .align
> > for ppc32.
> >
> > Commit c857c43b34ec ("powerpc: Don't use a function descriptor for
> > system call table") removed _GLOBAL from the syscall table.
> >
> > Anyway, adding alignment to the syscall table for ppc32 fixes the issue.
> >
> > I am not giving Fixes tag because I do not know since when it has been
> > broken, but presumably it has been for a long while.
>
> Thanks.
>
> I trimmed the change log a bit just to say ~= it's been broken for ever,
> and added a Cc to stable.
>
> cheers






--
Best Regards
Masahiro Yamada

2022-08-25 23:01:16

by Michael Ellerman

[permalink] [raw]
Subject: Re: [PATCH] powerpc: align syscall table for ppc32

Masahiro Yamada <[email protected]> writes:
> On Thu, Aug 25, 2022 at 4:53 PM Michael Ellerman <[email protected]> wrote:
>>
>> Masahiro Yamada <[email protected]> writes:
>> > Christophe Leroy reported that commit 7b4537199a4a ("kbuild: link
>> > symbol CRCs at final link, removing CONFIG_MODULE_REL_CRCS") broke
>> > mpc85xx_defconfig + CONFIG_RELOCATABLE=y.
>> >
>> > LD vmlinux
>> > SYSMAP System.map
>> > SORTTAB vmlinux
>> > CHKREL vmlinux
>> > WARNING: 451 bad relocations
>> > c0b312a9 R_PPC_UADDR32 .head.text-0x3ff9ed54
>> > c0b312ad R_PPC_UADDR32 .head.text-0x3ffac224
>> > c0b312b1 R_PPC_UADDR32 .head.text-0x3ffb09f4
>> > c0b312b5 R_PPC_UADDR32 .head.text-0x3fe184dc
>> > c0b312b9 R_PPC_UADDR32 .head.text-0x3fe183a8
>> > ...
>> >
>> > The compiler emits a bunch of R_PPC_UADDR32, which is not supported by
>> > arch/powerpc/kernel/reloc_32.S.
>> >
>> > The reason is there exists an unaligned symbol.
>> >
>> > $ powerpc-linux-gnu-nm -n vmlinux
>> > ...
>> > c0b31258 d spe_aligninfo
>> > c0b31298 d __func__.0
>> > c0b312a9 D sys_call_table
>> > c0b319b8 d __func__.0
>> >
>> > Commit 7b4537199a4a is not the root cause. Even before that, I can
>> > reproduce the same issue for mpc85xx_defconfig + CONFIG_RELOCATABLE=y
>> > + CONFIG_MODVERSIONS=n.
>> >
>> > It is just that nobody did not notice it because when CONFIG_MODVERSIONS
>
> I wrote weird English (double negation)
>
> nobody did not notice --> nobody noticed
>
> Please fix it if you have not yet.

Yeah I did fix it up when applying :)

It is just that nobody noticed because when CONFIG_MODVERSIONS is
enabled, a __crc_* symbol inserted before sys_call_table was hiding the
unalignment issue.

cheers

2022-08-31 13:35:04

by Michael Ellerman

[permalink] [raw]
Subject: Re: [PATCH] powerpc: align syscall table for ppc32

On Sun, 21 Aug 2022 01:51:29 +0900, Masahiro Yamada wrote:
> Christophe Leroy reported that commit 7b4537199a4a ("kbuild: link
> symbol CRCs at final link, removing CONFIG_MODULE_REL_CRCS") broke
> mpc85xx_defconfig + CONFIG_RELOCATABLE=y.
>
> LD vmlinux
> SYSMAP System.map
> SORTTAB vmlinux
> CHKREL vmlinux
> WARNING: 451 bad relocations
> c0b312a9 R_PPC_UADDR32 .head.text-0x3ff9ed54
> c0b312ad R_PPC_UADDR32 .head.text-0x3ffac224
> c0b312b1 R_PPC_UADDR32 .head.text-0x3ffb09f4
> c0b312b5 R_PPC_UADDR32 .head.text-0x3fe184dc
> c0b312b9 R_PPC_UADDR32 .head.text-0x3fe183a8
> ...
>
> [...]

Applied to powerpc/fixes.

[1/1] powerpc: align syscall table for ppc32
https://git.kernel.org/powerpc/c/c7acee3d2f128a38b68fb7af85dbbd91bfd0b4ad

cheers