| 97 |
/* slow unaligned access (it spans two pages or IO) */ |
/* slow unaligned access (it spans two pages or IO) */ |
| 98 |
do_unaligned_access: |
do_unaligned_access: |
| 99 |
retaddr = GETPC(); |
retaddr = GETPC(); |
| 100 |
|
#ifdef ALIGNED_ONLY |
| 101 |
|
do_unaligned_access(addr, READ_ACCESS_TYPE, is_user, retaddr); |
| 102 |
|
#endif |
| 103 |
res = glue(glue(slow_ld, SUFFIX), MMUSUFFIX)(addr, |
res = glue(glue(slow_ld, SUFFIX), MMUSUFFIX)(addr, |
| 104 |
is_user, retaddr); |
is_user, retaddr); |
| 105 |
} else { |
} else { |
| 106 |
/* unaligned access in the same page */ |
/* unaligned/aligned access in the same page */ |
| 107 |
|
#ifdef ALIGNED_ONLY |
| 108 |
|
if ((addr & (DATA_SIZE - 1)) != 0) { |
| 109 |
|
retaddr = GETPC(); |
| 110 |
|
do_unaligned_access(addr, READ_ACCESS_TYPE, is_user, retaddr); |
| 111 |
|
} |
| 112 |
|
#endif |
| 113 |
res = glue(glue(ld, USUFFIX), _raw)((uint8_t *)(long)physaddr); |
res = glue(glue(ld, USUFFIX), _raw)((uint8_t *)(long)physaddr); |
| 114 |
} |
} |
| 115 |
} else { |
} else { |
| 116 |
/* the page is not in the TLB : fill it */ |
/* the page is not in the TLB : fill it */ |
| 117 |
retaddr = GETPC(); |
retaddr = GETPC(); |
| 118 |
|
#ifdef ALIGNED_ONLY |
| 119 |
|
if ((addr & (DATA_SIZE - 1)) != 0) |
| 120 |
|
do_unaligned_access(addr, READ_ACCESS_TYPE, is_user, retaddr); |
| 121 |
|
#endif |
| 122 |
tlb_fill(addr, READ_ACCESS_TYPE, is_user, retaddr); |
tlb_fill(addr, READ_ACCESS_TYPE, is_user, retaddr); |
| 123 |
goto redo; |
goto redo; |
| 124 |
} |
} |
| 226 |
} else if (((addr & ~TARGET_PAGE_MASK) + DATA_SIZE - 1) >= TARGET_PAGE_SIZE) { |
} else if (((addr & ~TARGET_PAGE_MASK) + DATA_SIZE - 1) >= TARGET_PAGE_SIZE) { |
| 227 |
do_unaligned_access: |
do_unaligned_access: |
| 228 |
retaddr = GETPC(); |
retaddr = GETPC(); |
| 229 |
|
#ifdef ALIGNED_ONLY |
| 230 |
|
do_unaligned_access(addr, 1, is_user, retaddr); |
| 231 |
|
#endif |
| 232 |
glue(glue(slow_st, SUFFIX), MMUSUFFIX)(addr, val, |
glue(glue(slow_st, SUFFIX), MMUSUFFIX)(addr, val, |
| 233 |
is_user, retaddr); |
is_user, retaddr); |
| 234 |
} else { |
} else { |
| 235 |
/* aligned/unaligned access in the same page */ |
/* aligned/unaligned access in the same page */ |
| 236 |
|
#ifdef ALIGNED_ONLY |
| 237 |
|
if ((addr & (DATA_SIZE - 1)) != 0) { |
| 238 |
|
retaddr = GETPC(); |
| 239 |
|
do_unaligned_access(addr, 1, is_user, retaddr); |
| 240 |
|
} |
| 241 |
|
#endif |
| 242 |
glue(glue(st, SUFFIX), _raw)((uint8_t *)(long)physaddr, val); |
glue(glue(st, SUFFIX), _raw)((uint8_t *)(long)physaddr, val); |
| 243 |
} |
} |
| 244 |
} else { |
} else { |
| 245 |
/* the page is not in the TLB : fill it */ |
/* the page is not in the TLB : fill it */ |
| 246 |
retaddr = GETPC(); |
retaddr = GETPC(); |
| 247 |
|
#ifdef ALIGNED_ONLY |
| 248 |
|
if ((addr & (DATA_SIZE - 1)) != 0) |
| 249 |
|
do_unaligned_access(addr, 1, is_user, retaddr); |
| 250 |
|
#endif |
| 251 |
tlb_fill(addr, 1, is_user, retaddr); |
tlb_fill(addr, 1, is_user, retaddr); |
| 252 |
goto redo; |
goto redo; |
| 253 |
} |
} |