Commit 1c5d3a1e authored by Bibo Mao's avatar Bibo Mao Committed by Huacai Chen
Browse files

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: default avatarBibo Mao <maobibo@loongson.cn>
Signed-off-by: default avatarHuacai Chen <chenhuacai@loongson.cn>
parent 985a9698
Loading
Loading
Loading
Loading
+50 −0
Original line number Diff line number Diff line
@@ -113,6 +113,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__
@@ -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)
+5 −0
Original line number Diff line number Diff line
@@ -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;