Michael Ellerman <m...@ellerman.id.au> writes: > 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: ab037dd87a2f ("powerpc/vdso: Switch VDSO to generic C implementation.") > Cc: sta...@vger.kernel.org # v5.11+
In practice, with GCC 10.3.0, that commit doesn't result in r30 being used by the compiler. It's commit 74205b3fc2ef ("powerpc/vdso: Add support for time namespaces"), which went into v5.13-rc1, which causes r30 to be used in __c_kernel_clock_gettime(): 00000000000006e0 <__c_kernel_clock_gettime>: 6e0: 0f 00 03 28 cmplwi r3,15 6e4: ec 00 81 41 bgt 7d0 <__c_kernel_clock_gettime+0xf0> 6e8: 01 00 20 39 li r9,1 6ec: 30 18 29 7d slw r9,r9,r3 6f0: 83 08 2a 71 andi. r10,r9,2179 6f4: fc 00 82 41 beq 7f0 <__c_kernel_clock_gettime+0x110> 6f8: e4 26 63 78 rldicr r3,r3,4,59 6fc: ff 7f 20 3d lis r9,32767 700: f0 ff c1 fb std r30,-16(r1) 704: f8 ff e1 fb std r31,-8(r1) 708: 14 1a c5 7c add r6,r5,r3 70c: ff ff 2b 61 ori r11,r9,65535 710: 00 00 05 81 lwz r8,0(r5) 714: 01 00 09 71 andi. r9,r8,1 718: 98 00 82 40 bne 7b0 <__c_kernel_clock_gettime+0xd0> 71c: ac 04 20 7c lwsync 720: a6 42 cc 7f mftb r30 cheers