blob: 6fa625adf6fba4d0c82821bc6237deebe954681c [file] [log] [blame] [edit]
// 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