Path: blob/master/tools/testing/selftests/kvm/include/loongarch/processor.h
49294 views
/* SPDX-License-Identifier: GPL-2.0-only */12#ifndef SELFTEST_KVM_PROCESSOR_H3#define SELFTEST_KVM_PROCESSOR_H45#ifndef __ASSEMBLER__6#include "ucall_common.h"78#else9/* general registers */10#define zero $r011#define ra $r112#define tp $r213#define sp $r314#define a0 $r415#define a1 $r516#define a2 $r617#define a3 $r718#define a4 $r819#define a5 $r920#define a6 $r1021#define a7 $r1122#define t0 $r1223#define t1 $r1324#define t2 $r1425#define t3 $r1526#define t4 $r1627#define t5 $r1728#define t6 $r1829#define t7 $r1930#define t8 $r2031#define u0 $r2132#define fp $r2233#define s0 $r2334#define s1 $r2435#define s2 $r2536#define s3 $r2637#define s4 $r2738#define s5 $r2839#define s6 $r2940#define s7 $r3041#define s8 $r3142#endif4344/*45* LoongArch page table entry definition46* Original header file arch/loongarch/include/asm/loongarch.h47*/48#define _PAGE_VALID_SHIFT 049#define _PAGE_DIRTY_SHIFT 150#define _PAGE_PLV_SHIFT 2 /* 2~3, two bits */51#define PLV_KERN 052#define PLV_USER 353#define PLV_MASK 0x354#define _CACHE_SHIFT 4 /* 4~5, two bits */55#define _PAGE_PRESENT_SHIFT 756#define _PAGE_WRITE_SHIFT 85758#define _PAGE_VALID BIT_ULL(_PAGE_VALID_SHIFT)59#define _PAGE_PRESENT BIT_ULL(_PAGE_PRESENT_SHIFT)60#define _PAGE_WRITE BIT_ULL(_PAGE_WRITE_SHIFT)61#define _PAGE_DIRTY BIT_ULL(_PAGE_DIRTY_SHIFT)62#define _PAGE_USER (PLV_USER << _PAGE_PLV_SHIFT)63#define __READABLE (_PAGE_VALID)64#define __WRITEABLE (_PAGE_DIRTY | _PAGE_WRITE)65/* Coherent Cached */66#define _CACHE_CC BIT_ULL(_CACHE_SHIFT)67#define PS_4K 0x0000000c68#define PS_16K 0x0000000e69#define PS_64K 0x0000001070#define PS_DEFAULT_SIZE PS_16K7172/* LoongArch Basic CSR registers */73#define LOONGARCH_CSR_CRMD 0x0 /* Current mode info */74#define CSR_CRMD_PG_SHIFT 475#define CSR_CRMD_PG BIT_ULL(CSR_CRMD_PG_SHIFT)76#define CSR_CRMD_IE_SHIFT 277#define CSR_CRMD_IE BIT_ULL(CSR_CRMD_IE_SHIFT)78#define CSR_CRMD_PLV_SHIFT 079#define CSR_CRMD_PLV_WIDTH 280#define CSR_CRMD_PLV (0x3UL << CSR_CRMD_PLV_SHIFT)81#define PLV_MASK 0x382#define LOONGARCH_CSR_PRMD 0x183#define LOONGARCH_CSR_EUEN 0x284#define LOONGARCH_CSR_ECFG 0x485#define ECFGB_TIMER 1186#define ECFGF_TIMER (BIT_ULL(ECFGB_TIMER))87#define LOONGARCH_CSR_ESTAT 0x5 /* Exception status */88#define CSR_ESTAT_EXC_SHIFT 1689#define CSR_ESTAT_EXC_WIDTH 690#define CSR_ESTAT_EXC (0x3f << CSR_ESTAT_EXC_SHIFT)91#define EXCCODE_INT 0 /* Interrupt */92#define INT_TI 11 /* Timer interrupt*/93#define LOONGARCH_CSR_ERA 0x6 /* ERA */94#define LOONGARCH_CSR_BADV 0x7 /* Bad virtual address */95#define LOONGARCH_CSR_EENTRY 0xc96#define LOONGARCH_CSR_TLBIDX 0x10 /* TLB Index, EHINV, PageSize */97#define CSR_TLBIDX_PS_SHIFT 2498#define CSR_TLBIDX_PS_WIDTH 699#define CSR_TLBIDX_PS (0x3fUL << CSR_TLBIDX_PS_SHIFT)100#define CSR_TLBIDX_SIZEM 0x3f000000101#define CSR_TLBIDX_SIZE CSR_TLBIDX_PS_SHIFT102#define LOONGARCH_CSR_ASID 0x18 /* ASID */103#define LOONGARCH_CSR_PGDL 0x19104#define LOONGARCH_CSR_PGDH 0x1a105/* Page table base */106#define LOONGARCH_CSR_PGD 0x1b107#define LOONGARCH_CSR_PWCTL0 0x1c108#define LOONGARCH_CSR_PWCTL1 0x1d109#define LOONGARCH_CSR_STLBPGSIZE 0x1e110#define LOONGARCH_CSR_CPUID 0x20111#define LOONGARCH_CSR_KS0 0x30112#define LOONGARCH_CSR_KS1 0x31113#define LOONGARCH_CSR_TMID 0x40114#define LOONGARCH_CSR_TCFG 0x41115#define CSR_TCFG_VAL (BIT_ULL(48) - BIT_ULL(2))116#define CSR_TCFG_PERIOD_SHIFT 1117#define CSR_TCFG_PERIOD (0x1UL << CSR_TCFG_PERIOD_SHIFT)118#define CSR_TCFG_EN (0x1UL)119#define LOONGARCH_CSR_TVAL 0x42120#define LOONGARCH_CSR_TINTCLR 0x44 /* Timer interrupt clear */121#define CSR_TINTCLR_TI_SHIFT 0122#define CSR_TINTCLR_TI (1 << CSR_TINTCLR_TI_SHIFT)123/* TLB refill exception entry */124#define LOONGARCH_CSR_TLBRENTRY 0x88125#define LOONGARCH_CSR_TLBRSAVE 0x8b126#define LOONGARCH_CSR_TLBREHI 0x8e127#define CSR_TLBREHI_PS_SHIFT 0128#define CSR_TLBREHI_PS (0x3fUL << CSR_TLBREHI_PS_SHIFT)129130#define csr_read(csr) \131({ \132register unsigned long __v; \133__asm__ __volatile__( \134"csrrd %[val], %[reg]\n\t" \135: [val] "=r" (__v) \136: [reg] "i" (csr) \137: "memory"); \138__v; \139})140141#define csr_write(v, csr) \142({ \143register unsigned long __v = v; \144__asm__ __volatile__ ( \145"csrwr %[val], %[reg]\n\t" \146: [val] "+r" (__v) \147: [reg] "i" (csr) \148: "memory"); \149__v; \150})151152#define EXREGS_GPRS (32)153154#ifndef __ASSEMBLER__155void handle_tlb_refill(void);156void handle_exception(void);157158struct ex_regs {159unsigned long regs[EXREGS_GPRS];160unsigned long pc;161unsigned long estat;162unsigned long badv;163unsigned long prmd;164};165166#define PC_OFFSET_EXREGS offsetof(struct ex_regs, pc)167#define ESTAT_OFFSET_EXREGS offsetof(struct ex_regs, estat)168#define BADV_OFFSET_EXREGS offsetof(struct ex_regs, badv)169#define PRMD_OFFSET_EXREGS offsetof(struct ex_regs, prmd)170#define EXREGS_SIZE sizeof(struct ex_regs)171172#define VECTOR_NUM 64173174typedef void(*handler_fn)(struct ex_regs *);175176struct handlers {177handler_fn exception_handlers[VECTOR_NUM];178};179180void vm_init_descriptor_tables(struct kvm_vm *vm);181void vm_install_exception_handler(struct kvm_vm *vm, int vector, handler_fn handler);182183static inline void cpu_relax(void)184{185asm volatile("nop" ::: "memory");186}187188static inline void local_irq_enable(void)189{190unsigned int flags = CSR_CRMD_IE;191register unsigned int mask asm("$t0") = CSR_CRMD_IE;192193__asm__ __volatile__(194"csrxchg %[val], %[mask], %[reg]\n\t"195: [val] "+r" (flags)196: [mask] "r" (mask), [reg] "i" (LOONGARCH_CSR_CRMD)197: "memory");198}199200static inline void local_irq_disable(void)201{202unsigned int flags = 0;203register unsigned int mask asm("$t0") = CSR_CRMD_IE;204205__asm__ __volatile__(206"csrxchg %[val], %[mask], %[reg]\n\t"207: [val] "+r" (flags)208: [mask] "r" (mask), [reg] "i" (LOONGARCH_CSR_CRMD)209: "memory");210}211#else212#define PC_OFFSET_EXREGS ((EXREGS_GPRS + 0) * 8)213#define ESTAT_OFFSET_EXREGS ((EXREGS_GPRS + 1) * 8)214#define BADV_OFFSET_EXREGS ((EXREGS_GPRS + 2) * 8)215#define PRMD_OFFSET_EXREGS ((EXREGS_GPRS + 3) * 8)216#define EXREGS_SIZE ((EXREGS_GPRS + 4) * 8)217#endif218219#endif /* SELFTEST_KVM_PROCESSOR_H */220221222