From 722a7b78279d26b59c95f4149affa65d2cc9c9bc Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Thu, 20 Oct 2016 15:49:07 -0400 Subject: [PATCH] curve25519: fix confusing SP adjustments The curve25519 assembly routines do very non-Go-ABI SP adjustments. These would thoroughly confuse traceback if it were to fire in one of these functions (say, because of a signal). Plus, we're about to make the assembler track SP balance through more operations (which it should have done all along), and the SP alignment performed by these functions is going to make the assembler think the SP is out of balance. Fix this by eliminating the SP alignment prologue from all four assembly functions. They don't do any operations that care about SP alignment, so this is simply unnecessary. square and freeze don't even use the stack for anything other that saving what were presumably "callee save" registers in some other ABI, so for these we can eliminate the stack frame entirely. Change-Id: If9dbb2fb6800d9cd733daa91f483eb2937e95f0f Reviewed-on: https://go-review.googlesource.com/31579 Run-TryBot: Austin Clements TryBot-Result: Gobot Gobot Reviewed-by: Minux Ma Reviewed-by: Adam Langley --- curve25519/freeze_amd64.s | 25 +------------------------ curve25519/ladderstep_amd64.s | 9 +-------- curve25519/mul_amd64.s | 9 +-------- curve25519/square_amd64.s | 25 +------------------------ 4 files changed, 4 insertions(+), 64 deletions(-) diff --git a/curve25519/freeze_amd64.s b/curve25519/freeze_amd64.s index 37599fa..932800b 100644 --- a/curve25519/freeze_amd64.s +++ b/curve25519/freeze_amd64.s @@ -8,22 +8,9 @@ // +build amd64,!gccgo,!appengine // func freeze(inout *[5]uint64) -TEXT ·freeze(SB),7,$96-8 +TEXT ·freeze(SB),7,$0-8 MOVQ inout+0(FP), DI - MOVQ SP,R11 - MOVQ $31,CX - NOTQ CX - ANDQ CX,SP - ADDQ $32,SP - - MOVQ R11,0(SP) - MOVQ R12,8(SP) - MOVQ R13,16(SP) - MOVQ R14,24(SP) - MOVQ R15,32(SP) - MOVQ BX,40(SP) - MOVQ BP,48(SP) MOVQ 0(DI),SI MOVQ 8(DI),DX MOVQ 16(DI),CX @@ -81,14 +68,4 @@ REDUCELOOP: MOVQ CX,16(DI) MOVQ R8,24(DI) MOVQ R9,32(DI) - MOVQ 0(SP),R11 - MOVQ 8(SP),R12 - MOVQ 16(SP),R13 - MOVQ 24(SP),R14 - MOVQ 32(SP),R15 - MOVQ 40(SP),BX - MOVQ 48(SP),BP - MOVQ R11,SP - MOVQ DI,AX - MOVQ SI,DX RET diff --git a/curve25519/ladderstep_amd64.s b/curve25519/ladderstep_amd64.s index 3949f9c..af17c0a 100644 --- a/curve25519/ladderstep_amd64.s +++ b/curve25519/ladderstep_amd64.s @@ -8,15 +8,9 @@ // +build amd64,!gccgo,!appengine // func ladderstep(inout *[5][5]uint64) -TEXT ·ladderstep(SB),0,$384-8 +TEXT ·ladderstep(SB),0,$352-8 MOVQ inout+0(FP),DI - MOVQ SP,R11 - MOVQ $31,CX - NOTQ CX - ANDQ CX,SP - ADDQ $32,SP - MOVQ R11,0(SP) MOVQ R12,8(SP) MOVQ R13,16(SP) @@ -1392,7 +1386,6 @@ TEXT ·ladderstep(SB),0,$384-8 MOVQ 32(SP),R15 MOVQ 40(SP),BX MOVQ 48(SP),BP - MOVQ R11,SP MOVQ DI,AX MOVQ SI,DX RET diff --git a/curve25519/mul_amd64.s b/curve25519/mul_amd64.s index e48d183..bf1af83 100644 --- a/curve25519/mul_amd64.s +++ b/curve25519/mul_amd64.s @@ -8,17 +8,11 @@ // +build amd64,!gccgo,!appengine // func mul(dest, a, b *[5]uint64) -TEXT ·mul(SB),0,$128-24 +TEXT ·mul(SB),0,$80-24 MOVQ dest+0(FP), DI MOVQ a+8(FP), SI MOVQ b+16(FP), DX - MOVQ SP,R11 - MOVQ $31,CX - NOTQ CX - ANDQ CX,SP - ADDQ $32,SP - MOVQ R11,0(SP) MOVQ R12,8(SP) MOVQ R13,16(SP) @@ -185,7 +179,6 @@ TEXT ·mul(SB),0,$128-24 MOVQ 32(SP),R15 MOVQ 40(SP),BX MOVQ 48(SP),BP - MOVQ R11,SP MOVQ DI,AX MOVQ SI,DX RET diff --git a/curve25519/square_amd64.s b/curve25519/square_amd64.s index 78d1a50..3a92804 100644 --- a/curve25519/square_amd64.s +++ b/curve25519/square_amd64.s @@ -8,23 +8,10 @@ // +build amd64,!gccgo,!appengine // func square(out, in *[5]uint64) -TEXT ·square(SB),7,$96-16 +TEXT ·square(SB),7,$0-16 MOVQ out+0(FP), DI MOVQ in+8(FP), SI - MOVQ SP,R11 - MOVQ $31,CX - NOTQ CX - ANDQ CX,SP - ADDQ $32, SP - - MOVQ R11,0(SP) - MOVQ R12,8(SP) - MOVQ R13,16(SP) - MOVQ R14,24(SP) - MOVQ R15,32(SP) - MOVQ BX,40(SP) - MOVQ BP,48(SP) MOVQ 0(SI),AX MULQ 0(SI) MOVQ AX,CX @@ -140,14 +127,4 @@ TEXT ·square(SB),7,$96-16 MOVQ R9,16(DI) MOVQ AX,24(DI) MOVQ R10,32(DI) - MOVQ 0(SP),R11 - MOVQ 8(SP),R12 - MOVQ 16(SP),R13 - MOVQ 24(SP),R14 - MOVQ 32(SP),R15 - MOVQ 40(SP),BX - MOVQ 48(SP),BP - MOVQ R11,SP - MOVQ DI,AX - MOVQ SI,DX RET