#include <machine/fpu.h>
#include <api/failures.h>
#include <model/statedata.h>
#include <arch/object/structures.h>
#ifdef CONFIG_HAVE_FPU
void switchLocalFpuOwner(user_fpu_state_t *new_owner)
{
enableFpu();
if (NODE_STATE(ksActiveFPUState)) {
saveFpuState(NODE_STATE(ksActiveFPUState));
}
if (new_owner) {
NODE_STATE(ksFPURestoresSinceSwitch) = 0;
loadFpuState(new_owner);
} else {
disableFpu();
}
NODE_STATE(ksActiveFPUState) = new_owner;
}
void switchFpuOwner(user_fpu_state_t *new_owner, word_t cpu)
{
#if CONFIG_MAX_NUM_NODES > 1
if (cpu != getCurrentCPUIndex()) {
doRemoteswitchFpuOwner(new_owner, cpu);
} else
#endif
{
switchLocalFpuOwner(new_owner);
}
}
exception_t
handleFPUFault(void)
{
assert(!nativeThreadUsingFPU(NODE_STATE(ksCurThread)));
switchLocalFpuOwner(&NODE_STATE(ksCurThread)->tcbArch.tcbContext.fpuState);
return EXCEPTION_NONE;
}
void fpuThreadDelete(tcb_t *thread)
{
if (nativeThreadUsingFPU(thread)) {
switchFpuOwner(NULL, SMP_TERNARY(thread->tcbAffinity, 0));
}
}
#endif