blob: 06103d1c0f9b927248585ee16b8219ad553c6635 [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.
#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