mirror of
https://github.com/qemu/qemu.git
synced 2025-08-09 19:05:29 +00:00
target-arm: Correctly restore FPSCR
Use the helper functions to save and restore the FPSCR, so that we correctly propagate rounding mode and flushing behaviour into the float_status fields. This also allows us to stop saving the vector length/stride fields separately. Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
602131e944
commit
e91f229a25
@ -9,17 +9,51 @@ static bool vfp_needed(void *opaque)
|
|||||||
return arm_feature(env, ARM_FEATURE_VFP);
|
return arm_feature(env, ARM_FEATURE_VFP);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int get_fpscr(QEMUFile *f, void *opaque, size_t size)
|
||||||
|
{
|
||||||
|
ARMCPU *cpu = opaque;
|
||||||
|
CPUARMState *env = &cpu->env;
|
||||||
|
uint32_t val = qemu_get_be32(f);
|
||||||
|
|
||||||
|
vfp_set_fpscr(env, val);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void put_fpscr(QEMUFile *f, void *opaque, size_t size)
|
||||||
|
{
|
||||||
|
ARMCPU *cpu = opaque;
|
||||||
|
CPUARMState *env = &cpu->env;
|
||||||
|
|
||||||
|
qemu_put_be32(f, vfp_get_fpscr(env));
|
||||||
|
}
|
||||||
|
|
||||||
|
static const VMStateInfo vmstate_fpscr = {
|
||||||
|
.name = "fpscr",
|
||||||
|
.get = get_fpscr,
|
||||||
|
.put = put_fpscr,
|
||||||
|
};
|
||||||
|
|
||||||
static const VMStateDescription vmstate_vfp = {
|
static const VMStateDescription vmstate_vfp = {
|
||||||
.name = "cpu/vfp",
|
.name = "cpu/vfp",
|
||||||
.version_id = 1,
|
.version_id = 2,
|
||||||
.minimum_version_id = 1,
|
.minimum_version_id = 2,
|
||||||
.minimum_version_id_old = 1,
|
.minimum_version_id_old = 2,
|
||||||
.fields = (VMStateField[]) {
|
.fields = (VMStateField[]) {
|
||||||
VMSTATE_FLOAT64_ARRAY(env.vfp.regs, ARMCPU, 32),
|
VMSTATE_FLOAT64_ARRAY(env.vfp.regs, ARMCPU, 32),
|
||||||
VMSTATE_UINT32_ARRAY(env.vfp.xregs, ARMCPU, 16),
|
/* The xregs array is a little awkward because element 1 (FPSCR)
|
||||||
/* TODO: Should use proper FPSCR access functions. */
|
* requires a specific accessor, so we have to split it up in
|
||||||
VMSTATE_INT32(env.vfp.vec_len, ARMCPU),
|
* the vmstate:
|
||||||
VMSTATE_INT32(env.vfp.vec_stride, ARMCPU),
|
*/
|
||||||
|
VMSTATE_UINT32(env.vfp.xregs[0], ARMCPU),
|
||||||
|
VMSTATE_UINT32_SUB_ARRAY(env.vfp.xregs, ARMCPU, 2, 14),
|
||||||
|
{
|
||||||
|
.name = "fpscr",
|
||||||
|
.version_id = 0,
|
||||||
|
.size = sizeof(uint32_t),
|
||||||
|
.info = &vmstate_fpscr,
|
||||||
|
.flags = VMS_SINGLE,
|
||||||
|
.offset = 0,
|
||||||
|
},
|
||||||
VMSTATE_END_OF_LIST()
|
VMSTATE_END_OF_LIST()
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user