1 /* 2 * SPDX-License-Identifier: BSD-3-Clause 3 * SPDX-FileCopyrightText: Copyright TF-RMM Contributors. 4 */ 5 6 #include <cpuid.h> 7 #include <fpu_helpers.h> 8 #include <stdbool.h> 9 10 struct rmm_fpu_state { 11 struct fpu_state state; 12 bool saved; 13 }; 14 15 struct rmm_fpu_state rmm_fpu_state[MAX_CPUS]; 16 17 #ifdef RMM_FPU_USE_AT_REL2 fpu_save_my_state(void)18void fpu_save_my_state(void) 19 { 20 struct rmm_fpu_state *rmm_state; 21 unsigned int cpu_id = my_cpuid(); 22 23 rmm_state = rmm_fpu_state + cpu_id; 24 assert(!rmm_state->saved); 25 rmm_state->saved = true; 26 FPU_ALLOW(fpu_save_state(&(rmm_state->state))); 27 } 28 fpu_restore_my_state(void)29void fpu_restore_my_state(void) 30 { 31 struct rmm_fpu_state *rmm_state; 32 unsigned int cpu_id = my_cpuid(); 33 34 rmm_state = rmm_fpu_state + cpu_id; 35 assert(rmm_state->saved); 36 FPU_ALLOW(fpu_restore_state(&(rmm_state->state))); 37 rmm_state->saved = false; 38 } 39 fpu_is_my_state_saved(unsigned int cpu_id)40bool fpu_is_my_state_saved(unsigned int cpu_id) 41 { 42 assert(cpu_id < MAX_CPUS); 43 return rmm_fpu_state[cpu_id].saved; 44 } 45 46 #else /* RMM_FPU_USE_AT_REL2 */ fpu_save_my_state(void)47void fpu_save_my_state(void) {} 48 fpu_restore_my_state(void)49void fpu_restore_my_state(void) {} 50 51 #endif /* RMM_FPU_USE_AT_REL2 */ 52