Commit cc6747f4c94de5ebe9605f3592633928934f6295
1 parent
06e67a82
Add mmu tlb demap support (Igor Kovalenko)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5332 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
35 additions
and
1 deletions
target-sparc/op_helper.c
| ... | ... | @@ -1941,6 +1941,8 @@ void helper_st_asi(target_ulong addr, target_ulong val, int asi, int size) |
| 1941 | 1941 | } |
| 1942 | 1942 | case 0x55: // I-MMU data access |
| 1943 | 1943 | { |
| 1944 | + // TODO: auto demap | |
| 1945 | + | |
| 1944 | 1946 | unsigned int i = (addr >> 3) & 0x3f; |
| 1945 | 1947 | |
| 1946 | 1948 | env->itlb_tag[i] = env->immuregs[6]; |
| ... | ... | @@ -1948,7 +1950,22 @@ void helper_st_asi(target_ulong addr, target_ulong val, int asi, int size) |
| 1948 | 1950 | return; |
| 1949 | 1951 | } |
| 1950 | 1952 | case 0x57: // I-MMU demap |
| 1951 | - // XXX | |
| 1953 | + { | |
| 1954 | + unsigned int i; | |
| 1955 | + | |
| 1956 | + for (i = 0; i < 64; i++) { | |
| 1957 | + if ((env->itlb_tte[i] & 0x8000000000000000ULL) != 0) { | |
| 1958 | + target_ulong mask = 0xffffffffffffe000ULL; | |
| 1959 | + | |
| 1960 | + mask <<= 3 * ((env->itlb_tte[i] >> 61) & 3); | |
| 1961 | + if ((val & mask) == (env->itlb_tag[i] & mask)) { | |
| 1962 | + env->itlb_tag[i] = 0; | |
| 1963 | + env->itlb_tte[i] = 0; | |
| 1964 | + } | |
| 1965 | + return; | |
| 1966 | + } | |
| 1967 | + } | |
| 1968 | + } | |
| 1952 | 1969 | return; |
| 1953 | 1970 | case 0x58: // D-MMU regs |
| 1954 | 1971 | { |
| ... | ... | @@ -2018,6 +2035,23 @@ void helper_st_asi(target_ulong addr, target_ulong val, int asi, int size) |
| 2018 | 2035 | return; |
| 2019 | 2036 | } |
| 2020 | 2037 | case 0x5f: // D-MMU demap |
| 2038 | + { | |
| 2039 | + unsigned int i; | |
| 2040 | + | |
| 2041 | + for (i = 0; i < 64; i++) { | |
| 2042 | + if ((env->dtlb_tte[i] & 0x8000000000000000ULL) != 0) { | |
| 2043 | + target_ulong mask = 0xffffffffffffe000ULL; | |
| 2044 | + | |
| 2045 | + mask <<= 3 * ((env->dtlb_tte[i] >> 61) & 3); | |
| 2046 | + if ((val & mask) == (env->dtlb_tag[i] & mask)) { | |
| 2047 | + env->dtlb_tag[i] = 0; | |
| 2048 | + env->dtlb_tte[i] = 0; | |
| 2049 | + } | |
| 2050 | + return; | |
| 2051 | + } | |
| 2052 | + } | |
| 2053 | + } | |
| 2054 | + return; | |
| 2021 | 2055 | case 0x49: // Interrupt data receive |
| 2022 | 2056 | // XXX |
| 2023 | 2057 | return; | ... | ... |