Merge zizzer:/bk/newmem
into zower.eecs.umich.edu:/eecshome/m5/newmem --HG-- extra : convert_revision : 2d7ae62a59b91d735bbac093f8a4ab542ea75eee
This commit is contained in:
commit
5f50dfa5d0
4 changed files with 43 additions and 10 deletions
|
@ -314,6 +314,11 @@ void doREDFault(ThreadContext *tc, TrapType tt)
|
||||||
|
|
||||||
TL++;
|
TL++;
|
||||||
|
|
||||||
|
if (bits(PSTATE, 3,3)) {
|
||||||
|
PC &= mask(32);
|
||||||
|
NPC &= mask(32);
|
||||||
|
}
|
||||||
|
|
||||||
//set TSTATE.gl to gl
|
//set TSTATE.gl to gl
|
||||||
replaceBits(TSTATE, 42, 40, GL);
|
replaceBits(TSTATE, 42, 40, GL);
|
||||||
//set TSTATE.ccr to ccr
|
//set TSTATE.ccr to ccr
|
||||||
|
@ -394,6 +399,11 @@ void doNormalFault(ThreadContext *tc, TrapType tt, bool gotoHpriv)
|
||||||
MiscReg PC = tc->readPC();
|
MiscReg PC = tc->readPC();
|
||||||
MiscReg NPC = tc->readNextPC();
|
MiscReg NPC = tc->readNextPC();
|
||||||
|
|
||||||
|
if (bits(PSTATE, 3,3)) {
|
||||||
|
PC &= mask(32);
|
||||||
|
NPC &= mask(32);
|
||||||
|
}
|
||||||
|
|
||||||
//Increment the trap level
|
//Increment the trap level
|
||||||
TL++;
|
TL++;
|
||||||
tc->setMiscReg(MISCREG_TL, TL);
|
tc->setMiscReg(MISCREG_TL, TL);
|
||||||
|
|
|
@ -169,6 +169,9 @@ decode OP default Unknown::unknown()
|
||||||
0x6: Trap::fbfcc({{fault = new FpDisabled;}});
|
0x6: Trap::fbfcc({{fault = new FpDisabled;}});
|
||||||
}
|
}
|
||||||
0x1: BranchN::call(30, {{
|
0x1: BranchN::call(30, {{
|
||||||
|
if (Pstate<3:>)
|
||||||
|
R15 = (xc->readPC())<31:0>;
|
||||||
|
else
|
||||||
R15 = xc->readPC();
|
R15 = xc->readPC();
|
||||||
NNPC = R15 + disp;
|
NNPC = R15 + disp;
|
||||||
}});
|
}});
|
||||||
|
@ -581,6 +584,9 @@ decode OP default Unknown::unknown()
|
||||||
Cansave = Cansave - 1;
|
Cansave = Cansave - 1;
|
||||||
else
|
else
|
||||||
Otherwin = Otherwin - 1;
|
Otherwin = Otherwin - 1;
|
||||||
|
|
||||||
|
if(Cleanwin < NWindows - 1)
|
||||||
|
Cleanwin = Cleanwin + 1;
|
||||||
}});
|
}});
|
||||||
}
|
}
|
||||||
0x32: decode RD {
|
0x32: decode RD {
|
||||||
|
@ -878,6 +884,9 @@ decode OP default Unknown::unknown()
|
||||||
fault = new MemAddressNotAligned;
|
fault = new MemAddressNotAligned;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
if (Pstate<3:>)
|
||||||
|
(Rd = xc->readPC())<31:0>;
|
||||||
|
else
|
||||||
Rd = xc->readPC();
|
Rd = xc->readPC();
|
||||||
NNPC = target;
|
NNPC = target;
|
||||||
}
|
}
|
||||||
|
|
|
@ -549,6 +549,7 @@ ITB::translate(RequestPtr &req, ThreadContext *tc)
|
||||||
|
|
||||||
// were not priviledged accesing priv page
|
// were not priviledged accesing priv page
|
||||||
if (!priv && e->pte.priv()) {
|
if (!priv && e->pte.priv()) {
|
||||||
|
writeTagAccess(tc, vaddr, context);
|
||||||
writeSfsr(tc, false, ct, false, PrivViolation, asi);
|
writeSfsr(tc, false, ct, false, PrivViolation, asi);
|
||||||
return new InstructionAccessException;
|
return new InstructionAccessException;
|
||||||
}
|
}
|
||||||
|
@ -592,13 +593,15 @@ DTB::translate(RequestPtr &req, ThreadContext *tc, bool write)
|
||||||
// Be fast if we can!
|
// Be fast if we can!
|
||||||
if (cacheValid && cacheState == tlbdata) {
|
if (cacheValid && cacheState == tlbdata) {
|
||||||
if (cacheEntry[0] && cacheAsi[0] == asi && cacheEntry[0]->range.va < vaddr + size &&
|
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) |
|
req->setPaddr(cacheEntry[0]->pte.paddr() & ~(cacheEntry[0]->pte.size()-1) |
|
||||||
vaddr & cacheEntry[0]->pte.size()-1 );
|
vaddr & cacheEntry[0]->pte.size()-1 );
|
||||||
return NoFault;
|
return NoFault;
|
||||||
}
|
}
|
||||||
if (cacheEntry[1] && cacheAsi[1] == asi && cacheEntry[1]->range.va < vaddr + size &&
|
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) |
|
req->setPaddr(cacheEntry[1]->pte.paddr() & ~(cacheEntry[1]->pte.size()-1) |
|
||||||
vaddr & cacheEntry[1]->pte.size()-1 );
|
vaddr & cacheEntry[1]->pte.size()-1 );
|
||||||
return NoFault;
|
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()) {
|
if (write && !e->pte.writable()) {
|
||||||
|
writeTagAccess(tc, vaddr, context);
|
||||||
writeSfr(tc, vaddr, write, ct, e->pte.sideffect(), OtherFault, asi);
|
writeSfr(tc, vaddr, write, ct, e->pte.sideffect(), OtherFault, asi);
|
||||||
return new FastDataAccessProtection;
|
return new FastDataAccessProtection;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (e->pte.nofault() && !AsiIsNoFault(asi)) {
|
if (e->pte.nofault() && !AsiIsNoFault(asi)) {
|
||||||
|
writeTagAccess(tc, vaddr, context);
|
||||||
writeSfr(tc, vaddr, write, ct, e->pte.sideffect(), LoadFromNfo, asi);
|
writeSfr(tc, vaddr, write, ct, e->pte.sideffect(), LoadFromNfo, asi);
|
||||||
return new DataAccessException;
|
return new DataAccessException;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (e->pte.sideffect())
|
if (e->pte.sideffect() && AsiIsNoFault(asi)) {
|
||||||
req->setFlags(req->getFlags() | UNCACHEABLE);
|
writeTagAccess(tc, vaddr, context);
|
||||||
|
writeSfr(tc, vaddr, write, ct, e->pte.sideffect(), SideEffect, asi);
|
||||||
|
|
||||||
if (!priv && e->pte.priv()) {
|
|
||||||
writeSfr(tc, vaddr, write, ct, e->pte.sideffect(), PrivViolation, asi);
|
|
||||||
return new DataAccessException;
|
return new DataAccessException;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (e->pte.sideffect())
|
||||||
|
req->setFlags(req->getFlags() | UNCACHEABLE);
|
||||||
|
|
||||||
// cache translation date for next translation
|
// cache translation date for next translation
|
||||||
cacheState = tlbdata;
|
cacheState = tlbdata;
|
||||||
if (!cacheValid) {
|
if (!cacheValid) {
|
||||||
|
|
|
@ -342,6 +342,9 @@ Trace::InstRecord::dump(ostream &outs)
|
||||||
while (!compared) {
|
while (!compared) {
|
||||||
if (shared_data->flags == OWN_M5) {
|
if (shared_data->flags == OWN_M5) {
|
||||||
m5Pc = PC & TheISA::PAddrImplMask;
|
m5Pc = PC & TheISA::PAddrImplMask;
|
||||||
|
if (bits(shared_data->pstate,3,3)) {
|
||||||
|
m5Pc &= mask(32);
|
||||||
|
}
|
||||||
lgnPc = shared_data->pc & TheISA::PAddrImplMask;
|
lgnPc = shared_data->pc & TheISA::PAddrImplMask;
|
||||||
if (lgnPc != m5Pc)
|
if (lgnPc != m5Pc)
|
||||||
diffPC = true;
|
diffPC = true;
|
||||||
|
|
Loading…
Reference in a new issue