summaryrefslogtreecommitdiff
path: root/libgo
diff options
context:
space:
mode:
authorBenny Siegert <bsiegert@gmail.com>2020-04-20 16:11:14 +0200
committerIan Lance Taylor <iant@golang.org>2020-04-20 21:20:53 -0700
commit8e841bd419fb9dc3e027367fc11078b677541a9a (patch)
tree6057bd268fb933a070fa9faac31f86e95b767c69 /libgo
parent8ab392f97bb51854e11fae9c2e9a15b67206efba (diff)
gccgo: fix runtime compilation on NetBSD
si_code in siginfo_t is a macro on NetBSD, not a member of the struct itself, so add a C trampoline for receiving its value. Also replace references to mos.waitsemacount with the replacement and add some helpers from os_netbsd.go in the GC repository. Update golang/go#38538. Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/228918
Diffstat (limited to 'libgo')
-rw-r--r--libgo/go/runtime/os_netbsd.go41
-rw-r--r--libgo/go/runtime/signal_gccgo.go2
-rw-r--r--libgo/go/runtime/stubs.go4
-rw-r--r--libgo/runtime/go-signal.c12
4 files changed, 53 insertions, 6 deletions
diff --git a/libgo/go/runtime/os_netbsd.go b/libgo/go/runtime/os_netbsd.go
index 7c3d41fb9d1..69d2c710449 100644
--- a/libgo/go/runtime/os_netbsd.go
+++ b/libgo/go/runtime/os_netbsd.go
@@ -68,9 +68,9 @@ func semasleep(ns int64) int32 {
}
for {
- v := atomic.Load(&_g_.m.mos.waitsemacount)
+ v := atomic.Load(&_g_.m.waitsemacount)
if v > 0 {
- if atomic.Cas(&_g_.m.mos.waitsemacount, v, v-1) {
+ if atomic.Cas(&_g_.m.waitsemacount, v, v-1) {
return 0 // semaphore acquired
}
continue
@@ -96,15 +96,15 @@ func semasleep(ns int64) int32 {
//go:nosplit
func semawakeup(mp *m) {
- atomic.Xadd(&mp.mos.waitsemacount, 1)
+ atomic.Xadd(&mp.waitsemacount, 1)
// From NetBSD's _lwp_unpark(2) manual:
// "If the target LWP is not currently waiting, it will return
// immediately upon the next call to _lwp_park()."
- ret := lwp_unpark(int32(mp.procid), unsafe.Pointer(&mp.mos.waitsemacount))
+ ret := lwp_unpark(int32(mp.procid), unsafe.Pointer(&mp.waitsemacount))
if ret != 0 && ret != _ESRCH {
// semawakeup can be called on signal stack.
systemstack(func() {
- print("thrwakeup addr=", &mp.mos.waitsemacount, " sem=", mp.mos.waitsemacount, " ret=", ret, "\n")
+ print("thrwakeup addr=", &mp.waitsemacount, " sem=", mp.waitsemacount, " ret=", ret, "\n")
})
}
}
@@ -115,3 +115,34 @@ func osinit() {
physPageSize = getPageSize()
}
}
+
+func sysargs(argc int32, argv **byte) {
+ n := argc + 1
+
+ // skip over argv, envp to get to auxv
+ for argv_index(argv, n) != nil {
+ n++
+ }
+
+ // skip NULL separator
+ n++
+
+ // now argv+n is auxv
+ auxv := (*[1 << 28]uintptr)(add(unsafe.Pointer(argv), uintptr(n)*sys.PtrSize))
+ sysauxv(auxv[:])
+}
+
+const (
+ _AT_NULL = 0 // Terminates the vector
+ _AT_PAGESZ = 6 // Page size in bytes
+)
+
+func sysauxv(auxv []uintptr) {
+ for i := 0; auxv[i] != _AT_NULL; i += 2 {
+ tag, val := auxv[i], auxv[i+1]
+ switch tag {
+ case _AT_PAGESZ:
+ physPageSize = val
+ }
+ }
+}
diff --git a/libgo/go/runtime/signal_gccgo.go b/libgo/go/runtime/signal_gccgo.go
index 6f362fc05be..c555712a03c 100644
--- a/libgo/go/runtime/signal_gccgo.go
+++ b/libgo/go/runtime/signal_gccgo.go
@@ -60,7 +60,7 @@ type sigctxt struct {
}
func (c *sigctxt) sigcode() uint64 {
- return uint64(c.info.si_code)
+ return uint64(getSiginfoCode(c.info))
}
//go:nosplit
diff --git a/libgo/go/runtime/stubs.go b/libgo/go/runtime/stubs.go
index 4a06da51fe5..25b1836daf0 100644
--- a/libgo/go/runtime/stubs.go
+++ b/libgo/go/runtime/stubs.go
@@ -297,6 +297,10 @@ func getSigactionHandler(*_sigaction) uintptr
//go:noescape
func setSigactionHandler(*_sigaction, uintptr)
+// Get signal code, written in C.
+//go:noescape
+func getSiginfoCode(*_siginfo_t) uintptr
+
// Retrieve fields from the siginfo_t and ucontext_t pointers passed
// to a signal handler using C, as they are often hidden in a union.
// Returns and, if available, PC where signal occurred.
diff --git a/libgo/runtime/go-signal.c b/libgo/runtime/go-signal.c
index a07fdeafeb4..b429fdb2403 100644
--- a/libgo/runtime/go-signal.c
+++ b/libgo/runtime/go-signal.c
@@ -179,6 +179,18 @@ setSigactionHandler(struct sigaction* sa, uintptr handler)
// C code to fetch values from the siginfo_t and ucontext_t pointers
// passed to a signal handler.
+uintptr getSiginfoCode(siginfo_t *)
+ __attribute__ ((no_split_stack));
+
+uintptr getSiginfoCode(siginfo_t *)
+ __asm__ (GOSYM_PREFIX "runtime.getSiginfoCode");
+
+uintptr
+getSiginfoCode(siginfo_t *info)
+{
+ return (uintptr)(info->si_code);
+}
+
struct getSiginfoRet {
uintptr sigaddr;
uintptr sigpc;