aboutsummaryrefslogtreecommitdiff
path: root/libgo/runtime
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@golang.org>2021-09-13 10:37:49 -0700
committerIan Lance Taylor <iant@golang.org>2021-09-13 10:37:49 -0700
commite252b51ccde010cbd2a146485d8045103cd99533 (patch)
treee060f101cdc32bf5e520de8e5275db9d4236b74c /libgo/runtime
parentf10c7c4596dda99d2ee872c995ae4aeda65adbdf (diff)
parent104c05c5284b7822d770ee51a7d91946c7e56d50 (diff)
downloadgcc-e252b51ccde010cbd2a146485d8045103cd99533.zip
gcc-e252b51ccde010cbd2a146485d8045103cd99533.tar.gz
gcc-e252b51ccde010cbd2a146485d8045103cd99533.tar.bz2
Merge from trunk revision 104c05c5284b7822d770ee51a7d91946c7e56d50.
Diffstat (limited to 'libgo/runtime')
-rw-r--r--libgo/runtime/go-now.c4
-rw-r--r--libgo/runtime/proc.c4
-rw-r--r--libgo/runtime/runtime_c.c25
-rw-r--r--libgo/runtime/stack.c65
4 files changed, 91 insertions, 7 deletions
diff --git a/libgo/runtime/go-now.c b/libgo/runtime/go-now.c
index 1c02e52..e1dcd18 100644
--- a/libgo/runtime/go-now.c
+++ b/libgo/runtime/go-now.c
@@ -8,7 +8,7 @@
#include "runtime.h"
-// Return current time. This is the implementation of time.walltime1().
+// Return current time. This is the implementation of runtime.walltime().
struct walltime_ret
{
@@ -16,7 +16,7 @@ struct walltime_ret
int32_t nsec;
};
-struct walltime_ret now(void) __asm__ (GOSYM_PREFIX "runtime.walltime1")
+struct walltime_ret now(void) __asm__ (GOSYM_PREFIX "runtime.walltime")
__attribute__ ((no_split_stack));
struct walltime_ret
diff --git a/libgo/runtime/proc.c b/libgo/runtime/proc.c
index 38bf7a6..3a30748 100644
--- a/libgo/runtime/proc.c
+++ b/libgo/runtime/proc.c
@@ -594,7 +594,7 @@ runtime_mstart(void *arg)
gp->entry = nil;
gp->param = nil;
__builtin_call_with_static_chain(pfn(gp1), fv);
- *(int*)0x21 = 0x21;
+ abort();
}
if(mp->exiting) {
@@ -662,7 +662,7 @@ setGContext(void)
gp->entry = nil;
gp->param = nil;
__builtin_call_with_static_chain(pfn(gp1), fv);
- *(int*)0x22 = 0x22;
+ abort();
}
}
diff --git a/libgo/runtime/runtime_c.c b/libgo/runtime/runtime_c.c
index 18222c1..f92bdd4 100644
--- a/libgo/runtime/runtime_c.c
+++ b/libgo/runtime/runtime_c.c
@@ -116,7 +116,7 @@ runtime_signalstack(byte *p, uintptr n)
if(p == nil)
st.ss_flags = SS_DISABLE;
if(sigaltstack(&st, nil) < 0)
- *(int *)0xf1 = 0xf1;
+ abort();
}
int32 go_open(char *, int32, int32)
@@ -199,10 +199,13 @@ getEnd()
uintptr getText(void)
__asm__ (GOSYM_PREFIX "runtime.getText");
+extern void main_main(void*)
+ __asm__(GOSYM_PREFIX "main.main");
+
uintptr
getText(void)
{
- return (uintptr)(const void *)(getText);
+ return (uintptr)(const void *)(main_main);
}
// Return the end of the text segment, assumed to come after the
@@ -224,6 +227,24 @@ getEtext(void)
return (uintptr)(p);
}
+// Return the start of the BSS section.
+
+uintptr getBSS(void)
+ __asm__ (GOSYM_PREFIX "runtime.getBSS");
+
+uintptr
+getBSS(void)
+{
+ const void *p;
+
+ p = __edata;
+ if (p == NULL)
+ p = _edata;
+ if (p == NULL)
+ p = __bss_start;
+ return (uintptr)(p);
+}
+
// CPU-specific initialization.
// Fetch CPUID info on x86.
diff --git a/libgo/runtime/stack.c b/libgo/runtime/stack.c
index c78f0c4..65e8fa3 100644
--- a/libgo/runtime/stack.c
+++ b/libgo/runtime/stack.c
@@ -23,7 +23,7 @@ bool runtime_usestackmaps;
#pragma GCC optimize ("-fno-optimize-sibling-calls")
extern void scanstackblock(uintptr addr, uintptr size, void *gcw)
- __asm__("runtime.scanstackblock");
+ __asm__(GOSYM_PREFIX "runtime.scanstackblock");
static bool doscanstack1(G*, void*)
__attribute__ ((noinline));
@@ -125,3 +125,66 @@ static bool doscanstack1(G *gp, void *gcw) {
#endif
return true;
}
+
+extern bool onCurrentStack(uintptr p)
+ __asm__(GOSYM_PREFIX "runtime.onCurrentStack");
+
+bool onCurrentStack(uintptr p)
+{
+#ifdef USING_SPLIT_STACK
+
+ void* sp;
+ size_t spsize;
+ void* next_segment;
+ void* next_sp;
+ void* initial_sp;
+
+ sp = __splitstack_find(nil, nil, &spsize, &next_segment, &next_sp,
+ &initial_sp);
+ while (sp != nil) {
+ if (p >= (uintptr)(sp) && p < (uintptr)(sp) + spsize) {
+ return true;
+ }
+ sp = __splitstack_find(next_segment, next_sp, &spsize,
+ &next_segment, &next_sp, &initial_sp);
+ }
+ return false;
+
+#else
+
+ G* gp;
+ byte* bottom;
+ byte* top;
+ byte* temp;
+ byte* nextsp2;
+ byte* initialsp2;
+
+ gp = runtime_g();
+ bottom = (byte*)(&p);
+ top = (byte*)(void*)(gp->gcinitialsp) + gp->gcstacksize;
+ if ((uintptr)(top) < (uintptr)(bottom)) {
+ temp = top;
+ top = bottom;
+ bottom = temp;
+ }
+ if (p >= (uintptr)(bottom) && p < (uintptr)(top)) {
+ return true;
+ }
+
+ nextsp2 = secondary_stack_pointer();
+ if (nextsp2 != nil) {
+ initialsp2 = (byte*)(void*)(gp->gcinitialsp2);
+ if ((uintptr)(initialsp2) < (uintptr)(nextsp2)) {
+ temp = initialsp2;
+ initialsp2 = nextsp2;
+ nextsp2 = temp;
+ }
+ if (p >= (uintptr)(nextsp2) && p < (uintptr)(initialsp2)) {
+ return true;
+ }
+ }
+
+ return false;
+
+#endif
+}