diff options
Diffstat (limited to 'src/pkg/runtime/arm/asm.s')
-rw-r--r-- | src/pkg/runtime/arm/asm.s | 112 |
1 files changed, 60 insertions, 52 deletions
diff --git a/src/pkg/runtime/arm/asm.s b/src/pkg/runtime/arm/asm.s index 1144ff2a1..44c47bad1 100644 --- a/src/pkg/runtime/arm/asm.s +++ b/src/pkg/runtime/arm/asm.s @@ -6,7 +6,7 @@ // using frame size $-4 means do not save LR on stack. TEXT _rt0_arm(SB),7,$-4 - MOVW $setR12(SB), R12 + MOVW $0xcafebabe, R12 // copy arguments forward on an even stack // use R13 instead of SP to avoid linker rewriting the offsets @@ -19,8 +19,8 @@ TEXT _rt0_arm(SB),7,$-4 // set up m and g registers // g is R10, m is R9 - MOVW $g0(SB), g - MOVW $m0(SB), m + MOVW $runtime·g0(SB), g + MOVW $runtime·m0(SB), m // save m->g0 = g0 MOVW g, m_g0(m) @@ -29,45 +29,47 @@ TEXT _rt0_arm(SB),7,$-4 MOVW $(-8192+104)(R13), R0 MOVW R0, g_stackguard(g) // (w 104b guard) MOVW R13, g_stackbase(g) - BL emptyfunc(SB) // fault if stack check is wrong + BL runtime·emptyfunc(SB) // fault if stack check is wrong - BL check(SB) + BL runtime·check(SB) // saved argc, argv MOVW 120(R13), R0 MOVW R0, 4(R13) MOVW 124(R13), R1 MOVW R1, 8(R13) - BL args(SB) - BL osinit(SB) - BL schedinit(SB) + BL runtime·args(SB) + BL runtime·osinit(SB) + BL runtime·schedinit(SB) // create a new goroutine to start program - MOVW $mainstart(SB), R0 + MOVW $runtime·mainstart(SB), R0 MOVW.W R0, -4(R13) MOVW $8, R0 MOVW.W R0, -4(R13) MOVW $0, R0 MOVW.W R0, -4(R13) // push $0 as guard - BL ·newproc(SB) + BL runtime·newproc(SB) MOVW $12(R13), R13 // pop args and LR // start this M - BL mstart(SB) + BL runtime·mstart(SB) MOVW $1234, R0 MOVW $1000, R1 MOVW R0, (R1) // fail hard - B _dep_dummy(SB) // Never reached + B runtime·_dep_dummy(SB) // Never reached -TEXT mainstart(SB),7,$4 +TEXT runtime·mainstart(SB),7,$4 BL main·init(SB) - BL initdone(SB) + BL runtime·initdone(SB) + EOR R0, R0 + MOVW R0, 0(R13) BL main·main(SB) MOVW $0, R0 MOVW R0, 4(SP) - BL exit(SB) + BL runtime·exit(SB) MOVW $1234, R0 MOVW $1001, R1 MOVW R0, (R1) // fail hard @@ -75,7 +77,7 @@ TEXT mainstart(SB),7,$4 // TODO(kaib): remove these once i actually understand how the linker removes symbols // pull in dummy dependencies -TEXT _dep_dummy(SB),7,$0 +TEXT runtime·_dep_dummy(SB),7,$0 BL _div(SB) BL _divu(SB) BL _mod(SB) @@ -83,8 +85,8 @@ TEXT _dep_dummy(SB),7,$0 BL _modu(SB) BL _sfloat(SB) -TEXT breakpoint(SB),7,$0 - BL abort(SB) +TEXT runtime·breakpoint(SB),7,$0 + // no breakpoint yet; let program exit RET /* @@ -93,8 +95,8 @@ TEXT breakpoint(SB),7,$0 // uintptr gosave(Gobuf*) // save state in Gobuf; setjmp -TEXT gosave(SB), 7, $-4 - MOVW 0(FP), R0 +TEXT runtime·gosave(SB), 7, $-4 + MOVW 0(FP), R0 // gobuf MOVW SP, gobuf_sp(R0) MOVW LR, gobuf_pc(R0) MOVW g, gobuf_g(R0) @@ -103,8 +105,8 @@ TEXT gosave(SB), 7, $-4 // void gogo(Gobuf*, uintptr) // restore state from Gobuf; longjmp -TEXT gogo(SB), 7, $-4 - MOVW 0(FP), R1 // gobuf +TEXT runtime·gogo(SB), 7, $-4 + MOVW 0(FP), R1 // gobuf MOVW 4(FP), R0 // return 2nd arg MOVW gobuf_g(R1), g MOVW 0(g), R2 // make sure g != nil @@ -115,11 +117,12 @@ TEXT gogo(SB), 7, $-4 // restore state from Gobuf but then call fn. // (call fn, returning to state in Gobuf) // using frame size $-4 means do not save LR on stack. -TEXT gogocall(SB), 7, $-4 - MOVW 0(FP), R0 +TEXT runtime·gogocall(SB), 7, $-4 + MOVW 0(FP), R0 // gobuf MOVW 4(FP), R1 // fn + MOVW 8(FP), R2 // fp offset MOVW gobuf_g(R0), g - MOVW 0(g), R2 // make sure g != nil + MOVW 0(g), R3 // make sure g != nil MOVW gobuf_sp(R0), SP // restore SP MOVW gobuf_pc(R0), LR MOVW R1, PC @@ -135,12 +138,11 @@ TEXT gogocall(SB), 7, $-4 // NB. we do not save R0 because we've forced 5c to pass all arguments // on the stack. // using frame size $-4 means do not save LR on stack. -TEXT ·morestack(SB),7,$-4 +TEXT runtime·morestack(SB),7,$-4 // Cannot grow scheduler stack (m->g0). MOVW m_g0(m), R4 CMP g, R4 - BNE 2(PC) - BL abort(SB) + BL.EQ runtime·abort(SB) // Save in m. MOVW R1, m_moreframe(m) @@ -148,9 +150,9 @@ TEXT ·morestack(SB),7,$-4 // Called from f. // Set m->morebuf to f's caller. - MOVW R3, (m_morebuf+gobuf_pc)(m) // f's caller's PC - MOVW SP, (m_morebuf+gobuf_sp)(m) // f's caller's SP - MOVW SP, m_morefp(m) // f's caller's SP + MOVW R3, (m_morebuf+gobuf_pc)(m) // f's caller's PC + MOVW SP, (m_morebuf+gobuf_sp)(m) // f's caller's SP + MOVW SP, m_morefp(m) // f's caller's SP MOVW g, (m_morebuf+gobuf_g)(m) // Set m->morepc to f's PC. @@ -159,7 +161,7 @@ TEXT ·morestack(SB),7,$-4 // Call newstack on m's scheduling stack. MOVW m_g0(m), g MOVW (m_sched+gobuf_sp)(m), SP - B newstack(SB) + B runtime·newstack(SB) // Called from reflection library. Mimics morestack, // reuses stack growth code to create a frame @@ -179,45 +181,48 @@ TEXT reflect·call(SB), 7, $-4 // If it turns out that f needs a larger frame than // the default stack, f's usual stack growth prolog will // allocate a new segment (and recopy the arguments). - MOVW 4(SP), R0 // fn - MOVW 8(SP), R1 // arg frame - MOVW 12(SP), R2 // arg size + MOVW 4(SP), R0 // fn + MOVW 8(SP), R1 // arg frame + MOVW 12(SP), R2 // arg size - MOVW R0, m_morepc(m) // f's PC - MOVW R1, m_morefp(m) // argument frame pointer - MOVW R2, m_moreargs(m) // f's argument size + SUB $4,R1 // add the saved LR to the frame + ADD $4,R2 + + MOVW R0, m_morepc(m) // f's PC + MOVW R1, m_morefp(m) // argument frame pointer + MOVW R2, m_moreargs(m) // f's argument size MOVW $1, R3 - MOVW R3, m_moreframe(m) // f's frame size + MOVW R3, m_moreframe(m) // f's frame size // Call newstack on m's scheduling stack. MOVW m_g0(m), g MOVW (m_sched+gobuf_sp)(m), SP - B newstack(SB) + B runtime·newstack(SB) // Return point when leaving stack. // using frame size $-4 means do not save LR on stack. -TEXT ·lessstack(SB), 7, $-4 +TEXT runtime·lessstack(SB), 7, $-4 // Save return value in m->cret MOVW R0, m_cret(m) // Call oldstack on m's scheduling stack. MOVW m_g0(m), g MOVW (m_sched+gobuf_sp)(m), SP - B oldstack(SB) + B runtime·oldstack(SB) // void jmpdefer(fn, sp); // called from deferreturn. // 1. grab stored LR for caller // 2. sub 4 bytes to get back to BL deferreturn // 3. B to fn -TEXT jmpdefer(SB), 7, $0 +TEXT runtime·jmpdefer(SB), 7, $0 MOVW 0(SP), LR MOVW $-4(LR), LR // BL deferreturn MOVW 4(SP), R0 // fn MOVW 8(SP), SP B (R0) -TEXT ·memclr(SB),7,$20 +TEXT runtime·memclr(SB),7,$20 MOVW 0(FP), R0 MOVW $0, R1 // c = 0 MOVW R1, -16(SP) @@ -225,21 +230,21 @@ TEXT ·memclr(SB),7,$20 MOVW R1, -12(SP) MOVW m, -8(SP) // Save m and g MOVW g, -4(SP) - BL memset(SB) + BL runtime·memset(SB) MOVW -8(SP), m // Restore m and g, memset clobbers them MOVW -4(SP), g RET -TEXT ·getcallerpc+0(SB),7,$-4 +TEXT runtime·getcallerpc(SB),7,$-4 MOVW 0(SP), R0 RET -TEXT ·setcallerpc+0(SB),7,$-4 +TEXT runtime·setcallerpc(SB),7,$-4 MOVW x+4(FP), R0 MOVW R0, 0(SP) RET -TEXT getcallersp(SB),7,$-4 +TEXT runtime·getcallersp(SB),7,$-4 MOVW 0(FP), R0 MOVW $-4(R0), R0 RET @@ -248,8 +253,8 @@ TEXT getcallersp(SB),7,$-4 // Just call fn(arg), but first align the stack // appropriately for the gcc ABI. // TODO(kaib): figure out the arm-gcc ABI -TEXT runcgo(SB),7,$16 - BL abort(SB) +TEXT runtime·runcgo(SB),7,$16 + BL runtime·abort(SB) // MOVL fn+0(FP), AX // MOVL arg+4(FP), BX // MOVL SP, CX @@ -260,10 +265,13 @@ TEXT runcgo(SB),7,$16 // MOVL 4(SP), SP // RET -TEXT emptyfunc(SB),0,$0 +TEXT runtime·emptyfunc(SB),0,$0 RET -TEXT abort(SB),7,$-4 +TEXT runtime·abort(SB),7,$-4 MOVW $0, R0 MOVW (R0), R1 +TEXT runtime·runcgocallback(SB),7,$0 + MOVW $0, R0 + MOVW (R0), R1 |