gccgo: fix runtime compilation on NetBSD
authorBenny Siegert <bsiegert@gmail.com>
Mon, 20 Apr 2020 14:11:14 +0000 (16:11 +0200)
committerIan Lance Taylor <iant@golang.org>
Tue, 21 Apr 2020 04:20:53 +0000 (21:20 -0700)
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

gcc/go/gofrontend/MERGE
libgo/go/runtime/os_netbsd.go
libgo/go/runtime/signal_gccgo.go
libgo/go/runtime/stubs.go
libgo/runtime/go-signal.c

index 7b382cf..e48abcf 100644 (file)
@@ -1,4 +1,4 @@
-0fe7a277c5d22265a73a4d216bd5d81799634453
+b76c83f34c006938fe6c3311d949496990bc5db9
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
index 7c3d41f..69d2c71 100644 (file)
@@ -68,9 +68,9 @@ func semasleep(ns int64) int32 {
        }
 
        for {
        }
 
        for {
-               v := atomic.Load(&_g_.m.mos.waitsemacount)
+               v := atomic.Load(&_g_.m.waitsemacount)
                if v > 0 {
                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
                                return 0 // semaphore acquired
                        }
                        continue
@@ -96,15 +96,15 @@ func semasleep(ns int64) int32 {
 
 //go:nosplit
 func semawakeup(mp *m) {
 
 //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()."
        // 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() {
        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()
        }
 }
                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
+               }
+       }
+}
index 6f362fc..c555712 100644 (file)
@@ -60,7 +60,7 @@ type sigctxt struct {
 }
 
 func (c *sigctxt) sigcode() uint64 {
 }
 
 func (c *sigctxt) sigcode() uint64 {
-       return uint64(c.info.si_code)
+       return uint64(getSiginfoCode(c.info))
 }
 
 //go:nosplit
 }
 
 //go:nosplit
index 4a06da5..25b1836 100644 (file)
@@ -297,6 +297,10 @@ func getSigactionHandler(*_sigaction) uintptr
 //go:noescape
 func setSigactionHandler(*_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.
 // 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.
index a07fdea..b429fdb 100644 (file)
@@ -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.
 
 // 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;
 struct getSiginfoRet {
        uintptr sigaddr;
        uintptr sigpc;