• Michael Ellerman's avatar
    powerpc/vdso: Don't use r30 to avoid breaking Go lang · a88603f4
    Michael Ellerman authored
    The Go runtime uses r30 for some special value called 'g'. It assumes
    that value will remain unchanged even when calling VDSO functions.
    Although r30 is non-volatile across function calls, the callee is free
    to use it, as long as the callee saves the value and restores it before
    returning.
    
    It used to be true by accident that the VDSO didn't use r30, because the
    VDSO was hand-written asm. When we switched to building the VDSO from C
    the compiler started using r30, at least in some builds, leading to
    crashes in Go. eg:
    
      ~/go/src$ ./all.bash
      Building Go cmd/dist using /usr/lib/go-1.16. (go1.16.2 linux/ppc64le)
      Building Go toolchain1 using /usr/lib/go-1.16.
      go build os/exec: /usr/lib/go-1.16/pkg/tool/linux_ppc64le/compile: signal: segmentation fault
      go build reflect: /usr/lib/go-1.16/pkg/tool/linux_ppc64le/compile: signal: segmentation fault
      go tool dist: FAILED: /usr/lib/go-1.16/bin/go install -gcflags=-l -tags=math_big_pure_go compiler_bootstrap bootstrap/cmd/...: exit status 1
    
    There are patches in flight to fix Go[1], but until they are released
    and widely deployed we can workaround it in the VDSO by avoiding use of
    r30.
    
    Note this only works with GCC, clang does not support -ffixed-rN.
    
    1: https://go-review.googlesource.com/c/go/+/328110
    
    Fixes: ab037dd8 ("powerpc/vdso: Switch VDSO to generic C implementation.")
    Cc: stable@vger.kernel.org # v5.11+
    Reported-by: default avatarPaul Menzel <pmenzel@molgen.mpg.de>
    Tested-by: default avatarPaul Menzel <pmenzel@molgen.mpg.de>
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/20210729131244.2595519-1-mpe@ellerman.id.au
    a88603f4
Makefile 2.18 KB