// 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
MOVQ p+0(FP), AX
MOVQ (AX), R10
MOVQ (AX), R11
MOVQ (AX), R12
MOVQ (AX), R13
MOVOU (AX), X1
MOVOU (AX), X2
MOVOU (AX), X3
MOVOU (AX), X4
CMPB internal∕cpu·X86+const_offsetX86HasAVX(SB), $1
JNE return
VMOVDQU (AX), Y5
VMOVDQU (AX), Y6
VMOVDQU (AX), Y7
VMOVDQU (AX), Y8
CMPB internal∕cpu·X86+const_offsetX86HasAVX512(SB), $1
JNE return
VMOVUPD (AX), Z14
VMOVUPD (AX), Z15
VMOVUPD (AX), Z16
VMOVUPD (AX), Z17
KMOVQ (AX), K2
KMOVQ (AX), K3
KMOVQ (AX), K4
KMOVQ (AX), K5
return:
RET
TEXT ·spillRegisters(SB),0,$0-16
MOVQ p+0(FP), AX
MOVQ AX, BX
MOVQ R10, (AX)
MOVQ R11, 8(AX)
MOVQ R12, 16(AX)
MOVQ R13, 24(AX)
ADDQ $32, AX
MOVOU X1, (AX)
MOVOU X2, 16(AX)
MOVOU X3, 32(AX)
MOVOU X4, 48(AX)
ADDQ $64, AX
CMPB internal∕cpu·X86+const_offsetX86HasAVX(SB), $1
JNE return
VMOVDQU Y5, (AX)
VMOVDQU Y6, 32(AX)
VMOVDQU Y7, 64(AX)
VMOVDQU Y8, 96(AX)
ADDQ $128, AX
CMPB internal∕cpu·X86+const_offsetX86HasAVX512(SB), $1
JNE return
VMOVUPD Z14, (AX)
ADDQ $64, AX
VMOVUPD Z15, (AX)
ADDQ $64, AX
VMOVUPD Z16, (AX)
ADDQ $64, AX
VMOVUPD Z17, (AX)
ADDQ $64, AX
KMOVQ K2, (AX)
ADDQ $8, AX
KMOVQ K3, (AX)
ADDQ $8, AX
KMOVQ K4, (AX)
ADDQ $8, AX
KMOVQ K5, (AX)
ADDQ $8, AX
return:
SUBQ BX, AX
MOVQ AX, ret+8(FP)
RET
TEXT ·useSecret(SB),0,$64-24
NO_LOCAL_POINTERS
// Load secret into AX
MOVQ secret_base+0(FP), AX
MOVQ (AX), AX
// Scatter secret all across registers.
// Increment low byte so we can tell which register
// a leaking secret came from.
ADDQ $2, AX // add 2 so Rn has secret #n.
MOVQ AX, BX
INCQ AX
MOVQ AX, CX
INCQ AX
MOVQ AX, DX
INCQ AX
MOVQ AX, SI
INCQ AX
MOVQ AX, DI
INCQ AX
MOVQ AX, BP
INCQ AX
MOVQ AX, R8
INCQ AX
MOVQ AX, R9
INCQ AX
MOVQ AX, R10
INCQ AX
MOVQ AX, R11
INCQ AX
MOVQ AX, R12
INCQ AX
MOVQ AX, R13
INCQ AX
MOVQ AX, R14
INCQ AX
MOVQ AX, R15
CMPB internal∕cpu·X86+const_offsetX86HasAVX512(SB), $1
JNE noavx512
VMOVUPD (SP), Z0
VMOVUPD (SP), Z1
VMOVUPD (SP), Z2
VMOVUPD (SP), Z3
VMOVUPD (SP), Z4
VMOVUPD (SP), Z5
VMOVUPD (SP), Z6
VMOVUPD (SP), Z7
VMOVUPD (SP), Z8
VMOVUPD (SP), Z9
VMOVUPD (SP), Z10
VMOVUPD (SP), Z11
VMOVUPD (SP), Z12
VMOVUPD (SP), Z13
VMOVUPD (SP), Z14
VMOVUPD (SP), Z15
VMOVUPD (SP), Z16
VMOVUPD (SP), Z17
VMOVUPD (SP), Z18
VMOVUPD (SP), Z19
VMOVUPD (SP), Z20
VMOVUPD (SP), Z21
VMOVUPD (SP), Z22
VMOVUPD (SP), Z23
VMOVUPD (SP), Z24
VMOVUPD (SP), Z25
VMOVUPD (SP), Z26
VMOVUPD (SP), Z27
VMOVUPD (SP), Z28
VMOVUPD (SP), Z29
VMOVUPD (SP), Z30
VMOVUPD (SP), Z31
noavx512:
MOVOU (SP), X0
MOVOU (SP), X1
MOVOU (SP), X2
MOVOU (SP), X3
MOVOU (SP), X4
MOVOU (SP), X5
MOVOU (SP), X6
MOVOU (SP), X7
MOVOU (SP), X8
MOVOU (SP), X9
MOVOU (SP), X10
MOVOU (SP), X11
MOVOU (SP), X12
MOVOU (SP), X13
MOVOU (SP), X14
MOVOU (SP), X15
// Put secret on the stack.
INCQ AX
MOVQ AX, (SP)
MOVQ AX, 8(SP)
MOVQ AX, 16(SP)
MOVQ AX, 24(SP)
MOVQ AX, 32(SP)
MOVQ AX, 40(SP)
MOVQ AX, 48(SP)
MOVQ AX, 56(SP)
// Delay a bit. This makes it more likely that
// we will be the target of a signal while
// registers contain secrets.
// It also tests the path from G stack to M stack
// to scheduler and back.
CALL runtime∕secret·delay(SB)
RET
 |
The pages are generated with Golds v0.8.3-preview. (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu.
PR and bug reports are welcome and can be submitted to the issue list.
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds. |