summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIgor Pashev <pashev.igor@gmail.com>2014-05-21 00:03:51 +0400
committerIgor Pashev <pashev.igor@gmail.com>2014-05-21 00:03:51 +0400
commitc451f119503eaccbb91787ef2f163a7438cad4fe (patch)
tree9d44559ddd8c9031686600fec757c470aafe4d17
parentc5b1b00cfe45da16a3d92a540414f5820cf9f0dc (diff)
downloadmono-c451f119503eaccbb91787ef2f163a7438cad4fe.tar.gz
Support detecting stack boundaries on illumos
-rw-r--r--mono/metadata/sgen-gc.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/mono/metadata/sgen-gc.c b/mono/metadata/sgen-gc.c
index 12e8ce69a4..cb4665d30c 100644
--- a/mono/metadata/sgen-gc.c
+++ b/mono/metadata/sgen-gc.c
@@ -4143,6 +4143,30 @@ sgen_thread_register (SgenThreadInfo* info, void *addr)
info->stack_start_limit = staddr;
info->stack_end = staddr + stsize;
}
+#elif (defined(__sun__) || defined(__illumos_kernel__))
+#include <thread.h>
+#include <errno.h>
+ {
+ int rc;
+ stack_t s;
+
+ do {
+ rc = thr_stksegment(&s);
+ } while (rc != 0 && errno == EAGAIN);
+
+ info->stack_end = s.ss_sp;
+
+ // Is stack "unlimited" ?
+ if (s.ss_size == RLIM_INFINITY)
+ {
+ // XXX Lower stack boundary
+ info->stack_start_limit = (void*)0xFFFF800000000000L;
+ }
+ else
+ {
+ info->stack_start_limit = (void*)((intptr_t)s.ss_sp - (intptr_t)s.ss_size);
+ }
+ }
#else
{
/* FIXME: we assume the stack grows down */