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 | ... | ... |