]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
KVM: LoongArch: selftests: Add cpucfg read/write helpers
authorSong Gao <gaosong@loongson.cn>
Thu, 9 Apr 2026 10:56:37 +0000 (18:56 +0800)
committerHuacai Chen <chenhuacai@loongson.cn>
Thu, 9 Apr 2026 10:56:37 +0000 (18:56 +0800)
Add helper macros and functions to read and write CPU configuration
registers (cpucfg) from the guest and from the VMM. This interface is
required in upcoming selftests for querying and setting CPU features,
such as PMU capabilities.

Signed-off-by: Song Gao <gaosong@loongson.cn>
Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
tools/testing/selftests/kvm/include/loongarch/processor.h
tools/testing/selftests/kvm/lib/loongarch/processor.c

index 76840ddda57d1a9bb44bbbc9aaabc8d79311052b..6c1e59484485f4ce4312c4b3a45449e83d9c2d26 100644 (file)
 #define  CSR_TLBREHI_PS_SHIFT          0
 #define  CSR_TLBREHI_PS                        (0x3fUL << CSR_TLBREHI_PS_SHIFT)
 
+#define read_cpucfg(reg)                       \
+({                                             \
+       register unsigned long __v;             \
+       __asm__ __volatile__(                   \
+               "cpucfg %0, %1\n\t"             \
+               : "=r" (__v)                    \
+               : "r" (reg)                     \
+               : "memory");                    \
+        __v;                                   \
+})
+
 #define csr_read(csr)                          \
 ({                                             \
        register unsigned long __v;             \
index 17aa55a2047a0c61a224641336a91e63a534eb95..0ad4544517e95873423da01c950f23f82eb6bb23 100644 (file)
@@ -251,6 +251,14 @@ static void loongarch_set_reg(struct kvm_vcpu *vcpu, uint64_t id, uint64_t val)
        __vcpu_set_reg(vcpu, id, val);
 }
 
+static void loongarch_set_cpucfg(struct kvm_vcpu *vcpu, uint64_t id, uint64_t val)
+{
+       uint64_t cfgid;
+
+       cfgid = KVM_REG_LOONGARCH_CPUCFG | KVM_REG_SIZE_U64 | 8 * id;
+       __vcpu_set_reg(vcpu, cfgid, val);
+}
+
 static void loongarch_get_csr(struct kvm_vcpu *vcpu, uint64_t id, void *addr)
 {
        uint64_t csrid;