From d91219e458823a26a447c57c616f8ddf5adf4c9a Mon Sep 17 00:00:00 2001 From: Dmitriy Vyukov Date: Mon, 29 Jul 2013 22:59:30 +0400 Subject: [PATCH] runtime: fix linux/arm build notetsleep: nosplit stack overflow 128 assumed on entry to notetsleep 80 after notetsleep uses 48 44 after runtime.futexsleep uses 36 -12 after runtime.timediv uses 56 R=golang-dev, rsc CC=golang-dev https://golang.org/cl/12049043 --- src/pkg/runtime/lock_futex.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/pkg/runtime/lock_futex.c b/src/pkg/runtime/lock_futex.c index 4fabc76944..3f8d632363 100644 --- a/src/pkg/runtime/lock_futex.c +++ b/src/pkg/runtime/lock_futex.c @@ -138,9 +138,11 @@ runtime·notesleep(Note *n) #pragma textflag 7 static bool -notetsleep(Note *n, int64 ns) +notetsleep(Note *n, int64 ns, int64 deadline, int64 now) { - int64 deadline, now; + // Conceptually, deadline and now are local variables. + // They are passed as arguments so that the space for them + // does not count against our nosplit stack sequence. if(ns < 0) { while(runtime·atomicload((uint32*)&n->key) == 0) @@ -174,7 +176,7 @@ runtime·notetsleep(Note *n, int64 ns) if(m->profilehz > 0) runtime·setprof(false); - res = notetsleep(n, ns); + res = notetsleep(n, ns, 0, 0); if(m->profilehz > 0) runtime·setprof(true); return res; @@ -192,7 +194,7 @@ runtime·notetsleepg(Note *n, int64 ns) runtime·throw("notetsleepg on g0"); runtime·entersyscallblock(); - res = notetsleep(n, ns); + res = notetsleep(n, ns, 0, 0); runtime·exitsyscall(); return res; } -- 2.48.1