X86: Pass whether an access was a read/write/fetch so faults can behave accordingly.
This commit is contained in:
parent
6c5afe6346
commit
e8c1c3e72e
6 changed files with 21 additions and 12 deletions
|
@ -166,13 +166,13 @@ namespace X86ISA
|
|||
void FakeITLBFault::invoke(ThreadContext * tc)
|
||||
{
|
||||
// Start the page table walker.
|
||||
tc->getITBPtr()->walk(tc, vaddr);
|
||||
tc->getITBPtr()->walk(tc, vaddr, write, execute);
|
||||
}
|
||||
|
||||
void FakeDTLBFault::invoke(ThreadContext * tc)
|
||||
{
|
||||
// Start the page table walker.
|
||||
tc->getDTBPtr()->walk(tc, vaddr);
|
||||
tc->getDTBPtr()->walk(tc, vaddr, write, execute);
|
||||
}
|
||||
|
||||
#else // !FULL_SYSTEM
|
||||
|
|
|
@ -429,10 +429,12 @@ namespace X86ISA
|
|||
{
|
||||
protected:
|
||||
Addr vaddr;
|
||||
bool write;
|
||||
bool execute;
|
||||
public:
|
||||
FakeITLBFault(Addr _vaddr) :
|
||||
FakeITLBFault(Addr _vaddr, bool _write, bool _execute) :
|
||||
X86Fault("fake instruction tlb fault", "itlb", 0),
|
||||
vaddr(_vaddr)
|
||||
vaddr(_vaddr), write(_write), execute(_execute)
|
||||
{}
|
||||
|
||||
void invoke(ThreadContext * tc);
|
||||
|
@ -442,10 +444,12 @@ namespace X86ISA
|
|||
{
|
||||
protected:
|
||||
Addr vaddr;
|
||||
bool write;
|
||||
bool execute;
|
||||
public:
|
||||
FakeDTLBFault(Addr _vaddr) :
|
||||
FakeDTLBFault(Addr _vaddr, bool _write, bool _execute) :
|
||||
X86Fault("fake data tlb fault", "dtlb", 0),
|
||||
vaddr(_vaddr)
|
||||
vaddr(_vaddr), write(_write), execute(_execute)
|
||||
{}
|
||||
|
||||
void invoke(ThreadContext * tc);
|
||||
|
|
|
@ -319,11 +319,13 @@ Walker::doNext(PacketPtr &read, PacketPtr &write)
|
|||
}
|
||||
|
||||
void
|
||||
Walker::start(ThreadContext * _tc, Addr vaddr)
|
||||
Walker::start(ThreadContext * _tc, Addr vaddr, bool _write, bool _execute)
|
||||
{
|
||||
assert(state == Ready);
|
||||
assert(!tc);
|
||||
tc = _tc;
|
||||
execute = _execute;
|
||||
write = _write;
|
||||
|
||||
VAddr addr = vaddr;
|
||||
|
||||
|
|
|
@ -95,7 +95,7 @@ namespace X86ISA
|
|||
void doNext(PacketPtr &read, PacketPtr &write);
|
||||
|
||||
// Kick off the state machine.
|
||||
void start(ThreadContext * _tc, Addr vaddr);
|
||||
void start(ThreadContext * _tc, Addr vaddr, bool write, bool execute);
|
||||
|
||||
protected:
|
||||
|
||||
|
@ -165,7 +165,10 @@ namespace X86ISA
|
|||
State nextState;
|
||||
int size;
|
||||
bool enableNX;
|
||||
bool write, execute;
|
||||
TlbEntry entry;
|
||||
|
||||
Fault pageFault(bool present);
|
||||
|
||||
public:
|
||||
|
||||
|
|
|
@ -140,9 +140,9 @@ TLB::lookup(Addr va, bool update_lru)
|
|||
|
||||
#if FULL_SYSTEM
|
||||
void
|
||||
TLB::walk(ThreadContext * _tc, Addr vaddr)
|
||||
TLB::walk(ThreadContext * _tc, Addr vaddr, bool write, bool execute)
|
||||
{
|
||||
walker->start(_tc, vaddr);
|
||||
walker->start(_tc, vaddr, write, execute);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -616,7 +616,7 @@ TLB::translate(RequestPtr &req, ThreadContext *tc, bool write, bool execute)
|
|||
// The vaddr already has the segment base applied.
|
||||
TlbEntry *entry = lookup(vaddr);
|
||||
if (!entry) {
|
||||
return new TlbFault(vaddr);
|
||||
return new TlbFault(vaddr, write, execute);
|
||||
} else {
|
||||
// Do paging protection checks.
|
||||
DPRINTF(TLB, "Entry found with paddr %#x, doing protection checks.\n", entry->paddr);
|
||||
|
|
|
@ -119,7 +119,7 @@ namespace X86ISA
|
|||
|
||||
Walker * walker;
|
||||
|
||||
void walk(ThreadContext * _tc, Addr vaddr);
|
||||
void walk(ThreadContext * _tc, Addr vaddr, bool write, bool execute);
|
||||
#endif
|
||||
|
||||
public:
|
||||
|
|
Loading…
Reference in a new issue