mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-05 16:53:55 -06:00
Fix memory leak in register save load due to xsave support
From: Avi Kivity <avi@redhat.com> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
This commit is contained in:
parent
577804958a
commit
0f53994f7a
1 changed files with 8 additions and 3 deletions
|
@ -660,7 +660,7 @@ static int kvm_put_fpu(CPUState *env)
|
||||||
static int kvm_put_xsave(CPUState *env)
|
static int kvm_put_xsave(CPUState *env)
|
||||||
{
|
{
|
||||||
#ifdef KVM_CAP_XSAVE
|
#ifdef KVM_CAP_XSAVE
|
||||||
int i;
|
int i, r;
|
||||||
struct kvm_xsave* xsave;
|
struct kvm_xsave* xsave;
|
||||||
uint16_t cwd, swd, twd, fop;
|
uint16_t cwd, swd, twd, fop;
|
||||||
|
|
||||||
|
@ -685,7 +685,9 @@ static int kvm_put_xsave(CPUState *env)
|
||||||
*(uint64_t *)&xsave->region[XSAVE_XSTATE_BV] = env->xstate_bv;
|
*(uint64_t *)&xsave->region[XSAVE_XSTATE_BV] = env->xstate_bv;
|
||||||
memcpy(&xsave->region[XSAVE_YMMH_SPACE], env->ymmh_regs,
|
memcpy(&xsave->region[XSAVE_YMMH_SPACE], env->ymmh_regs,
|
||||||
sizeof env->ymmh_regs);
|
sizeof env->ymmh_regs);
|
||||||
return kvm_vcpu_ioctl(env, KVM_SET_XSAVE, xsave);
|
r = kvm_vcpu_ioctl(env, KVM_SET_XSAVE, xsave);
|
||||||
|
qemu_free(xsave);
|
||||||
|
return r;
|
||||||
#else
|
#else
|
||||||
return kvm_put_fpu(env);
|
return kvm_put_fpu(env);
|
||||||
#endif
|
#endif
|
||||||
|
@ -850,8 +852,10 @@ static int kvm_get_xsave(CPUState *env)
|
||||||
|
|
||||||
xsave = qemu_memalign(4096, sizeof(struct kvm_xsave));
|
xsave = qemu_memalign(4096, sizeof(struct kvm_xsave));
|
||||||
ret = kvm_vcpu_ioctl(env, KVM_GET_XSAVE, xsave);
|
ret = kvm_vcpu_ioctl(env, KVM_GET_XSAVE, xsave);
|
||||||
if (ret < 0)
|
if (ret < 0) {
|
||||||
|
qemu_free(xsave);
|
||||||
return ret;
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
cwd = (uint16_t)xsave->region[0];
|
cwd = (uint16_t)xsave->region[0];
|
||||||
swd = (uint16_t)(xsave->region[0] >> 16);
|
swd = (uint16_t)(xsave->region[0] >> 16);
|
||||||
|
@ -870,6 +874,7 @@ static int kvm_get_xsave(CPUState *env)
|
||||||
env->xstate_bv = *(uint64_t *)&xsave->region[XSAVE_XSTATE_BV];
|
env->xstate_bv = *(uint64_t *)&xsave->region[XSAVE_XSTATE_BV];
|
||||||
memcpy(env->ymmh_regs, &xsave->region[XSAVE_YMMH_SPACE],
|
memcpy(env->ymmh_regs, &xsave->region[XSAVE_YMMH_SPACE],
|
||||||
sizeof env->ymmh_regs);
|
sizeof env->ymmh_regs);
|
||||||
|
qemu_free(xsave);
|
||||||
return 0;
|
return 0;
|
||||||
#else
|
#else
|
||||||
return kvm_get_fpu(env);
|
return kvm_get_fpu(env);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue