mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-01 23:03:54 -06:00
target/sparc: Introduce cpu_get_fsr, cpu_put_fsr
Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Tested-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> Acked-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> Message-Id: <20231103173841.33651-16-richard.henderson@linaro.org>
This commit is contained in:
parent
41535ca6f4
commit
1ccd6e13cc
9 changed files with 80 additions and 18 deletions
|
@ -293,7 +293,7 @@ void cpu_loop (CPUSPARCState *env)
|
|||
case TT_FP_EXCP:
|
||||
{
|
||||
int code = TARGET_FPE_FLTUNK;
|
||||
target_ulong fsr = env->fsr;
|
||||
target_ulong fsr = cpu_get_fsr(env);
|
||||
|
||||
if ((fsr & FSR_FTT_MASK) == FSR_FTT_IEEE_EXCP) {
|
||||
if (fsr & FSR_NVC) {
|
||||
|
|
|
@ -199,20 +199,21 @@ static void save_fpu(struct target_siginfo_fpu *fpu, CPUSPARCState *env)
|
|||
for (i = 0; i < 32; ++i) {
|
||||
__put_user(env->fpr[i].ll, &fpu->si_double_regs[i]);
|
||||
}
|
||||
__put_user(env->fsr, &fpu->si_fsr);
|
||||
__put_user(cpu_get_fsr(env), &fpu->si_fsr);
|
||||
__put_user(env->gsr, &fpu->si_gsr);
|
||||
__put_user(env->fprs, &fpu->si_fprs);
|
||||
#else
|
||||
for (i = 0; i < 16; ++i) {
|
||||
__put_user(env->fpr[i].ll, &fpu->si_double_regs[i]);
|
||||
}
|
||||
__put_user(env->fsr, &fpu->si_fsr);
|
||||
__put_user(cpu_get_fsr(env), &fpu->si_fsr);
|
||||
__put_user(0, &fpu->si_fpqdepth);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void restore_fpu(struct target_siginfo_fpu *fpu, CPUSPARCState *env)
|
||||
{
|
||||
target_ulong fsr;
|
||||
int i;
|
||||
|
||||
#ifdef TARGET_SPARC64
|
||||
|
@ -230,15 +231,16 @@ static void restore_fpu(struct target_siginfo_fpu *fpu, CPUSPARCState *env)
|
|||
__get_user(env->fpr[i].ll, &fpu->si_double_regs[i]);
|
||||
}
|
||||
}
|
||||
__get_user(env->fsr, &fpu->si_fsr);
|
||||
__get_user(env->gsr, &fpu->si_gsr);
|
||||
env->fprs |= fprs;
|
||||
#else
|
||||
for (i = 0; i < 16; ++i) {
|
||||
__get_user(env->fpr[i].ll, &fpu->si_double_regs[i]);
|
||||
}
|
||||
__get_user(env->fsr, &fpu->si_fsr);
|
||||
#endif
|
||||
|
||||
__get_user(fsr, &fpu->si_fsr);
|
||||
cpu_put_fsr(env, fsr);
|
||||
}
|
||||
|
||||
#ifdef TARGET_ARCH_HAS_SETUP_FRAME
|
||||
|
@ -662,6 +664,7 @@ void sparc64_set_context(CPUSPARCState *env)
|
|||
__get_user(fenab, &(fpup->mcfpu_enab));
|
||||
if (fenab) {
|
||||
abi_ulong fprs;
|
||||
abi_ulong fsr;
|
||||
|
||||
/*
|
||||
* We use the FPRS from the guest only in deciding whether
|
||||
|
@ -690,7 +693,8 @@ void sparc64_set_context(CPUSPARCState *env)
|
|||
__get_user(env->fpr[i].ll, &(fpup->mcfpu_fregs.dregs[i]));
|
||||
}
|
||||
}
|
||||
__get_user(env->fsr, &(fpup->mcfpu_fsr));
|
||||
__get_user(fsr, &(fpup->mcfpu_fsr));
|
||||
cpu_put_fsr(env, fsr);
|
||||
__get_user(env->gsr, &(fpup->mcfpu_gsr));
|
||||
}
|
||||
unlock_user_struct(ucp, ucp_addr, 0);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue