runtime: mark dropm and callees nowritebarrierrec

The CgocallbackDone function calls dropm after it calls entersyscall,
which means that dropm must not have any write barriers. Mark it
accordingly.

Change-Id: I5a48a8aa36259778ef465af0dc153a72239d97b1
Reviewed-on: https://go-review.googlesource.com/46464
Reviewed-by: Than McIntosh <thanm@google.com>
diff --git a/libgo/go/runtime/os_gccgo.go b/libgo/go/runtime/os_gccgo.go
index 358a38b..db3ea48 100644
--- a/libgo/go/runtime/os_gccgo.go
+++ b/libgo/go/runtime/os_gccgo.go
@@ -32,6 +32,7 @@
 
 // Called from dropm to undo the effect of an minit.
 //go:nosplit
+//go:nowritebarrierrec
 func unminit() {
 	unminitSignals()
 }
diff --git a/libgo/go/runtime/proc.go b/libgo/go/runtime/proc.go
index bdf7144..77b624b 100644
--- a/libgo/go/runtime/proc.go
+++ b/libgo/go/runtime/proc.go
@@ -1447,6 +1447,9 @@
 // in which dropm happens on each cgo call, is still correct too.
 // We may have to keep the current version on systems with cgo
 // but without pthreads, like Windows.
+//
+// CgocallBackDone calls this after releasing p, so no write barriers.
+//go:nowritebarrierrec
 func dropm() {
 	// Clear m and g, and return m to the extra list.
 	// After the call to setg we can only call nosplit functions
@@ -1492,6 +1495,7 @@
 // return a nil list head if that's what it finds. If nilokay is false,
 // lockextra will keep waiting until the list head is no longer nil.
 //go:nosplit
+//go:nowritebarrierrec
 func lockextra(nilokay bool) *m {
 	const locked = 1
 
@@ -1524,6 +1528,7 @@
 }
 
 //go:nosplit
+//go:nowritebarrierrec
 func unlockextra(mp *m) {
 	atomic.Storeuintptr(&extram, uintptr(unsafe.Pointer(mp)))
 }
diff --git a/libgo/go/runtime/signal_unix.go b/libgo/go/runtime/signal_unix.go
index c8713b6..e2642ee 100644
--- a/libgo/go/runtime/signal_unix.go
+++ b/libgo/go/runtime/signal_unix.go
@@ -599,6 +599,7 @@
 // unminitSignals is called from dropm, via unminit, to undo the
 // effect of calling minit on a non-Go thread.
 //go:nosplit
+//go:nowritebarrierrec
 func unminitSignals() {
 	if getg().m.newSigstack {
 		signalstack(nil, 0)