mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
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>
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user