root/include/asm-mips/mipsregs.h

/* [previous][next][first][last][top][bottom][index][help] */

INCLUDED FROM


   1 /*
   2  * include/asm-mips/mipsregs.h
   3  *
   4  * This file is subject to the terms and conditions of the GNU General Public
   5  * License.  See the file "COPYING" in the main directory of this archive
   6  * for more details.
   7  *
   8  * Copyright (C) 1994 by Ralf Baechle
   9  */
  10 
  11 #ifndef __ASM_MIPS_MIPSREGS_H
  12 #define __ASM_MIPS_MIPSREGS_H
  13 
  14 /*
  15  * The following macros are especially useful for __asm__
  16  * inline assembler.
  17  */
  18 
  19 #ifndef __STR
  20 #define __STR(x) #x
  21 #endif
  22 #ifndef STR
  23 #define STR(x) __STR(x)
  24 #endif
  25 
  26 /*
  27  * On the R2000/3000 load instructions are not interlocked -
  28  * we therefore sometimes need to fill load delay slots with a nop
  29  * which are useless for >=R4000.
  30  *
  31  * FIXME: Don't know about R6000
  32  */
  33 #if !defined (__R4000__)
  34 #define FILL_LDS nop
  35 #else
  36 #define FILL_LDS
  37 #endif
  38 
  39 /*
  40  * Coprocessor 0 register names
  41  */
  42 #define CP0_INDEX $0
  43 #define CP0_RANDOM $1
  44 #define CP0_ENTRYLO0 $2
  45 #define CP0_ENTRYLO1 $3
  46 #define CP0_CONTEXT $4
  47 #define CP0_PAGEMASK $5
  48 #define CP0_WIRED $6
  49 #define CP0_BADVADDR $8
  50 #define CP0_COUNT $9
  51 #define CP0_ENTRYHI $10
  52 #define CP0_COMPARE $11
  53 #define CP0_STATUS $12
  54 #define CP0_CAUSE $13
  55 #define CP0_EPC $14
  56 #define CP0_PRID $15
  57 #define CP0_CONFIG $16
  58 #define CP0_LLADDR $17
  59 #define CP0_WATCHLO $18
  60 #define CP0_WATCHHI $19
  61 #define CP0_XCONTEXT $20
  62 #define CP0_ECC $26
  63 #define CP0_CACHEERR $27
  64 #define CP0_TAGLO $28
  65 #define CP0_TAGHI $29
  66 #define CP0_ERROREPC $30
  67 
  68 /*
  69  * Values for PageMask register
  70  */
  71 #define PM_4K   0x00000000
  72 #define PM_16K  0x00006000
  73 #define PM_64K  0x0001e000
  74 #define PM_256K 0x0007e000
  75 #define PM_1M   0x001fe000
  76 #define PM_4M   0x007fe000
  77 #define PM_16M  0x01ffe000
  78 
  79 /*
  80  * Values used for computation of new tlb entries
  81  */
  82 #define PL_4K   12
  83 #define PL_16K  14
  84 #define PL_64K  16
  85 #define PL_256K 18
  86 #define PL_1M   20
  87 #define PL_4M   22
  88 #define PL_16M  24
  89 
  90 /*
  91  * Compute a vpn/pfn entry for EntryHi register
  92  */
  93 #define VPN(addr,pagesizeshift) ((addr) & ~((1 << (pagesizeshift))-1))
  94 #define PFN(addr,pagesizeshift) (((addr) & ((1 << (pagesizeshift))-1)) << 6)
  95 
  96 /*
  97  * Macros to access the system control coprocessor
  98  */
  99 #define read_32bit_cp0_register(source)                                        \
 100 ({ int __res;                                                                  \
 101         __asm__ __volatile__(                                                  \
 102         "mfc0\t%0,"STR(source)                                                 \
 103         : "=r" (__res));                                                       \
 104         __res;})
 105 
 106 #define read_64bit_cp0_register(source)                                        \
 107 ({ int __res;                                                                  \
 108         __asm__ __volatile__(                                                  \
 109         "dmfc0\t%0,"STR(source)                                                \
 110         : "=r" (__res));                                                       \
 111         __res;})
 112 
 113 #define write_32bit_cp0_register(register,value)                               \
 114         __asm__ __volatile__(                                                  \
 115         "mtc0\t%0,"STR(register)                                               \
 116         : : "r" (value));
 117 
 118 /*
 119  * Inline code for use of the ll and sc instructions
 120  *
 121  * FIXME: This instruction is only available on MIPS ISA >=3.
 122  * Since these operations are only being used for atomic operations
 123  * the easiest workaround for the R[23]00 is to disable interrupts.
 124  */
 125 #define load_linked(addr)                                                      \
 126 ({                                                                             \
 127         unsigned int __res;                                                    \
 128                                                                                \
 129         __asm__ __volatile__(                                                  \
 130         "ll\t%0,(%1)"                                                          \
 131         : "=r" (__res)                                                         \
 132         : "r" ((unsigned int) (addr)));                                        \
 133                                                                                \
 134         __res;                                                                 \
 135 })
 136 
 137 #define store_conditional(addr,value)                                          \
 138 ({                                                                             \
 139         int     __res;                                                         \
 140                                                                                \
 141         __asm__ __volatile__(                                                  \
 142         "sc\t%0,(%2)"                                                          \
 143         : "=r" (__res)                                                         \
 144         : "0" (value), "r" (addr));                                            \
 145                                                                                \
 146         __res;                                                                 \
 147 })
 148 
 149 /*
 150  * Bitfields in the cp0 status register
 151  *
 152  * Refer to MIPS R4600 manual, page 5-4 for explanation
 153  */
 154 #define ST0_IE  (1   <<  0)
 155 #define ST0_EXL (1   <<  1)
 156 #define ST0_ERL (1   <<  2)
 157 #define ST0_KSU (3   <<  3)
 158 #define ST0_UX  (1   <<  5)
 159 #define ST0_SX  (1   <<  6)
 160 #define ST0_KX  (1   <<  7)
 161 #define ST0_IM  (255 <<  8)
 162 #define ST0_DE  (1   << 16)
 163 #define ST0_CE  (1   << 17)
 164 #define ST0_CH  (1   << 18)
 165 #define ST0_SR  (1   << 20)
 166 #define ST0_BEV (1   << 22)
 167 #define ST0_RE  (1   << 25)
 168 #define ST0_FR  (1   << 26)
 169 #define ST0_CU  (15  << 28)
 170 #define ST0_CU0 (1   << 28)
 171 #define ST0_CU1 (1   << 29)
 172 #define ST0_CU2 (1   << 30)
 173 #define ST0_CU3 (1   << 31)
 174 
 175 #endif /* __ASM_MIPS_MIPSREGS_H */

/* [previous][next][first][last][top][bottom][index][help] */