r4kc0.h

来自「国产CPU-龙芯(loongson)BIOS源代码」· C头文件 代码 · 共 490 行

H
490
字号
/* * r4kc0.h : SDE R4000 coprocessor 0 definitions * * Copyright (c) 1992-1999, Algorithmics Ltd.  All rights reserved. * * This program is free software; you can redistribute it and/or modify  * it under the terms of the "Free MIPS" License Agreement, a copy of  * which is available at: * *  http://www.algor.co.uk/ftp/pub/doc/freemips-license.txt * * You may not, however, modify or remove any part of this copyright  * message if this program is redistributed or reused in whole or in * part. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * "Free MIPS" License for more details.   */#ifndef _R4KC0_H_#ifdef __cplusplusextern "C" {#endif#define _R4KC0_H_#if #mmu(no)#include <mips/notlb.h>#else#assert mmu(r4k)#include <mips/r4ktlb.h>#endif/* * R4000 Exception Codes */#define EXC_INTR	0	/* interrupt */#define EXC_MOD		1	/* tlb modification */#define EXC_TLBL	2	/* tlb miss (load/i-fetch) */#define EXC_TLBS	3	/* tlb miss (store) */#define EXC_ADEL	4	/* address error (load/i-fetch) */#define EXC_ADES	5	/* address error (store) */#define EXC_IBE		6	/* bus error (i-fetch) */#define EXC_DBE		7	/* data bus error (load/store) */#define EXC_SYS		8	/* system call */#define EXC_BP		9	/* breakpoint */#define EXC_RI		10	/* reserved instruction */#define EXC_CPU		11	/* coprocessor unusable */#define EXC_OVF		12	/* integer overflow */#define EXC_TRAP	13	/* trap exception */#define EXC_VCEI	14	/* virtual coherency error (i-cache) */#define EXC_FPE		15	/* floating point exception */#define EXC_C2E		16	/* coprocessor 2 exception */#define EXC_RES17	17#define EXC_RES18	18#define EXC_RES19	19#define EXC_RES20	20#define EXC_RES21	21#define EXC_RES22	22#if !#cpu(r4600) && !#cpu(r4700)#define EXC_WATCH	23	/* watchpoint */#endif#define EXC_RES24	24#define EXC_RES25	25#define EXC_RES26	26#define EXC_RES27	27#define EXC_RES28	28#define EXC_RES29	29#define EXC_RES30	30#define EXC_VCED	31	/* virtual coherency error (d-cache) *//* * R4000 Cause Register  */#define CR_BD		0x80000000	/* branch delay */#define CR_CEMASK	0x30000000      /* coprocessor used */#define CR_CESHIFT	28/* interrupt pending bits */#define CR_SINT0	0x00000100 	/* s/w interrupt 0 */#define CR_SINT1	0x00000200	/* s/w interrupt 1 */#define CR_HINT0	0x00000400	/* h/w interrupt 0 */#define CR_HINT1	0x00000800	/* h/w interrupt 1 */#define CR_HINT2	0x00001000	/* h/w interrupt 2 */#define CR_HINT3	0x00002000	/* h/w interrupt 3 */#define CR_HINT4	0x00004000	/* h/w interrupt 4 */#define CR_HINT5	0x00008000	/* h/w interrupt 5 *//* alternative interrupt pending bit naming */#define CR_IP0		0x00000100#define CR_IP1		0x00000200#define CR_IP2		0x00000400#define CR_IP3		0x00000800#define CR_IP4		0x00001000#define CR_IP5		0x00002000#define CR_IP6		0x00004000#define CR_IP7		0x00008000#define CR_IMASK	0x0000ff00 	/* interrupt pending mask */#define CR_XMASK	0x0000007c 	/* exception code mask */#define CR_XCPT(x)	((x)<<2)/* * R4000 Status Register  */#define SR_IE		0x00000001 	/* interrupt enable */#define SR_EXL		0x00000002	/* exception level */#define SR_ERL		0x00000004	/* error level */#define SR_KSU_MASK	0x00000018	/* ksu mode mask */#define SR_KSU_USER	0x00000010	/* user mode */#define SR_KSU_SPVS	0x00000008	/* supervisor mode */#define SR_KSU_KERN	0x00000000	/* kernel mode */#define SR_UX		0x00000020	/* mips3 & xtlb in user mode */#define SR_SX		0x00000040	/* mips3 & xtlb in supervisor mode */#define SR_KX		0x00000080	/* xtlb in kernel mode *//* interrupt mask bits */#define SR_SINT0	0x00000100	/* enable s/w interrupt 0 */#define SR_SINT1	0x00000200	/* enable s/w interrupt 1 */#define SR_HINT0	0x00000400	/* enable h/w interrupt 1 */#define SR_HINT1	0x00000800	/* enable h/w interrupt 2 */#define SR_HINT2	0x00001000	/* enable h/w interrupt 3 */#define SR_HINT3	0x00002000	/* enable h/w interrupt 4 */#define SR_HINT4	0x00004000	/* enable h/w interrupt 5 */#define SR_HINT5	0x00008000	/* enable h/w interrupt 6 *//* alternative interrupt mask naming */#define SR_IM0		0x00000100#define SR_IM1		0x00000200#define SR_IM2		0x00000400#define SR_IM3		0x00000800#define SR_IM4		0x00001000#define SR_IM5		0x00002000#define SR_IM6		0x00004000#define SR_IM7		0x00008000#define SR_IMASK	0x0000ff00/* diagnostic field */#define SR_DE		0x00010000	/* disable cache/ecc errors */#define SR_CE		0x00020000	/* use ecc register */#define SR_CH		0x00040000 	/* cache hit indicator */#define SR_SR		0x00100000	/* soft reset occurred */#define SR_TS		0x00200000	/* TLB shutdown */#define SR_BEV		0x00400000	/* boot exception vectors */#define SR_RE		0x02000000	/* reverse endian (user mode) */#define SR_FR		0x04000000	/* 64-bit fpu registers */#define SR_RP		0x08000000	/* reduce power */#define SR_CU0		0x10000000	/* coprocessor 0 enable */#define SR_CU1		0x20000000	/* coprocessor 1 enable */#define SR_CU2		0x40000000	/* coprocessor 2 enable */#define SR_CU3		0x80000000	/* coprocessor 3 enable *//* * R4000 Config Register  */#define CFG_CM		0x80000000	/* Master-Checker mode */#define CFG_ECMASK	0x70000000	/* System Clock Ratio */#define CFG_ECSHIFT	28#define CFG_EPMASK	0x0f000000	/* Transmit data pattern */#define CFG_EPD		0x00000000	/* D */#define CFG_EPDDX	0x01000000	/* DDX */#define CFG_EPDDXX	0x02000000	/* DDXX */#define CFG_EPDXDX	0x03000000	/* DXDX */#define CFG_EPDDXXX	0x04000000	/* DDXXX */#define CFG_EPDDXXXX	0x05000000	/* DDXXXX */#define CFG_EPDXXDXX	0x06000000	/* DXXDXX */#define CFG_EPDDXXXXX	0x07000000	/* DDXXXXX */#define CFG_EPDXXXDXXX	0x08000000	/* DXXXDXXX */#define CFG_AD		0x00800000	/* Accelerated Data (Vr4100) */#define CFG_SBMASK	0x00c00000	/* Secondary cache block size */#define CFG_SBSHIFT	22#define CFG_SB4		0x00000000	/* 4 words */#define CFG_SB8		0x00400000	/* 8 words */#define CFG_SB16	0x00800000	/* 16 words */#define CFG_SB32	0x00c00000	/* 32 words */#define CFG_EMMASK	0x00c00000	/* Vr54xx: SysAD mode */#define CFG_EM_R4K	0x00000000	/* Vr54xx: R4x00 compatible */#define CFG_EM_SPLITRD	0x00400000	/* Vr54xx: Multiple split reads */#define CFG_EM_PIPEWR	0x00800000	/* Vr54xx: Pipeline writes */#define CFG_EM_REISSUE	0x00c00000	/* Vr54xx: Write-reissue */#define CFG_SS		0x00200000	/* Split secondary cache */#define CFG_SW		0x00100000	/* Secondary cache port width */#define CFG_EWMASK	0x000c0000	/* System port width */#define CFG_EWSHIFT	18#define CFG_EW64	0x00000000	/* 64 bit */#define CFG_EW32	0x00040000	/* 32 bit */#define CFG_SC		0x00020000	/* Secondary cache absent */#define CFG_SM		0x00010000	/* Dirty Shared mode disabled */#define CFG_BE		0x00008000	/* Big Endian */#define CFG_EM		0x00004000	/* ECC mode enable */#define CFG_EB		0x00002000	/* Block ordering */#define CFG_CS		0x00001000 	/* Cache Size 0=2^(12+n) 1=2^(10+n) */#define CFG_ICMASK	0x00000e00	/* Instruction cache size */#define CFG_ICSHIFT	9#define CFG_DCMASK	0x000001c0	/* Data cache size */#define CFG_DCSHIFT	6#define CFG_IB		0x00000020	/* Instruction cache block size */#define CFG_DB		0x00000010	/* Data cache block size */#define CFG_CU		0x00000008	/* Update on Store Conditional */#define CFG_K0MASK	0x00000007	/* KSEG0 coherency algorithm *//* * Primary cache mode */#define CFG_C_WTHRU_NOALLOC	0	/* r4600 only */#define CFG_C_WTHRU_ALLOC	1	/* r4600 only */#define CFG_C_UNCACHED		2#define CFG_C_NONCOHERENT	3#define CFG_C_WBACK		3#define CFG_C_COHERENTXCL	4#define CFG_C_COHERENTXCLW	5 	#define CFG_C_COHERENTUPD	6	/* r4000/r4400 only */#define CFG_C_UNCACHED_ACCEL	7	/* t5 only *//*  * Primary Cache TagLo  */#define TAG_PTAG_MASK           0xffffff00      /* Primary Tag */#define TAG_PTAG_SHIFT          8#define TAG_PSTATE_MASK         0x000000c0      /* Primary Cache State */#define TAG_PSTATE_SHIFT        6#define TAG_PARITY_MASK         0x00000001      /* Primary Tag Parity */#define TAG_PARITY_SHIFT        0#define PSTATE_INVAL		0#define PSTATE_SHARED		1#define PSTATE_CLEAN_EXCL	2#define PSTATE_DIRTY_EXCL	3/*  * Secondary Cache TagLo  */#define TAG_STAG_MASK           0xffffe000      /* Secondary Tag */#define TAG_STAG_SHIFT          13#define TAG_SSTATE_MASK         0x00001c00      /* Secondary Cache State */#define TAG_SSTATE_SHIFT        10#define TAG_VINDEX_MASK         0x00000380      /* Secondary Virtual Index */#define TAG_VINDEX_SHIFT        7#define TAG_ECC_MASK            0x0000007f      /* Secondary Tag ECC */#define TAG_ECC_SHIFT           0#define TAG_STAG_SIZE		19		/* Secondary Tag Width */#define SSTATE_INVAL		0#define SSTATE_CLEAN_EXCL	4#define SSTATE_DIRTY_EXCL	5#define SSTATE_CLEAN_SHARED	6#define SSTATE_DIRTY_SHARED	7/* * CacheErr register */#define CACHEERR_TYPE		0x80000000	/* reference type: 						   0=Instr, 1=Data */#define CACHEERR_LEVEL		0x40000000	/* cache level:						   0=Primary, 1=Secondary */#define CACHEERR_DATA		0x20000000	/* data field:						   0=No error, 1=Error */#define CACHEERR_TAG		0x10000000	/* tag field:						   0=No error, 1=Error */#define CACHEERR_REQ		0x08000000	/* request type:						   0=Internal, 1=External */#define CACHEERR_BUS		0x04000000	/* error on bus:						   0=No, 1=Yes */#define CACHEERR_BOTH		0x02000000	/* Data & Instruction error:						   0=No, 1=Yes */#define CACHEERR_STORE		0x01000000	/* Scache error on store miss :						   0=No, 1=Yes */#define CACHEERR_MP		0x00800000	/* Multiprocessor error :						   0=No, 1=Yes */#define CACHEERR_SIDX_MASK	0x003ffff8	/* PADDR(21..3) */#define CACHEERR_SIDX_SHIFT		 3#define CACHEERR_PIDX_MASK	0x00000007	/* VADDR(14..12) */#define CACHEERR_PIDX_SHIFT		12/* * Cache operations */#define Index_Invalidate_I               0x0         /* 0       0 */#define Index_Writeback_Inv_D            0x1         /* 0       1 */#define Index_Invalidate_SI              0x2         /* 0       2 */#define Index_Writeback_Inv_SD           0x3         /* 0       3 */#define Index_Load_Tag_I                 0x0         /* 1       0 */#define Index_Load_Tag_D                 0x5         /* 1       1 */#define Index_Load_Tag_SI                0x6         /* 1       2 */#define Index_Load_Tag_SD                0x7         /* 1       3 */#define Index_Store_Tag_I                0x0         /* 2       0 */#define Index_Store_Tag_D                0x9         /* 2       1 */#define Index_Store_Tag_SI               0xA         /* 2       2 */#define Index_Store_Tag_SD               0xB         /* 2       3 */#define Create_Dirty_Exc_D               0xD         /* 3       1 */#define Create_Dirty_Exc_SD              0xF         /* 3       3 *//* define Hit_Invalidate_I                 0x10      */  /* 4       0 */#define Hit_Invalidate_I                 0x00        /* 4       0 */#define Hit_Invalidate_D                 0x11        /* 4       1 */#define Hit_Invalidate_SI                0x12        /* 4       2 */#define Hit_Invalidate_SD                0x13        /* 4       3 */#define Hit_Writeback_Inv_D              0x15        /* 5       1 */#define Hit_Writeback_Inv_SD             0x17        /* 5       3 */#define Fill_I                           0x0        /* 5       0 */#define Hit_Writeback_D                  0x19        /* 6       1 */#define Hit_Writeback_SD                 0x1B        /* 6       3 */#define Hit_Writeback_I                  0x18        /* 6       0 */#define Hit_Set_Virtual_SI               0x1E        /* 7       2 */#define Hit_Set_Virtual_SD               0x1F        /* 7       3 *//* Watchpoint Register */#if !#cpu(r4600) && !#cpu(r4700)#define WATCHLO_PA	0xfffffff8#define WATCHLO_R	0x00000002#define WATCHLO_W	0x00000001#endif#ifdef __ASSEMBLER__/*  * R4000 Coprocessor 0 register numbers  */#define C0_INDEX	$0#define C0_INX		$0#define C0_RANDOM	$1#define C0_RAND		$1#define C0_ENTRYLO0	$2#define C0_TLBLO0	$2#define C0_ENTRYLO1	$3#define C0_TLBLO1	$3#define C0_CONTEXT	$4#define C0_CTXT		$4#define C0_PAGEMASK	$5#define C0_WIRED	$6#define C0_BADVADDR 	$8#define C0_VADDR 	$8#define C0_COUNT 	$9#define C0_ENTRYHI	$10#define C0_TLBHI	$10#define C0_COMPARE	$11#define C0_STATUS	$12#define C0_SR		$12#define C0_CAUSE	$13#define C0_CR		$13#define C0_EPC 		$14#define C0_PRID		$15#define C0_CONFIG	$16#if !#cpu(r4100) && !#cpu(r4111)#define C0_LLADDR	$17#endif#if !#cpu(r4600) && !#cpu(r4700)#define C0_WATCHLO	$18#define C0_WATCHHI	$19#endif#define C0_ECC		$26#define C0_CACHEERR	$27#define C0_TAGLO	$28#define C0_TAGHI	$29#define C0_ERRPC	$30$index		=	$0$random		=	$1$entrylo0	=	$2$entrylo1	=	$3$context	=	$4$pagemask	=	$5$wired		=	$6$vaddr 		=	$8$count 		=	$9$entryhi	=	$10$compare	=	$11$sr		=	$12$cr		=	$13$epc 		=	$14$prid		=	$15$config		=	$16#if !#cpu(r4100) && !#cpu(r4111)$lladdr		=	$17#endif#if !#cpu(r4600) && !#cpu(r4700)$watchlo	=	$18$watchhi	=	$19#endif$ecc		=	$26$cacheerr	=	$27$taglo		=	$28$taghi		=	$29$errpc		=	$30#else/* * Standard types */#define _REG_T_typedef unsigned long		reg32_t;	/* a 32-bit register */typedef unsigned long long	reg64_t;	/* a 64-bit register */#if (__mips >= 3 && __mips != 32) || __mips64typedef unsigned long long	reg_t;typedef signed long long	sreg_t;#elsetypedef unsigned long		reg_t;typedef signed long		sreg_t;#endif/*  * R4000 Coprocessor 0 register numbers  */#define C0_INDEX	0#define C0_INX		0#define C0_RANDOM	1#define C0_RAND		1#define C0_ENTRYLO0	2#define C0_TLBLO0	2#define C0_ENTRYLO1	3#define C0_TLBLO1	3#define C0_CONTEXT	4#define C0_CTXT		4#define C0_PAGEMASK	5#define C0_WIRED	6#define C0_BADVADDR 	8#define C0_VADDR 	8#define C0_COUNT 	9#define C0_ENTRYHI	10#define C0_TLBHI	10#define C0_COMPARE	11#define C0_STATUS	12#define C0_SR		12#define C0_CAUSE	13#define C0_CR		13#define C0_EPC 		14#define C0_PRID		15#define C0_CONFIG	16#if !#cpu(r4100) && !#cpu(r4111)#define C0_LLADDR	17#endif#if !#cpu(r4600) && !#cpu(r4700)#define C0_WATCHLO	18#define C0_WATCHHI	19#endif#define C0_ECC		26#define C0_CACHEERR	27#define C0_TAGLO	28#define C0_TAGHI	29#define C0_ERRPC	30#define _mips_nop() \  __asm__ __volatile ("%(nop%)" : :) #define _mips_sync() \  __asm__ __volatile ("sync")#if #cpu(r41xx)#define _mips_wait() \  __asm__ __volatile ("standby")#endif/*  * Define generic macros for accessing the R4000 coprocessor 0 registers. * Most apart from "set" return the original register value. */#define _mips_mfc0(reg) \({ \  register reg32_t __r; \  __asm__ __volatile ("%(mfc0 %0,$%1; nop; nop%)" \		      : "=d" (__r) \		      : "JK" (reg)); \  __r; \})#define _mips_mtc0(reg, val) \({ \    __asm__ __volatile ("%(mtc0 %z0,$%1; nop; nop; nop%)" \			: \			: "dJ" ((reg32_t)(val)), "JK" (reg) \			: "memory"); \})#endif /* !ASSEMBLER */#ifdef __cplusplus}#endif#endif /* _R4KC0_H_ */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?