diff options
author | Artyom Tarasenko <atar4qemu@gmail.com> | 2016-01-26 14:42:50 +0100 |
---|---|---|
committer | Artyom Tarasenko <atar4qemu@gmail.com> | 2017-01-18 22:03:44 +0100 |
commit | 4797a6851975c1239df440c5f01d8566e63717bb (patch) | |
tree | 01c8a56e0def240f3f5c856b72c05468ffbb5381 | |
parent | 2f1b52920205863024cc86007e88557f4c2c898e (diff) |
target-sparc: replace the last tlb entry when no free entries left
Implement the behavior described in the chapter 13.9.11 of
UltraSPARC T1™ Supplement to the UltraSPARC Architecture 2005:
"If a TLB Data-In replacement is attempted with all TLB
entries locked and valid, the last TLB entry (entry 63) is
replaced."
Signed-off-by: Artyom Tarasenko <atar4qemu@gmail.com>
-rw-r--r-- | target/sparc/ldst_helper.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/target/sparc/ldst_helper.c b/target/sparc/ldst_helper.c index d3747cf0f2..029120d1a0 100644 --- a/target/sparc/ldst_helper.c +++ b/target/sparc/ldst_helper.c @@ -246,9 +246,11 @@ static void replace_tlb_1bit_lru(SparcTLBEntry *tlb, } #ifdef DEBUG_MMU - DPRINTF_MMU("%s lru replacement failed: no entries available\n", strmmu); + DPRINTF_MMU("%s lru replacement: no free entries available, " + "replacing the last one\n", strmmu); #endif - /* error state? */ + /* corner case: the last entry is replaced anyway */ + replace_tlb_entry(&tlb[63], tlb_tag, tlb_tte, env1); } #endif |