runtime: don't crash if panicstring called with no m

It's possible for runtime_panicstring to be called with no m if a
signal handler, or scheduler innards, do something wrong.  If that
happens carry on with the panic rather than crashing.

Change-Id: I8ad04f1f9d7655b4a4e9a983f439f2cc3ac6b269
Reviewed-on: https://go-review.googlesource.com/41137
Reviewed-by: Than McIntosh <thanm@google.com>
diff --git a/libgo/runtime/panic.c b/libgo/runtime/panic.c
index 493fde8..8cb6bff 100644
--- a/libgo/runtime/panic.c
+++ b/libgo/runtime/panic.c
@@ -16,19 +16,23 @@
 void
 runtime_panicstring(const char *s)
 {
+	M* mp;
 	Eface err;
 
-	if(runtime_m()->mallocing) {
-		runtime_printf("panic: %s\n", s);
-		runtime_throw("panic during malloc");
-	}
-	if(runtime_m()->gcing) {
-		runtime_printf("panic: %s\n", s);
-		runtime_throw("panic during gc");
-	}
-	if(runtime_m()->locks) {
-		runtime_printf("panic: %s\n", s);
-		runtime_throw("panic holding locks");
+	mp = runtime_m();
+	if (mp != nil) {
+		if(mp->mallocing) {
+			runtime_printf("panic: %s\n", s);
+			runtime_throw("panic during malloc");
+		}
+		if(mp->gcing) {
+			runtime_printf("panic: %s\n", s);
+			runtime_throw("panic during gc");
+		}
+		if(mp->locks) {
+			runtime_printf("panic: %s\n", s);
+			runtime_throw("panic holding locks");
+		}
 	}
 	runtime_newErrorCString(s, &err);
 	runtime_panic(err);