📄 mipsregs.h
字号:
#define ST0_CH 0x00040000#define ST0_SR 0x00100000#define ST0_TS 0x00200000#define ST0_BEV 0x00400000#define ST0_RE 0x02000000#define ST0_FR 0x04000000#define ST0_CU 0xf0000000#define ST0_CU0 0x10000000#define ST0_CU1 0x20000000#define ST0_CU2 0x40000000#define ST0_CU3 0x80000000#define ST0_XX 0x80000000 /* MIPS IV naming *//* * Bitfields and bit numbers in the coprocessor 0 cause register. * * Refer to your MIPS R4xx0 manual, chapter 5 for explanation. */#define CAUSEB_EXCCODE 2#define CAUSEF_EXCCODE (_ULCAST_(31) << 2)#define CAUSEB_IP 8#define CAUSEF_IP (_ULCAST_(255) << 8)#define CAUSEB_IP0 8#define CAUSEF_IP0 (_ULCAST_(1) << 8)#define CAUSEB_IP1 9#define CAUSEF_IP1 (_ULCAST_(1) << 9)#define CAUSEB_IP2 10#define CAUSEF_IP2 (_ULCAST_(1) << 10)#define CAUSEB_IP3 11#define CAUSEF_IP3 (_ULCAST_(1) << 11)#define CAUSEB_IP4 12#define CAUSEF_IP4 (_ULCAST_(1) << 12)#define CAUSEB_IP5 13#define CAUSEF_IP5 (_ULCAST_(1) << 13)#define CAUSEB_IP6 14#define CAUSEF_IP6 (_ULCAST_(1) << 14)#define CAUSEB_IP7 15#define CAUSEF_IP7 (_ULCAST_(1) << 15)#define CAUSEB_IV 23#define CAUSEF_IV (_ULCAST_(1) << 23)#define CAUSEB_CE 28#define CAUSEF_CE (_ULCAST_(3) << 28)#define CAUSEB_BD 31#define CAUSEF_BD (_ULCAST_(1) << 31)/* * Bits in the coprocessor 0 config register. *//* Generic bits. */#define CONF_CM_CACHABLE_NO_WA 0#define CONF_CM_CACHABLE_WA 1#define CONF_CM_UNCACHED 2#define CONF_CM_CACHABLE_NONCOHERENT 3#define CONF_CM_CACHABLE_CE 4#define CONF_CM_CACHABLE_COW 5#define CONF_CM_CACHABLE_CUW 6#define CONF_CM_CACHABLE_ACCELERATED 7#define CONF_CM_CMASK 7#define CONF_BE (_ULCAST_(1) << 15)/* Bits common to various processors. */#define CONF_CU (_ULCAST_(1) << 3)#define CONF_DB (_ULCAST_(1) << 4)#define CONF_IB (_ULCAST_(1) << 5)#define CONF_DC (_ULCAST_(7) << 6)#define CONF_IC (_ULCAST_(7) << 9)#define CONF_EB (_ULCAST_(1) << 13)#define CONF_EM (_ULCAST_(1) << 14)#define CONF_SM (_ULCAST_(1) << 16)#define CONF_SC (_ULCAST_(1) << 17)#define CONF_EW (_ULCAST_(3) << 18)#define CONF_EP (_ULCAST_(15)<< 24)#define CONF_EC (_ULCAST_(7) << 28)#define CONF_CM (_ULCAST_(1) << 31)/* Bits specific to the R4xx0. */#define R4K_CONF_SW (_ULCAST_(1) << 20)#define R4K_CONF_SS (_ULCAST_(1) << 21)#define R4K_CONF_SB (_ULCAST_(3) << 22)/* Bits specific to the R5000. */#define R5K_CONF_SE (_ULCAST_(1) << 12)#define R5K_CONF_SS (_ULCAST_(3) << 20)/* Bits specific to the R10000. */#define R10K_CONF_DN (_ULCAST_(3) << 3)#define R10K_CONF_CT (_ULCAST_(1) << 5)#define R10K_CONF_PE (_ULCAST_(1) << 6)#define R10K_CONF_PM (_ULCAST_(3) << 7)#define R10K_CONF_EC (_ULCAST_(15)<< 9)#define R10K_CONF_SB (_ULCAST_(1) << 13)#define R10K_CONF_SK (_ULCAST_(1) << 14)#define R10K_CONF_SS (_ULCAST_(7) << 16)#define R10K_CONF_SC (_ULCAST_(7) << 19)#define R10K_CONF_DC (_ULCAST_(7) << 26)#define R10K_CONF_IC (_ULCAST_(7) << 29)/* Bits specific to the VR41xx. */#define VR41_CONF_CS (_ULCAST_(1) << 12)#define VR41_CONF_M16 (_ULCAST_(1) << 20)#define VR41_CONF_AD (_ULCAST_(1) << 23)/* Bits specific to the R30xx. */#define R30XX_CONF_FDM (_ULCAST_(1) << 19)#define R30XX_CONF_REV (_ULCAST_(1) << 22)#define R30XX_CONF_AC (_ULCAST_(1) << 23)#define R30XX_CONF_RF (_ULCAST_(1) << 24)#define R30XX_CONF_HALT (_ULCAST_(1) << 25)#define R30XX_CONF_FPINT (_ULCAST_(7) << 26)#define R30XX_CONF_DBR (_ULCAST_(1) << 29)#define R30XX_CONF_SB (_ULCAST_(1) << 30)#define R30XX_CONF_LOCK (_ULCAST_(1) << 31)/* Bits specific to the TX49. */#define TX49_CONF_DC (_ULCAST_(1) << 16)#define TX49_CONF_IC (_ULCAST_(1) << 17) /* conflict with CONF_SC */#define TX49_CONF_HALT (_ULCAST_(1) << 18)#define TX49_CONF_CWFON (_ULCAST_(1) << 27)/* Bits specific to the MIPS32/64 PRA. */#define MIPS_CONF_MT (_ULCAST_(7) << 7)#define MIPS_CONF_AR (_ULCAST_(7) << 10)#define MIPS_CONF_AT (_ULCAST_(3) << 13)#define MIPS_CONF_M (_ULCAST_(1) << 31)/* * R10000 performance counter definitions. * * FIXME: The R10000 performance counter opens a nice way to implement CPU * time accounting with a precission of one cycle. I don't have * R10000 silicon but just a manual, so ... *//* * Events counted by counter #0 */#define CE0_CYCLES 0#define CE0_INSN_ISSUED 1#define CE0_LPSC_ISSUED 2#define CE0_S_ISSUED 3#define CE0_SC_ISSUED 4#define CE0_SC_FAILED 5#define CE0_BRANCH_DECODED 6#define CE0_QW_WB_SECONDARY 7#define CE0_CORRECTED_ECC_ERRORS 8#define CE0_ICACHE_MISSES 9#define CE0_SCACHE_I_MISSES 10#define CE0_SCACHE_I_WAY_MISSPREDICTED 11#define CE0_EXT_INTERVENTIONS_REQ 12#define CE0_EXT_INVALIDATE_REQ 13#define CE0_VIRTUAL_COHERENCY_COND 14#define CE0_INSN_GRADUATED 15/* * Events counted by counter #1 */#define CE1_CYCLES 0#define CE1_INSN_GRADUATED 1#define CE1_LPSC_GRADUATED 2#define CE1_S_GRADUATED 3#define CE1_SC_GRADUATED 4#define CE1_FP_INSN_GRADUATED 5#define CE1_QW_WB_PRIMARY 6#define CE1_TLB_REFILL 7#define CE1_BRANCH_MISSPREDICTED 8#define CE1_DCACHE_MISS 9#define CE1_SCACHE_D_MISSES 10#define CE1_SCACHE_D_WAY_MISSPREDICTED 11#define CE1_EXT_INTERVENTION_HITS 12#define CE1_EXT_INVALIDATE_REQ 13#define CE1_SP_HINT_TO_CEXCL_SC_BLOCKS 14#define CE1_SP_HINT_TO_SHARED_SC_BLOCKS 15/* * These flags define in which priviledge mode the counters count events */#define CEB_USER 8 /* Count events in user mode, EXL = ERL = 0 */#define CEB_SUPERVISOR 4 /* Count events in supvervisor mode EXL = ERL = 0 */#define CEB_KERNEL 2 /* Count events in kernel mode EXL = ERL = 0 */#define CEB_EXL 1 /* Count events with EXL = 1, ERL = 0 */#ifndef __ASSEMBLY__#define CAUSE_EXCCODE(x) ((CAUSEF_EXCCODE & (x->cp0_cause)) >> CAUSEB_EXCCODE)#define CAUSE_EPC(x) (x->cp0_epc + (((x->cp0_cause & CAUSEF_BD) >> CAUSEB_BD) << 2))/* * Functions to access the r10k performance counter and control registers */#define read_r10k_perf_cntr(counter) \({ unsigned int __res; \ __asm__ __volatile__( \ "mfpc\t%0, "STR(counter) \ : "=r" (__res)); \ __res;})#define write_r10k_perf_cntr(counter,val) \ __asm__ __volatile__( \ "mtpc\t%0, "STR(counter) \ : : "r" (val));#define read_r10k_perf_cntl(counter) \({ unsigned int __res; \ __asm__ __volatile__( \ "mfps\t%0, "STR(counter) \ : "=r" (__res)); \ __res;})#define write_r10k_perf_cntl(counter,val) \ __asm__ __volatile__( \ "mtps\t%0, "STR(counter) \ : : "r" (val));/* * Macros to access the system control coprocessor */#define __read_32bit_c0_register(source, sel) \({ int __res; \ if (sel == 0) \ __asm__ __volatile__( \ "mfc0\t%0, " #source "\n\t" \ : "=r" (__res)); \ else \ __asm__ __volatile__( \ ".set\tmips32\n\t" \ "mfc0\t%0, " #source ", " #sel "\n\t" \ ".set\tmips0\n\t" \ : "=r" (__res)); \ __res; \})#define __read_64bit_c0_register(source, sel) \({ unsigned long __res; \ if (sel == 0) \ __asm__ __volatile__( \ ".set\tmips3\n\t" \ "dmfc0\t%0, " #source "\n\t" \ ".set\tmips0" \ : "=r" (__res)); \ else \ __asm__ __volatile__( \ ".set\tmips64\n\t" \ "dmfc0\t%0, " #source ", " #sel "\n\t" \ ".set\tmips0" \ : "=r" (__res)); \ __res; \})#define __write_32bit_c0_register(register, sel, value) \do { \ if (sel == 0) \ __asm__ __volatile__( \ "mtc0\t%z0, " #register "\n\t" \ : : "Jr" (value)); \ else \ __asm__ __volatile__( \ ".set\tmips32\n\t" \ "mtc0\t%z0, " #register ", " #sel "\n\t" \ ".set\tmips0" \ : : "Jr" (value)); \} while (0)#define __write_64bit_c0_register(register, sel, value) \do { \ if (sel == 0) \ __asm__ __volatile__( \ ".set\tmips3\n\t" \ "dmtc0\t%z0, " #register "\n\t" \ ".set\tmips0" \ : : "Jr" (value)); \ else \ __asm__ __volatile__( \ ".set\tmips64\n\t" \ "dmtc0\t%z0, " #register ", " #sel "\n\t" \ ".set\tmips0" \ : : "Jr" (value)); \} while (0)#define __read_ulong_c0_register(reg, sel) \ ((sizeof(unsigned long) == 4) ? \ __read_32bit_c0_register(reg, sel) : \ __read_64bit_c0_register(reg, sel))#define __write_ulong_c0_register(reg, sel, val) \do { \ if (sizeof(unsigned long) == 4) \ __write_32bit_c0_register(reg, sel, val); \ else \ __write_64bit_c0_register(reg, sel, val); \} while (0)/* * These versions are only needed for systems with more than 38 bits of * physical address space running the 32-bit kernel. That's none atm :-) */#define __read_64bit_c0_split(source, sel) \({ \ unsigned long long val; \ unsigned long flags; \ \ local_irq_save(flags); \ if (sel == 0) \ __asm__ __volatile__( \ ".set\tmips64\n\t" \ "dmfc0\t%M0, " #source "\n\t" \ "dsll\t%L0, %M0, 32\n\t" \ "dsrl\t%M0, %M0, 32\n\t" \ "dsrl\t%L0, %L0, 32\n\t" \ ".set\tmips0" \ : "=r" (val)); \ else \ __asm__ __volatile__( \ ".set\tmips64\n\t" \ "dmfc0\t%M0, " #source ", " #sel "\n\t" \ "dsll\t%L0, %M0, 32\n\t" \ "dsrl\t%M0, %M0, 32\n\t" \ "dsrl\t%L0, %L0, 32\n\t" \ ".set\tmips0" \ : "=r" (val)); \ local_irq_restore(flags); \ \ val; \})#define __write_64bit_c0_split(source, sel, val) \do { \ unsigned long flags; \ \
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -