On Mon, Dec 19, 2022 at 10:41:52PM +0100, Pali Rohár wrote: > When gcc's default cpu (selected by --with-cpu= during gcc's configure > phase) does not match target U-Boot board cpu then U-Boot binary does not > have to be compiled correctly. Lot of distributions sets gcc's default cpu > to generic powerpc variant which works fine. > > U-Boot already pass -Wa,-me500 flag to gcc which instructs GNU AS to accept > e500 specific instructions when processing assembler source files (.S). > > This affects also assembly files generated by gcc from C source files. And > because gcc for generic powerpc cpu puts '.machine ppc' at the beginning of > the generated assembly file, it basically overwrites -me500 flag by which > was GNU AS invoked (from U-boot build system). > > It started to be an issue since binutils 2.38 which does not keep enabled > extra functional units selected by previous cpu. Hence issuing directive > '.machine ppc' (generated by gcc for generic powerpc) after '.machine e500' > (specifying at command line) disables usage of e500 specific instructions. > > And compiling arch/powerpc/cpu/mpc85xx/tlb.c code throws following > assembler errors: > > {standard input}: Assembler messages: > {standard input}:127: Error: unrecognized opcode: `tlbre' > {standard input}:418: Error: unrecognized opcode: `tlbre' > {standard input}:821: Error: unrecognized opcode: `msync' > {standard input}:821: Error: unrecognized opcode: `tlbwe' > {standard input}:884: Error: unrecognized opcode: `tlbsx' > > This issue was already hit by Debian people and is reported in bug tracker: > https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1003490 > > Calling gcc with -mcpu=8540 flag fixes this issue because -mcpu=8540 tells > gcc to compile code for e500 core/cpu (overwriting gcc's default cpu) and > does not put '.machine ppc' directive into assembly anymore. > > Also if gcc is invoked with -mcpu=8540 then it pass -me500 flag to GNU AS. > So it is unnecessary to manually specify -Wa,-me500 flag because it is > implicitly added. > > Fix this issue properly by specifying correct -mcpu compiler flag for all > supported powerpc cores in U-Boot mpc85xx platform, which are: e500v1, > e500v2, e500mc, e5500 and e6500. For specifying e500v1 and e500v2 cores, > gcc has unintuitive -mcpu=8540 and -mcpu=8548 flag names, for other cores > -mcpu matches core name. > > The only difference between gcc's -mcpu=8540 and -mcpu=8548 flags is > support for double precision floating point SPE instructions. As U-Boot > does not use floating point, it is fine to use -mcpu=8540 for both e500v1 > and e500v2 cores. Moreover gcc 9 completely removed e500 floating point > support, so since gcc 9 -mcpu=8548 is just alias to -mcpu=8540. > > Note that U-Boot's CONFIG_E500 option is set also for other cpus, not only > for e500v1 and e500v2. So do not check for CONFIG_E500 and rather set e500 > as last fallback value when no other mpc85xx cpu matches. > > Signed-off-by: Pali Rohár <p...@kernel.org>
Applied to u-boot/master, thanks! -- Tom
signature.asc
Description: PGP signature