On Tue, 3 Dec 2019 08:28:11 -0500 Janosch Frank <fran...@linux.ibm.com> wrote:
> Up to now we only had an ioctl to reset vcpu data QEMU couldn't reach > for the initial reset, and that was also called for the clear > reset. To be architecture compliant, we also need to clear local > interrupts on a normal reset. > > Because of this and the upcoming protvirt support we need to add > ioctls for the missing clear and normal resets. > > Signed-off-by: Janosch Frank <fran...@linux.ibm.com> > Reviewed-by: Thomas Huth <th...@redhat.com> > Acked-by: David Hildenbrand <da...@redhat.com> > --- > target/s390x/cpu.c | 16 +++++++++++++-- > target/s390x/kvm-stub.c | 10 +++++++++- > target/s390x/kvm.c | 42 ++++++++++++++++++++++++++++++++-------- > target/s390x/kvm_s390x.h | 4 +++- > 4 files changed, 60 insertions(+), 12 deletions(-) > > diff --git a/target/s390x/cpu.c b/target/s390x/cpu.c > index 829ce6ad54..4973365d6c 100644 > --- a/target/s390x/cpu.c > +++ b/target/s390x/cpu.c > @@ -139,8 +139,20 @@ static void s390_cpu_reset(CPUState *s, cpu_reset_type > type) > } > > /* Reset state inside the kernel that we cannot access yet from QEMU. */ For the last iteration, I asked about the 'yet' here... > - if (kvm_enabled() && type != S390_CPU_RESET_NORMAL) { > - kvm_s390_reset_vcpu(cpu); > + if (kvm_enabled()) { > + switch (type) { > + case S390_CPU_RESET_CLEAR: > + kvm_s390_reset_vcpu_clear(cpu); > + break; > + case S390_CPU_RESET_INITIAL: > + kvm_s390_reset_vcpu_initial(cpu); > + break; > + case S390_CPU_RESET_NORMAL: > + kvm_s390_reset_vcpu_normal(cpu); > + break; > + default: > + g_assert_not_reached(); > + } > } > } > (...) > @@ -403,17 +405,41 @@ int kvm_arch_destroy_vcpu(CPUState *cs) > return 0; > } > > -void kvm_s390_reset_vcpu(S390CPU *cpu) > +static void kvm_s390_reset_vcpu(S390CPU *cpu, unsigned long type) > { > CPUState *cs = CPU(cpu); > > - /* The initial reset call is needed here to reset in-kernel > - * vcpu data that we can't access directly from QEMU > - * (i.e. with older kernels which don't support sync_regs/ONE_REG). > - * Before this ioctl cpu_synchronize_state() is called in common kvm > - * code (kvm-all) */ > - if (kvm_vcpu_ioctl(cs, KVM_S390_INITIAL_RESET, NULL)) { > - error_report("Initial CPU reset failed on CPU %i", cs->cpu_index); > + /* > + * The reset call is needed here to reset in-kernel vcpu data that > + * we can't access directly from QEMU (i.e. with older kernels > + * which don't support sync_regs/ONE_REG). Before this ioctl ...and this reference to 'older kernels' here. Are the comments still correct/relevant? > + * cpu_synchronize_state() is called in common kvm code > + * (kvm-all). > + */ > + if (kvm_vcpu_ioctl(cs, type)) { > + error_report("CPU reset failed on CPU %i type %lx", > + cs->cpu_index, type); > + } > +}