Commit 799a8c8d0a33ee8732407530f1a06a649be3b0bc
1 parent
ff4a62cd
target-ppc: convert dcbz instruction to TCG
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5826 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
7 changed files
with
55 additions
and
360 deletions
target-ppc/helper.h
| ... | ... | @@ -9,6 +9,8 @@ DEF_HELPER_3(td, void, tl, tl, i32) |
| 9 | 9 | |
| 10 | 10 | DEF_HELPER_2(lmw, void, tl, i32) |
| 11 | 11 | DEF_HELPER_2(stmw, void, tl, i32) |
| 12 | +DEF_HELPER_1(dcbz, void, tl) | |
| 13 | +DEF_HELPER_1(dcbz_970, void, tl) | |
| 12 | 14 | |
| 13 | 15 | DEF_HELPER_2(fcmpo, i32, i64, i64) |
| 14 | 16 | DEF_HELPER_2(fcmpu, i32, i64, i64) | ... | ... |
target-ppc/op.c
| ... | ... | @@ -273,23 +273,6 @@ void OPPROTO op_srli_T1 (void) |
| 273 | 273 | #include "op_mem.h" |
| 274 | 274 | #endif |
| 275 | 275 | |
| 276 | -/* Special op to check and maybe clear reservation */ | |
| 277 | -void OPPROTO op_check_reservation (void) | |
| 278 | -{ | |
| 279 | - if ((uint32_t)env->reserve == (uint32_t)(T0 & ~0x00000003)) | |
| 280 | - env->reserve = (target_ulong)-1ULL; | |
| 281 | - RETURN(); | |
| 282 | -} | |
| 283 | - | |
| 284 | -#if defined(TARGET_PPC64) | |
| 285 | -void OPPROTO op_check_reservation_64 (void) | |
| 286 | -{ | |
| 287 | - if ((uint64_t)env->reserve == (uint64_t)(T0 & ~0x00000003)) | |
| 288 | - env->reserve = (target_ulong)-1ULL; | |
| 289 | - RETURN(); | |
| 290 | -} | |
| 291 | -#endif | |
| 292 | - | |
| 293 | 276 | /* Return from interrupt */ |
| 294 | 277 | #if !defined(CONFIG_USER_ONLY) |
| 295 | 278 | void OPPROTO op_rfi (void) | ... | ... |
target-ppc/op_helper.c
| ... | ... | @@ -56,7 +56,6 @@ void helper_raise_debug (void) |
| 56 | 56 | raise_exception(env, EXCP_DEBUG); |
| 57 | 57 | } |
| 58 | 58 | |
| 59 | - | |
| 60 | 59 | /*****************************************************************************/ |
| 61 | 60 | /* Registers load and stores */ |
| 62 | 61 | target_ulong helper_load_cr (void) |
| ... | ... | @@ -171,6 +170,46 @@ void helper_stmw (target_ulong addr, uint32_t reg) |
| 171 | 170 | } |
| 172 | 171 | } |
| 173 | 172 | |
| 173 | +static void do_dcbz(target_ulong addr, int dcache_line_size) | |
| 174 | +{ | |
| 175 | + target_long mask = get_addr(~(dcache_line_size - 1)); | |
| 176 | + int i; | |
| 177 | +#ifdef CONFIG_USER_ONLY | |
| 178 | +#define stfun stl_raw | |
| 179 | +#else | |
| 180 | + void (*stfun)(target_ulong, int); | |
| 181 | + | |
| 182 | + switch (env->mmu_idx) { | |
| 183 | + default: | |
| 184 | + case 0: stfun = stl_user; | |
| 185 | + break; | |
| 186 | + case 1: stfun = stl_kernel; | |
| 187 | + break; | |
| 188 | + case 2: stfun = stl_hypv; | |
| 189 | + break; | |
| 190 | + } | |
| 191 | +#endif | |
| 192 | + addr &= mask; | |
| 193 | + for (i = 0 ; i < dcache_line_size ; i += 4) { | |
| 194 | + stfun(addr + i , 0); | |
| 195 | + } | |
| 196 | + if ((env->reserve & mask) == addr) | |
| 197 | + env->reserve = (target_ulong)-1ULL; | |
| 198 | +} | |
| 199 | + | |
| 200 | +void helper_dcbz(target_ulong addr) | |
| 201 | +{ | |
| 202 | + do_dcbz(addr, env->dcache_line_size); | |
| 203 | +} | |
| 204 | + | |
| 205 | +void helper_dcbz_970(target_ulong addr) | |
| 206 | +{ | |
| 207 | + if (((env->spr[SPR_970_HID5] >> 7) & 0x3) == 1) | |
| 208 | + do_dcbz(addr, 32); | |
| 209 | + else | |
| 210 | + do_dcbz(addr, env->dcache_line_size); | |
| 211 | +} | |
| 212 | + | |
| 174 | 213 | /*****************************************************************************/ |
| 175 | 214 | /* Fixed point operations helpers */ |
| 176 | 215 | #if defined(TARGET_PPC64) |
| ... | ... | @@ -1219,7 +1258,6 @@ uint64_t helper_fnmsub (uint64_t arg1, uint64_t arg2, uint64_t arg3) |
| 1219 | 1258 | return farg1.ll; |
| 1220 | 1259 | } |
| 1221 | 1260 | |
| 1222 | - | |
| 1223 | 1261 | /* frsp - frsp. */ |
| 1224 | 1262 | uint64_t helper_frsp (uint64_t arg) |
| 1225 | 1263 | { | ... | ... |
target-ppc/op_helper.h
| ... | ... | @@ -24,7 +24,6 @@ |
| 24 | 24 | void glue(do_lsw, MEMSUFFIX) (int dst); |
| 25 | 25 | void glue(do_stsw, MEMSUFFIX) (int src); |
| 26 | 26 | void glue(do_icbi, MEMSUFFIX) (void); |
| 27 | -void glue(do_dcbz, MEMSUFFIX) (void); | |
| 28 | 27 | void glue(do_POWER_lscbx, MEMSUFFIX) (int dest, int ra, int rb); |
| 29 | 28 | void glue(do_POWER2_lfq, MEMSUFFIX) (void); |
| 30 | 29 | void glue(do_POWER2_lfq_le, MEMSUFFIX) (void); |
| ... | ... | @@ -35,7 +34,6 @@ void glue(do_POWER2_stfq_le, MEMSUFFIX) (void); |
| 35 | 34 | void glue(do_lsw_64, MEMSUFFIX) (int dst); |
| 36 | 35 | void glue(do_stsw_64, MEMSUFFIX) (int src); |
| 37 | 36 | void glue(do_icbi_64, MEMSUFFIX) (void); |
| 38 | -void glue(do_dcbz_64, MEMSUFFIX) (void); | |
| 39 | 37 | #endif |
| 40 | 38 | |
| 41 | 39 | #else | ... | ... |
target-ppc/op_helper_mem.h
| ... | ... | @@ -123,100 +123,6 @@ void glue(do_icbi_64, MEMSUFFIX) (void) |
| 123 | 123 | } |
| 124 | 124 | #endif |
| 125 | 125 | |
| 126 | -void glue(do_dcbz, MEMSUFFIX) (void) | |
| 127 | -{ | |
| 128 | - int dcache_line_size = env->dcache_line_size; | |
| 129 | - | |
| 130 | - /* XXX: should be 970 specific (?) */ | |
| 131 | - if (((env->spr[SPR_970_HID5] >> 7) & 0x3) == 1) | |
| 132 | - dcache_line_size = 32; | |
| 133 | - T0 &= ~(uint32_t)(dcache_line_size - 1); | |
| 134 | - glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x00), 0); | |
| 135 | - glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x04), 0); | |
| 136 | - glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x08), 0); | |
| 137 | - glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x0C), 0); | |
| 138 | - glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x10), 0); | |
| 139 | - glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x14), 0); | |
| 140 | - glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x18), 0); | |
| 141 | - glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x1C), 0); | |
| 142 | - if (dcache_line_size >= 64) { | |
| 143 | - glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x20UL), 0); | |
| 144 | - glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x24UL), 0); | |
| 145 | - glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x28UL), 0); | |
| 146 | - glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x2CUL), 0); | |
| 147 | - glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x30UL), 0); | |
| 148 | - glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x34UL), 0); | |
| 149 | - glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x38UL), 0); | |
| 150 | - glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x3CUL), 0); | |
| 151 | - if (dcache_line_size >= 128) { | |
| 152 | - glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x40UL), 0); | |
| 153 | - glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x44UL), 0); | |
| 154 | - glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x48UL), 0); | |
| 155 | - glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x4CUL), 0); | |
| 156 | - glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x50UL), 0); | |
| 157 | - glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x54UL), 0); | |
| 158 | - glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x58UL), 0); | |
| 159 | - glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x5CUL), 0); | |
| 160 | - glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x60UL), 0); | |
| 161 | - glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x64UL), 0); | |
| 162 | - glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x68UL), 0); | |
| 163 | - glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x6CUL), 0); | |
| 164 | - glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x70UL), 0); | |
| 165 | - glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x74UL), 0); | |
| 166 | - glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x78UL), 0); | |
| 167 | - glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x7CUL), 0); | |
| 168 | - } | |
| 169 | - } | |
| 170 | -} | |
| 171 | - | |
| 172 | -#if defined(TARGET_PPC64) | |
| 173 | -void glue(do_dcbz_64, MEMSUFFIX) (void) | |
| 174 | -{ | |
| 175 | - int dcache_line_size = env->dcache_line_size; | |
| 176 | - | |
| 177 | - /* XXX: should be 970 specific (?) */ | |
| 178 | - if (((env->spr[SPR_970_HID5] >> 6) & 0x3) == 0x2) | |
| 179 | - dcache_line_size = 32; | |
| 180 | - T0 &= ~(uint64_t)(dcache_line_size - 1); | |
| 181 | - glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x00), 0); | |
| 182 | - glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x04), 0); | |
| 183 | - glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x08), 0); | |
| 184 | - glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x0C), 0); | |
| 185 | - glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x10), 0); | |
| 186 | - glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x14), 0); | |
| 187 | - glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x18), 0); | |
| 188 | - glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x1C), 0); | |
| 189 | - if (dcache_line_size >= 64) { | |
| 190 | - glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x20UL), 0); | |
| 191 | - glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x24UL), 0); | |
| 192 | - glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x28UL), 0); | |
| 193 | - glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x2CUL), 0); | |
| 194 | - glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x30UL), 0); | |
| 195 | - glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x34UL), 0); | |
| 196 | - glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x38UL), 0); | |
| 197 | - glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x3CUL), 0); | |
| 198 | - if (dcache_line_size >= 128) { | |
| 199 | - glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x40UL), 0); | |
| 200 | - glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x44UL), 0); | |
| 201 | - glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x48UL), 0); | |
| 202 | - glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x4CUL), 0); | |
| 203 | - glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x50UL), 0); | |
| 204 | - glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x54UL), 0); | |
| 205 | - glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x58UL), 0); | |
| 206 | - glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x5CUL), 0); | |
| 207 | - glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x60UL), 0); | |
| 208 | - glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x64UL), 0); | |
| 209 | - glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x68UL), 0); | |
| 210 | - glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x6CUL), 0); | |
| 211 | - glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x70UL), 0); | |
| 212 | - glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x74UL), 0); | |
| 213 | - glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x78UL), 0); | |
| 214 | - glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x7CUL), 0); | |
| 215 | - } | |
| 216 | - } | |
| 217 | -} | |
| 218 | -#endif | |
| 219 | - | |
| 220 | 126 | /* PowerPC 601 specific instructions (POWER bridge) */ |
| 221 | 127 | // XXX: to be tested |
| 222 | 128 | void glue(do_POWER_lscbx, MEMSUFFIX) (int dest, int ra, int rb) | ... | ... |
target-ppc/op_mem.h
| ... | ... | @@ -314,168 +314,6 @@ void OPPROTO glue(op_stdcx_le_64, MEMSUFFIX) (void) |
| 314 | 314 | } |
| 315 | 315 | #endif |
| 316 | 316 | |
| 317 | -void OPPROTO glue(op_dcbz_l32, MEMSUFFIX) (void) | |
| 318 | -{ | |
| 319 | - T0 &= ~((uint32_t)31); | |
| 320 | - glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x00), 0); | |
| 321 | - glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x04), 0); | |
| 322 | - glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x08), 0); | |
| 323 | - glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x0C), 0); | |
| 324 | - glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x10), 0); | |
| 325 | - glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x14), 0); | |
| 326 | - glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x18), 0); | |
| 327 | - glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x1C), 0); | |
| 328 | - RETURN(); | |
| 329 | -} | |
| 330 | - | |
| 331 | -void OPPROTO glue(op_dcbz_l64, MEMSUFFIX) (void) | |
| 332 | -{ | |
| 333 | - T0 &= ~((uint32_t)63); | |
| 334 | - glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x00), 0); | |
| 335 | - glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x04), 0); | |
| 336 | - glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x08), 0); | |
| 337 | - glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x0C), 0); | |
| 338 | - glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x10), 0); | |
| 339 | - glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x14), 0); | |
| 340 | - glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x18), 0); | |
| 341 | - glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x1C), 0); | |
| 342 | - glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x20UL), 0); | |
| 343 | - glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x24UL), 0); | |
| 344 | - glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x28UL), 0); | |
| 345 | - glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x2CUL), 0); | |
| 346 | - glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x30UL), 0); | |
| 347 | - glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x34UL), 0); | |
| 348 | - glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x38UL), 0); | |
| 349 | - glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x3CUL), 0); | |
| 350 | - RETURN(); | |
| 351 | -} | |
| 352 | - | |
| 353 | -void OPPROTO glue(op_dcbz_l128, MEMSUFFIX) (void) | |
| 354 | -{ | |
| 355 | - T0 &= ~((uint32_t)127); | |
| 356 | - glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x00), 0); | |
| 357 | - glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x04), 0); | |
| 358 | - glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x08), 0); | |
| 359 | - glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x0C), 0); | |
| 360 | - glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x10), 0); | |
| 361 | - glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x14), 0); | |
| 362 | - glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x18), 0); | |
| 363 | - glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x1C), 0); | |
| 364 | - glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x20UL), 0); | |
| 365 | - glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x24UL), 0); | |
| 366 | - glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x28UL), 0); | |
| 367 | - glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x2CUL), 0); | |
| 368 | - glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x30UL), 0); | |
| 369 | - glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x34UL), 0); | |
| 370 | - glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x38UL), 0); | |
| 371 | - glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x3CUL), 0); | |
| 372 | - glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x40UL), 0); | |
| 373 | - glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x44UL), 0); | |
| 374 | - glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x48UL), 0); | |
| 375 | - glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x4CUL), 0); | |
| 376 | - glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x50UL), 0); | |
| 377 | - glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x54UL), 0); | |
| 378 | - glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x58UL), 0); | |
| 379 | - glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x5CUL), 0); | |
| 380 | - glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x60UL), 0); | |
| 381 | - glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x64UL), 0); | |
| 382 | - glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x68UL), 0); | |
| 383 | - glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x6CUL), 0); | |
| 384 | - glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x70UL), 0); | |
| 385 | - glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x74UL), 0); | |
| 386 | - glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x78UL), 0); | |
| 387 | - glue(st32, MEMSUFFIX)((uint32_t)(T0 + 0x7CUL), 0); | |
| 388 | - RETURN(); | |
| 389 | -} | |
| 390 | - | |
| 391 | -void OPPROTO glue(op_dcbz, MEMSUFFIX) (void) | |
| 392 | -{ | |
| 393 | - glue(do_dcbz, MEMSUFFIX)(); | |
| 394 | - RETURN(); | |
| 395 | -} | |
| 396 | - | |
| 397 | -#if defined(TARGET_PPC64) | |
| 398 | -void OPPROTO glue(op_dcbz_l32_64, MEMSUFFIX) (void) | |
| 399 | -{ | |
| 400 | - T0 &= ~((uint64_t)31); | |
| 401 | - glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x00), 0); | |
| 402 | - glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x04), 0); | |
| 403 | - glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x08), 0); | |
| 404 | - glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x0C), 0); | |
| 405 | - glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x10), 0); | |
| 406 | - glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x14), 0); | |
| 407 | - glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x18), 0); | |
| 408 | - glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x1C), 0); | |
| 409 | - RETURN(); | |
| 410 | -} | |
| 411 | - | |
| 412 | -void OPPROTO glue(op_dcbz_l64_64, MEMSUFFIX) (void) | |
| 413 | -{ | |
| 414 | - T0 &= ~((uint64_t)63); | |
| 415 | - glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x00), 0); | |
| 416 | - glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x04), 0); | |
| 417 | - glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x08), 0); | |
| 418 | - glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x0C), 0); | |
| 419 | - glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x10), 0); | |
| 420 | - glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x14), 0); | |
| 421 | - glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x18), 0); | |
| 422 | - glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x1C), 0); | |
| 423 | - glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x20UL), 0); | |
| 424 | - glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x24UL), 0); | |
| 425 | - glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x28UL), 0); | |
| 426 | - glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x2CUL), 0); | |
| 427 | - glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x30UL), 0); | |
| 428 | - glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x34UL), 0); | |
| 429 | - glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x38UL), 0); | |
| 430 | - glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x3CUL), 0); | |
| 431 | - RETURN(); | |
| 432 | -} | |
| 433 | - | |
| 434 | -void OPPROTO glue(op_dcbz_l128_64, MEMSUFFIX) (void) | |
| 435 | -{ | |
| 436 | - T0 &= ~((uint64_t)127); | |
| 437 | - glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x00), 0); | |
| 438 | - glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x04), 0); | |
| 439 | - glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x08), 0); | |
| 440 | - glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x0C), 0); | |
| 441 | - glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x10), 0); | |
| 442 | - glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x14), 0); | |
| 443 | - glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x18), 0); | |
| 444 | - glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x1C), 0); | |
| 445 | - glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x20UL), 0); | |
| 446 | - glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x24UL), 0); | |
| 447 | - glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x28UL), 0); | |
| 448 | - glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x2CUL), 0); | |
| 449 | - glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x30UL), 0); | |
| 450 | - glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x34UL), 0); | |
| 451 | - glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x38UL), 0); | |
| 452 | - glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x3CUL), 0); | |
| 453 | - glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x40UL), 0); | |
| 454 | - glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x44UL), 0); | |
| 455 | - glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x48UL), 0); | |
| 456 | - glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x4CUL), 0); | |
| 457 | - glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x50UL), 0); | |
| 458 | - glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x54UL), 0); | |
| 459 | - glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x58UL), 0); | |
| 460 | - glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x5CUL), 0); | |
| 461 | - glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x60UL), 0); | |
| 462 | - glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x64UL), 0); | |
| 463 | - glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x68UL), 0); | |
| 464 | - glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x6CUL), 0); | |
| 465 | - glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x70UL), 0); | |
| 466 | - glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x74UL), 0); | |
| 467 | - glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x78UL), 0); | |
| 468 | - glue(st32, MEMSUFFIX)((uint64_t)(T0 + 0x7CUL), 0); | |
| 469 | - RETURN(); | |
| 470 | -} | |
| 471 | - | |
| 472 | -void OPPROTO glue(op_dcbz_64, MEMSUFFIX) (void) | |
| 473 | -{ | |
| 474 | - glue(do_dcbz_64, MEMSUFFIX)(); | |
| 475 | - RETURN(); | |
| 476 | -} | |
| 477 | -#endif | |
| 478 | - | |
| 479 | 317 | /* Instruction cache block invalidate */ |
| 480 | 318 | void OPPROTO glue(op_icbi, MEMSUFFIX) (void) |
| 481 | 319 | { | ... | ... |
target-ppc/translate.c
| ... | ... | @@ -199,7 +199,6 @@ typedef struct DisasContext { |
| 199 | 199 | int spe_enabled; |
| 200 | 200 | ppc_spr_t *spr_cb; /* Needed to check rights for mfspr/mtspr */ |
| 201 | 201 | int singlestep_enabled; |
| 202 | - int dcache_line_size; | |
| 203 | 202 | } DisasContext; |
| 204 | 203 | |
| 205 | 204 | struct opc_handler_t { |
| ... | ... | @@ -4142,95 +4141,27 @@ GEN_HANDLER(dcbtst, 0x1F, 0x16, 0x07, 0x02000001, PPC_CACHE) |
| 4142 | 4141 | } |
| 4143 | 4142 | |
| 4144 | 4143 | /* dcbz */ |
| 4145 | -#define op_dcbz(n) (*gen_op_dcbz[n][ctx->mem_idx])() | |
| 4146 | -static GenOpFunc *gen_op_dcbz[4][NB_MEM_FUNCS] = { | |
| 4147 | - /* 32 bytes cache line size */ | |
| 4148 | - { | |
| 4149 | -#define gen_op_dcbz_l32_le_raw gen_op_dcbz_l32_raw | |
| 4150 | -#define gen_op_dcbz_l32_le_user gen_op_dcbz_l32_user | |
| 4151 | -#define gen_op_dcbz_l32_le_kernel gen_op_dcbz_l32_kernel | |
| 4152 | -#define gen_op_dcbz_l32_le_hypv gen_op_dcbz_l32_hypv | |
| 4153 | -#define gen_op_dcbz_l32_le_64_raw gen_op_dcbz_l32_64_raw | |
| 4154 | -#define gen_op_dcbz_l32_le_64_user gen_op_dcbz_l32_64_user | |
| 4155 | -#define gen_op_dcbz_l32_le_64_kernel gen_op_dcbz_l32_64_kernel | |
| 4156 | -#define gen_op_dcbz_l32_le_64_hypv gen_op_dcbz_l32_64_hypv | |
| 4157 | - GEN_MEM_FUNCS(dcbz_l32), | |
| 4158 | - }, | |
| 4159 | - /* 64 bytes cache line size */ | |
| 4160 | - { | |
| 4161 | -#define gen_op_dcbz_l64_le_raw gen_op_dcbz_l64_raw | |
| 4162 | -#define gen_op_dcbz_l64_le_user gen_op_dcbz_l64_user | |
| 4163 | -#define gen_op_dcbz_l64_le_kernel gen_op_dcbz_l64_kernel | |
| 4164 | -#define gen_op_dcbz_l64_le_hypv gen_op_dcbz_l64_hypv | |
| 4165 | -#define gen_op_dcbz_l64_le_64_raw gen_op_dcbz_l64_64_raw | |
| 4166 | -#define gen_op_dcbz_l64_le_64_user gen_op_dcbz_l64_64_user | |
| 4167 | -#define gen_op_dcbz_l64_le_64_kernel gen_op_dcbz_l64_64_kernel | |
| 4168 | -#define gen_op_dcbz_l64_le_64_hypv gen_op_dcbz_l64_64_hypv | |
| 4169 | - GEN_MEM_FUNCS(dcbz_l64), | |
| 4170 | - }, | |
| 4171 | - /* 128 bytes cache line size */ | |
| 4172 | - { | |
| 4173 | -#define gen_op_dcbz_l128_le_raw gen_op_dcbz_l128_raw | |
| 4174 | -#define gen_op_dcbz_l128_le_user gen_op_dcbz_l128_user | |
| 4175 | -#define gen_op_dcbz_l128_le_kernel gen_op_dcbz_l128_kernel | |
| 4176 | -#define gen_op_dcbz_l128_le_hypv gen_op_dcbz_l128_hypv | |
| 4177 | -#define gen_op_dcbz_l128_le_64_raw gen_op_dcbz_l128_64_raw | |
| 4178 | -#define gen_op_dcbz_l128_le_64_user gen_op_dcbz_l128_64_user | |
| 4179 | -#define gen_op_dcbz_l128_le_64_kernel gen_op_dcbz_l128_64_kernel | |
| 4180 | -#define gen_op_dcbz_l128_le_64_hypv gen_op_dcbz_l128_64_hypv | |
| 4181 | - GEN_MEM_FUNCS(dcbz_l128), | |
| 4182 | - }, | |
| 4183 | - /* tunable cache line size */ | |
| 4184 | - { | |
| 4185 | -#define gen_op_dcbz_le_raw gen_op_dcbz_raw | |
| 4186 | -#define gen_op_dcbz_le_user gen_op_dcbz_user | |
| 4187 | -#define gen_op_dcbz_le_kernel gen_op_dcbz_kernel | |
| 4188 | -#define gen_op_dcbz_le_hypv gen_op_dcbz_hypv | |
| 4189 | -#define gen_op_dcbz_le_64_raw gen_op_dcbz_64_raw | |
| 4190 | -#define gen_op_dcbz_le_64_user gen_op_dcbz_64_user | |
| 4191 | -#define gen_op_dcbz_le_64_kernel gen_op_dcbz_64_kernel | |
| 4192 | -#define gen_op_dcbz_le_64_hypv gen_op_dcbz_64_hypv | |
| 4193 | - GEN_MEM_FUNCS(dcbz), | |
| 4194 | - }, | |
| 4195 | -}; | |
| 4196 | - | |
| 4197 | -static always_inline void handler_dcbz (DisasContext *ctx, | |
| 4198 | - int dcache_line_size) | |
| 4199 | -{ | |
| 4200 | - int n; | |
| 4201 | - | |
| 4202 | - switch (dcache_line_size) { | |
| 4203 | - case 32: | |
| 4204 | - n = 0; | |
| 4205 | - break; | |
| 4206 | - case 64: | |
| 4207 | - n = 1; | |
| 4208 | - break; | |
| 4209 | - case 128: | |
| 4210 | - n = 2; | |
| 4211 | - break; | |
| 4212 | - default: | |
| 4213 | - n = 3; | |
| 4214 | - break; | |
| 4215 | - } | |
| 4216 | - op_dcbz(n); | |
| 4217 | -} | |
| 4218 | - | |
| 4219 | 4144 | GEN_HANDLER(dcbz, 0x1F, 0x16, 0x1F, 0x03E00001, PPC_CACHE_DCBZ) |
| 4220 | 4145 | { |
| 4221 | - gen_addr_reg_index(cpu_T[0], ctx); | |
| 4222 | - handler_dcbz(ctx, ctx->dcache_line_size); | |
| 4223 | - gen_op_check_reservation(); | |
| 4146 | + TCGv t0 = tcg_temp_new(); | |
| 4147 | + gen_addr_reg_index(t0, ctx); | |
| 4148 | + /* NIP cannot be restored if the memory exception comes from an helper */ | |
| 4149 | + gen_update_nip(ctx, ctx->nip - 4); | |
| 4150 | + gen_helper_dcbz(t0); | |
| 4151 | + tcg_temp_free(t0); | |
| 4224 | 4152 | } |
| 4225 | 4153 | |
| 4226 | 4154 | GEN_HANDLER2(dcbz_970, "dcbz", 0x1F, 0x16, 0x1F, 0x03C00001, PPC_CACHE_DCBZT) |
| 4227 | 4155 | { |
| 4228 | - gen_addr_reg_index(cpu_T[0], ctx); | |
| 4156 | + TCGv t0 = tcg_temp_new(); | |
| 4157 | + gen_addr_reg_index(t0, ctx); | |
| 4158 | + /* NIP cannot be restored if the memory exception comes from an helper */ | |
| 4159 | + gen_update_nip(ctx, ctx->nip - 4); | |
| 4229 | 4160 | if (ctx->opcode & 0x00200000) |
| 4230 | - handler_dcbz(ctx, ctx->dcache_line_size); | |
| 4161 | + gen_helper_dcbz(t0); | |
| 4231 | 4162 | else |
| 4232 | - handler_dcbz(ctx, -1); | |
| 4233 | - gen_op_check_reservation(); | |
| 4163 | + gen_helper_dcbz_970(t0); | |
| 4164 | + tcg_temp_free(t0); | |
| 4234 | 4165 | } |
| 4235 | 4166 | |
| 4236 | 4167 | /* icbi */ |
| ... | ... | @@ -7563,7 +7494,6 @@ static always_inline void gen_intermediate_code_internal (CPUState *env, |
| 7563 | 7494 | #else |
| 7564 | 7495 | ctx.mem_idx = (supervisor << 1) | little_endian; |
| 7565 | 7496 | #endif |
| 7566 | - ctx.dcache_line_size = env->dcache_line_size; | |
| 7567 | 7497 | ctx.fpu_enabled = msr_fp; |
| 7568 | 7498 | if ((env->flags & POWERPC_FLAG_SPE) && msr_spe) |
| 7569 | 7499 | ctx.spe_enabled = msr_spe; | ... | ... |