diff options
Diffstat (limited to 'src/pkg/runtime/proc.c')
-rw-r--r-- | src/pkg/runtime/proc.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/src/pkg/runtime/proc.c b/src/pkg/runtime/proc.c index 454a4a217..1a1895dcb 100644 --- a/src/pkg/runtime/proc.c +++ b/src/pkg/runtime/proc.c @@ -461,9 +461,7 @@ scheduler(void) // unwind to the stack frame with d->sp in it. unwindstack(gp, d->sp); - if(d->sp < gp->stackguard || gp->stackbase < d->sp) - throw("bad stack in recovery"); - + // make the deferproc for this d return again, // this time returning 1. function will jump to // standard return epilogue. @@ -930,6 +928,11 @@ unwindstack(G *gp, byte *sp) gp->stackguard = top->stackguard; free(stk); } + + if(sp != nil && (sp < gp->stackguard - StackGuard || gp->stackbase < sp)) { + printf("recover: %p not in [%p, %p]\n", sp, gp->stackguard - StackGuard, gp->stackbase); + throw("bad unwindstack"); + } } static void |