diff options
author | Ali Saidi <Ali.Saidi@ARM.com> | 2010-12-07 16:19:57 -0800 |
---|---|---|
committer | Ali Saidi <Ali.Saidi@ARM.com> | 2010-12-07 16:19:57 -0800 |
commit | 21bfbd422cb9d043f88bd7f5ca9d4c72b97f9f33 (patch) | |
tree | 8daca00e0dc933e7442da1eb7a017fe2be8734fe /src/cpu | |
parent | 658849d101c98b6d8c7a06f41ffbe39675848eac (diff) | |
download | gem5-21bfbd422cb9d043f88bd7f5ca9d4c72b97f9f33.tar.xz |
ARM: Support switchover with hardware table walkers
Diffstat (limited to 'src/cpu')
-rw-r--r-- | src/cpu/base.cc | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/src/cpu/base.cc b/src/cpu/base.cc index 556e7ec6f..e0d29577d 100644 --- a/src/cpu/base.cc +++ b/src/cpu/base.cc @@ -33,6 +33,7 @@ #include <string> #include <sstream> +#include "arch/tlb.hh" #include "base/cprintf.hh" #include "base/loader/symtab.hh" #include "base/misc.hh" @@ -359,6 +360,26 @@ BaseCPU::takeOverFrom(BaseCPU *oldCPU, Port *ic, Port *dc) if (DTRACE(Context)) ThreadContext::compare(oldTC, newTC); */ + + Port *old_itb_port, *old_dtb_port, *new_itb_port, *new_dtb_port; + old_itb_port = oldTC->getITBPtr()->getPort(); + old_dtb_port = oldTC->getDTBPtr()->getPort(); + new_itb_port = newTC->getITBPtr()->getPort(); + new_dtb_port = newTC->getDTBPtr()->getPort(); + + // Move over any table walker ports if they exist + if (new_itb_port && !new_itb_port->isConnected()) { + assert(old_itb_port); + Port *peer = old_itb_port->getPeer();; + new_itb_port->setPeer(peer); + peer->setPeer(new_itb_port); + } + if (new_dtb_port && !new_dtb_port->isConnected()) { + assert(old_dtb_port); + Port *peer = old_dtb_port->getPeer();; + new_dtb_port->setPeer(peer); + peer->setPeer(new_dtb_port); + } } #if FULL_SYSTEM |