home *** CD-ROM | disk | FTP | other *** search
- /*
- * include/asm-mips/mipsregs.h
- *
- * This file is subject to the terms and conditions of the GNU General Public
- * License. See the file "COPYING" in the main directory of this archive
- * for more details.
- *
- * Copyright (C) 1994 by Ralf Baechle
- */
-
- #ifndef __ASM_MIPS_MIPSREGS_H
- #define __ASM_MIPS_MIPSREGS_H
-
- /*
- * The following macros are especially useful for __asm__
- * inline assembler.
- */
-
- #ifndef __STR
- #define __STR(x) #x
- #endif
- #ifndef STR
- #define STR(x) __STR(x)
- #endif
-
- /*
- * On the R2000/3000 load instructions are not interlocked -
- * we therefore sometimes need to fill load delay slots with a nop
- * which are useless for >=R4000.
- *
- * FIXME: Don't know about R6000
- */
- #if !defined (__R4000__)
- #define FILL_LDS nop
- #else
- #define FILL_LDS
- #endif
-
- /*
- * Coprocessor 0 register names
- */
- #define CP0_INDEX $0
- #define CP0_RANDOM $1
- #define CP0_ENTRYLO0 $2
- #define CP0_ENTRYLO1 $3
- #define CP0_CONTEXT $4
- #define CP0_PAGEMASK $5
- #define CP0_WIRED $6
- #define CP0_BADVADDR $8
- #define CP0_COUNT $9
- #define CP0_ENTRYHI $10
- #define CP0_COMPARE $11
- #define CP0_STATUS $12
- #define CP0_CAUSE $13
- #define CP0_EPC $14
- #define CP0_PRID $15
- #define CP0_CONFIG $16
- #define CP0_LLADDR $17
- #define CP0_WATCHLO $18
- #define CP0_WATCHHI $19
- #define CP0_XCONTEXT $20
- #define CP0_ECC $26
- #define CP0_CACHEERR $27
- #define CP0_TAGLO $28
- #define CP0_TAGHI $29
- #define CP0_ERROREPC $30
-
- /*
- * Values for PageMask register
- */
- #define PM_4K 0x00000000
- #define PM_16K 0x00006000
- #define PM_64K 0x0001e000
- #define PM_256K 0x0007e000
- #define PM_1M 0x001fe000
- #define PM_4M 0x007fe000
- #define PM_16M 0x01ffe000
-
- /*
- * Values used for computation of new tlb entries
- */
- #define PL_4K 12
- #define PL_16K 14
- #define PL_64K 16
- #define PL_256K 18
- #define PL_1M 20
- #define PL_4M 22
- #define PL_16M 24
-
- /*
- * Compute a vpn/pfn entry for EntryHi register
- */
- #define VPN(addr,pagesizeshift) ((addr) & ~((1 << (pagesizeshift))-1))
- #define PFN(addr,pagesizeshift) (((addr) & ((1 << (pagesizeshift))-1)) << 6)
-
- /*
- * Macros to access the system control coprocessor
- */
- #define read_32bit_cp0_register(source) \
- ({ int __res; \
- __asm__ __volatile__( \
- "mfc0\t%0,"STR(source) \
- : "=r" (__res)); \
- __res;})
-
- #define read_64bit_cp0_register(source) \
- ({ int __res; \
- __asm__ __volatile__( \
- "dmfc0\t%0,"STR(source) \
- : "=r" (__res)); \
- __res;})
-
- #define write_32bit_cp0_register(register,value) \
- __asm__ __volatile__( \
- "mtc0\t%0,"STR(register) \
- : : "r" (value));
-
- /*
- * Inline code for use of the ll and sc instructions
- *
- * FIXME: This instruction is only available on MIPS ISA >=3.
- * Since these operations are only being used for atomic operations
- * the easiest workaround for the R[23]00 is to disable interrupts.
- */
- #define load_linked(addr) \
- ({ \
- unsigned int __res; \
- \
- __asm__ __volatile__( \
- "ll\t%0,(%1)" \
- : "=r" (__res) \
- : "r" ((unsigned int) (addr))); \
- \
- __res; \
- })
-
- #define store_conditional(addr,value) \
- ({ \
- int __res; \
- \
- __asm__ __volatile__( \
- "sc\t%0,(%2)" \
- : "=r" (__res) \
- : "0" (value), "r" (addr)); \
- \
- __res; \
- })
-
- /*
- * Bitfields in the cp0 status register
- *
- * Refer to MIPS R4600 manual, page 5-4 for explanation
- */
- #define ST0_IE (1 << 0)
- #define ST0_EXL (1 << 1)
- #define ST0_ERL (1 << 2)
- #define ST0_KSU (3 << 3)
- #define ST0_UX (1 << 5)
- #define ST0_SX (1 << 6)
- #define ST0_KX (1 << 7)
- #define ST0_IM (255 << 8)
- #define ST0_DE (1 << 16)
- #define ST0_CE (1 << 17)
- #define ST0_CH (1 << 18)
- #define ST0_SR (1 << 20)
- #define ST0_BEV (1 << 22)
- #define ST0_RE (1 << 25)
- #define ST0_FR (1 << 26)
- #define ST0_CU (15 << 28)
- #define ST0_CU0 (1 << 28)
- #define ST0_CU1 (1 << 29)
- #define ST0_CU2 (1 << 30)
- #define ST0_CU3 (1 << 31)
-
- #endif /* __ASM_MIPS_MIPSREGS_H */
-