target-arm: Implement vCPU reset via KVM_ARM_VCPU_INIT for 32-bit CPUs

Implement kvm_arm_vcpu_init() as a simple call to arm_arm_vcpu_init()
(which uses the KVM_ARM_VCPU_INIT vcpu ioctl to tell the kernel
to re-initialize the vCPU), rather than via the complicated code
which saves a copy of the register state on first init and then
writes it back to the kernel. This is much simpler and brings the
32-bit KVM code into line with the 64-bit code.

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Message-id: 1403802973-20841-1-git-send-email-peter.maydell@linaro.org
This commit is contained in:
Peter Maydell 2014-06-26 18:16:13 +01:00
parent 6ec1588e09
commit 75c9a1a047
2 changed files with 5 additions and 18 deletions

View file

@ -72,10 +72,6 @@ typedef struct ARMCPU {
uint64_t *cpreg_indexes; uint64_t *cpreg_indexes;
/* Values of the registers (cpreg_indexes[i]'s value is cpreg_values[i]) */ /* Values of the registers (cpreg_indexes[i]'s value is cpreg_values[i]) */
uint64_t *cpreg_values; uint64_t *cpreg_values;
/* When using KVM, keeps a copy of the initial state of the VCPU,
* so that on reset we can feed the reset values back into the kernel.
*/
uint64_t *cpreg_reset_values;
/* Length of the indexes, values, reset_values arrays */ /* Length of the indexes, values, reset_values arrays */
int32_t cpreg_array_len; int32_t cpreg_array_len;
/* These are used only for migration: incoming data arrives in /* These are used only for migration: incoming data arrives in

View file

@ -270,13 +270,6 @@ int kvm_arch_init_vcpu(CPUState *cs)
goto out; goto out;
} }
/* Save a copy of the initial register values so that we can
* feed it back to the kernel on VCPU reset.
*/
cpu->cpreg_reset_values = g_memdup(cpu->cpreg_values,
cpu->cpreg_array_len *
sizeof(cpu->cpreg_values[0]));
out: out:
g_free(rlp); g_free(rlp);
return ret; return ret;
@ -518,11 +511,9 @@ int kvm_arch_get_registers(CPUState *cs)
void kvm_arm_reset_vcpu(ARMCPU *cpu) void kvm_arm_reset_vcpu(ARMCPU *cpu)
{ {
/* Feed the kernel back its initial register state */ /* Re-init VCPU so that all registers are set to
memmove(cpu->cpreg_values, cpu->cpreg_reset_values, * their respective reset values.
cpu->cpreg_array_len * sizeof(cpu->cpreg_values[0])); */
kvm_arm_vcpu_init(CPU(cpu));
if (!write_list_to_kvmstate(cpu)) { write_kvmstate_to_list(cpu);
abort();
}
} }