Commit 43e9e742b96ce2e94e76b53e96db3e22df3c4083

Authored by blueswir1
1 parent 01b1fa6d

Fix I/D MMU tag reads

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4991 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 4 additions and 54 deletions
target-sparc/op_helper.c
@@ -1674,34 +1674,9 @@ uint64_t helper_ld_asi(target_ulong addr, int asi, int size, int sign) @@ -1674,34 +1674,9 @@ uint64_t helper_ld_asi(target_ulong addr, int asi, int size, int sign)
1674 } 1674 }
1675 case 0x56: // I-MMU tag read 1675 case 0x56: // I-MMU tag read
1676 { 1676 {
1677 - unsigned int i; 1677 + int reg = (addr >> 3) & 0x3f;
1678 1678
1679 - for (i = 0; i < 64; i++) {  
1680 - // Valid, ctx match, vaddr match  
1681 - if ((env->itlb_tte[i] & 0x8000000000000000ULL) != 0) {  
1682 - uint64_t mask;  
1683 -  
1684 - switch ((env->itlb_tte[i] >> 61) & 3) {  
1685 - default:  
1686 - case 0x0:  
1687 - mask = 0xffffffffffffffff;  
1688 - break;  
1689 - case 0x1:  
1690 - mask = 0xffffffffffff0fff;  
1691 - break;  
1692 - case 0x2:  
1693 - mask = 0xfffffffffff80fff;  
1694 - break;  
1695 - case 0x3:  
1696 - mask = 0xffffffffffc00fff;  
1697 - break;  
1698 - }  
1699 - if ((env->itlb_tag[i] & mask) == (addr & mask)) {  
1700 - ret = env->itlb_tte[i];  
1701 - break;  
1702 - }  
1703 - }  
1704 - } 1679 + ret = env->itlb_tag[reg];
1705 break; 1680 break;
1706 } 1681 }
1707 case 0x58: // D-MMU regs 1682 case 0x58: // D-MMU regs
@@ -1720,34 +1695,9 @@ uint64_t helper_ld_asi(target_ulong addr, int asi, int size, int sign) @@ -1720,34 +1695,9 @@ uint64_t helper_ld_asi(target_ulong addr, int asi, int size, int sign)
1720 } 1695 }
1721 case 0x5e: // D-MMU tag read 1696 case 0x5e: // D-MMU tag read
1722 { 1697 {
1723 - unsigned int i; 1698 + int reg = (addr >> 3) & 0x3f;
1724 1699
1725 - for (i = 0; i < 64; i++) {  
1726 - // Valid, ctx match, vaddr match  
1727 - if ((env->dtlb_tte[i] & 0x8000000000000000ULL) != 0) {  
1728 - uint64_t mask;  
1729 -  
1730 - switch ((env->dtlb_tte[i] >> 61) & 3) {  
1731 - default:  
1732 - case 0x0:  
1733 - mask = 0xffffffffffffffff;  
1734 - break;  
1735 - case 0x1:  
1736 - mask = 0xffffffffffff0fff;  
1737 - break;  
1738 - case 0x2:  
1739 - mask = 0xfffffffffff80fff;  
1740 - break;  
1741 - case 0x3:  
1742 - mask = 0xffffffffffc00fff;  
1743 - break;  
1744 - }  
1745 - if ((env->dtlb_tag[i] & mask) == (addr & mask)) {  
1746 - ret = env->dtlb_tte[i];  
1747 - break;  
1748 - }  
1749 - }  
1750 - } 1700 + ret = env->dtlb_tag[reg];
1751 break; 1701 break;
1752 } 1702 }
1753 case 0x46: // D-cache data 1703 case 0x46: // D-cache data