Hi, Bibo, On Tue, Nov 4, 2025 at 7:37 PM Bibo Mao <[email protected]> wrote: > > Add some basic function interfaces such as CSR register access, > local irq enable or disable APIs. This is "basic interfaces", so better to be before Patch-2 (or keep the order but change the subject)?
Huacai > > Signed-off-by: Bibo Mao <[email protected]> > --- > .../kvm/include/loongarch/processor.h | 52 +++++++++++++++++++ > .../selftests/kvm/lib/loongarch/processor.c | 5 ++ > 2 files changed, 57 insertions(+) > > diff --git a/tools/testing/selftests/kvm/include/loongarch/processor.h > b/tools/testing/selftests/kvm/include/loongarch/processor.h > index a18ac7bff303..b027f8f4dac7 100644 > --- a/tools/testing/selftests/kvm/include/loongarch/processor.h > +++ b/tools/testing/selftests/kvm/include/loongarch/processor.h > @@ -118,6 +118,28 @@ > #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__ > @@ -147,6 +169,36 @@ struct handlers { > void vm_init_descriptor_tables(struct kvm_vm *vm); > void vm_install_exception_handler(struct kvm_vm *vm, int vector, handler_fn > handler); > > +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"); > +} > + > +static inline void cpu_relax(void) > +{ > + asm volatile("nop" ::: "memory"); > +} > #else > #define PC_OFFSET_EXREGS ((EXREGS_GPRS + 0) * 8) > #define ESTAT_OFFSET_EXREGS ((EXREGS_GPRS + 1) * 8) > diff --git a/tools/testing/selftests/kvm/lib/loongarch/processor.c > b/tools/testing/selftests/kvm/lib/loongarch/processor.c > index be537c5ff74e..20ba476ccb72 100644 > --- a/tools/testing/selftests/kvm/lib/loongarch/processor.c > +++ b/tools/testing/selftests/kvm/lib/loongarch/processor.c > @@ -373,3 +373,8 @@ void vcpu_arch_set_entry_point(struct kvm_vcpu *vcpu, > void *guest_code) > regs.pc = (uint64_t)guest_code; > vcpu_regs_set(vcpu, ®s); > } > + > +uint32_t guest_get_vcpuid(void) > +{ > + return csr_read(LOONGARCH_CSR_CPUID); > +} > -- > 2.39.3 >

