You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
69 lines
1.9 KiB
69 lines
1.9 KiB
4 months ago
|
package psx
|
||
|
|
||
|
import (
|
||
|
"runtime"
|
||
|
"syscall"
|
||
|
"testing"
|
||
|
)
|
||
|
|
||
|
func TestSyscall3(t *testing.T) {
|
||
|
want := syscall.Getpid()
|
||
|
if got, _, err := Syscall3(syscall.SYS_GETPID, 0, 0, 0); err != 0 {
|
||
|
t.Errorf("failed to get PID via libpsx: %v", err)
|
||
|
} else if int(got) != want {
|
||
|
t.Errorf("pid mismatch: got=%d want=%d", got, want)
|
||
|
}
|
||
|
if got, _, err := Syscall3(syscall.SYS_CAPGET, 0, 0, 0); err != 14 {
|
||
|
t.Errorf("malformed capget returned %d: %v (want 14: %v)", err, err, syscall.Errno(14))
|
||
|
} else if ^got != 0 {
|
||
|
t.Errorf("malformed capget did not return -1, got=%d", got)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestSyscall6(t *testing.T) {
|
||
|
want := syscall.Getpid()
|
||
|
if got, _, err := Syscall6(syscall.SYS_GETPID, 0, 0, 0, 0, 0, 0); err != 0 {
|
||
|
t.Errorf("failed to get PID via libpsx: %v", err)
|
||
|
} else if int(got) != want {
|
||
|
t.Errorf("pid mismatch: got=%d want=%d", got, want)
|
||
|
}
|
||
|
if got, _, err := Syscall6(syscall.SYS_CAPGET, 0, 0, 0, 0, 0, 0); err != 14 {
|
||
|
t.Errorf("malformed capget errno %d: %v (want 14: %v)", err, err, syscall.Errno(14))
|
||
|
} else if ^got != 0 {
|
||
|
t.Errorf("malformed capget did not return -1, got=%d", got)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// killAThread locks the goroutine to a thread and exits. This has the
|
||
|
// effect of making the go runtime terminate the thread.
|
||
|
func killAThread(c <-chan struct{}) {
|
||
|
runtime.LockOSThread()
|
||
|
<-c
|
||
|
}
|
||
|
|
||
|
// Test to confirm no regression against:
|
||
|
//
|
||
|
// https://github.com/golang/go/issues/42494
|
||
|
func TestThreadChurn(t *testing.T) {
|
||
|
const prSetKeepCaps = 8
|
||
|
|
||
|
for j := 0; j < 4; j++ {
|
||
|
kill := (j & 1) != 0
|
||
|
sysc := (j & 2) != 0
|
||
|
t.Logf("[%d] testing kill=%v, sysc=%v", j, kill, sysc)
|
||
|
for i := 50; i > 0; i-- {
|
||
|
if kill {
|
||
|
c := make(chan struct{})
|
||
|
go killAThread(c)
|
||
|
close(c)
|
||
|
}
|
||
|
if sysc {
|
||
|
if _, _, e := Syscall3(syscall.SYS_PRCTL, prSetKeepCaps, uintptr(i&1), 0); e != 0 {
|
||
|
t.Fatalf("[%d] psx:prctl(SET_KEEPCAPS, %d) failed: %v", i, i&1, syscall.Errno(e))
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
t.Logf("[%d] PASSED kill=%v, sysc=%v", j, kill, sysc)
|
||
|
}
|
||
|
}
|