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