diff options
author | Gabe Black <gblack@eecs.umich.edu> | 2007-01-24 19:57:36 -0500 |
---|---|---|
committer | Gabe Black <gblack@eecs.umich.edu> | 2007-01-24 19:57:36 -0500 |
commit | 5f50dfa5d037e56e73c68f4c087491f57b52f677 (patch) | |
tree | cf70c6b765bafeb489a07bd688053e0b180c6cf0 /src/arch/sparc/tlb.cc | |
parent | b8fc86e28f15b03ba82465b2a1dcf0725c769bad (diff) | |
parent | 4301e4cd08018eb56b4f196afcce9a8311f390b4 (diff) | |
download | gem5-5f50dfa5d037e56e73c68f4c087491f57b52f677.tar.xz |
Merge zizzer:/bk/newmem
into zower.eecs.umich.edu:/eecshome/m5/newmem
--HG--
extra : convert_revision : 2d7ae62a59b91d735bbac093f8a4ab542ea75eee
Diffstat (limited to 'src/arch/sparc/tlb.cc')
-rw-r--r-- | src/arch/sparc/tlb.cc | 27 |
1 files changed, 19 insertions, 8 deletions
diff --git a/src/arch/sparc/tlb.cc b/src/arch/sparc/tlb.cc index 1a2ec6eac..0e59f3e15 100644 --- a/src/arch/sparc/tlb.cc +++ b/src/arch/sparc/tlb.cc @@ -549,6 +549,7 @@ ITB::translate(RequestPtr &req, ThreadContext *tc) // were not priviledged accesing priv page if (!priv && e->pte.priv()) { + writeTagAccess(tc, vaddr, context); writeSfsr(tc, false, ct, false, PrivViolation, asi); return new InstructionAccessException; } @@ -592,13 +593,15 @@ DTB::translate(RequestPtr &req, ThreadContext *tc, bool write) // Be fast if we can! if (cacheValid && cacheState == tlbdata) { if (cacheEntry[0] && cacheAsi[0] == asi && cacheEntry[0]->range.va < vaddr + size && - cacheEntry[0]->range.va + cacheEntry[0]->range.size > vaddr) { + cacheEntry[0]->range.va + cacheEntry[0]->range.size > vaddr && + (!write || cacheEntry[0]->pte.writable())) { req->setPaddr(cacheEntry[0]->pte.paddr() & ~(cacheEntry[0]->pte.size()-1) | vaddr & cacheEntry[0]->pte.size()-1 ); return NoFault; } if (cacheEntry[1] && cacheAsi[1] == asi && cacheEntry[1]->range.va < vaddr + size && - cacheEntry[1]->range.va + cacheEntry[1]->range.size > vaddr) { + cacheEntry[1]->range.va + cacheEntry[1]->range.size > vaddr && + (!write || cacheEntry[1]->pte.writable())) { req->setPaddr(cacheEntry[1]->pte.paddr() & ~(cacheEntry[1]->pte.size()-1) | vaddr & cacheEntry[1]->pte.size()-1 ); return NoFault; @@ -726,26 +729,34 @@ DTB::translate(RequestPtr &req, ThreadContext *tc, bool write) } + if (!priv && e->pte.priv()) { + writeTagAccess(tc, vaddr, context); + writeSfr(tc, vaddr, write, ct, e->pte.sideffect(), PrivViolation, asi); + return new DataAccessException; + } if (write && !e->pte.writable()) { + writeTagAccess(tc, vaddr, context); writeSfr(tc, vaddr, write, ct, e->pte.sideffect(), OtherFault, asi); return new FastDataAccessProtection; } if (e->pte.nofault() && !AsiIsNoFault(asi)) { + writeTagAccess(tc, vaddr, context); writeSfr(tc, vaddr, write, ct, e->pte.sideffect(), LoadFromNfo, asi); return new DataAccessException; } - if (e->pte.sideffect()) - req->setFlags(req->getFlags() | UNCACHEABLE); - - - if (!priv && e->pte.priv()) { - writeSfr(tc, vaddr, write, ct, e->pte.sideffect(), PrivViolation, asi); + if (e->pte.sideffect() && AsiIsNoFault(asi)) { + writeTagAccess(tc, vaddr, context); + writeSfr(tc, vaddr, write, ct, e->pte.sideffect(), SideEffect, asi); return new DataAccessException; } + + if (e->pte.sideffect()) + req->setFlags(req->getFlags() | UNCACHEABLE); + // cache translation date for next translation cacheState = tlbdata; if (!cacheValid) { |