diff options
author | Ian Lance Taylor <iant@golang.org> | 2021-09-13 10:37:49 -0700 |
---|---|---|
committer | Ian Lance Taylor <iant@golang.org> | 2021-09-13 10:37:49 -0700 |
commit | e252b51ccde010cbd2a146485d8045103cd99533 (patch) | |
tree | e060f101cdc32bf5e520de8e5275db9d4236b74c /libgo/runtime | |
parent | f10c7c4596dda99d2ee872c995ae4aeda65adbdf (diff) | |
parent | 104c05c5284b7822d770ee51a7d91946c7e56d50 (diff) | |
download | gcc-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.c | 4 | ||||
-rw-r--r-- | libgo/runtime/proc.c | 4 | ||||
-rw-r--r-- | libgo/runtime/runtime_c.c | 25 | ||||
-rw-r--r-- | libgo/runtime/stack.c | 65 |
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 +} |