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 1674 }
1675 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 1680 break;
1706 1681 }
1707 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 1695 }
1721 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 1701 break;
1752 1702 }
1753 1703 case 0x46: // D-cache data
... ...