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@xxxxxxxxxx> --- The kernel has always supported being able to call VCPU_INIT multiple times for this reset effect; I just didn't realize it was possible when I wrote the original reset code. When kvm64.c grows support for system registers we can probably coalesce the two kvm_arm_reset_cpu() functions into one. I also have a vague recollection that somebody reported that we had an actual bug in this area that this patch would fix; however I can't now find that in the mailing list archives :-( Testing appreciated: my ARMv7 box is being a bit flaky at the moment; I don't *think* the occasional weird stuff I see is the effect of this patch but it's hard to be certain. --- target-arm/cpu-qom.h | 4 ---- target-arm/kvm32.c | 19 +++++-------------- 2 files changed, 5 insertions(+), 18 deletions(-) diff --git a/target-arm/cpu-qom.h b/target-arm/cpu-qom.h index eaee944..ee4fbb1 100644 --- a/target-arm/cpu-qom.h +++ b/target-arm/cpu-qom.h @@ -72,10 +72,6 @@ typedef struct ARMCPU { uint64_t *cpreg_indexes; /* Values of the registers (cpreg_indexes[i]'s value is cpreg_values[i]) */ 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 */ int32_t cpreg_array_len; /* These are used only for migration: incoming data arrives in diff --git a/target-arm/kvm32.c b/target-arm/kvm32.c index 068af7d..5ec4eb1 100644 --- a/target-arm/kvm32.c +++ b/target-arm/kvm32.c @@ -270,13 +270,6 @@ int kvm_arch_init_vcpu(CPUState *cs) 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: g_free(rlp); return ret; @@ -518,11 +511,9 @@ int kvm_arch_get_registers(CPUState *cs) void kvm_arm_reset_vcpu(ARMCPU *cpu) { - /* Feed the kernel back its initial register state */ - memmove(cpu->cpreg_values, cpu->cpreg_reset_values, - cpu->cpreg_array_len * sizeof(cpu->cpreg_values[0])); - - if (!write_list_to_kvmstate(cpu)) { - abort(); - } + /* Re-init VCPU so that all registers are set to + * their respective reset values. + */ + kvm_arm_vcpu_init(CPU(cpu)); + write_kvmstate_to_list(cpu); } -- 1.9.2 _______________________________________________ kvmarm mailing list kvmarm@xxxxxxxxxxxxxxxxxxxxx https://lists.cs.columbia.edu/mailman/listinfo/kvmarm