diff --git a/asm_386.s b/asm_386.s index 53da8e3..3c5c34c 100644 --- a/asm_386.s +++ b/asm_386.s @@ -25,10 +25,9 @@ TEXT ·raise(SB),NOSPLIT|NOFRAME,$0 MOVB $1, ret+4(FP) RET -// returns stack-top -TEXT ·getbp(SB),NOSPLIT|NOFRAME,$0 +TEXT ·stkhi(SB),NOSPLIT|NOFRAME,$0 NO_LOCAL_POINTERS MOVL (TLS), DI MOVL (g_stack+stack_hi)(DI), AX // g.stack.hi -> AX - MOVL AX, ret+4(FP) + MOVL AX, ret+0(FP) RET diff --git a/asm_amd64.s b/asm_amd64.s index 699c391..9cf936c 100644 --- a/asm_amd64.s +++ b/asm_amd64.s @@ -10,7 +10,7 @@ TEXT ·waserror(SB),NOSPLIT|NOFRAME,$0 MOVQ DX, Checkpoint_ctxt(DI) MOVQ (SP), AX MOVQ AX, Checkpoint_pc(DI) - MOVQ (BP), AX + MOVQ (g_stack+stack_hi)(R14), AX // g.stack.hi -> AX MOVQ AX, Checkpoint_probe(DI) MOVB $0, ret+8(FP) RET @@ -26,16 +26,8 @@ TEXT ·raise(SB),NOSPLIT|NOFRAME,$0 MOVB $1, ret+8(FP) RET -TEXT ·getbp(SB),NOSPLIT|NOFRAME,$0 +TEXT ·stkhi(SB),NOSPLIT|NOFRAME,$0 NO_LOCAL_POINTERS - MOVQ skip+0(FP), DI - MOVQ BP, AX -loop: - CMPQ DI, $0 - JBE end - MOVQ (AX), AX - DECQ DI - JMP loop -end: - MOVQ AX, ret+8(FP) + MOVQ (g_stack+stack_hi)(R14), AX // g.stack.hi -> AX + MOVQ AX, ret+0(FP) RET diff --git a/asm_arm64.s b/asm_arm64.s index cc30a2d..4c2f233 100644 --- a/asm_arm64.s +++ b/asm_arm64.s @@ -10,7 +10,7 @@ TEXT ·waserror(SB),NOSPLIT|NOFRAME,$0 MOVD R29, Checkpoint_bp(R2) MOVD R26, Checkpoint_ctxt(R2) MOVD LR, Checkpoint_pc(R2) - MOVD (R29), R0 + MOVD (g_stack+stack_hi)(g), R0 // g.stack.hi -> R0 MOVD R0, Checkpoint_probe(R2) MOVD $0, R0 MOVD R0, ret+8(FP) @@ -28,16 +28,8 @@ TEXT ·raise(SB),NOSPLIT|NOFRAME,$0 MOVD R0, ret+8(FP) RET -TEXT ·getbp(SB),NOSPLIT|NOFRAME,$0 +TEXT ·stkhi(SB),NOSPLIT|NOFRAME,$0 NO_LOCAL_POINTERS - MOVD skip+0(FP), R2 - MOVD R29, R0 -loop: - CMP $0, R2 // 0 > R2 - BLE end - MOVD (R0), R0 - SUB $1, R2, R2 - JMP loop -end: - MOVD R0, ret+8(FP) + MOVD (g_stack+stack_hi)(g), R0 // g.stack.hi -> R0 + MOVD R0, ret+0(FP) RET diff --git a/try.go b/try.go index d24ef2f..10909c0 100644 --- a/try.go +++ b/try.go @@ -57,7 +57,7 @@ func WithIgnore(errs ...error) Option { func waserror(cp *Checkpoint) bool func raise(cp *Checkpoint) bool -func getbp(skip int) uintptr +func stkhi() uintptr // Handle creates a fallback point. func Handle() (*Checkpoint, error) { @@ -80,8 +80,8 @@ func (cp *Checkpoint) raise(skip int, err error) { } cp.err = err - bp := getbp(skip + 1) - d := bp - cp.probe + hi := stkhi() + d := hi - cp.probe cp.probe += d cp.sp += d cp.bp += d diff --git a/try_test.go b/try_test.go index c1817d2..83a306a 100644 --- a/try_test.go +++ b/try_test.go @@ -10,16 +10,16 @@ import ( ) func TestBP(t *testing.T) { - bp0 := getbp(1) - bp1 := wrap(2) - if bp0 != bp1 { - t.Errorf("bp0 = 0x%x; bp1 = 0x%x\n", bp0, bp1) + p1 := stkhi() + p2 := wrapstkhi() + if p1 != p2 { + t.Errorf("p1 = 0x%x; p2 = 0x%x\n", p1, p2) } } //go:noinline -func wrap(skip int) uintptr { - return getbp(skip) +func wrapstkhi() uintptr { + return stkhi() } func TestHandle(t *testing.T) {