]> Cypherpunks repositories - gostls13.git/commitdiff
Add Gobuf.r0 that stores arg0 or return value of
authorKai Backman <kaib@golang.org>
Thu, 25 Jun 2009 18:26:10 +0000 (11:26 -0700)
committerKai Backman <kaib@golang.org>
Thu, 25 Jun 2009 18:26:10 +0000 (11:26 -0700)
goroutine. arm only.

R=rsc
APPROVED=rsc
DELTA=5  (3 added, 2 deleted, 0 changed)
OCL=30644
CL=30746

src/pkg/runtime/arm/asm.s
src/pkg/runtime/runtime.h

index 39ac99ec6740a2856fedd75956ba838affbf34fc..f709ebbd88c28c675bee25210da095f23db5ead7 100644 (file)
@@ -111,7 +111,6 @@ TEXT        gogo(SB), 7, $0
 // void gogocall(Gobuf*, void (*fn)(void))
 // restore state from Gobuf but then call fn.
 // (call fn, returning to state in Gobuf)
-// TODO(kaib): add R0 to gobuf so it can be restored properly
 // using frame size $-4 means do not save LR on stack.
 TEXT gogocall(SB), 7, $-4
        MOVW    8(SP), R1               // fn
@@ -119,6 +118,7 @@ TEXT gogocall(SB), 7, $-4
        MOVW    0(g), R2                // make sure g != nil
        MOVW    gobuf_sp(R0), SP        // restore SP
        MOVW    gobuf_pc(R0), LR
+       MOVW    gobuf_r0(R0), R0
        MOVW    R1, PC
 
 /*
@@ -146,6 +146,7 @@ TEXT sys·morestack(SB),7,$-4
        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    g, (m_morebuf+gobuf_g)(m)
+       MOVW    R0, (m_morebuf+gobuf_r0)(m)
 
        // Set m->morepc to f's PC.
        MOVW    LR, m_morepc(m)
@@ -172,7 +173,6 @@ TEXT sys·lessstack(SB), 7, $-4
 // R3 is LR for f (f's caller's PC)
 // using frame size $-4 means do not save LR on stack.
 TEXT sys·morestackx(SB), 7, $-4
-       MOVW    R0, 0(FP)       // Save arg0
        MOVW    $0, R1          // set frame size
        B       sys·morestack(SB)
 
index 662fde75931db76eebbf75e54ca602d0305a5c6a..d7bf807cc518702a930f4b70fb36df9a44b32ede 100644 (file)
@@ -138,6 +138,7 @@ struct      Gobuf
        byte*   sp;
        byte*   pc;
        G*      g;
+       uintptr r0;             // used on arm
 };
 struct G
 {