| // Copyright 2024 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| //go:build goexperiment.runtimesecret |
| |
| // Note: this assembly file is used for testing only. |
| // We need to access registers directly to properly test |
| // that secrets are erased and go test doesn't like to conditionally |
| // include assembly files. |
| // These functions defined in the package proper and we |
| // rely on the linker to prune these away in regular builds |
| |
| #include "go_asm.h" |
| #include "funcdata.h" |
| |
| TEXT ·loadRegisters(SB),0,$0-8 |
| MOVD p+0(FP), R0 |
| |
| MOVD (R0), R10 |
| MOVD (R0), R11 |
| MOVD (R0), R12 |
| MOVD (R0), R13 |
| |
| FMOVD (R0), F15 |
| FMOVD (R0), F16 |
| FMOVD (R0), F17 |
| FMOVD (R0), F18 |
| |
| VLD1 (R0), [V20.B16] |
| VLD1 (R0), [V21.H8] |
| VLD1 (R0), [V22.S4] |
| VLD1 (R0), [V23.D2] |
| |
| RET |
| |
| TEXT ·spillRegisters(SB),0,$0-16 |
| MOVD p+0(FP), R0 |
| MOVD R0, R1 |
| |
| MOVD R10, (R0) |
| MOVD R11, 8(R0) |
| MOVD R12, 16(R0) |
| MOVD R13, 24(R0) |
| ADD $32, R0 |
| |
| FMOVD F15, (R0) |
| FMOVD F16, 16(R0) |
| FMOVD F17, 32(R0) |
| FMOVD F18, 64(R0) |
| ADD $64, R0 |
| |
| VST1.P [V20.B16], (R0) |
| VST1.P [V21.H8], (R0) |
| VST1.P [V22.S4], (R0) |
| VST1.P [V23.D2], (R0) |
| |
| SUB R1, R0, R0 |
| MOVD R0, ret+8(FP) |
| RET |
| |
| TEXT ·useSecret(SB),0,$0-24 |
| NO_LOCAL_POINTERS |
| |
| // Load secret into R0 |
| MOVD secret_base+0(FP), R0 |
| MOVD (R0), R0 |
| // Scatter secret across registers. |
| // Increment low byte so we can tell which register |
| // a leaking secret came from. |
| |
| // TODO(dmo): more substantial dirtying here |
| ADD $1, R0 |
| MOVD R0, R1 |
| ADD $1, R0 |
| MOVD R0, R2 |
| ADD $1, R0 |
| MOVD R0, R3 |
| ADD $1, R0 |
| MOVD R0, R4 |
| ADD $1, R0 |
| MOVD R0, R5 |
| ADD $1, R0 |
| MOVD R0, R6 |
| ADD $1, R0 |
| MOVD R0, R7 |
| ADD $1, R0 |
| MOVD R0, R8 |
| ADD $1, R0 |
| MOVD R0, R9 |
| ADD $1, R0 |
| MOVD R0, R10 |
| ADD $1, R0 |
| MOVD R0, R11 |
| ADD $1, R0 |
| MOVD R0, R12 |
| ADD $1, R0 |
| MOVD R0, R13 |
| ADD $1, R0 |
| MOVD R0, R14 |
| ADD $1, R0 |
| MOVD R0, R15 |
| |
| // Dirty the floating point registers |
| ADD $1, R0 |
| FMOVD R0, F0 |
| ADD $1, R0 |
| FMOVD R0, F1 |
| ADD $1, R0 |
| FMOVD R0, F2 |
| ADD $1, R0 |
| FMOVD R0, F3 |
| ADD $1, R0 |
| FMOVD R0, F4 |
| ADD $1, R0 |
| FMOVD R0, F5 |
| ADD $1, R0 |
| FMOVD R0, F6 |
| ADD $1, R0 |
| FMOVD R0, F7 |
| ADD $1, R0 |
| FMOVD R0, F8 |
| ADD $1, R0 |
| FMOVD R0, F9 |
| ADD $1, R0 |
| FMOVD R0, F10 |
| ADD $1, R0 |
| FMOVD R0, F11 |
| ADD $1, R0 |
| FMOVD R0, F12 |
| ADD $1, R0 |
| FMOVD R0, F13 |
| ADD $1, R0 |
| FMOVD R0, F14 |
| ADD $1, R0 |
| FMOVD R0, F15 |
| ADD $1, R0 |
| FMOVD R0, F16 |
| ADD $1, R0 |
| FMOVD R0, F17 |
| ADD $1, R0 |
| FMOVD R0, F18 |
| ADD $1, R0 |
| FMOVD R0, F19 |
| ADD $1, R0 |
| FMOVD R0, F20 |
| ADD $1, R0 |
| FMOVD R0, F21 |
| ADD $1, R0 |
| FMOVD R0, F22 |
| ADD $1, R0 |
| FMOVD R0, F23 |
| ADD $1, R0 |
| FMOVD R0, F24 |
| ADD $1, R0 |
| FMOVD R0, F25 |
| ADD $1, R0 |
| FMOVD R0, F26 |
| ADD $1, R0 |
| FMOVD R0, F27 |
| ADD $1, R0 |
| FMOVD R0, F28 |
| ADD $1, R0 |
| FMOVD R0, F29 |
| ADD $1, R0 |
| FMOVD R0, F30 |
| ADD $1, R0 |
| FMOVD R0, F31 |
| RET |