summaryrefslogtreecommitdiff
path: root/mono/metadata/sgen-gc.c
diff options
context:
space:
mode:
Diffstat (limited to 'mono/metadata/sgen-gc.c')
-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 */