• Joel Stanley's avatar
    powerpc/Makefile: Fix PPC_BOOK3S_64 ASFLAGS · 32f2674c
    Joel Stanley authored
    [ Upstream commit 960e3002 ]
    
    Ever since commit 15a3204d ("powerpc/64s: Set assembler machine type
    to POWER4") we force -mpower4 to be passed to the assembler
    irrespective of the CFLAGS used (for Book3s 64).
    
    When building a powerpc64 kernel with clang, clang will not add -many
    to the assembler flags, so any instructions that the compiler has
    generated that are not available on power4 will cause an error:
    
      /usr/bin/as -a64 -mppc64 -mlittle-endian -mpower8 \
       -I ./arch/powerpc/include -I ./arch/powerpc/include/generated \
       -I ./include -I ./arch/powerpc/include/uapi \
       -I ./arch/powerpc/include/generated/uapi -I ./include/uapi \
       -I ./include/generated/uapi -I arch/powerpc -I arch/powerpc \
       -maltivec -mpower4 -o init/do_mounts.o /tmp/do_mounts-3b0a3d.s
      /tmp/do_mounts-51ce54.s:748: Error: unrecognized opcode: `isel'
    
    GCC does include -many, so the GCC driven gas call will succeed:
    
      as -v -I ./arch/powerpc/include -I ./arch/powerpc/include/generated -I
      ./include -I ./arch/powerpc/include/uapi
      -I ./arch/powerpc/include/generated/uapi -I ./include/uapi
      -I ./include/generated/uapi -I arch/powerpc -I arch/powerpc
       -a64 -mpower8 -many -mlittle -maltivec -mpower4 -o init/do_mounts.o
    
    Note that isel is power7 and above for IBM CPUs. GCC only generates it
    for Power9 and above, but the above test was run against the clang
    generated assembly.
    
    Peter Bergner explains:
    
      When using -many -mpower4, gas will first try and find a matching
      power4 mnemonic and failing that, it will then allow any valid
      mnemonic that gas knows about. GCC's use of -many predates me
      though.
    
      IIRC, Alan looked at trying to remove it, but I forget why he
      didn't. Could be either a gcc or gas issue at the time. I'm not sure
      whether issue still exists or not. He and I have modified how gas
      works internally a fair amount since he tried removing gcc use of
      -many.
    
      I will also note that when using -many, gas will choose the first
      mnemonic that matches in the mnemonic table and we have (mostly)
      sorted the table so that server mnemonics show up earlier in the
      table than other mnemonics, so they'll be seen/chosen first.
    
    By explicitly setting -many we can build with Clang and GCC while
    retaining the -mpower4 option.
    Signed-off-by: default avatarJoel Stanley <joel@jms.id.au>
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    32f2674c
Makefile 15 KB