summaryrefslogtreecommitdiff
path: root/src/runtime
diff options
context:
space:
mode:
Diffstat (limited to 'src/runtime')
-rw-r--r--src/runtime/asm_power64x.s55
-rw-r--r--src/runtime/gcinfo_test.go8
-rw-r--r--src/runtime/mgc0.c1
-rw-r--r--src/runtime/panic.c2
-rw-r--r--src/runtime/runtime.c6
-rw-r--r--src/runtime/signal_power64x.c2
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);