LoongArch: KVM: Set reserved bits as zero in CPUCFG
authorBibo Mao <maobibo@loongson.cn>
Wed, 6 Mar 2024 01:12:13 +0000 (09:12 +0800)
committerHuacai Chen <chenhuacai@loongson.cn>
Wed, 6 Mar 2024 01:12:13 +0000 (09:12 +0800)
Supported CPUCFG information comes from function _kvm_get_cpucfg_mask().
A bit should be zero if it is reserved by HW or if it is not supported
by KVM.

Also LoongArch software page table walk feature defined in CPUCFG2_LSPW
is supported by KVM, it should be enabled by default.

Signed-off-by: Bibo Mao <maobibo@loongson.cn>
Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
arch/loongarch/kvm/vcpu.c

index 36106922b5d75b7f7de70df5df0d72a697440f0f..3a8779065f73b45425f69b2cf204545dd2e0c908 100644 (file)
@@ -304,11 +304,18 @@ static int _kvm_get_cpucfg_mask(int id, u64 *v)
                return -EINVAL;
 
        switch (id) {
-       case 2:
+       case LOONGARCH_CPUCFG0:
+               *v = GENMASK(31, 0);
+               return 0;
+       case LOONGARCH_CPUCFG1:
+               /* CPUCFG1_MSGINT is not supported by KVM */
+               *v = GENMASK(25, 0);
+               return 0;
+       case LOONGARCH_CPUCFG2:
                /* CPUCFG2 features unconditionally supported by KVM */
                *v = CPUCFG2_FP     | CPUCFG2_FPSP  | CPUCFG2_FPDP     |
                     CPUCFG2_FPVERS | CPUCFG2_LLFTP | CPUCFG2_LLFTPREV |
-                    CPUCFG2_LAM;
+                    CPUCFG2_LSPW | CPUCFG2_LAM;
                /*
                 * For the ISA extensions listed below, if one is supported
                 * by the host, then it is also supported by KVM.
@@ -318,14 +325,26 @@ static int _kvm_get_cpucfg_mask(int id, u64 *v)
                if (cpu_has_lasx)
                        *v |= CPUCFG2_LASX;
 
+               return 0;
+       case LOONGARCH_CPUCFG3:
+               *v = GENMASK(16, 0);
+               return 0;
+       case LOONGARCH_CPUCFG4:
+       case LOONGARCH_CPUCFG5:
+               *v = GENMASK(31, 0);
+               return 0;
+       case LOONGARCH_CPUCFG16:
+               *v = GENMASK(16, 0);
+               return 0;
+       case LOONGARCH_CPUCFG17 ... LOONGARCH_CPUCFG20:
+               *v = GENMASK(30, 0);
                return 0;
        default:
                /*
-                * No restrictions on other valid CPUCFG IDs' values, but
-                * CPUCFG data is limited to 32 bits as the LoongArch ISA
-                * manual says (Volume 1, Section 2.2.10.5 "CPUCFG").
+                * CPUCFG bits should be zero if reserved by HW or not
+                * supported by KVM.
                 */
-               *v = U32_MAX;
+               *v = 0;
                return 0;
        }
 }
@@ -344,7 +363,7 @@ static int kvm_check_cpucfg(int id, u64 val)
                return -EINVAL;
 
        switch (id) {
-       case 2:
+       case LOONGARCH_CPUCFG2:
                if (!(val & CPUCFG2_LLFTP))
                        /* Guests must have a constant timer */
                        return -EINVAL;