| 1 | |
|---|
| 2 | #ifndef __BMIPS_H__ |
|---|
| 3 | #define __BMIPS_H__ |
|---|
| 4 | |
|---|
| 5 | /********************************************************************** |
|---|
| 6 | * Bitfield macros |
|---|
| 7 | ********************************************************************* */ |
|---|
| 8 | |
|---|
| 9 | /* |
|---|
| 10 | * Make a mask for 1 bit at position 'n' |
|---|
| 11 | */ |
|---|
| 12 | |
|---|
| 13 | #define _MM_MAKEMASK1(n) (1 << (n)) |
|---|
| 14 | |
|---|
| 15 | /* |
|---|
| 16 | * Make a mask for 'v' bits at position 'n' |
|---|
| 17 | */ |
|---|
| 18 | |
|---|
| 19 | #define _MM_MAKEMASK(v,n) (((1<<(v))-1) << (n)) |
|---|
| 20 | |
|---|
| 21 | /* |
|---|
| 22 | * Make a value at 'v' at bit position 'n' |
|---|
| 23 | */ |
|---|
| 24 | |
|---|
| 25 | #define _MM_MAKEVALUE(v,n) ((v) << (n)) |
|---|
| 26 | |
|---|
| 27 | /* |
|---|
| 28 | * Retrieve a value from 'v' at bit position 'n' with 'm' mask bits |
|---|
| 29 | */ |
|---|
| 30 | |
|---|
| 31 | #define _MM_GETVALUE(v,n,m) (((v) & (m)) >> (n)) |
|---|
| 32 | |
|---|
| 33 | |
|---|
| 34 | |
|---|
| 35 | #if defined(__ASSEMBLER__) |
|---|
| 36 | #define zero $0 |
|---|
| 37 | #define AT $1 /* assembler temporaries */ |
|---|
| 38 | #define v0 $2 /* value holders */ |
|---|
| 39 | #define v1 $3 |
|---|
| 40 | #define a0 $4 /* arguments */ |
|---|
| 41 | #define a1 $5 |
|---|
| 42 | #define a2 $6 |
|---|
| 43 | #define a3 $7 |
|---|
| 44 | #define t0 $8 /* temporaries */ |
|---|
| 45 | #define t1 $9 |
|---|
| 46 | #define t2 $10 |
|---|
| 47 | #define t3 $11 |
|---|
| 48 | #define t4 $12 |
|---|
| 49 | #define t5 $13 |
|---|
| 50 | #define t6 $14 |
|---|
| 51 | #define t7 $15 |
|---|
| 52 | #define ta0 $12 |
|---|
| 53 | #define ta1 $13 |
|---|
| 54 | #define ta2 $14 |
|---|
| 55 | #define ta3 $15 |
|---|
| 56 | #define s0 $16 /* saved registers */ |
|---|
| 57 | #define s1 $17 |
|---|
| 58 | #define s2 $18 |
|---|
| 59 | #define s3 $19 |
|---|
| 60 | #define s4 $20 |
|---|
| 61 | #define s5 $21 |
|---|
| 62 | #define s6 $22 |
|---|
| 63 | #define s7 $23 |
|---|
| 64 | #define t8 $24 /* temporaries */ |
|---|
| 65 | #define t9 $25 |
|---|
| 66 | #define k0 $26 /* kernel registers */ |
|---|
| 67 | #define k1 $27 |
|---|
| 68 | #define gp $28 /* global pointer */ |
|---|
| 69 | #define sp $29 /* stack pointer */ |
|---|
| 70 | #define s8 $30 /* saved register */ |
|---|
| 71 | #define fp $30 /* frame pointer */ |
|---|
| 72 | #define ra $31 /* return address */ |
|---|
| 73 | #endif |
|---|
| 74 | |
|---|
| 75 | |
|---|
| 76 | |
|---|
| 77 | |
|---|
| 78 | /* ********************************************************************* |
|---|
| 79 | * Macros for generating assembly language routines |
|---|
| 80 | ********************************************************************* */ |
|---|
| 81 | |
|---|
| 82 | #if defined(__ASSEMBLER__) |
|---|
| 83 | |
|---|
| 84 | /* global leaf function (does not call other functions) */ |
|---|
| 85 | #define LEAF(name) \ |
|---|
| 86 | .globl name; \ |
|---|
| 87 | .ent name; \ |
|---|
| 88 | name: |
|---|
| 89 | |
|---|
| 90 | /* global alternate entry to (local or global) leaf function */ |
|---|
| 91 | #define XLEAF(name) \ |
|---|
| 92 | .globl name; \ |
|---|
| 93 | .aent name; \ |
|---|
| 94 | name: |
|---|
| 95 | |
|---|
| 96 | /* end of a global function */ |
|---|
| 97 | #define END(name) \ |
|---|
| 98 | .size name,.-name; \ |
|---|
| 99 | .end name |
|---|
| 100 | |
|---|
| 101 | /* local leaf function (does not call other functions) */ |
|---|
| 102 | #define SLEAF(name) \ |
|---|
| 103 | .ent name; \ |
|---|
| 104 | name: |
|---|
| 105 | |
|---|
| 106 | /* local alternate entry to (local or global) leaf function */ |
|---|
| 107 | #define SXLEAF(name) \ |
|---|
| 108 | .aent name; \ |
|---|
| 109 | name: |
|---|
| 110 | |
|---|
| 111 | /* end of a local function */ |
|---|
| 112 | #define SEND(name) \ |
|---|
| 113 | END(name) |
|---|
| 114 | |
|---|
| 115 | /* define & export a symbol */ |
|---|
| 116 | #define EXPORT(name) \ |
|---|
| 117 | .globl name; \ |
|---|
| 118 | name: |
|---|
| 119 | |
|---|
| 120 | /* import a symbol */ |
|---|
| 121 | #define IMPORT(name, size) \ |
|---|
| 122 | .extern name,size |
|---|
| 123 | |
|---|
| 124 | /* define a zero-fill common block (BSS if not overridden) with a global name */ |
|---|
| 125 | #define COMM(name,size) \ |
|---|
| 126 | .comm name,size |
|---|
| 127 | |
|---|
| 128 | /* define a zero-fill common block (BSS if not overridden) with a local name */ |
|---|
| 129 | #define LCOMM(name,size) \ |
|---|
| 130 | .lcomm name,size |
|---|
| 131 | |
|---|
| 132 | #endif |
|---|
| 133 | |
|---|
| 134 | |
|---|
| 135 | /* |
|---|
| 136 | * Primary Cache operations |
|---|
| 137 | */ |
|---|
| 138 | #define Index_Invalidate_I 0x0 /* 0 0 */ |
|---|
| 139 | #define Index_Writeback_Inv_D 0x1 /* 0 1 */ |
|---|
| 140 | #define Index_Invalidate_SI 0x2 /* 0 2 */ |
|---|
| 141 | #define Index_Writeback_Inv_SD 0x3 /* 0 3 */ |
|---|
| 142 | #define Index_Load_Tag_I 0x4 /* 1 0 */ |
|---|
| 143 | #define Index_Load_Tag_D 0x5 /* 1 1 */ |
|---|
| 144 | #define Index_Load_Tag_SI 0x6 /* 1 2 */ |
|---|
| 145 | #define Index_Load_Tag_SD 0x7 /* 1 3 */ |
|---|
| 146 | #define Index_Store_Tag_I 0x8 /* 2 0 */ |
|---|
| 147 | #define Index_Store_Tag_D 0x9 /* 2 1 */ |
|---|
| 148 | #define Index_Store_Tag_SI 0xA /* 2 2 */ |
|---|
| 149 | #define Index_Store_Tag_SD 0xB /* 2 3 */ |
|---|
| 150 | #define Create_Dirty_Exc_D 0xD /* 3 1 */ |
|---|
| 151 | #define Create_Dirty_Exc_SD 0xF /* 3 3 */ |
|---|
| 152 | #define Hit_Invalidate_I 0x10 /* 4 0 */ |
|---|
| 153 | #define Hit_Invalidate_D 0x11 /* 4 1 */ |
|---|
| 154 | #define Hit_Invalidate_SI 0x12 /* 4 2 */ |
|---|
| 155 | #define Hit_Invalidate_SD 0x13 /* 4 3 */ |
|---|
| 156 | #define Fill_I 0x14 /* 5 0 */ |
|---|
| 157 | #define Hit_Writeback_Inv_D 0x15 /* 5 1 */ |
|---|
| 158 | #define Hit_Writeback_Inv_SD 0x17 /* 5 3 */ |
|---|
| 159 | #define Hit_Writeback_I 0x18 /* 6 0 */ |
|---|
| 160 | #define Hit_Writeback_D 0x19 /* 6 1 */ |
|---|
| 161 | #define Hit_Writeback_SD 0x1B /* 6 3 */ |
|---|
| 162 | #define Hit_Set_Virtual_SI 0x1E /* 7 2 */ |
|---|
| 163 | #define Hit_Set_Virtual_SD 0x1F /* 7 3 */ |
|---|
| 164 | |
|---|
| 165 | /* |
|---|
| 166 | #************************************************************************ |
|---|
| 167 | #* KSEG Mapping Definitions and Macro's |
|---|
| 168 | #************************************************************************ |
|---|
| 169 | */ |
|---|
| 170 | #define K0_BASE 0x80000000 |
|---|
| 171 | #define K0_SIZE 0x20000000 |
|---|
| 172 | #define K1_BASE 0xa0000000 |
|---|
| 173 | #define K1_SIZE 0x20000000 |
|---|
| 174 | #define K2_BASE 0xc0000000 |
|---|
| 175 | |
|---|
| 176 | #define PHYS_TO_K0(x) ((x) | 0x80000000) |
|---|
| 177 | #define PHYS_TO_K1(x) ((x) | 0xa0000000) |
|---|
| 178 | #define K0_TO_PHYS(x) ((x) & 0x1fffffff) |
|---|
| 179 | #define K1_TO_PHYS(x) (K0_TO_PHYS(x)) |
|---|
| 180 | #define K0_TO_K1(x) ((x) | 0x20000000) |
|---|
| 181 | #define K1_TO_K0(x) ((x) & 0xdfffffff) |
|---|
| 182 | |
|---|
| 183 | #define T_VEC K0_BASE /* tlbmiss vector */ |
|---|
| 184 | #define X_VEC (K0_BASE+0x80) /* xtlbmiss vector */ |
|---|
| 185 | #define C_VEC (K1_BASE+0x100) /* cache exception vector */ |
|---|
| 186 | #define E_VEC (K0_BASE+0x180) /* exception vector */ |
|---|
| 187 | #define R_VEC (K1_BASE+0x1fc00000) /* reset vector */ |
|---|
| 188 | |
|---|
| 189 | #define REG_ADDR(X) PHYS_TO_K1(BCHP_PHYSICAL_OFFSET+X) |
|---|
| 190 | |
|---|
| 191 | |
|---|
| 192 | #define K0_WRITE_THROGH (0x0) |
|---|
| 193 | #define K0_WRITE_BACK (0x3) |
|---|
| 194 | #define K0_UNCACHED (0x2) |
|---|
| 195 | |
|---|
| 196 | |
|---|
| 197 | #define cacheop(kva, size, linesize, op) \ |
|---|
| 198 | .set noreorder ; \ |
|---|
| 199 | addu t1, kva, size ; \ |
|---|
| 200 | subu t2, linesize, 1 ; \ |
|---|
| 201 | not t2 ; \ |
|---|
| 202 | and t0, kva, t2 ; \ |
|---|
| 203 | addiu t1, t1, -1 ; \ |
|---|
| 204 | and t1, t2 ; \ |
|---|
| 205 | 9: cache op, 0(t0) ; \ |
|---|
| 206 | bne t0, t1, 9b ; \ |
|---|
| 207 | addu t0, linesize ; \ |
|---|
| 208 | .set reorder ; |
|---|
| 209 | |
|---|
| 210 | |
|---|
| 211 | |
|---|
| 212 | #endif |
|---|