Message ID | 1399280445-25345-1-git-send-email-pranavkumar@linaro.org |
---|---|
State | New |
Headers | show |
Am 05.05.2014 11:00, schrieb Pranavkumar Sawargaonkar: > Introduce a common kvm_arm_vcpu_init() for doing KVM_ARM_VCPU_INIT > ioctl in KVM ARM and KVM ARM64. This also helps us factor-out few > common code lines from kvm_arch_init_vcpu() for KVM ARM/ARM64. > > Signed-off-by: Pranavkumar Sawargaonkar <pranavkumar@linaro.org> > Signed-off-by: Anup Patel <anup.patel@linaro.org> > --- > target-arm/kvm.c | 23 +++++++++++++++++++++++ > target-arm/kvm32.c | 18 +++--------------- > target-arm/kvm64.c | 22 ++++++++-------------- > target-arm/kvm_arm.h | 14 ++++++++++++++ > 4 files changed, 48 insertions(+), 29 deletions(-) > > diff --git a/target-arm/kvm.c b/target-arm/kvm.c > index 39202d7..55bc3a3 100644 > --- a/target-arm/kvm.c > +++ b/target-arm/kvm.c > @@ -27,6 +27,29 @@ const KVMCapabilityInfo kvm_arch_required_capabilities[] = { > KVM_CAP_LAST_INFO > }; > > +int kvm_arm_vcpu_init(CPUState *cs, uint32_t feature0_extra) Since this is ARM-specific code and both kvm_arch_* implementations cast it, you could use an ARMCPU *cpu argument - but as you need cs for the ioctl, it's no net win, so your/PMM's choice. Apart from that, refactoring looks fine to me. Cleaning up the fprintf() moved will hopefully be done independently. Regards, Andreas
On 5 May 2014 10:00, Pranavkumar Sawargaonkar <pranavkumar@linaro.org> wrote: > Introduce a common kvm_arm_vcpu_init() for doing KVM_ARM_VCPU_INIT > ioctl in KVM ARM and KVM ARM64. This also helps us factor-out few > common code lines from kvm_arch_init_vcpu() for KVM ARM/ARM64. > > Signed-off-by: Pranavkumar Sawargaonkar <pranavkumar@linaro.org> > Signed-off-by: Anup Patel <anup.patel@linaro.org> > --- > target-arm/kvm.c | 23 +++++++++++++++++++++++ > target-arm/kvm32.c | 18 +++--------------- > target-arm/kvm64.c | 22 ++++++++-------------- > target-arm/kvm_arm.h | 14 ++++++++++++++ > 4 files changed, 48 insertions(+), 29 deletions(-) > > diff --git a/target-arm/kvm.c b/target-arm/kvm.c > index 39202d7..55bc3a3 100644 > --- a/target-arm/kvm.c > +++ b/target-arm/kvm.c > @@ -27,6 +27,29 @@ const KVMCapabilityInfo kvm_arch_required_capabilities[] = { > KVM_CAP_LAST_INFO > }; > > +int kvm_arm_vcpu_init(CPUState *cs, uint32_t feature0_extra) > +{ > + ARMCPU *cpu = ARM_CPU(cs); > + struct kvm_vcpu_init init; > + > + if (cpu->kvm_target == QEMU_KVM_ARM_TARGET_NONE) { > + fprintf(stderr, "KVM is not supported for this guest CPU type\n"); > + return -EINVAL; > + } > + > + init.target = cpu->kvm_target; > + memset(init.features, 0, sizeof(init.features)); > + if (cpu->start_powered_off) { > + init.features[0] |= 1 << KVM_ARM_VCPU_POWER_OFF; > + } > + if (kvm_check_extension(cs->kvm_state, KVM_CAP_ARM_PSCI_0_2)) { > + init.features[0] |= 1 << KVM_ARM_VCPU_PSCI_0_2; > + } > + init.features[0] |= feature0_extra; > + > + return kvm_vcpu_ioctl(cs, KVM_ARM_VCPU_INIT, &init); > +} I said back in the review comments for v2 of this series that we didn't need to do all this just for reset. Put the features word in cpu along with kvm_target: http://patchwork.ozlabs.org/patch/335900/ thanks -- PMM
Hi Peter, On 5 May 2014 16:14, Peter Maydell <peter.maydell@linaro.org> wrote: > On 5 May 2014 10:00, Pranavkumar Sawargaonkar <pranavkumar@linaro.org> wrote: >> Introduce a common kvm_arm_vcpu_init() for doing KVM_ARM_VCPU_INIT >> ioctl in KVM ARM and KVM ARM64. This also helps us factor-out few >> common code lines from kvm_arch_init_vcpu() for KVM ARM/ARM64. >> >> Signed-off-by: Pranavkumar Sawargaonkar <pranavkumar@linaro.org> >> Signed-off-by: Anup Patel <anup.patel@linaro.org> >> --- >> target-arm/kvm.c | 23 +++++++++++++++++++++++ >> target-arm/kvm32.c | 18 +++--------------- >> target-arm/kvm64.c | 22 ++++++++-------------- >> target-arm/kvm_arm.h | 14 ++++++++++++++ >> 4 files changed, 48 insertions(+), 29 deletions(-) >> >> diff --git a/target-arm/kvm.c b/target-arm/kvm.c >> index 39202d7..55bc3a3 100644 >> --- a/target-arm/kvm.c >> +++ b/target-arm/kvm.c >> @@ -27,6 +27,29 @@ const KVMCapabilityInfo kvm_arch_required_capabilities[] = { >> KVM_CAP_LAST_INFO >> }; >> >> +int kvm_arm_vcpu_init(CPUState *cs, uint32_t feature0_extra) >> +{ >> + ARMCPU *cpu = ARM_CPU(cs); >> + struct kvm_vcpu_init init; >> + >> + if (cpu->kvm_target == QEMU_KVM_ARM_TARGET_NONE) { >> + fprintf(stderr, "KVM is not supported for this guest CPU type\n"); >> + return -EINVAL; >> + } >> + >> + init.target = cpu->kvm_target; >> + memset(init.features, 0, sizeof(init.features)); >> + if (cpu->start_powered_off) { >> + init.features[0] |= 1 << KVM_ARM_VCPU_POWER_OFF; >> + } >> + if (kvm_check_extension(cs->kvm_state, KVM_CAP_ARM_PSCI_0_2)) { >> + init.features[0] |= 1 << KVM_ARM_VCPU_PSCI_0_2; >> + } >> + init.features[0] |= feature0_extra; >> + >> + return kvm_vcpu_ioctl(cs, KVM_ARM_VCPU_INIT, &init); >> +} > > I said back in the review comments for v2 of this series that we > didn't need to do all this just for reset. Put the features word in > cpu along with kvm_target: > http://patchwork.ozlabs.org/patch/335900/ Sure, I will do it. > > thanks > -- PMM Thanks, Pranav
On Mon, May 5, 2014 at 6:42 AM, Pranavkumar Sawargaonkar <pranavkumar@linaro.org> wrote: > Hi Peter, > > On 5 May 2014 16:14, Peter Maydell <peter.maydell@linaro.org> wrote: >> On 5 May 2014 10:00, Pranavkumar Sawargaonkar <pranavkumar@linaro.org> wrote: >>> Introduce a common kvm_arm_vcpu_init() for doing KVM_ARM_VCPU_INIT >>> ioctl in KVM ARM and KVM ARM64. This also helps us factor-out few >>> common code lines from kvm_arch_init_vcpu() for KVM ARM/ARM64. >>> >>> Signed-off-by: Pranavkumar Sawargaonkar <pranavkumar@linaro.org> >>> Signed-off-by: Anup Patel <anup.patel@linaro.org> >>> --- >>> target-arm/kvm.c | 23 +++++++++++++++++++++++ >>> target-arm/kvm32.c | 18 +++--------------- >>> target-arm/kvm64.c | 22 ++++++++-------------- >>> target-arm/kvm_arm.h | 14 ++++++++++++++ >>> 4 files changed, 48 insertions(+), 29 deletions(-) Rather than add this in 2 places, shouldn't this come after patch 5? Rob >>> >>> diff --git a/target-arm/kvm.c b/target-arm/kvm.c >>> index 39202d7..55bc3a3 100644 >>> --- a/target-arm/kvm.c >>> +++ b/target-arm/kvm.c >>> @@ -27,6 +27,29 @@ const KVMCapabilityInfo kvm_arch_required_capabilities[] = { >>> KVM_CAP_LAST_INFO >>> }; >>> >>> +int kvm_arm_vcpu_init(CPUState *cs, uint32_t feature0_extra) >>> +{ >>> + ARMCPU *cpu = ARM_CPU(cs); >>> + struct kvm_vcpu_init init; >>> + >>> + if (cpu->kvm_target == QEMU_KVM_ARM_TARGET_NONE) { >>> + fprintf(stderr, "KVM is not supported for this guest CPU type\n"); >>> + return -EINVAL; >>> + } >>> + >>> + init.target = cpu->kvm_target; >>> + memset(init.features, 0, sizeof(init.features)); >>> + if (cpu->start_powered_off) { >>> + init.features[0] |= 1 << KVM_ARM_VCPU_POWER_OFF; >>> + } >>> + if (kvm_check_extension(cs->kvm_state, KVM_CAP_ARM_PSCI_0_2)) { >>> + init.features[0] |= 1 << KVM_ARM_VCPU_PSCI_0_2; >>> + } >>> + init.features[0] |= feature0_extra; >>> + >>> + return kvm_vcpu_ioctl(cs, KVM_ARM_VCPU_INIT, &init); >>> +} >> >> I said back in the review comments for v2 of this series that we >> didn't need to do all this just for reset. Put the features word in >> cpu along with kvm_target: >> http://patchwork.ozlabs.org/patch/335900/ > > Sure, I will do it. > >> >> thanks >> -- PMM > Thanks, > Pranav
diff --git a/target-arm/kvm.c b/target-arm/kvm.c index 39202d7..55bc3a3 100644 --- a/target-arm/kvm.c +++ b/target-arm/kvm.c @@ -27,6 +27,29 @@ const KVMCapabilityInfo kvm_arch_required_capabilities[] = { KVM_CAP_LAST_INFO }; +int kvm_arm_vcpu_init(CPUState *cs, uint32_t feature0_extra) +{ + ARMCPU *cpu = ARM_CPU(cs); + struct kvm_vcpu_init init; + + if (cpu->kvm_target == QEMU_KVM_ARM_TARGET_NONE) { + fprintf(stderr, "KVM is not supported for this guest CPU type\n"); + return -EINVAL; + } + + init.target = cpu->kvm_target; + memset(init.features, 0, sizeof(init.features)); + if (cpu->start_powered_off) { + init.features[0] |= 1 << KVM_ARM_VCPU_POWER_OFF; + } + if (kvm_check_extension(cs->kvm_state, KVM_CAP_ARM_PSCI_0_2)) { + init.features[0] |= 1 << KVM_ARM_VCPU_PSCI_0_2; + } + init.features[0] |= feature0_extra; + + return kvm_vcpu_ioctl(cs, KVM_ARM_VCPU_INIT, &init); +} + bool kvm_arm_create_scratch_host_vcpu(const uint32_t *cpus_to_try, int *fdarray, struct kvm_vcpu_init *init) diff --git a/target-arm/kvm32.c b/target-arm/kvm32.c index cd9ac03..0034248 100644 --- a/target-arm/kvm32.c +++ b/target-arm/kvm32.c @@ -166,7 +166,6 @@ static int compare_u64(const void *a, const void *b) int kvm_arch_init_vcpu(CPUState *cs) { - struct kvm_vcpu_init init; int i, ret, arraylen; uint64_t v; struct kvm_one_reg r; @@ -174,23 +173,12 @@ int kvm_arch_init_vcpu(CPUState *cs) struct kvm_reg_list *rlp; ARMCPU *cpu = ARM_CPU(cs); - if (cpu->kvm_target == QEMU_KVM_ARM_TARGET_NONE) { - fprintf(stderr, "KVM is not supported for this guest CPU type\n"); - return -EINVAL; - } - - init.target = cpu->kvm_target; - memset(init.features, 0, sizeof(init.features)); - if (cpu->start_powered_off) { - init.features[0] |= 1 << KVM_ARM_VCPU_POWER_OFF; - } - if (kvm_check_extension(cs->kvm_state, KVM_CAP_ARM_PSCI_0_2)) { - init.features[0] |= 1 << KVM_ARM_VCPU_PSCI_0_2; - } - ret = kvm_vcpu_ioctl(cs, KVM_ARM_VCPU_INIT, &init); + /* Do KVM_ARM_VCPU_INIT ioctl */ + ret = kvm_arm_vcpu_init(cs, 0x0); if (ret) { return ret; } + /* Query the kernel to make sure it supports 32 VFP * registers: QEMU's "cortex-a15" CPU is always a * VFP-D32 core. The simplest way to do this is just diff --git a/target-arm/kvm64.c b/target-arm/kvm64.c index bc6cd74..f7cc3ef 100644 --- a/target-arm/kvm64.c +++ b/target-arm/kvm64.c @@ -77,29 +77,23 @@ bool kvm_arm_get_host_cpu_features(ARMHostCPUClass *ahcc) int kvm_arch_init_vcpu(CPUState *cs) { - ARMCPU *cpu = ARM_CPU(cs); - struct kvm_vcpu_init init; int ret; + ARMCPU *cpu = ARM_CPU(cs); - if (cpu->kvm_target == QEMU_KVM_ARM_TARGET_NONE || - !arm_feature(&cpu->env, ARM_FEATURE_AARCH64)) { - fprintf(stderr, "KVM is not supported for this guest CPU type\n"); + if (!arm_feature(&cpu->env, ARM_FEATURE_AARCH64)) { + fprintf(stderr, "KVM only support Aarch64 CPU type\n"); return -EINVAL; } - init.target = cpu->kvm_target; - memset(init.features, 0, sizeof(init.features)); - if (cpu->start_powered_off) { - init.features[0] |= 1 << KVM_ARM_VCPU_POWER_OFF; - } - if (kvm_check_extension(cs->kvm_state, KVM_CAP_ARM_PSCI_0_2)) { - init.features[0] |= 1 << KVM_ARM_VCPU_PSCI_0_2; + /* Do KVM_ARM_VCPU_INIT ioctl */ + ret = kvm_arm_vcpu_init(cs, 0x0); + if (ret) { + return ret; } - ret = kvm_vcpu_ioctl(cs, KVM_ARM_VCPU_INIT, &init); /* TODO : support for save/restore/reset of system regs via tuple list */ - return ret; + return 0; } #define AARCH64_CORE_REG(x) (KVM_REG_ARM64 | KVM_REG_SIZE_U64 | \ diff --git a/target-arm/kvm_arm.h b/target-arm/kvm_arm.h index 137c567..1889ba1 100644 --- a/target-arm/kvm_arm.h +++ b/target-arm/kvm_arm.h @@ -15,6 +15,20 @@ #include "exec/memory.h" /** + * kvm_arm_vcpu_init: + * @cs: CPUState + * @feature0_extra: additional features + * + * KVM ARM and KVM ARM64 need to use KVM_ARM_VCPU_INIT ioctl for + * init/re-init/reset the VCPU with given feature flags. + * This is a common function for doing KVM_ARM_VCPU_INIT ioctl + * independent of KVM ARM or KVM ARM64. + * + * Returns: 0 if success else < 0 error code + */ +int kvm_arm_vcpu_init(CPUState *cs, uint32_t feature0_extra); + +/** * kvm_arm_register_device: * @mr: memory region for this device * @devid: the KVM device ID