diff options
author | Ondřej Surý <ondrej@sury.org> | 2011-04-20 15:44:41 +0200 |
---|---|---|
committer | Ondřej Surý <ondrej@sury.org> | 2011-04-20 15:44:41 +0200 |
commit | 50104cc32a498f7517a51c8dc93106c51c7a54b4 (patch) | |
tree | 47af80be259cc7c45d0eaec7d42e61fa38c8e4fb /src/pkg/runtime/arm | |
parent | c072558b90f1bbedc2022b0f30c8b1ac4712538e (diff) | |
download | golang-upstream/2011.03.07.1.tar.gz |
Imported Upstream version 2011.03.07.1upstream/2011.03.07.1
Diffstat (limited to 'src/pkg/runtime/arm')
-rw-r--r-- | src/pkg/runtime/arm/asm.s | 41 | ||||
-rw-r--r-- | src/pkg/runtime/arm/cas5.s | 43 | ||||
-rw-r--r-- | src/pkg/runtime/arm/cas6.s | 29 | ||||
-rw-r--r-- | src/pkg/runtime/arm/traceback.c | 37 |
4 files changed, 72 insertions, 78 deletions
diff --git a/src/pkg/runtime/arm/asm.s b/src/pkg/runtime/arm/asm.s index a4e4b3283..f9fe7e628 100644 --- a/src/pkg/runtime/arm/asm.s +++ b/src/pkg/runtime/arm/asm.s @@ -12,10 +12,10 @@ TEXT _rt0_arm(SB),7,$-4 // use R13 instead of SP to avoid linker rewriting the offsets MOVW 0(R13), R0 // argc MOVW $4(R13), R1 // argv - SUB $128, R13 // plenty of scratch + SUB $64, R13 // plenty of scratch AND $~7, R13 - MOVW R0, 120(R13) // save argc, argv away - MOVW R1, 124(R13) + MOVW R0, 60(R13) // save argc, argv away + MOVW R1, 64(R13) // set up m and g registers // g is R10, m is R9 @@ -34,9 +34,9 @@ TEXT _rt0_arm(SB),7,$-4 BL runtime·check(SB) // saved argc, argv - MOVW 120(R13), R0 + MOVW 60(R13), R0 MOVW R0, 4(R13) - MOVW 124(R13), R1 + MOVW 64(R13), R1 MOVW R1, 8(R13) BL runtime·args(SB) BL runtime·osinit(SB) @@ -274,3 +274,34 @@ TEXT runtime·abort(SB),7,$-4 TEXT runtime·runcgocallback(SB),7,$0 MOVW $0, R0 MOVW (R0), R1 + +// bool armcas(int32 *val, int32 old, int32 new) +// Atomically: +// if(*val == old){ +// *val = new; +// return 1; +// }else +// return 0; +// +// To implement runtime·cas in ../$GOOS/arm/sys.s +// using the native instructions, use: +// +// TEXT runtime·cas(SB),7,$0 +// B runtime·armcas(SB) +// +TEXT runtime·armcas(SB),7,$0 + MOVW valptr+0(FP), R1 + MOVW old+4(FP), R2 + MOVW new+8(FP), R3 +casl: + LDREX (R1), R0 + CMP R0, R2 + BNE casfail + STREX R3, (R1), R0 + CMP $0, R0 + BNE casl + MOVW $1, R0 + RET +casfail: + MOVW $0, R0 + RET diff --git a/src/pkg/runtime/arm/cas5.s b/src/pkg/runtime/arm/cas5.s deleted file mode 100644 index 20bd3c3e2..000000000 --- a/src/pkg/runtime/arm/cas5.s +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -#include "arm/asm.h" - -// This version works on pre v6 architectures - -// bool cas(int32 *val, int32 old, int32 new) -// Atomically: -// if(*val == old){ -// *val = new; -// return 1; -// }else -// return 0; - -TEXT runtime·cas(SB),7,$0 - MOVW 0(FP), R0 // *val - MOVW 4(FP), R1 // old - MOVW 8(FP), R2 // new - MOVW $1, R3 - MOVW $runtime·cas_mutex(SB), R4 -l: - SWPW (R4), R3 // acquire mutex - CMP $0, R3 - BNE fail0 - - MOVW (R0), R5 - CMP R1, R5 - BNE fail1 - - MOVW R2, (R0) - MOVW R3, (R4) // release mutex - MOVW $1, R0 - RET -fail1: - MOVW R3, (R4) // release mutex -fail0: - MOVW $0, R0 - RET - -DATA runtime·cas_mutex(SB)/4, $0 -GLOBL runtime·cas_mutex(SB), $4 diff --git a/src/pkg/runtime/arm/cas6.s b/src/pkg/runtime/arm/cas6.s deleted file mode 100644 index 43788b28a..000000000 --- a/src/pkg/runtime/arm/cas6.s +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// bool cas(int32 *val, int32 old, int32 new) -// Atomically: -// if(*val == old){ -// *val = new; -// return 1; -// }else -// return 0; - -TEXT runtime·cas(SB),7,$0 - MOVW 0(FP), R1 // *val - MOVW 4(FP), R2 // old - MOVW 8(FP), R3 // new -l: - LDREX (R1), R0 - CMP R0, R2 - BNE fail - STREX R3, (R1), R0 - CMP $0, R0 - BNE l - MOVW $1, R0 - RET -fail: - MOVW $0, R0 - RET - diff --git a/src/pkg/runtime/arm/traceback.c b/src/pkg/runtime/arm/traceback.c index 2307e98e8..ad3096823 100644 --- a/src/pkg/runtime/arm/traceback.c +++ b/src/pkg/runtime/arm/traceback.c @@ -9,6 +9,10 @@ void runtime·deferproc(void); void runtime·newproc(void); void runtime·newstack(void); void runtime·morestack(void); +void _div(void); +void _mod(void); +void _divu(void); +void _modu(void); static int32 gentraceback(byte *pc0, byte *sp, byte *lr0, G *g, int32 skip, uintptr *pcbuf, int32 max) @@ -113,7 +117,7 @@ gentraceback(byte *pc0, byte *sp, byte *lr0, G *g, int32 skip, uintptr *pcbuf, i // Print during crash. // main+0xf /home/rsc/go/src/runtime/x.go:23 // main(0x1, 0x2, 0x3) - runtime·printf("%S", f->name); + runtime·printf("[%p] %S", fp, f->name); if(pc > f->entry) runtime·printf("+%p", (uintptr)(pc - f->entry)); tracepc = pc; // back up to CALL instruction for funcline. @@ -145,12 +149,43 @@ gentraceback(byte *pc0, byte *sp, byte *lr0, G *g, int32 skip, uintptr *pcbuf, i continue; } + if(pcbuf == nil && f->entry == (uintptr)runtime·lessstack && g == m->g0) { + runtime·printf("----- lessstack called from goroutine %d -----\n", m->curg->goid); + g = m->curg; + stk = (Stktop*)g->stackbase; + sp = stk->gobuf.sp; + pc = (uintptr)stk->gobuf.pc; + fp = nil; + lr = 0; + continue; + } + // Unwind to next frame. pc = lr; lr = 0; sp = fp; fp = nil; + + // If this was div or divu or mod or modu, the caller had + // an extra 8 bytes on its stack. Adjust sp. + if(f->entry == (uintptr)_div || f->entry == (uintptr)_divu || f->entry == (uintptr)_mod || f->entry == (uintptr)_modu) + sp += 8; + + // If this was deferproc or newproc, the caller had an extra 12. + if(f->entry == (uintptr)runtime·deferproc || f->entry == (uintptr)runtime·newproc) + sp += 12; } + + if(pcbuf == nil && (pc = g->gopc) != 0 && (f = runtime·findfunc(pc)) != nil) { + runtime·printf("----- goroutine created by -----\n%S", f->name); + if(pc > f->entry) + runtime·printf("+%p", (uintptr)(pc - f->entry)); + tracepc = pc; // back up to CALL instruction for funcline. + if(n > 0 && pc > f->entry) + tracepc -= sizeof(uintptr); + runtime·printf(" %S:%d\n", f->src, runtime·funcline(f, tracepc)); + } + return n; } |