diff options
Diffstat (limited to 'src/arch/x86/pagetable_walker.hh')
-rw-r--r-- | src/arch/x86/pagetable_walker.hh | 31 |
1 files changed, 26 insertions, 5 deletions
diff --git a/src/arch/x86/pagetable_walker.hh b/src/arch/x86/pagetable_walker.hh index 324f16f3c..f73774a45 100644 --- a/src/arch/x86/pagetable_walker.hh +++ b/src/arch/x86/pagetable_walker.hh @@ -85,17 +85,28 @@ namespace X86ISA PSEPD, PD, PTE }; - // Act on the current state and determine what to do next. read - // should be the packet that just came back from a read and write + // Act on the current state and determine what to do next. The global + // read should be the packet that just came back from a read and write // should be NULL. When the function returns, read is either NULL // if the machine is finished, or points to a packet to initiate // the next read. If any write is required to update an "accessed" // bit, write will point to a packet to do the write. Otherwise it - // will be NULL. - void doNext(PacketPtr &read, PacketPtr &write); + // will be NULL. The return value is whatever fault was incurred + // during this stage of the lookup. + Fault doNext(PacketPtr &write); // Kick off the state machine. - void start(ThreadContext * _tc, Addr vaddr); + Fault start(ThreadContext * _tc, BaseTLB::Translation *translation, + RequestPtr req, bool write, bool execute); + // Clean up after the state machine. + void + stop() + { + nextState = Ready; + delete read->req; + delete read; + read = NULL; + } protected: @@ -111,6 +122,11 @@ namespace X86ISA bool retrying; /* + * The fault, if any, that's waiting to be delivered in timing mode. + */ + Fault timingFault; + + /* * Functions for dealing with packets. */ bool recvTiming(PacketPtr pkt); @@ -156,16 +172,21 @@ namespace X86ISA // The TLB we're supposed to load. TLB * tlb; System * sys; + BaseTLB::Translation * translation; /* * State machine state. */ ThreadContext * tc; + RequestPtr req; State state; State nextState; int size; bool enableNX; + bool write, execute, user; TlbEntry entry; + + Fault pageFault(bool present); public: |