diff options
Diffstat (limited to 'src/runtime')
-rw-r--r-- | src/runtime/asm_power64x.s | 55 | ||||
-rw-r--r-- | src/runtime/gcinfo_test.go | 8 | ||||
-rw-r--r-- | src/runtime/mgc0.c | 1 | ||||
-rw-r--r-- | src/runtime/panic.c | 2 | ||||
-rw-r--r-- | src/runtime/runtime.c | 6 | ||||
-rw-r--r-- | src/runtime/signal_power64x.c | 2 |
6 files changed, 41 insertions, 33 deletions
diff --git a/src/runtime/asm_power64x.s b/src/runtime/asm_power64x.s index fd0c6be16..ba900c2b3 100644 --- a/src/runtime/asm_power64x.s +++ b/src/runtime/asm_power64x.s @@ -86,7 +86,7 @@ TEXT runtime·reginit(SB),NOSPLIT,$-8-0 // void gosave(Gobuf*) // save state in Gobuf; setjmp TEXT runtime·gosave(SB), NOSPLIT, $-8-8 - MOVD gobuf+0(FP), R3 + MOVD buf+0(FP), R3 MOVD R1, gobuf_sp(R3) MOVD LR, R31 MOVD R31, gobuf_pc(R3) @@ -99,7 +99,7 @@ TEXT runtime·gosave(SB), NOSPLIT, $-8-8 // void gogo(Gobuf*) // restore state from Gobuf; longjmp TEXT runtime·gogo(SB), NOSPLIT, $-8-8 - MOVD gobuf+0(FP), R5 + MOVD buf+0(FP), R5 MOVD gobuf_g(R5), g // make sure g is not nil MOVD 0(g), R4 MOVD gobuf_sp(R5), R1 @@ -299,7 +299,7 @@ TEXT runtime·morestack_noctxt(SB),NOSPLIT,$-8-0 // Note: can't just "BR NAME(SB)" - bad inlining results. TEXT ·reflectcall(SB), NOSPLIT, $-8-24 - MOVW argsize+16(FP), R3 + MOVWZ n+16(FP), R3 DISPATCH(runtime·call16, 16) DISPATCH(runtime·call32, 32) DISPATCH(runtime·call64, 64) @@ -335,8 +335,8 @@ TEXT ·reflectcall(SB), NOSPLIT, $-8-24 TEXT NAME(SB), WRAPPER, $MAXSIZE-24; \ NO_LOCAL_POINTERS; \ /* copy arguments to stack */ \ - MOVD argptr+8(FP), R3; \ - MOVW argsize+16(FP), R4; \ + MOVD arg+8(FP), R3; \ + MOVWZ n+16(FP), R4; \ MOVD R1, R5; \ ADD $(8-1), R5; \ SUB $1, R3; \ @@ -353,9 +353,9 @@ TEXT NAME(SB), WRAPPER, $MAXSIZE-24; \ PCDATA $PCDATA_StackMapIndex, $0; \ BL (CTR); \ /* copy return values back */ \ - MOVD argptr+8(FP), R3; \ - MOVW argsize+16(FP), R4; \ - MOVW retoffset+20(FP), R6; \ + MOVD arg+8(FP), R3; \ + MOVWZ n+16(FP), R4; \ + MOVWZ retoffset+20(FP), R6; \ MOVD R1, R5; \ ADD R6, R5; \ ADD R6, R3; \ @@ -398,7 +398,7 @@ CALLFN(·call268435456, 268435456) CALLFN(·call536870912, 536870912) CALLFN(·call1073741824, 1073741824) -// bool cas(int32 *val, int32 old, int32 new) +// bool cas(uint32 *ptr, uint32 old, uint32 new) // Atomically: // if(*val == old){ // *val = new; @@ -406,9 +406,9 @@ CALLFN(·call1073741824, 1073741824) // } else // return 0; TEXT runtime·cas(SB), NOSPLIT, $0-17 - MOVD p+0(FP), R3 - MOVW old+8(FP), R4 - MOVW new+12(FP), R5 + MOVD ptr+0(FP), R3 + MOVWZ old+8(FP), R4 + MOVWZ new+12(FP), R5 cas_again: SYNC LWAR (R3), R6 @@ -425,7 +425,7 @@ cas_fail: MOVD $0, R3 BR -5(PC) -// bool runtime·cas64(uint64 *val, uint64 old, uint64 new) +// bool runtime·cas64(uint64 *ptr, uint64 old, uint64 new) // Atomically: // if(*val == *old){ // *val = new; @@ -434,7 +434,7 @@ cas_fail: // return 0; // } TEXT runtime·cas64(SB), NOSPLIT, $0-25 - MOVD p+0(FP), R3 + MOVD ptr+0(FP), R3 MOVD old+8(FP), R4 MOVD new+16(FP), R5 cas64_again: @@ -475,12 +475,12 @@ TEXT runtime·atomicstoreuintptr(SB), NOSPLIT, $0-16 TEXT runtime·casp1(SB), NOSPLIT, $0-25 BR runtime·cas64(SB) -// uint32 xadd(uint32 volatile *val, int32 delta) +// uint32 xadd(uint32 volatile *ptr, int32 delta) // Atomically: // *val += delta; // return *val; TEXT runtime·xadd(SB), NOSPLIT, $0-20 - MOVD p+0(FP), R4 + MOVD ptr+0(FP), R4 MOVW delta+8(FP), R5 SYNC LWAR (R4), R3 @@ -493,7 +493,7 @@ TEXT runtime·xadd(SB), NOSPLIT, $0-20 RETURN TEXT runtime·xadd64(SB), NOSPLIT, $0-24 - MOVD p+0(FP), R4 + MOVD ptr+0(FP), R4 MOVD delta+8(FP), R5 SYNC LDAR (R4), R3 @@ -506,7 +506,7 @@ TEXT runtime·xadd64(SB), NOSPLIT, $0-24 RETURN TEXT runtime·xchg(SB), NOSPLIT, $0-20 - MOVD p+0(FP), R4 + MOVD ptr+0(FP), R4 MOVW new+8(FP), R5 SYNC LWAR (R4), R3 @@ -518,7 +518,7 @@ TEXT runtime·xchg(SB), NOSPLIT, $0-20 RETURN TEXT runtime·xchg64(SB), NOSPLIT, $0-24 - MOVD p+0(FP), R4 + MOVD ptr+0(FP), R4 MOVD new+8(FP), R5 SYNC LDAR (R4), R3 @@ -651,7 +651,7 @@ TEXT runtime·setcallerpc(SB),NOSPLIT,$-8-16 RETURN TEXT runtime·getcallersp(SB),NOSPLIT,$0-16 - MOVD sp+0(FP), R3 + MOVD argp+0(FP), R3 SUB $8, R3 MOVD R3, ret+8(FP) RETURN @@ -695,16 +695,17 @@ TEXT runtime·aeshashstr(SB),NOSPLIT,$-8-0 TEXT runtime·memeq(SB),NOSPLIT,$-8-25 MOVD a+0(FP), R3 MOVD b+8(FP), R4 - MOVD count+16(FP), R5 + MOVD size+16(FP), R5 SUB $1, R3 SUB $1, R4 ADD R3, R5, R8 loop: CMP R3, R8 - BNE 4(PC) + BNE test MOVD $1, R3 MOVB R3, ret+24(FP) RETURN +test: MOVBZU 1(R3), R6 MOVBZU 1(R4), R7 CMP R6, R7 @@ -828,7 +829,7 @@ notfound: // in ../../cmd/9g/ggen.c:/^clearfat. // R0: always zero // R3 (aka REGRT1): ptr to memory to be zeroed - 8 -// R3 is updated as a side effect. +// On return, R3 points to the last zeroed dword. TEXT runtime·duffzero(SB), NOSPLIT, $-8-0 MOVDU R0, 8(R3) MOVDU R0, 8(R3) @@ -964,7 +965,7 @@ TEXT runtime·fastrand1(SB), NOSPLIT, $0-4 MOVD g_m(g), R4 MOVWZ m_fastrand(R4), R3 ADD R3, R3 - CMP R3, $0 + CMPW R3, $0 BGE 2(PC) XOR $0x88888eef, R3 MOVW R3, m_fastrand(R4) @@ -979,3 +980,9 @@ TEXT runtime·return0(SB), NOSPLIT, $0 // Must obey the gcc calling convention. TEXT _cgo_topofstack(SB),NOSPLIT,$0 MOVD R0, 26(R0) + +// The top-most function running on a goroutine +// returns to goexit+PCQuantum. +TEXT runtime·goexit(SB),NOSPLIT,$-8-0 + MOVD R0, R0 // NOP + BL runtime·goexit1(SB) // does not return diff --git a/src/runtime/gcinfo_test.go b/src/runtime/gcinfo_test.go index 1a33f3b3b..662b7546d 100644 --- a/src/runtime/gcinfo_test.go +++ b/src/runtime/gcinfo_test.go @@ -137,7 +137,7 @@ func infoBigStruct() []byte { BitsScalar, BitsScalar, BitsScalar, BitsScalar, // t int; y uint16; u uint64 BitsPointer, BitsDead, // i string } - case "amd64": + case "amd64", "power64", "power64le": return []byte{ BitsPointer, // q *int BitsScalar, BitsScalar, BitsScalar, // w byte; e [17]byte @@ -153,12 +153,6 @@ func infoBigStruct() []byte { BitsScalar, BitsScalar, BitsDead, BitsScalar, BitsScalar, // t int; y uint16; u uint64 BitsPointer, BitsDead, // i string } - case "power64", "power64le": - return []byte{ - BitsPointer, BitsScalar, BitsScalar, BitsScalar, - BitsMultiWord, BitsSlice, BitsScalar, BitsScalar, - BitsScalar, BitsScalar, BitsMultiWord, BitsString, - } default: panic("unknown arch") } diff --git a/src/runtime/mgc0.c b/src/runtime/mgc0.c index 3248b0f49..f37c01af0 100644 --- a/src/runtime/mgc0.c +++ b/src/runtime/mgc0.c @@ -122,6 +122,7 @@ enum { Debug = 0, + DebugPtrs = 0, // if 1, print trace of every pointer load during GC ConcurrentSweep = 1, FinBlockSize = 4*1024, diff --git a/src/runtime/panic.c b/src/runtime/panic.c index 46683b2b0..b19fdd0e1 100644 --- a/src/runtime/panic.c +++ b/src/runtime/panic.c @@ -69,7 +69,7 @@ runtime·recovery_m(G *gp) // each call to deferproc. // (The pc we're returning to does pop pop // before it tests the return value.) - // On the arm there are 2 saved LRs mixed in too. + // On the arm and power there are 2 saved LRs mixed in too. if(thechar == '5' || thechar == '9') gp->sched.sp = (uintptr)argp - 4*sizeof(uintptr); else diff --git a/src/runtime/runtime.c b/src/runtime/runtime.c index f19f8e4be..a68414284 100644 --- a/src/runtime/runtime.c +++ b/src/runtime/runtime.c @@ -226,6 +226,12 @@ runtime·check(void) if(z != 4) runtime·throw("cas4"); + z = 0xffffffff; + if(!runtime·cas(&z, 0xffffffff, 0xfffffffe)) + runtime·throw("cas5"); + if(z != 0xfffffffe) + runtime·throw("cas6"); + k = (byte*)0xfedcb123; if(sizeof(void*) == 8) k = (byte*)((uintptr)k<<10); diff --git a/src/runtime/signal_power64x.c b/src/runtime/signal_power64x.c index 89c5c7848..c0bf1c4a5 100644 --- a/src/runtime/signal_power64x.c +++ b/src/runtime/signal_power64x.c @@ -124,7 +124,7 @@ runtime·sighandler(int32 sig, Siginfo *info, void *ctxt, G *gp) if(runtime·gotraceback(&crash)){ runtime·goroutineheader(gp); - runtime·traceback(SIG_PC(info, ctxt), SIG_SP(info, ctxt), SIG_LINK(info, ctxt), gp); + runtime·tracebacktrap(SIG_PC(info, ctxt), SIG_SP(info, ctxt), SIG_LINK(info, ctxt), gp); runtime·tracebackothers(gp); runtime·printf("\n"); runtime·dumpregs(info, ctxt); |