Commit 6f2d8978728c48ca46f5c01835438508aace5c64
1 parent
8582a53a
Fix usage of the -1 constant in the PowerPC target code:
fix invalid size casts and/or sign-extensions. git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3626 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
4 changed files
with
54 additions
and
51 deletions
target-ppc/helper.c
| ... | ... | @@ -199,7 +199,7 @@ static always_inline int _pte_check (mmu_ctx_t *ctx, int is_64b, |
| 199 | 199 | pp = pte1 & 0x00000003; |
| 200 | 200 | } |
| 201 | 201 | if (ptem == ctx->ptem) { |
| 202 | - if (ctx->raddr != (target_ulong)-1) { | |
| 202 | + if (ctx->raddr != (target_phys_addr_t)-1ULL) { | |
| 203 | 203 | /* all matches should have equal RPN, WIMG & PP */ |
| 204 | 204 | if ((ctx->raddr & mmask) != (pte1 & mmask)) { |
| 205 | 205 | if (loglevel != 0) |
| ... | ... | @@ -900,7 +900,7 @@ static always_inline target_phys_addr_t get_pgaddr (target_phys_addr_t sdr1, |
| 900 | 900 | target_phys_addr_t hash, |
| 901 | 901 | target_phys_addr_t mask) |
| 902 | 902 | { |
| 903 | - return (sdr1 & ((target_ulong)(-1ULL) << sdr_sh)) | (hash & mask); | |
| 903 | + return (sdr1 & ((target_phys_addr_t)(-1ULL) << sdr_sh)) | (hash & mask); | |
| 904 | 904 | } |
| 905 | 905 | |
| 906 | 906 | static always_inline int get_segment (CPUState *env, mmu_ctx_t *ctx, |
| ... | ... | @@ -1011,7 +1011,7 @@ static always_inline int get_segment (CPUState *env, mmu_ctx_t *ctx, |
| 1011 | 1011 | ctx->ptem = (vsid << 7) | (pgidx >> 10); |
| 1012 | 1012 | } |
| 1013 | 1013 | /* Initialize real address with an invalid value */ |
| 1014 | - ctx->raddr = (target_ulong)-1; | |
| 1014 | + ctx->raddr = (target_phys_addr_t)-1ULL; | |
| 1015 | 1015 | if (unlikely(env->mmu_model == POWERPC_MMU_SOFT_6xx || |
| 1016 | 1016 | env->mmu_model == POWERPC_MMU_SOFT_74xx)) { |
| 1017 | 1017 | /* Software TLB search */ |
| ... | ... | @@ -1223,7 +1223,7 @@ int mmu40x_get_physical_address (CPUState *env, mmu_ctx_t *ctx, |
| 1223 | 1223 | int i, ret, zsel, zpr, pr; |
| 1224 | 1224 | |
| 1225 | 1225 | ret = -1; |
| 1226 | - raddr = -1; | |
| 1226 | + raddr = (target_phys_addr_t)-1ULL; | |
| 1227 | 1227 | pr = msr_pr; |
| 1228 | 1228 | for (i = 0; i < env->nb_tlb; i++) { |
| 1229 | 1229 | tlb = &env->tlb[i].tlbe; |
| ... | ... | @@ -1306,7 +1306,7 @@ int mmubooke_get_physical_address (CPUState *env, mmu_ctx_t *ctx, |
| 1306 | 1306 | int i, prot, ret; |
| 1307 | 1307 | |
| 1308 | 1308 | ret = -1; |
| 1309 | - raddr = -1; | |
| 1309 | + raddr = (target_phys_addr_t)-1ULL; | |
| 1310 | 1310 | for (i = 0; i < env->nb_tlb; i++) { |
| 1311 | 1311 | tlb = &env->tlb[i].tlbe; |
| 1312 | 1312 | if (ppcemb_tlb_check(env, tlb, &raddr, address, |
| ... | ... | @@ -1975,7 +1975,7 @@ void ppc_tlb_invalidate_one (CPUPPCState *env, target_ulong addr) |
| 1975 | 1975 | case POWERPC_MMU_32B: |
| 1976 | 1976 | case POWERPC_MMU_601: |
| 1977 | 1977 | /* tlbie invalidate TLBs for all segments */ |
| 1978 | - addr &= ~((target_ulong)-1 << 28); | |
| 1978 | + addr &= ~((target_ulong)-1ULL << 28); | |
| 1979 | 1979 | /* XXX: this case should be optimized, |
| 1980 | 1980 | * giving a mask to tlb_flush_page |
| 1981 | 1981 | */ |
| ... | ... | @@ -2730,7 +2730,7 @@ static always_inline void powerpc_excp (CPUState *env, |
| 2730 | 2730 | new_msr &= ~((target_ulong)1 << MSR_LE); |
| 2731 | 2731 | /* Jump to handler */ |
| 2732 | 2732 | vector = env->excp_vectors[excp]; |
| 2733 | - if (vector == (target_ulong)-1) { | |
| 2733 | + if (vector == (target_ulong)-1ULL) { | |
| 2734 | 2734 | cpu_abort(env, "Raised an exception without defined vector %d\n", |
| 2735 | 2735 | excp); |
| 2736 | 2736 | } |
| ... | ... | @@ -2961,7 +2961,7 @@ void cpu_ppc_reset (void *opaque) |
| 2961 | 2961 | #endif |
| 2962 | 2962 | env->msr = msr; |
| 2963 | 2963 | hreg_compute_hflags(env); |
| 2964 | - env->reserve = -1; | |
| 2964 | + env->reserve = (target_ulong)-1ULL; | |
| 2965 | 2965 | /* Be sure no exception or interrupt is pending */ |
| 2966 | 2966 | env->pending_interrupts = 0; |
| 2967 | 2967 | env->exception_index = POWERPC_EXCP_NONE; | ... | ... |
target-ppc/op.c
| ... | ... | @@ -959,9 +959,9 @@ void OPPROTO op_add_ze (void) |
| 959 | 959 | /* divide word */ |
| 960 | 960 | void OPPROTO op_divw (void) |
| 961 | 961 | { |
| 962 | - if (unlikely(((int32_t)T0 == INT32_MIN && (int32_t)T1 == -1) || | |
| 962 | + if (unlikely(((int32_t)T0 == INT32_MIN && (int32_t)T1 == (int32_t)-1) || | |
| 963 | 963 | (int32_t)T1 == 0)) { |
| 964 | - T0 = (int32_t)((-1) * ((uint32_t)T0 >> 31)); | |
| 964 | + T0 = (int32_t)(UINT32_MAX * ((uint32_t)T0 >> 31)); | |
| 965 | 965 | } else { |
| 966 | 966 | T0 = (int32_t)T0 / (int32_t)T1; |
| 967 | 967 | } |
| ... | ... | @@ -971,9 +971,9 @@ void OPPROTO op_divw (void) |
| 971 | 971 | #if defined(TARGET_PPC64) |
| 972 | 972 | void OPPROTO op_divd (void) |
| 973 | 973 | { |
| 974 | - if (unlikely(((int64_t)T0 == INT64_MIN && (int64_t)T1 == -1) || | |
| 974 | + if (unlikely(((int64_t)T0 == INT64_MIN && (int64_t)T1 == (int64_t)-1LL) || | |
| 975 | 975 | (int64_t)T1 == 0)) { |
| 976 | - T0 = (int64_t)((-1ULL) * ((uint64_t)T0 >> 63)); | |
| 976 | + T0 = (int64_t)(UINT64_MAX * ((uint64_t)T0 >> 63)); | |
| 977 | 977 | } else { |
| 978 | 978 | T0 = (int64_t)T0 / (int64_t)T1; |
| 979 | 979 | } |
| ... | ... | @@ -2006,7 +2006,7 @@ void OPPROTO op_check_reservation (void) |
| 2006 | 2006 | void OPPROTO op_check_reservation_64 (void) |
| 2007 | 2007 | { |
| 2008 | 2008 | if ((uint64_t)env->reserve == (uint64_t)(T0 & ~0x00000003)) |
| 2009 | - env->reserve = -1; | |
| 2009 | + env->reserve = (target_ulong)-1ULL; | |
| 2010 | 2010 | RETURN(); |
| 2011 | 2011 | } |
| 2012 | 2012 | #endif |
| ... | ... | @@ -2344,7 +2344,7 @@ void OPPROTO op_POWER_sleq (void) |
| 2344 | 2344 | |
| 2345 | 2345 | void OPPROTO op_POWER_sllq (void) |
| 2346 | 2346 | { |
| 2347 | - uint32_t msk = -1; | |
| 2347 | + uint32_t msk = UINT32_MAX; | |
| 2348 | 2348 | |
| 2349 | 2349 | msk = msk << (T1 & 0x1FUL); |
| 2350 | 2350 | if (T1 & 0x20UL) |
| ... | ... | @@ -2357,7 +2357,7 @@ void OPPROTO op_POWER_sllq (void) |
| 2357 | 2357 | |
| 2358 | 2358 | void OPPROTO op_POWER_slq (void) |
| 2359 | 2359 | { |
| 2360 | - uint32_t msk = -1, tmp; | |
| 2360 | + uint32_t msk = UINT32_MAX, tmp; | |
| 2361 | 2361 | |
| 2362 | 2362 | msk = msk << (T1 & 0x1FUL); |
| 2363 | 2363 | if (T1 & 0x20UL) |
| ... | ... | @@ -2373,7 +2373,7 @@ void OPPROTO op_POWER_sraq (void) |
| 2373 | 2373 | { |
| 2374 | 2374 | env->spr[SPR_MQ] = rotl32(T0, 32 - (T1 & 0x1FUL)); |
| 2375 | 2375 | if (T1 & 0x20UL) |
| 2376 | - T0 = -1L; | |
| 2376 | + T0 = UINT32_MAX; | |
| 2377 | 2377 | else |
| 2378 | 2378 | T0 = (int32_t)T0 >> T1; |
| 2379 | 2379 | RETURN(); |
| ... | ... | @@ -2529,7 +2529,7 @@ void OPPROTO op_405_check_satu (void) |
| 2529 | 2529 | { |
| 2530 | 2530 | if (unlikely(T0 < T2)) { |
| 2531 | 2531 | /* Saturate result */ |
| 2532 | - T0 = -1; | |
| 2532 | + T0 = UINT32_MAX; | |
| 2533 | 2533 | } |
| 2534 | 2534 | RETURN(); |
| 2535 | 2535 | } |
| ... | ... | @@ -2602,7 +2602,7 @@ void OPPROTO op_4xx_tlbsx_check (void) |
| 2602 | 2602 | int tmp; |
| 2603 | 2603 | |
| 2604 | 2604 | tmp = xer_so; |
| 2605 | - if (T0 != -1) | |
| 2605 | + if ((int)T0 != -1) | |
| 2606 | 2606 | tmp |= 0x02; |
| 2607 | 2607 | env->crf[0] = tmp; |
| 2608 | 2608 | RETURN(); | ... | ... |
target-ppc/op_helper.c
| ... | ... | @@ -175,29 +175,29 @@ void do_addmeo_64 (void) |
| 175 | 175 | |
| 176 | 176 | void do_divwo (void) |
| 177 | 177 | { |
| 178 | - if (likely(!(((int32_t)T0 == INT32_MIN && (int32_t)T1 == -1) || | |
| 178 | + if (likely(!(((int32_t)T0 == INT32_MIN && (int32_t)T1 == (int32_t)-1) || | |
| 179 | 179 | (int32_t)T1 == 0))) { |
| 180 | 180 | xer_ov = 0; |
| 181 | 181 | T0 = (int32_t)T0 / (int32_t)T1; |
| 182 | 182 | } else { |
| 183 | 183 | xer_ov = 1; |
| 184 | - xer_so = 1; | |
| 185 | - T0 = (-1) * ((uint32_t)T0 >> 31); | |
| 184 | + T0 = UINT32_MAX * ((uint32_t)T0 >> 31); | |
| 186 | 185 | } |
| 186 | + xer_so |= xer_ov; | |
| 187 | 187 | } |
| 188 | 188 | |
| 189 | 189 | #if defined(TARGET_PPC64) |
| 190 | 190 | void do_divdo (void) |
| 191 | 191 | { |
| 192 | - if (likely(!(((int64_t)T0 == INT64_MIN && (int64_t)T1 == -1ULL) || | |
| 192 | + if (likely(!(((int64_t)T0 == INT64_MIN && (int64_t)T1 == (int64_t)-1LL) || | |
| 193 | 193 | (int64_t)T1 == 0))) { |
| 194 | 194 | xer_ov = 0; |
| 195 | 195 | T0 = (int64_t)T0 / (int64_t)T1; |
| 196 | 196 | } else { |
| 197 | 197 | xer_ov = 1; |
| 198 | - xer_so = 1; | |
| 199 | - T0 = (-1ULL) * ((uint64_t)T0 >> 63); | |
| 198 | + T0 = UINT64_MAX * ((uint64_t)T0 >> 63); | |
| 200 | 199 | } |
| 200 | + xer_so |= xer_ov; | |
| 201 | 201 | } |
| 202 | 202 | #endif |
| 203 | 203 | |
| ... | ... | @@ -247,14 +247,14 @@ void do_mulldo (void) |
| 247 | 247 | uint64_t tl; |
| 248 | 248 | |
| 249 | 249 | muls64(&tl, &th, T0, T1); |
| 250 | + T0 = (int64_t)tl; | |
| 250 | 251 | /* If th != 0 && th != -1, then we had an overflow */ |
| 251 | - if (likely((th + 1) <= 1)) { | |
| 252 | + if (likely((uint64_t)(th + 1) <= 1)) { | |
| 252 | 253 | xer_ov = 0; |
| 253 | 254 | } else { |
| 254 | 255 | xer_ov = 1; |
| 255 | - xer_so = 1; | |
| 256 | 256 | } |
| 257 | - T0 = (int64_t)tl; | |
| 257 | + xer_so |= xer_ov; | |
| 258 | 258 | } |
| 259 | 259 | #endif |
| 260 | 260 | |
| ... | ... | @@ -392,7 +392,7 @@ void do_sraw (void) |
| 392 | 392 | xer_ca = 0; |
| 393 | 393 | } |
| 394 | 394 | } else { |
| 395 | - ret = (-1) * ((uint32_t)T0 >> 31); | |
| 395 | + ret = UINT32_MAX * ((uint32_t)T0 >> 31); | |
| 396 | 396 | if (likely(ret >= 0 || ((uint32_t)T0 & ~0x80000000UL) == 0)) { |
| 397 | 397 | xer_ca = 0; |
| 398 | 398 | } else { |
| ... | ... | @@ -420,7 +420,7 @@ void do_srad (void) |
| 420 | 420 | xer_ca = 0; |
| 421 | 421 | } |
| 422 | 422 | } else { |
| 423 | - ret = (-1) * ((uint64_t)T0 >> 63); | |
| 423 | + ret = UINT64_MAX * ((uint64_t)T0 >> 63); | |
| 424 | 424 | if (likely(ret >= 0 || ((uint64_t)T0 & ~0x8000000000000000ULL) == 0)) { |
| 425 | 425 | xer_ca = 0; |
| 426 | 426 | } else { |
| ... | ... | @@ -609,7 +609,7 @@ static always_inline void fload_invalid_op_excp (int op) |
| 609 | 609 | env->fpscr &= ~((1 << FPSCR_FR) | (1 << FPSCR_FI)); |
| 610 | 610 | if (ve == 0) { |
| 611 | 611 | /* Set the result to quiet NaN */ |
| 612 | - FT0 = (uint64_t)-1; | |
| 612 | + FT0 = UINT64_MAX; | |
| 613 | 613 | env->fpscr &= ~(0xF << FPSCR_FPCC); |
| 614 | 614 | env->fpscr |= 0x11 << FPSCR_FPCC; |
| 615 | 615 | } |
| ... | ... | @@ -620,7 +620,7 @@ static always_inline void fload_invalid_op_excp (int op) |
| 620 | 620 | env->fpscr &= ~((1 << FPSCR_FR) | (1 << FPSCR_FI)); |
| 621 | 621 | if (ve == 0) { |
| 622 | 622 | /* Set the result to quiet NaN */ |
| 623 | - FT0 = (uint64_t)-1; | |
| 623 | + FT0 = UINT64_MAX; | |
| 624 | 624 | env->fpscr &= ~(0xF << FPSCR_FPCC); |
| 625 | 625 | env->fpscr |= 0x11 << FPSCR_FPCC; |
| 626 | 626 | } |
| ... | ... | @@ -1555,8 +1555,9 @@ void do_POWER_div (void) |
| 1555 | 1555 | { |
| 1556 | 1556 | uint64_t tmp; |
| 1557 | 1557 | |
| 1558 | - if (((int32_t)T0 == INT32_MIN && (int32_t)T1 == -1) || (int32_t)T1 == 0) { | |
| 1559 | - T0 = (long)((-1) * (T0 >> 31)); | |
| 1558 | + if (((int32_t)T0 == INT32_MIN && (int32_t)T1 == (int32_t)-1) || | |
| 1559 | + (int32_t)T1 == 0) { | |
| 1560 | + T0 = UINT32_MAX * ((uint32_t)T0 >> 31); | |
| 1560 | 1561 | env->spr[SPR_MQ] = 0; |
| 1561 | 1562 | } else { |
| 1562 | 1563 | tmp = ((uint64_t)T0 << 32) | env->spr[SPR_MQ]; |
| ... | ... | @@ -1569,29 +1570,30 @@ void do_POWER_divo (void) |
| 1569 | 1570 | { |
| 1570 | 1571 | int64_t tmp; |
| 1571 | 1572 | |
| 1572 | - if (((int32_t)T0 == INT32_MIN && (int32_t)T1 == -1) || (int32_t)T1 == 0) { | |
| 1573 | - T0 = (long)((-1) * (T0 >> 31)); | |
| 1573 | + if (((int32_t)T0 == INT32_MIN && (int32_t)T1 == (int32_t)-1) || | |
| 1574 | + (int32_t)T1 == 0) { | |
| 1575 | + T0 = UINT32_MAX * ((uint32_t)T0 >> 31); | |
| 1574 | 1576 | env->spr[SPR_MQ] = 0; |
| 1575 | 1577 | xer_ov = 1; |
| 1576 | - xer_so = 1; | |
| 1577 | 1578 | } else { |
| 1578 | 1579 | tmp = ((uint64_t)T0 << 32) | env->spr[SPR_MQ]; |
| 1579 | 1580 | env->spr[SPR_MQ] = tmp % T1; |
| 1580 | 1581 | tmp /= (int32_t)T1; |
| 1581 | 1582 | if (tmp > (int64_t)INT32_MAX || tmp < (int64_t)INT32_MIN) { |
| 1582 | 1583 | xer_ov = 1; |
| 1583 | - xer_so = 1; | |
| 1584 | 1584 | } else { |
| 1585 | 1585 | xer_ov = 0; |
| 1586 | 1586 | } |
| 1587 | 1587 | T0 = tmp; |
| 1588 | 1588 | } |
| 1589 | + xer_so |= xer_ov; | |
| 1589 | 1590 | } |
| 1590 | 1591 | |
| 1591 | 1592 | void do_POWER_divs (void) |
| 1592 | 1593 | { |
| 1593 | - if (((int32_t)T0 == INT32_MIN && (int32_t)T1 == -1) || (int32_t)T1 == 0) { | |
| 1594 | - T0 = (long)((-1) * (T0 >> 31)); | |
| 1594 | + if (((int32_t)T0 == INT32_MIN && (int32_t)T1 == (int32_t)-1) || | |
| 1595 | + (int32_t)T1 == 0) { | |
| 1596 | + T0 = UINT32_MAX * ((uint32_t)T0 >> 31); | |
| 1595 | 1597 | env->spr[SPR_MQ] = 0; |
| 1596 | 1598 | } else { |
| 1597 | 1599 | env->spr[SPR_MQ] = T0 % T1; |
| ... | ... | @@ -1601,16 +1603,17 @@ void do_POWER_divs (void) |
| 1601 | 1603 | |
| 1602 | 1604 | void do_POWER_divso (void) |
| 1603 | 1605 | { |
| 1604 | - if (((int32_t)T0 == INT32_MIN && (int32_t)T1 == -1) || (int32_t)T1 == 0) { | |
| 1605 | - T0 = (long)((-1) * (T0 >> 31)); | |
| 1606 | + if (((int32_t)T0 == INT32_MIN && (int32_t)T1 == (int32_t)-1) || | |
| 1607 | + (int32_t)T1 == 0) { | |
| 1608 | + T0 = UINT32_MAX * ((uint32_t)T0 >> 31); | |
| 1606 | 1609 | env->spr[SPR_MQ] = 0; |
| 1607 | 1610 | xer_ov = 1; |
| 1608 | - xer_so = 1; | |
| 1609 | 1611 | } else { |
| 1610 | 1612 | T0 = (int32_t)T0 / (int32_t)T1; |
| 1611 | 1613 | env->spr[SPR_MQ] = (int32_t)T0 % (int32_t)T1; |
| 1612 | 1614 | xer_ov = 0; |
| 1613 | 1615 | } |
| 1616 | + xer_so |= xer_ov; | |
| 1614 | 1617 | } |
| 1615 | 1618 | |
| 1616 | 1619 | void do_POWER_dozo (void) |
| ... | ... | @@ -1636,10 +1639,10 @@ void do_POWER_maskg (void) |
| 1636 | 1639 | uint32_t ret; |
| 1637 | 1640 | |
| 1638 | 1641 | if ((uint32_t)T0 == (uint32_t)(T1 + 1)) { |
| 1639 | - ret = -1; | |
| 1642 | + ret = UINT32_MAX; | |
| 1640 | 1643 | } else { |
| 1641 | - ret = (((uint32_t)(-1)) >> ((uint32_t)T0)) ^ | |
| 1642 | - (((uint32_t)(-1) >> ((uint32_t)T1)) >> 1); | |
| 1644 | + ret = (UINT32_MAX >> ((uint32_t)T0)) ^ | |
| 1645 | + ((UINT32_MAX >> ((uint32_t)T1)) >> 1); | |
| 1643 | 1646 | if ((uint32_t)T0 > (uint32_t)T1) |
| 1644 | 1647 | ret = ~ret; |
| 1645 | 1648 | } |
| ... | ... | @@ -1874,7 +1877,7 @@ void do_brinc (void) |
| 1874 | 1877 | { |
| 1875 | 1878 | uint32_t a, b, d, mask; |
| 1876 | 1879 | |
| 1877 | - mask = (uint32_t)(-1UL) >> MASKBITS; | |
| 1880 | + mask = UINT32_MAX >> MASKBITS; | |
| 1878 | 1881 | b = T1_64 & mask; |
| 1879 | 1882 | a = T0_64 & mask; |
| 1880 | 1883 | d = word_reverse(1 + word_reverse(a | ~mask)); | ... | ... |
target-ppc/translate.c
| ... | ... | @@ -404,15 +404,15 @@ static always_inline target_ulong MASK (uint32_t start, uint32_t end) |
| 404 | 404 | |
| 405 | 405 | #if defined(TARGET_PPC64) |
| 406 | 406 | if (likely(start == 0)) { |
| 407 | - ret = (uint64_t)(-1ULL) << (63 - end); | |
| 407 | + ret = UINT64_MAX << (63 - end); | |
| 408 | 408 | } else if (likely(end == 63)) { |
| 409 | - ret = (uint64_t)(-1ULL) >> start; | |
| 409 | + ret = UINT64_MAX >> start; | |
| 410 | 410 | } |
| 411 | 411 | #else |
| 412 | 412 | if (likely(start == 0)) { |
| 413 | - ret = (uint32_t)(-1ULL) << (31 - end); | |
| 413 | + ret = UINT32_MAX << (31 - end); | |
| 414 | 414 | } else if (likely(end == 31)) { |
| 415 | - ret = (uint32_t)(-1ULL) >> start; | |
| 415 | + ret = UINT32_MAX >> start; | |
| 416 | 416 | } |
| 417 | 417 | #endif |
| 418 | 418 | else { |
| ... | ... | @@ -3517,7 +3517,7 @@ GEN_HANDLER(mfmsr, 0x1F, 0x13, 0x02, 0x001FF801, PPC_MISC) |
| 3517 | 3517 | } |
| 3518 | 3518 | |
| 3519 | 3519 | #if 1 |
| 3520 | -#define SPR_NOACCESS ((void *)(-1)) | |
| 3520 | +#define SPR_NOACCESS ((void *)(-1UL)) | |
| 3521 | 3521 | #else |
| 3522 | 3522 | static void spr_noaccess (void *opaque, int sprn) |
| 3523 | 3523 | { | ... | ... |