Text file
src/runtime/secret_amd64.s
1 // Copyright 2024 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
4
5 #include "go_asm.h"
6 #include "textflag.h"
7 #include "funcdata.h"
8
9 // TODO(dmo): generate these with mkpreempt.go, the register sets
10 // are tightly coupled and this will ensure that we keep them
11 // all synchronized
12
13 // secretEraseRegisters erases any register that may
14 // have been used with user code within a secret.Do function.
15 // This is roughly the general purpose and floating point
16 // registers, barring any reserved registers and registers generally
17 // considered architectural (amd64 segment registers, arm64 exception registers)
18 TEXT ·secretEraseRegisters(SB),NOFRAME|NOSPLIT,$0-0
19 XORL AX, AX
20 JMP ·secretEraseRegistersMcall(SB)
21
22 // Mcall requires an argument in AX. This function
23 // excludes that register from being cleared
24 TEXT ·secretEraseRegistersMcall(SB),NOSPLIT|NOFRAME,$0-0
25 // integer registers
26 XORL BX, BX
27 XORL CX, CX
28 XORL DX, DX
29 XORL DI, DI
30 XORL SI, SI
31 // BP = frame pointer
32 // SP = stack pointer
33 XORL R8, R8
34 XORL R9, R9
35 XORL R10, R10
36 XORL R11, R11
37 XORL R12, R12
38 XORL R13, R13
39 // R14 = G register
40 XORL R15, R15
41
42 // floating-point registers
43 CMPB internal∕cpu·X86+const_offsetX86HasAVX(SB), $1
44 JEQ avx
45
46 PXOR X0, X0
47 PXOR X1, X1
48 PXOR X2, X2
49 PXOR X3, X3
50 PXOR X4, X4
51 PXOR X5, X5
52 PXOR X6, X6
53 PXOR X7, X7
54 PXOR X8, X8
55 PXOR X9, X9
56 PXOR X10, X10
57 PXOR X11, X11
58 PXOR X12, X12
59 PXOR X13, X13
60 PXOR X14, X14
61 PXOR X15, X15
62 JMP noavx512
63
64 avx:
65 // VZEROALL zeroes all of the X0-X15 registers, no matter how wide.
66 // That includes Y0-Y15 (256-bit avx) and Z0-Z15 (512-bit avx512).
67 VZEROALL
68
69 // Clear all the avx512 state.
70 CMPB internal∕cpu·X86+const_offsetX86HasAVX512(SB), $1
71 JNE noavx512
72
73 // Zero X16-X31
74 // Note that VZEROALL above already cleared Z0-Z15.
75 VMOVAPD Z0, Z16
76 VMOVAPD Z0, Z17
77 VMOVAPD Z0, Z18
78 VMOVAPD Z0, Z19
79 VMOVAPD Z0, Z20
80 VMOVAPD Z0, Z21
81 VMOVAPD Z0, Z22
82 VMOVAPD Z0, Z23
83 VMOVAPD Z0, Z24
84 VMOVAPD Z0, Z25
85 VMOVAPD Z0, Z26
86 VMOVAPD Z0, Z27
87 VMOVAPD Z0, Z28
88 VMOVAPD Z0, Z29
89 VMOVAPD Z0, Z30
90 VMOVAPD Z0, Z31
91
92 // Zero k0-k7
93 KXORQ K0, K0, K0
94 KXORQ K0, K0, K1
95 KXORQ K0, K0, K2
96 KXORQ K0, K0, K3
97 KXORQ K0, K0, K4
98 KXORQ K0, K0, K5
99 KXORQ K0, K0, K6
100 KXORQ K0, K0, K7
101
102 noavx512:
103 // misc registers
104 CMPL BX, BX //eflags
105 // segment registers? Direction flag? Both seem overkill.
106
107 RET
108
View as plain text