Revision e034e2c3 target-mips/helper.c
b/target-mips/helper.c | ||
---|---|---|
77 | 77 |
target_ulong tag = address & ~mask; |
78 | 78 |
target_ulong VPN = tlb->VPN & ~mask; |
79 | 79 |
#ifdef TARGET_MIPS64 |
80 |
tag &= 0xC00000FFFFFFFFFFULL;
|
|
80 |
tag &= env->SEGMask;
|
|
81 | 81 |
#endif |
82 | 82 |
|
83 | 83 |
/* Check ASID, virtual page number & size */ |
... | ... | |
140 | 140 |
/* |
141 | 141 |
XXX: Assuming : |
142 | 142 |
- PABITS = 36 (correct for MIPS64R1) |
143 |
- SEGBITS = 40 |
|
144 | 143 |
*/ |
145 | 144 |
} else if (address < 0x3FFFFFFFFFFFFFFFULL) { |
146 | 145 |
/* xuseg */ |
147 |
if (UX && address < 0x000000FFFFFFFFFFULL) {
|
|
146 |
if (UX && address < (0x3FFFFFFFFFFFFFFFULL & env->SEGMask)) {
|
|
148 | 147 |
ret = env->map_address(env, physical, prot, address, rw, access_type); |
149 | 148 |
} else { |
150 | 149 |
ret = TLBRET_BADADDR; |
151 | 150 |
} |
152 | 151 |
} else if (address < 0x7FFFFFFFFFFFFFFFULL) { |
153 | 152 |
/* xsseg */ |
154 |
if (SX && address < 0x400000FFFFFFFFFFULL) {
|
|
153 |
if (SX && address < (0x7FFFFFFFFFFFFFFFULL & env->SEGMask)) {
|
|
155 | 154 |
ret = env->map_address(env, physical, prot, address, rw, access_type); |
156 | 155 |
} else { |
157 | 156 |
ret = TLBRET_BADADDR; |
... | ... | |
159 | 158 |
} else if (address < 0xBFFFFFFFFFFFFFFFULL) { |
160 | 159 |
/* xkphys */ |
161 | 160 |
/* XXX: check supervisor mode */ |
162 |
if (KX && (address & 0x03FFFFFFFFFFFFFFULL) < 0X0000000FFFFFFFFFULL)
|
|
161 |
if (KX && (address & 0x07FFFFFFFFFFFFFFULL) < 0X0000000FFFFFFFFFULL)
|
|
163 | 162 |
{ |
164 |
*physical = address & 0X000000FFFFFFFFFFULL;
|
|
163 |
*physical = address & 0X0000000FFFFFFFFFULL;
|
|
165 | 164 |
*prot = PAGE_READ | PAGE_WRITE; |
166 | 165 |
} else { |
167 | 166 |
ret = TLBRET_BADADDR; |
... | ... | |
169 | 168 |
} else if (address < 0xFFFFFFFF7FFFFFFFULL) { |
170 | 169 |
/* xkseg */ |
171 | 170 |
/* XXX: check supervisor mode */ |
172 |
if (KX && address < 0xC00000FF7FFFFFFFULL) {
|
|
171 |
if (KX && address < (0xFFFFFFFF7FFFFFFFULL & env->SEGMask)) {
|
|
173 | 172 |
ret = env->map_address(env, physical, prot, address, rw, access_type); |
174 | 173 |
} else { |
175 | 174 |
ret = TLBRET_BADADDR; |
... | ... | |
303 | 302 |
env->CP0_EntryHi = |
304 | 303 |
(env->CP0_EntryHi & 0xFF) | (address & (TARGET_PAGE_MASK << 1)); |
305 | 304 |
#ifdef TARGET_MIPS64 |
306 |
env->CP0_EntryHi &= 0xc00000ffffffffffULL;
|
|
307 |
env->CP0_XContext = (env->CP0_XContext & 0xfffffffe00000000ULL) |
|
|
308 |
((address >> 31) & 0x0000000180000000ULL) |
|
|
309 |
((address >> 9) & 0x000000007ffffff0ULL);
|
|
305 |
env->CP0_EntryHi &= env->SEGMask;
|
|
306 |
env->CP0_XContext = (env->CP0_XContext & ((~0ULL) << (env->SEGBITS - 7))) |
|
|
307 |
((address & 0xC00000000000ULL) >> (env->SEGBITS - 9)) |
|
|
308 |
((address & ((1ULL << env->SEGBITS) - 1) & 0xFFFFFFFFFFFFE000ULL) >> 9);
|
|
310 | 309 |
#endif |
311 | 310 |
env->exception_index = exception; |
312 | 311 |
env->error_code = error_code; |
... | ... | |
555 | 554 |
if (tlb->V0) { |
556 | 555 |
addr = tlb->VPN & ~mask; |
557 | 556 |
#ifdef TARGET_MIPS64 |
558 |
if (addr >= 0xC00000FF80000000ULL) {
|
|
557 |
if (addr >= (0xFFFFFFFF80000000ULL & env->SEGMask)) {
|
|
559 | 558 |
addr |= 0x3FFFFF0000000000ULL; |
560 | 559 |
} |
561 | 560 |
#endif |
... | ... | |
568 | 567 |
if (tlb->V1) { |
569 | 568 |
addr = (tlb->VPN & ~mask) | ((mask >> 1) + 1); |
570 | 569 |
#ifdef TARGET_MIPS64 |
571 |
if (addr >= 0xC00000FF80000000ULL) {
|
|
570 |
if (addr >= (0xFFFFFFFF80000000ULL & env->SEGMask)) {
|
|
572 | 571 |
addr |= 0x3FFFFF0000000000ULL; |
573 | 572 |
} |
574 | 573 |
#endif |
Also available in: Unified diff