aboutsummaryrefslogtreecommitdiff
path: root/src/syscall/syscall_linux.go
diff options
context:
space:
mode:
authorAndrew G. Morgan <agm@google.com>2020-10-28 13:35:57 -0700
committerIan Lance Taylor <iant@golang.org>2020-10-29 17:53:57 +0000
commit3a819e8998af1db3bdd34eb2ab059a3c534c6def (patch)
tree8fd6d218b9b85f82dab1ada0c9ca9699ba0ee6b0 /src/syscall/syscall_linux.go
parent4fb429138881e3fe171e4c2e958ed0da26ddfd9c (diff)
downloadgo-3a819e8998af1db3bdd34eb2ab059a3c534c6def.tar.xz
syscall: handle undefined r2 value on linux-ppc64x
This change fixes two failng tests on linux-ppc64x: - TestAllThreadsSyscall() exposed a real bug in the ppc64x support: - It turns out that the r2 syscall return value is not defined on all architectures. Notably linux-ppc64x so address that by introducing a private architectural constant in the syscall package, archHonorsR2: true if r2 has a determanistic value. - TestSetuidEtc() was sensitive to /proc/<PID>/status content: - The amount of padding space has changed with kernel vintage. - Stress testing revealed a race with /proc files disappearing. Fixes #42178 Change-Id: Ie6fc0b8f2f94a409ac0e5756e73bfce113274709 Reviewed-on: https://go-review.googlesource.com/c/go/+/266202 Run-TryBot: Ian Lance Taylor <iant@golang.org> Reviewed-by: Emmanuel Odeke <emmanuel@orijtech.com> Reviewed-by: Ian Lance Taylor <iant@golang.org> TryBot-Result: Go Bot <gobot@golang.org>
Diffstat (limited to 'src/syscall/syscall_linux.go')
-rw-r--r--src/syscall/syscall_linux.go8
1 files changed, 6 insertions, 2 deletions
diff --git a/src/syscall/syscall_linux.go b/src/syscall/syscall_linux.go
index 54e5cfc2f2..3041f6f8fc 100644
--- a/src/syscall/syscall_linux.go
+++ b/src/syscall/syscall_linux.go
@@ -1003,7 +1003,9 @@ func (pc *allThreadsCaller) doSyscall(initial bool) bool {
pc.r1 = r1
pc.r2 = r2
pc.err = err
- } else if pc.r1 != r1 || pc.r2 != r2 || pc.err != err {
+ } else if pc.r1 != r1 || (archHonorsR2 && pc.r2 != r2) || pc.err != err {
+ print("trap:", pc.trap, ", a123=[", pc.a1, ",", pc.a2, ",", pc.a3, "]\n")
+ print("results: got {r1=", r1, ",r2=", r2, ",err=", err, "}, want {r1=", pc.r1, ",r2=", pc.r2, ",r3=", pc.err, "}\n")
panic("AllThreadsSyscall results differ between threads; runtime corrupted")
}
return err == 0
@@ -1019,7 +1021,9 @@ func (pc *allThreadsCaller) doSyscall6(initial bool) bool {
pc.r1 = r1
pc.r2 = r2
pc.err = err
- } else if pc.r1 != r1 || pc.r2 != r2 || pc.err != err {
+ } else if pc.r1 != r1 || (archHonorsR2 && pc.r2 != r2) || pc.err != err {
+ print("trap:", pc.trap, ", a123456=[", pc.a1, ",", pc.a2, ",", pc.a3, ",", pc.a4, ",", pc.a5, ",", pc.a6, "]\n")
+ print("results: got {r1=", r1, ",r2=", r2, ",err=", err, "}, want {r1=", pc.r1, ",r2=", pc.r2, ",r3=", pc.err, "}\n")
panic("AllThreadsSyscall6 results differ between threads; runtime corrupted")
}
return err == 0