Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

KVM: LoongArch: selftests: Add basic interfaces

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>

authored by

Bibo Mao and committed by
Huacai Chen
1c5d3a1e 985a9698

+55
+50
tools/testing/selftests/kvm/include/loongarch/processor.h
··· 113 113 #define CSR_TLBREHI_PS_SHIFT 0 114 114 #define CSR_TLBREHI_PS (0x3fUL << CSR_TLBREHI_PS_SHIFT) 115 115 116 + #define csr_read(csr) \ 117 + ({ \ 118 + register unsigned long __v; \ 119 + __asm__ __volatile__( \ 120 + "csrrd %[val], %[reg]\n\t" \ 121 + : [val] "=r" (__v) \ 122 + : [reg] "i" (csr) \ 123 + : "memory"); \ 124 + __v; \ 125 + }) 126 + 127 + #define csr_write(v, csr) \ 128 + ({ \ 129 + register unsigned long __v = v; \ 130 + __asm__ __volatile__ ( \ 131 + "csrwr %[val], %[reg]\n\t" \ 132 + : [val] "+r" (__v) \ 133 + : [reg] "i" (csr) \ 134 + : "memory"); \ 135 + __v; \ 136 + }) 137 + 116 138 #define EXREGS_GPRS (32) 117 139 118 140 #ifndef __ASSEMBLER__ ··· 155 133 #define PRMD_OFFSET_EXREGS offsetof(struct ex_regs, prmd) 156 134 #define EXREGS_SIZE sizeof(struct ex_regs) 157 135 136 + static inline void cpu_relax(void) 137 + { 138 + asm volatile("nop" ::: "memory"); 139 + } 140 + 141 + static inline void local_irq_enable(void) 142 + { 143 + unsigned int flags = CSR_CRMD_IE; 144 + register unsigned int mask asm("$t0") = CSR_CRMD_IE; 145 + 146 + __asm__ __volatile__( 147 + "csrxchg %[val], %[mask], %[reg]\n\t" 148 + : [val] "+r" (flags) 149 + : [mask] "r" (mask), [reg] "i" (LOONGARCH_CSR_CRMD) 150 + : "memory"); 151 + } 152 + 153 + static inline void local_irq_disable(void) 154 + { 155 + unsigned int flags = 0; 156 + register unsigned int mask asm("$t0") = CSR_CRMD_IE; 157 + 158 + __asm__ __volatile__( 159 + "csrxchg %[val], %[mask], %[reg]\n\t" 160 + : [val] "+r" (flags) 161 + : [mask] "r" (mask), [reg] "i" (LOONGARCH_CSR_CRMD) 162 + : "memory"); 163 + } 158 164 #else 159 165 #define PC_OFFSET_EXREGS ((EXREGS_GPRS + 0) * 8) 160 166 #define ESTAT_OFFSET_EXREGS ((EXREGS_GPRS + 1) * 8)
+5
tools/testing/selftests/kvm/lib/loongarch/processor.c
··· 192 192 while (1) ; 193 193 } 194 194 195 + uint32_t guest_get_vcpuid(void) 196 + { 197 + return csr_read(LOONGARCH_CSR_CPUID); 198 + } 199 + 195 200 void vcpu_args_set(struct kvm_vcpu *vcpu, unsigned int num, ...) 196 201 { 197 202 int i;