Signed-off-by: Andrew Jones <drjo...@redhat.com> --- target/arm/kvm64.c | 7 +++++-- target/arm/kvm_arm.h | 20 ++++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-)
diff --git a/target/arm/kvm64.c b/target/arm/kvm64.c index 0c666e405357..11c6334a7c08 100644 --- a/target/arm/kvm64.c +++ b/target/arm/kvm64.c @@ -446,7 +446,8 @@ void kvm_arm_pmu_set_irq(CPUState *cs, int irq) } } -static int kvm_arm_get_sve_vls(CPUState *cs, uint64_t sve_vls[]) +int kvm_arm_get_sve_vls(CPUState *cs, + uint64_t sve_vls[KVM_ARM64_SVE_VLS_WORDS]) { struct kvm_one_reg reg = { .id = KVM_REG_ARM64_SVE_VLS, @@ -470,7 +471,9 @@ static int kvm_arm_get_sve_vls(CPUState *cs, uint64_t sve_vls[]) return ret; } -static int kvm_arm_set_sve_vls(CPUState *cs, uint64_t sve_vls[], int max_vq) +static int kvm_arm_set_sve_vls(CPUState *cs, + uint64_t sve_vls[KVM_ARM64_SVE_VLS_WORDS], + int max_vq) { struct kvm_one_reg reg = { .id = KVM_REG_ARM64_SVE_VLS, diff --git a/target/arm/kvm_arm.h b/target/arm/kvm_arm.h index c488ec3ab410..748ed8d54985 100644 --- a/target/arm/kvm_arm.h +++ b/target/arm/kvm_arm.h @@ -248,6 +248,26 @@ int kvm_arm_vgic_probe(void); void kvm_arm_pmu_set_irq(CPUState *cs, int irq); void kvm_arm_pmu_init(CPUState *cs); +/** + * kvm_arm_get_sve_vls + * @cs: CPUState + * @sve_vls: valid vector length bitmap + * + * Get the valid vector length bitmap. If a bit 'bit' is set + * then the host supports a vector length of (bit * 16) bytes. + * + * For example, if + * + * sve_vls[0] = 0xb and + * sve_vls[1 ... KVM_ARM64_SVE_VLS_WORDS-1] = 0, + * + * then the host supports 16, 32, and 64 byte vector lengths. + * + * Returns: the highest set bit if successful else < 0 error code + */ +int kvm_arm_get_sve_vls(CPUState *cs, + uint64_t sve_vls[KVM_ARM64_SVE_VLS_WORDS]); + #else static inline void kvm_arm_set_cpu_features_from_host(ARMCPU *cpu) -- 2.20.1