Hi, Bibo, On Wed, Jun 26, 2024 at 2:32 PM Bibo Mao <maobibo@xxxxxxxxxxx> wrote: > > Two kinds of LBT feature detection are added here, one is VCPU > feature, the other is VM feature. VCPU feature dection can only > work with VCPU thread itself, and requires VCPU thread is created > already. So LBT feature detection for VM is added also, it can > be done even if VM is not created, and also can be done by any > thread besides VCPU threads. > > Loongson Binary Translation (LBT) feature is defined in register > cpucfg2. Here LBT capability detection for VCPU is added. > > Here ioctl command KVM_HAS_DEVICE_ATTR is added for VM, and macro > KVM_LOONGARCH_VM_FEAT_CTRL is added to check supported feature. And > three sub-features relative with LBT are added as following: > KVM_LOONGARCH_VM_FEAT_X86BT > KVM_LOONGARCH_VM_FEAT_ARMBT > KVM_LOONGARCH_VM_FEAT_MIPSBT > > Signed-off-by: Bibo Mao <maobibo@xxxxxxxxxxx> > --- > arch/loongarch/include/uapi/asm/kvm.h | 6 ++++ > arch/loongarch/kvm/vcpu.c | 6 ++++ > arch/loongarch/kvm/vm.c | 44 ++++++++++++++++++++++++++- > 3 files changed, 55 insertions(+), 1 deletion(-) > > diff --git a/arch/loongarch/include/uapi/asm/kvm.h b/arch/loongarch/include/uapi/asm/kvm.h > index ddc5cab0ffd0..c40f7d9ffe13 100644 > --- a/arch/loongarch/include/uapi/asm/kvm.h > +++ b/arch/loongarch/include/uapi/asm/kvm.h > @@ -82,6 +82,12 @@ struct kvm_fpu { > #define KVM_IOC_CSRID(REG) LOONGARCH_REG_64(KVM_REG_LOONGARCH_CSR, REG) > #define KVM_IOC_CPUCFG(REG) LOONGARCH_REG_64(KVM_REG_LOONGARCH_CPUCFG, REG) > > +/* Device Control API on vm fd */ > +#define KVM_LOONGARCH_VM_FEAT_CTRL 0 > +#define KVM_LOONGARCH_VM_FEAT_X86BT 0 > +#define KVM_LOONGARCH_VM_FEAT_ARMBT 1 > +#define KVM_LOONGARCH_VM_FEAT_MIPSBT 2 > + > /* Device Control API on vcpu fd */ > #define KVM_LOONGARCH_VCPU_CPUCFG 0 > #define KVM_LOONGARCH_VCPU_PVTIME_CTRL 1 If you insist that LBT should be a vm feature, then I suggest the above two also be vm features. Though this is an UAPI change, but CPUCFG is upstream in 6.10-rc1 and 6.10-final hasn't been released. We have a chance to change it now. Huacai > diff --git a/arch/loongarch/kvm/vcpu.c b/arch/loongarch/kvm/vcpu.c > index 233d28d0e928..9734b4d8db05 100644 > --- a/arch/loongarch/kvm/vcpu.c > +++ b/arch/loongarch/kvm/vcpu.c > @@ -565,6 +565,12 @@ static int _kvm_get_cpucfg_mask(int id, u64 *v) > *v |= CPUCFG2_LSX; > if (cpu_has_lasx) > *v |= CPUCFG2_LASX; > + if (cpu_has_lbt_x86) > + *v |= CPUCFG2_X86BT; > + if (cpu_has_lbt_arm) > + *v |= CPUCFG2_ARMBT; > + if (cpu_has_lbt_mips) > + *v |= CPUCFG2_MIPSBT; > > return 0; > case LOONGARCH_CPUCFG3: > diff --git a/arch/loongarch/kvm/vm.c b/arch/loongarch/kvm/vm.c > index 6b2e4f66ad26..09e05108c68b 100644 > --- a/arch/loongarch/kvm/vm.c > +++ b/arch/loongarch/kvm/vm.c > @@ -99,7 +99,49 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext) > return r; > } > > +static int kvm_vm_feature_has_attr(struct kvm *kvm, struct kvm_device_attr *attr) > +{ > + switch (attr->attr) { > + case KVM_LOONGARCH_VM_FEAT_X86BT: > + if (cpu_has_lbt_x86) > + return 0; > + return -ENXIO; > + case KVM_LOONGARCH_VM_FEAT_ARMBT: > + if (cpu_has_lbt_arm) > + return 0; > + return -ENXIO; > + case KVM_LOONGARCH_VM_FEAT_MIPSBT: > + if (cpu_has_lbt_mips) > + return 0; > + return -ENXIO; > + default: > + return -ENXIO; > + } > +} > + > +static int kvm_vm_has_attr(struct kvm *kvm, struct kvm_device_attr *attr) > +{ > + switch (attr->group) { > + case KVM_LOONGARCH_VM_FEAT_CTRL: > + return kvm_vm_feature_has_attr(kvm, attr); > + default: > + return -ENXIO; > + } > +} > + > int kvm_arch_vm_ioctl(struct file *filp, unsigned int ioctl, unsigned long arg) > { > - return -ENOIOCTLCMD; > + struct kvm *kvm = filp->private_data; > + void __user *argp = (void __user *)arg; > + struct kvm_device_attr attr; > + > + switch (ioctl) { > + case KVM_HAS_DEVICE_ATTR: > + if (copy_from_user(&attr, argp, sizeof(attr))) > + return -EFAULT; > + > + return kvm_vm_has_attr(kvm, &attr); > + default: > + return -EINVAL; > + } > } > -- > 2.39.3 >