]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
KVM: LoongArch: selftests: Add basic interfaces
authorBibo Mao <maobibo@loongson.cn>
Thu, 27 Nov 2025 03:00:18 +0000 (11:00 +0800)
committerHuacai Chen <chenhuacai@loongson.cn>
Thu, 27 Nov 2025 03:00:18 +0000 (11:00 +0800)
Add some basic function interfaces such as CSR register access, local
irq enable or disable APIs.

Signed-off-by: Bibo Mao <maobibo@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 374caddfb0db783143b0fc4ed012d35baf2ed493..f1bfc06a22643806a0c085bddfd7cdfabcb162d1 100644 (file)
 #define  CSR_TLBREHI_PS_SHIFT          0
 #define  CSR_TLBREHI_PS                        (0x3fUL << CSR_TLBREHI_PS_SHIFT)
 
+#define csr_read(csr)                          \
+({                                             \
+       register unsigned long __v;             \
+       __asm__ __volatile__(                   \
+               "csrrd %[val], %[reg]\n\t"      \
+               : [val] "=r" (__v)              \
+               : [reg] "i" (csr)               \
+               : "memory");                    \
+       __v;                                    \
+})
+
+#define csr_write(v, csr)                      \
+({                                             \
+       register unsigned long __v = v;         \
+       __asm__ __volatile__ (                  \
+               "csrwr %[val], %[reg]\n\t"      \
+               : [val] "+r" (__v)              \
+               : [reg] "i" (csr)               \
+               : "memory");                    \
+       __v;                                    \
+})
+
 #define EXREGS_GPRS                    (32)
 
 #ifndef __ASSEMBLER__
@@ -133,6 +155,34 @@ struct ex_regs {
 #define PRMD_OFFSET_EXREGS             offsetof(struct ex_regs, prmd)
 #define EXREGS_SIZE                    sizeof(struct ex_regs)
 
+static inline void cpu_relax(void)
+{
+       asm volatile("nop" ::: "memory");
+}
+
+static inline void local_irq_enable(void)
+{
+       unsigned int flags = CSR_CRMD_IE;
+       register unsigned int mask asm("$t0") = CSR_CRMD_IE;
+
+       __asm__ __volatile__(
+               "csrxchg %[val], %[mask], %[reg]\n\t"
+               : [val] "+r" (flags)
+               : [mask] "r" (mask), [reg] "i" (LOONGARCH_CSR_CRMD)
+               : "memory");
+}
+
+static inline void local_irq_disable(void)
+{
+       unsigned int flags = 0;
+       register unsigned int mask asm("$t0") = CSR_CRMD_IE;
+
+       __asm__ __volatile__(
+               "csrxchg %[val], %[mask], %[reg]\n\t"
+               : [val] "+r" (flags)
+               : [mask] "r" (mask), [reg] "i" (LOONGARCH_CSR_CRMD)
+               : "memory");
+}
 #else
 #define PC_OFFSET_EXREGS               ((EXREGS_GPRS + 0) * 8)
 #define ESTAT_OFFSET_EXREGS            ((EXREGS_GPRS + 1) * 8)
index 0ac1abcb71cb7d05785a272652ac96757daa0024..08b4cef48e443e02e4f327cd89431353202f7786 100644 (file)
@@ -192,6 +192,11 @@ void route_exception(struct ex_regs *regs)
        while (1) ;
 }
 
+uint32_t guest_get_vcpuid(void)
+{
+       return csr_read(LOONGARCH_CSR_CPUID);
+}
+
 void vcpu_args_set(struct kvm_vcpu *vcpu, unsigned int num, ...)
 {
        int i;