| // 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. |
| |
| #include "go_asm.h" |
| #include "textflag.h" |
| #include "funcdata.h" |
| |
| // TODO(dmo): generate these with mkpreempt.go, the register sets |
| // are tightly coupled and this will ensure that we keep them |
| // all synchronized |
| |
| // secretEraseRegisters erases any register that may |
| // have been used with user code within a secret.Do function. |
| // This is roughly the general purpose and floating point |
| // registers, barring any reserved registers and registers generally |
| // considered architectural (amd64 segment registers, arm64 exception registers) |
| TEXT ·secretEraseRegisters(SB),NOFRAME|NOSPLIT,$0-0 |
| XORL AX, AX |
| JMP ·secretEraseRegistersMcall(SB) |
| |
| // Mcall requires an argument in AX. This function |
| // excludes that register from being cleared |
| TEXT ·secretEraseRegistersMcall(SB),NOSPLIT|NOFRAME,$0-0 |
| // integer registers |
| XORL BX, BX |
| XORL CX, CX |
| XORL DX, DX |
| XORL DI, DI |
| XORL SI, SI |
| // BP = frame pointer |
| // SP = stack pointer |
| XORL R8, R8 |
| XORL R9, R9 |
| XORL R10, R10 |
| XORL R11, R11 |
| XORL R12, R12 |
| XORL R13, R13 |
| // R14 = G register |
| XORL R15, R15 |
| |
| // floating-point registers |
| CMPB internal∕cpu·X86+const_offsetX86HasAVX(SB), $1 |
| JEQ avx |
| |
| PXOR X0, X0 |
| PXOR X1, X1 |
| PXOR X2, X2 |
| PXOR X3, X3 |
| PXOR X4, X4 |
| PXOR X5, X5 |
| PXOR X6, X6 |
| PXOR X7, X7 |
| PXOR X8, X8 |
| PXOR X9, X9 |
| PXOR X10, X10 |
| PXOR X11, X11 |
| PXOR X12, X12 |
| PXOR X13, X13 |
| PXOR X14, X14 |
| PXOR X15, X15 |
| JMP noavx512 |
| |
| avx: |
| // VZEROALL zeroes all of the X0-X15 registers, no matter how wide. |
| // That includes Y0-Y15 (256-bit avx) and Z0-Z15 (512-bit avx512). |
| VZEROALL |
| |
| // Clear all the avx512 state. |
| CMPB internal∕cpu·X86+const_offsetX86HasAVX512(SB), $1 |
| JNE noavx512 |
| |
| // Zero X16-X31 |
| // Note that VZEROALL above already cleared Z0-Z15. |
| VMOVAPD Z0, Z16 |
| VMOVAPD Z0, Z17 |
| VMOVAPD Z0, Z18 |
| VMOVAPD Z0, Z19 |
| VMOVAPD Z0, Z20 |
| VMOVAPD Z0, Z21 |
| VMOVAPD Z0, Z22 |
| VMOVAPD Z0, Z23 |
| VMOVAPD Z0, Z24 |
| VMOVAPD Z0, Z25 |
| VMOVAPD Z0, Z26 |
| VMOVAPD Z0, Z27 |
| VMOVAPD Z0, Z28 |
| VMOVAPD Z0, Z29 |
| VMOVAPD Z0, Z30 |
| VMOVAPD Z0, Z31 |
| |
| // Zero k0-k7 |
| KXORQ K0, K0, K0 |
| KXORQ K0, K0, K1 |
| KXORQ K0, K0, K2 |
| KXORQ K0, K0, K3 |
| KXORQ K0, K0, K4 |
| KXORQ K0, K0, K5 |
| KXORQ K0, K0, K6 |
| KXORQ K0, K0, K7 |
| |
| noavx512: |
| // misc registers |
| CMPL BX, BX //eflags |
| // segment registers? Direction flag? Both seem overkill. |
| |
| RET |