blob: 70f79d936d5a8219ad339904b79868dce2bab9f6 [file] [log] [blame]
Soby Mathewb4c6df42022-11-09 11:13:29 +00001/*
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
10struct rmm_fpu_state {
11 struct fpu_state state;
12 bool saved;
13};
14
15struct rmm_fpu_state rmm_fpu_state[MAX_CPUS];
16
17#ifdef RMM_FPU_USE_AT_REL2
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
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
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 */
47void fpu_save_my_state(void) {}
48
49void fpu_restore_my_state(void) {}
50
51#endif /* RMM_FPU_USE_AT_REL2 */