1841533ddSMadhukar Pappireddy /* 2*34a22a02SBoyan Karatotev * Copyright (c) 2024-2025, 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 11*34a22a02SBoyan Karatotev #include <stdbool.h> 12*34a22a02SBoyan Karatotev #include <lib/cassert.h> 13*34a22a02SBoyan Karatotev #include <lib/utils_def.h> 14*34a22a02SBoyan Karatotev 15841533ddSMadhukar Pappireddy /******************************************************************************* 16841533ddSMadhukar Pappireddy * Constants that allow assembler code to access members of and the 'simd_context' 17841533ddSMadhukar Pappireddy * structure at their correct offsets. 18841533ddSMadhukar Pappireddy ******************************************************************************/ 19841533ddSMadhukar Pappireddy 2042422622SMadhukar Pappireddy #if CTX_INCLUDE_FPREGS || CTX_INCLUDE_SVE_REGS 2142422622SMadhukar Pappireddy #if CTX_INCLUDE_SVE_REGS 2242422622SMadhukar Pappireddy #define SIMD_VECTOR_LEN_BYTES (SVE_VECTOR_LEN / 8) /* Length of vector in bytes */ 2342422622SMadhukar Pappireddy #elif CTX_INCLUDE_FPREGS 24841533ddSMadhukar Pappireddy #define SIMD_VECTOR_LEN_BYTES U(16) /* 128 bits fixed vector length for FPU */ 2542422622SMadhukar Pappireddy #endif /* CTX_INCLUDE_SVE_REGS */ 26841533ddSMadhukar Pappireddy 27841533ddSMadhukar Pappireddy #define CTX_SIMD_VECTORS U(0) 28841533ddSMadhukar Pappireddy /* there are 32 vector registers, each of size SIMD_VECTOR_LEN_BYTES */ 29841533ddSMadhukar Pappireddy #define CTX_SIMD_FPSR (CTX_SIMD_VECTORS + (32 * SIMD_VECTOR_LEN_BYTES)) 30841533ddSMadhukar Pappireddy #define CTX_SIMD_FPCR (CTX_SIMD_FPSR + 8) 31841533ddSMadhukar Pappireddy 3242422622SMadhukar Pappireddy #if CTX_INCLUDE_FPREGS && CTX_INCLUDE_AARCH32_REGS 33841533ddSMadhukar Pappireddy #define CTX_SIMD_FPEXC32 (CTX_SIMD_FPCR + 8) 3442422622SMadhukar Pappireddy #define CTX_SIMD_PREDICATES (CTX_SIMD_FPEXC32 + 16) 3542422622SMadhukar Pappireddy #else 3642422622SMadhukar Pappireddy #define CTX_SIMD_PREDICATES (CTX_SIMD_FPCR + 8) 3742422622SMadhukar Pappireddy #endif /* CTX_INCLUDE_FPREGS && CTX_INCLUDE_AARCH32_REGS */ 3842422622SMadhukar Pappireddy 3942422622SMadhukar Pappireddy /* 4042422622SMadhukar Pappireddy * Each predicate register is 1/8th the size of a vector register and there are 16 4142422622SMadhukar Pappireddy * predicate registers 4242422622SMadhukar Pappireddy */ 4342422622SMadhukar Pappireddy #define CTX_SIMD_FFR (CTX_SIMD_PREDICATES + (16 * (SIMD_VECTOR_LEN_BYTES / 8))) 44841533ddSMadhukar Pappireddy 45841533ddSMadhukar Pappireddy #ifndef __ASSEMBLER__ 46841533ddSMadhukar Pappireddy 47841533ddSMadhukar Pappireddy #include <stdint.h> 48841533ddSMadhukar Pappireddy #include <lib/cassert.h> 49841533ddSMadhukar Pappireddy 50841533ddSMadhukar Pappireddy /* 51841533ddSMadhukar Pappireddy * Please don't change order of fields in this struct as that may violate 52841533ddSMadhukar Pappireddy * alignment requirements and affect how assembly code accesses members of this 53841533ddSMadhukar Pappireddy * struct. 54841533ddSMadhukar Pappireddy */ 55841533ddSMadhukar Pappireddy typedef struct { 56841533ddSMadhukar Pappireddy uint8_t vectors[32][SIMD_VECTOR_LEN_BYTES]; 57841533ddSMadhukar Pappireddy uint8_t fpsr[8]; 58841533ddSMadhukar Pappireddy uint8_t fpcr[8]; 59841533ddSMadhukar Pappireddy #if CTX_INCLUDE_FPREGS && CTX_INCLUDE_AARCH32_REGS 6042422622SMadhukar Pappireddy /* 16 bytes to align to next 16 byte boundary when CTX_INCLUDE_SVE_REGS is 0 */ 61841533ddSMadhukar Pappireddy uint8_t fpexc32_el2[16]; 62841533ddSMadhukar Pappireddy #endif 6342422622SMadhukar Pappireddy #if CTX_INCLUDE_SVE_REGS 6442422622SMadhukar Pappireddy /* FFR and each of predicates is one-eigth of the SVE vector length */ 6542422622SMadhukar Pappireddy uint8_t predicates[16][SIMD_VECTOR_LEN_BYTES / 8]; 6642422622SMadhukar Pappireddy uint8_t ffr[SIMD_VECTOR_LEN_BYTES / 8]; 6742422622SMadhukar Pappireddy /* SMCCCv1.3 FID[16] hint bit state recorded on EL3 entry */ 6842422622SMadhukar Pappireddy bool hint; 6942422622SMadhukar Pappireddy #endif /* CTX_INCLUDE_SVE_REGS */ 7042422622SMadhukar Pappireddy } __aligned(16) simd_regs_t; 71841533ddSMadhukar Pappireddy 72841533ddSMadhukar Pappireddy CASSERT(CTX_SIMD_VECTORS == __builtin_offsetof(simd_regs_t, vectors), 73841533ddSMadhukar Pappireddy assert_vectors_mismatch); 74841533ddSMadhukar Pappireddy 75841533ddSMadhukar Pappireddy CASSERT(CTX_SIMD_FPSR == __builtin_offsetof(simd_regs_t, fpsr), 76841533ddSMadhukar Pappireddy assert_fpsr_mismatch); 77841533ddSMadhukar Pappireddy 78841533ddSMadhukar Pappireddy CASSERT(CTX_SIMD_FPCR == __builtin_offsetof(simd_regs_t, fpcr), 79841533ddSMadhukar Pappireddy assert_fpcr_mismatch); 80841533ddSMadhukar Pappireddy 81841533ddSMadhukar Pappireddy #if CTX_INCLUDE_FPREGS && CTX_INCLUDE_AARCH32_REGS 82841533ddSMadhukar Pappireddy CASSERT(CTX_SIMD_FPEXC32 == __builtin_offsetof(simd_regs_t, fpexc32_el2), 83841533ddSMadhukar Pappireddy assert_fpex32_mismtatch); 84841533ddSMadhukar Pappireddy #endif 85841533ddSMadhukar Pappireddy 8642422622SMadhukar Pappireddy #if CTX_INCLUDE_SVE_REGS 8742422622SMadhukar Pappireddy CASSERT(CTX_SIMD_PREDICATES == __builtin_offsetof(simd_regs_t, predicates), 8842422622SMadhukar Pappireddy assert_predicates_mismatch); 8942422622SMadhukar Pappireddy 9042422622SMadhukar Pappireddy CASSERT(CTX_SIMD_FFR == __builtin_offsetof(simd_regs_t, ffr), 9142422622SMadhukar Pappireddy assert_ffr_mismatch); 9242422622SMadhukar Pappireddy #endif 9342422622SMadhukar Pappireddy 94841533ddSMadhukar Pappireddy void simd_ctx_save(uint32_t security_state, bool hint_sve); 95841533ddSMadhukar Pappireddy void simd_ctx_restore(uint32_t security_state); 96841533ddSMadhukar Pappireddy 97841533ddSMadhukar Pappireddy #endif /* __ASSEMBLER__ */ 98841533ddSMadhukar Pappireddy 9942422622SMadhukar Pappireddy #endif /* CTX_INCLUDE_FPREGS || CTX_INCLUDE_SVE_REGS */ 100841533ddSMadhukar Pappireddy 101841533ddSMadhukar Pappireddy #endif /* SIMD_CTX_H */ 102