blob: 70f79d936d5a8219ad339904b79868dce2bab9f6 [file] [log] [blame]
/*
* SPDX-License-Identifier: BSD-3-Clause
* SPDX-FileCopyrightText: Copyright TF-RMM Contributors.
*/
#include <cpuid.h>
#include <fpu_helpers.h>
#include <stdbool.h>
struct rmm_fpu_state {
struct fpu_state state;
bool saved;
};
struct rmm_fpu_state rmm_fpu_state[MAX_CPUS];
#ifdef RMM_FPU_USE_AT_REL2
void fpu_save_my_state(void)
{
struct rmm_fpu_state *rmm_state;
unsigned int cpu_id = my_cpuid();
rmm_state = rmm_fpu_state + cpu_id;
assert(!rmm_state->saved);
rmm_state->saved = true;
FPU_ALLOW(fpu_save_state(&(rmm_state->state)));
}
void fpu_restore_my_state(void)
{
struct rmm_fpu_state *rmm_state;
unsigned int cpu_id = my_cpuid();
rmm_state = rmm_fpu_state + cpu_id;
assert(rmm_state->saved);
FPU_ALLOW(fpu_restore_state(&(rmm_state->state)));
rmm_state->saved = false;
}
bool fpu_is_my_state_saved(unsigned int cpu_id)
{
assert(cpu_id < MAX_CPUS);
return rmm_fpu_state[cpu_id].saved;
}
#else /* RMM_FPU_USE_AT_REL2 */
void fpu_save_my_state(void) {}
void fpu_restore_my_state(void) {}
#endif /* RMM_FPU_USE_AT_REL2 */