1841533ddSMadhukar Pappireddy /* 2841533ddSMadhukar Pappireddy * Copyright (c) 2024, Arm Limited and Contributors. All rights reserved. 3841533ddSMadhukar Pappireddy * Copyright (c) 2022, Google LLC. All rights reserved. 4841533ddSMadhukar Pappireddy * 5841533ddSMadhukar Pappireddy * SPDX-License-Identifier: BSD-3-Clause 6841533ddSMadhukar Pappireddy */ 7841533ddSMadhukar Pappireddy 8841533ddSMadhukar Pappireddy #ifndef SIMD_CTX_H 9841533ddSMadhukar Pappireddy #define SIMD_CTX_H 10841533ddSMadhukar Pappireddy 11841533ddSMadhukar Pappireddy /******************************************************************************* 12841533ddSMadhukar Pappireddy * Constants that allow assembler code to access members of and the 'simd_context' 13841533ddSMadhukar Pappireddy * structure at their correct offsets. 14841533ddSMadhukar Pappireddy ******************************************************************************/ 15841533ddSMadhukar Pappireddy 16*42422622SMadhukar Pappireddy #if CTX_INCLUDE_FPREGS || CTX_INCLUDE_SVE_REGS 17*42422622SMadhukar Pappireddy #if CTX_INCLUDE_SVE_REGS 18*42422622SMadhukar Pappireddy #define SIMD_VECTOR_LEN_BYTES (SVE_VECTOR_LEN / 8) /* Length of vector in bytes */ 19*42422622SMadhukar Pappireddy #elif CTX_INCLUDE_FPREGS 20841533ddSMadhukar Pappireddy #define SIMD_VECTOR_LEN_BYTES U(16) /* 128 bits fixed vector length for FPU */ 21*42422622SMadhukar Pappireddy #endif /* CTX_INCLUDE_SVE_REGS */ 22841533ddSMadhukar Pappireddy 23841533ddSMadhukar Pappireddy #define CTX_SIMD_VECTORS U(0) 24841533ddSMadhukar Pappireddy /* there are 32 vector registers, each of size SIMD_VECTOR_LEN_BYTES */ 25841533ddSMadhukar Pappireddy #define CTX_SIMD_FPSR (CTX_SIMD_VECTORS + (32 * SIMD_VECTOR_LEN_BYTES)) 26841533ddSMadhukar Pappireddy #define CTX_SIMD_FPCR (CTX_SIMD_FPSR + 8) 27841533ddSMadhukar Pappireddy 28*42422622SMadhukar Pappireddy #if CTX_INCLUDE_FPREGS && CTX_INCLUDE_AARCH32_REGS 29841533ddSMadhukar Pappireddy #define CTX_SIMD_FPEXC32 (CTX_SIMD_FPCR + 8) 30*42422622SMadhukar Pappireddy #define CTX_SIMD_PREDICATES (CTX_SIMD_FPEXC32 + 16) 31*42422622SMadhukar Pappireddy #else 32*42422622SMadhukar Pappireddy #define CTX_SIMD_PREDICATES (CTX_SIMD_FPCR + 8) 33*42422622SMadhukar Pappireddy #endif /* CTX_INCLUDE_FPREGS && CTX_INCLUDE_AARCH32_REGS */ 34*42422622SMadhukar Pappireddy 35*42422622SMadhukar Pappireddy /* 36*42422622SMadhukar Pappireddy * Each predicate register is 1/8th the size of a vector register and there are 16 37*42422622SMadhukar Pappireddy * predicate registers 38*42422622SMadhukar Pappireddy */ 39*42422622SMadhukar Pappireddy #define CTX_SIMD_FFR (CTX_SIMD_PREDICATES + (16 * (SIMD_VECTOR_LEN_BYTES / 8))) 40841533ddSMadhukar Pappireddy 41841533ddSMadhukar Pappireddy #ifndef __ASSEMBLER__ 42841533ddSMadhukar Pappireddy 43841533ddSMadhukar Pappireddy #include <stdint.h> 44841533ddSMadhukar Pappireddy #include <lib/cassert.h> 45841533ddSMadhukar Pappireddy 46841533ddSMadhukar Pappireddy /* 47841533ddSMadhukar Pappireddy * Please don't change order of fields in this struct as that may violate 48841533ddSMadhukar Pappireddy * alignment requirements and affect how assembly code accesses members of this 49841533ddSMadhukar Pappireddy * struct. 50841533ddSMadhukar Pappireddy */ 51841533ddSMadhukar Pappireddy typedef struct { 52841533ddSMadhukar Pappireddy uint8_t vectors[32][SIMD_VECTOR_LEN_BYTES]; 53841533ddSMadhukar Pappireddy uint8_t fpsr[8]; 54841533ddSMadhukar Pappireddy uint8_t fpcr[8]; 55841533ddSMadhukar Pappireddy #if CTX_INCLUDE_FPREGS && CTX_INCLUDE_AARCH32_REGS 56*42422622SMadhukar Pappireddy /* 16 bytes to align to next 16 byte boundary when CTX_INCLUDE_SVE_REGS is 0 */ 57841533ddSMadhukar Pappireddy uint8_t fpexc32_el2[16]; 58841533ddSMadhukar Pappireddy #endif 59*42422622SMadhukar Pappireddy #if CTX_INCLUDE_SVE_REGS 60*42422622SMadhukar Pappireddy /* FFR and each of predicates is one-eigth of the SVE vector length */ 61*42422622SMadhukar Pappireddy uint8_t predicates[16][SIMD_VECTOR_LEN_BYTES / 8]; 62*42422622SMadhukar Pappireddy uint8_t ffr[SIMD_VECTOR_LEN_BYTES / 8]; 63*42422622SMadhukar Pappireddy /* SMCCCv1.3 FID[16] hint bit state recorded on EL3 entry */ 64*42422622SMadhukar Pappireddy bool hint; 65*42422622SMadhukar Pappireddy #endif /* CTX_INCLUDE_SVE_REGS */ 66*42422622SMadhukar Pappireddy } __aligned(16) simd_regs_t; 67841533ddSMadhukar Pappireddy 68841533ddSMadhukar Pappireddy CASSERT(CTX_SIMD_VECTORS == __builtin_offsetof(simd_regs_t, vectors), 69841533ddSMadhukar Pappireddy assert_vectors_mismatch); 70841533ddSMadhukar Pappireddy 71841533ddSMadhukar Pappireddy CASSERT(CTX_SIMD_FPSR == __builtin_offsetof(simd_regs_t, fpsr), 72841533ddSMadhukar Pappireddy assert_fpsr_mismatch); 73841533ddSMadhukar Pappireddy 74841533ddSMadhukar Pappireddy CASSERT(CTX_SIMD_FPCR == __builtin_offsetof(simd_regs_t, fpcr), 75841533ddSMadhukar Pappireddy assert_fpcr_mismatch); 76841533ddSMadhukar Pappireddy 77841533ddSMadhukar Pappireddy #if CTX_INCLUDE_FPREGS && CTX_INCLUDE_AARCH32_REGS 78841533ddSMadhukar Pappireddy CASSERT(CTX_SIMD_FPEXC32 == __builtin_offsetof(simd_regs_t, fpexc32_el2), 79841533ddSMadhukar Pappireddy assert_fpex32_mismtatch); 80841533ddSMadhukar Pappireddy #endif 81841533ddSMadhukar Pappireddy 82*42422622SMadhukar Pappireddy #if CTX_INCLUDE_SVE_REGS 83*42422622SMadhukar Pappireddy CASSERT(CTX_SIMD_PREDICATES == __builtin_offsetof(simd_regs_t, predicates), 84*42422622SMadhukar Pappireddy assert_predicates_mismatch); 85*42422622SMadhukar Pappireddy 86*42422622SMadhukar Pappireddy CASSERT(CTX_SIMD_FFR == __builtin_offsetof(simd_regs_t, ffr), 87*42422622SMadhukar Pappireddy assert_ffr_mismatch); 88*42422622SMadhukar Pappireddy #endif 89*42422622SMadhukar Pappireddy 90841533ddSMadhukar Pappireddy void simd_ctx_save(uint32_t security_state, bool hint_sve); 91841533ddSMadhukar Pappireddy void simd_ctx_restore(uint32_t security_state); 92841533ddSMadhukar Pappireddy 93841533ddSMadhukar Pappireddy #endif /* __ASSEMBLER__ */ 94841533ddSMadhukar Pappireddy 95*42422622SMadhukar Pappireddy #endif /* CTX_INCLUDE_FPREGS || CTX_INCLUDE_SVE_REGS */ 96841533ddSMadhukar Pappireddy 97841533ddSMadhukar Pappireddy #endif /* SIMD_CTX_H */ 98