diff options
| author | Rob Pike <r@golang.org> | 2008-07-12 11:30:53 -0700 |
|---|---|---|
| committer | Rob Pike <r@golang.org> | 2008-07-12 11:30:53 -0700 |
| commit | 2da9783e2b79f0c9a05087ba014bb93d03e191ea (patch) | |
| tree | 49d2daa2c96b564d67b42b864f3364000eafd9d0 /src/runtime/rt0_amd64.s | |
| parent | 5a81d1f29fad531a639379f78d0049638449b603 (diff) | |
| download | go-2da9783e2b79f0c9a05087ba014bb93d03e191ea.tar.xz | |
preserve AX across stack jump so C routines return correct value when triggering morestack.
SVN=126935
Diffstat (limited to 'src/runtime/rt0_amd64.s')
| -rw-r--r-- | src/runtime/rt0_amd64.s | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/src/runtime/rt0_amd64.s b/src/runtime/rt0_amd64.s index d6dba02864..71b1fd8f30 100644 --- a/src/runtime/rt0_amd64.s +++ b/src/runtime/rt0_amd64.s @@ -72,6 +72,25 @@ TEXT gosave(SB), 7, $0 MOVL $0, AX // return 0 RET +/* + * support for morestack + */ + +// return point when leaving new stack. save AX, jmp to oldstack to switch back +TEXT retfromnewstack(SB), 7, $0 + MOVQ AX, 16(R14) // save AX in m->cret + MOVQ $oldstack(SB), AX + JMP AX + +// gogo, returning 2nd arg instead of 1 +TEXT gogoret(SB), 7, $0 + MOVQ 16(SP), AX // return 2nd arg + MOVQ 8(SP), BX // gobuf + MOVQ 0(BX), SP // restore SP + MOVQ 8(BX), BX + MOVQ BX, 0(SP) // put PC on the stack + RET + TEXT setspgoto(SB), 7, $0 MOVQ 8(SP), AX // SP MOVQ 16(SP), BX // fn to call |
