Commit 90cbed4656108fec86d157ced39192e0774a6615
1 parent
bffe1431
Fix 32 bit address overflow
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5019 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
19 additions
and
0 deletions
tcg/sparc/tcg-target.c
| ... | ... | @@ -625,8 +625,18 @@ static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, |
| 625 | 625 | /* ld [arg1 + x], arg1 */ |
| 626 | 626 | tcg_out_ldst(s, arg1, arg1, offsetof(CPUTLBEntry, addend) - |
| 627 | 627 | offsetof(CPUTLBEntry, addr_read), HOST_LD_OP); |
| 628 | + | |
| 629 | +#if TARGET_LONG_BITS == 32 | |
| 630 | + /* and addr_reg, x, arg0 */ | |
| 631 | + tcg_out_movi(s, TCG_TYPE_I32, TCG_REG_I5, 0xffffffff); | |
| 632 | + tcg_out_arith(s, arg0, addr_reg, TCG_REG_I5, ARITH_AND); | |
| 633 | + /* add arg0, arg1, arg0 */ | |
| 634 | + tcg_out_arith(s, arg0, arg0, arg1, ARITH_ADD); | |
| 635 | +#else | |
| 628 | 636 | /* add addr_reg, arg1, arg0 */ |
| 629 | 637 | tcg_out_arith(s, arg0, addr_reg, arg1, ARITH_ADD); |
| 638 | +#endif | |
| 639 | + | |
| 630 | 640 | #else |
| 631 | 641 | arg0 = addr_reg; |
| 632 | 642 | #endif |
| ... | ... | @@ -785,8 +795,17 @@ static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, |
| 785 | 795 | tcg_out_ldst(s, arg1, arg1, offsetof(CPUTLBEntry, addend) - |
| 786 | 796 | offsetof(CPUTLBEntry, addr_write), HOST_LD_OP); |
| 787 | 797 | |
| 798 | +#if TARGET_LONG_BITS == 32 | |
| 799 | + /* and addr_reg, x, arg0 */ | |
| 800 | + tcg_out_movi(s, TCG_TYPE_I32, TCG_REG_I5, 0xffffffff); | |
| 801 | + tcg_out_arith(s, arg0, addr_reg, TCG_REG_I5, ARITH_AND); | |
| 802 | + /* add arg0, arg1, arg0 */ | |
| 803 | + tcg_out_arith(s, arg0, arg0, arg1, ARITH_ADD); | |
| 804 | +#else | |
| 788 | 805 | /* add addr_reg, arg1, arg0 */ |
| 789 | 806 | tcg_out_arith(s, arg0, addr_reg, arg1, ARITH_ADD); |
| 807 | +#endif | |
| 808 | + | |
| 790 | 809 | #else |
| 791 | 810 | arg0 = addr_reg; |
| 792 | 811 | #endif | ... | ... |