func casgstatus(gp *g, oldval, newval uint32) {
        if (oldval&_Gscan != 0) || (newval&_Gscan != 0) || oldval == newval {
                systemstack(func() {
+                       // Call on the systemstack to prevent print and throw from counting
+                       // against the nosplit stack reservation.
                        print("runtime: casgstatus: oldval=", hex(oldval), " newval=", hex(newval), "\n")
                        throw("casgstatus: bad incoming values")
                })
        // GC time to finish and change the state to oldval.
        for i := 0; !gp.atomicstatus.CompareAndSwap(oldval, newval); i++ {
                if oldval == _Gwaiting && gp.atomicstatus.Load() == _Grunnable {
-                       throw("casgstatus: waiting for Gwaiting but is Grunnable")
+                       systemstack(func() {
+                               // Call on the systemstack to prevent throw from counting
+                               // against the nosplit stack reservation.
+                               throw("casgstatus: waiting for Gwaiting but is Grunnable")
+                       })
                }
                if i == 0 {
                        nextYield = nanotime() + yieldDelay