Commit a5a52cf24604c6ae1a1df898cc252f60583f172a

Authored by blueswir1
1 parent e19e4efe

Fix MMU registers, add more E-cache ASIs

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4881 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 64 additions and 10 deletions
target-sparc/op_helper.c
... ... @@ -1649,19 +1649,43 @@ uint64_t helper_ld_asi(target_ulong addr, int asi, int size, int sign)
1649 1649 }
1650 1650 case 0x51: // I-MMU 8k TSB pointer
1651 1651 case 0x52: // I-MMU 64k TSB pointer
1652   - case 0x55: // I-MMU data access
1653 1652 // XXX
1654 1653 break;
  1654 + case 0x55: // I-MMU data access
  1655 + {
  1656 + int reg = (addr >> 3) & 0x3f;
  1657 +
  1658 + ret = env->itlb_tte[reg];
  1659 + break;
  1660 + }
1655 1661 case 0x56: // I-MMU tag read
1656 1662 {
1657 1663 unsigned int i;
1658 1664  
1659 1665 for (i = 0; i < 64; i++) {
1660 1666 // Valid, ctx match, vaddr match
1661   - if ((env->itlb_tte[i] & 0x8000000000000000ULL) != 0 &&
1662   - env->itlb_tag[i] == addr) {
1663   - ret = env->itlb_tag[i];
1664   - break;
  1667 + if ((env->itlb_tte[i] & 0x8000000000000000ULL) != 0) {
  1668 + uint64_t mask;
  1669 +
  1670 + switch ((env->itlb_tte[i] >> 61) & 3) {
  1671 + default:
  1672 + case 0x0:
  1673 + mask = 0xffffffffffffffff;
  1674 + break;
  1675 + case 0x1:
  1676 + mask = 0xffffffffffff0fff;
  1677 + break;
  1678 + case 0x2:
  1679 + mask = 0xfffffffffff80fff;
  1680 + break;
  1681 + case 0x3:
  1682 + mask = 0xffffffffffc00fff;
  1683 + break;
  1684 + }
  1685 + if ((env->itlb_tag[i] & mask) == (addr & mask)) {
  1686 + ret = env->itlb_tte[i];
  1687 + break;
  1688 + }
1665 1689 }
1666 1690 }
1667 1691 break;
... ... @@ -1673,22 +1697,50 @@ uint64_t helper_ld_asi(target_ulong addr, int asi, int size, int sign)
1673 1697 ret = env->dmmuregs[reg];
1674 1698 break;
1675 1699 }
  1700 + case 0x5d: // D-MMU data access
  1701 + {
  1702 + int reg = (addr >> 3) & 0x3f;
  1703 +
  1704 + ret = env->dtlb_tte[reg];
  1705 + break;
  1706 + }
1676 1707 case 0x5e: // D-MMU tag read
1677 1708 {
1678 1709 unsigned int i;
1679 1710  
1680 1711 for (i = 0; i < 64; i++) {
1681 1712 // Valid, ctx match, vaddr match
1682   - if ((env->dtlb_tte[i] & 0x8000000000000000ULL) != 0 &&
1683   - env->dtlb_tag[i] == addr) {
1684   - ret = env->dtlb_tag[i];
1685   - break;
  1713 + if ((env->dtlb_tte[i] & 0x8000000000000000ULL) != 0) {
  1714 + uint64_t mask;
  1715 +
  1716 + switch ((env->dtlb_tte[i] >> 61) & 3) {
  1717 + default:
  1718 + case 0x0:
  1719 + mask = 0xffffffffffffffff;
  1720 + break;
  1721 + case 0x1:
  1722 + mask = 0xffffffffffff0fff;
  1723 + break;
  1724 + case 0x2:
  1725 + mask = 0xfffffffffff80fff;
  1726 + break;
  1727 + case 0x3:
  1728 + mask = 0xffffffffffc00fff;
  1729 + break;
  1730 + }
  1731 + if ((env->dtlb_tag[i] & mask) == (addr & mask)) {
  1732 + ret = env->dtlb_tte[i];
  1733 + break;
  1734 + }
1686 1735 }
1687 1736 }
1688 1737 break;
1689 1738 }
1690 1739 case 0x46: // D-cache data
1691 1740 case 0x47: // D-cache tag access
  1741 + case 0x4b: // E-cache error enable
  1742 + case 0x4c: // E-cache asynchronous fault status
  1743 + case 0x4d: // E-cache asynchronous fault address
1692 1744 case 0x4e: // E-cache tag data
1693 1745 case 0x66: // I-cache instruction access
1694 1746 case 0x67: // I-cache tag access
... ... @@ -1700,7 +1752,6 @@ uint64_t helper_ld_asi(target_ulong addr, int asi, int size, int sign)
1700 1752 case 0x59: // D-MMU 8k TSB pointer
1701 1753 case 0x5a: // D-MMU 64k TSB pointer
1702 1754 case 0x5b: // D-MMU data pointer
1703   - case 0x5d: // D-MMU data access
1704 1755 case 0x48: // Interrupt dispatch, RO
1705 1756 case 0x49: // Interrupt data receive
1706 1757 case 0x7f: // Incoming interrupt vector, RO
... ... @@ -2052,6 +2103,9 @@ void helper_st_asi(target_ulong addr, target_ulong val, int asi, int size)
2052 2103 return;
2053 2104 case 0x46: // D-cache data
2054 2105 case 0x47: // D-cache tag access
  2106 + case 0x4b: // E-cache error enable
  2107 + case 0x4c: // E-cache asynchronous fault status
  2108 + case 0x4d: // E-cache asynchronous fault address
2055 2109 case 0x4e: // E-cache tag data
2056 2110 case 0x66: // I-cache instruction access
2057 2111 case 0x67: // I-cache tag access
... ...