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)18 void 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)29 void 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)40 bool 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)47 void fpu_save_my_state(void) {}
48 
fpu_restore_my_state(void)49 void fpu_restore_my_state(void) {}
50 
51 #endif /* RMM_FPU_USE_AT_REL2 */
52