summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Binkert <binkertn@umich.edu>2005-06-28 12:42:15 -0400
committerNathan Binkert <binkertn@umich.edu>2005-06-28 12:42:15 -0400
commit036a8ceb8da8aff10b819b4aab32584d41282a64 (patch)
treee3d1c6bd8572ec503ff53e6b1b27bcd0f292f247
parentd172447a7ae945139d0c3465b8504cd6b77ae819 (diff)
downloadgem5-036a8ceb8da8aff10b819b4aab32584d41282a64.tar.xz
Don't hard code the location of m5AlphaAccess. Instead, move the
code into a function that can be called by the AlphaConsole class. AlphaConsole will pass in its address. arch/alpha/ev5.hh: Move Phys2K0Seg to ev5.hh and fixup the TSUNAMI uncacheable bits so that they will be converted correctly. dev/alpha_access.h: Do not hard code the location of the AlphaConsole dev/alpha_console.cc: fixup #includes tell the system where the alpha console is sim/system.hh: Provide a function that will tell the system where the AlphaAccess structure (device) lives --HG-- extra : convert_revision : 92d70ca926151a32eebe9925de597459ac58013e
-rw-r--r--arch/alpha/ev5.hh10
-rw-r--r--dev/alpha_access.h6
-rw-r--r--dev/alpha_console.cc9
-rw-r--r--sim/system.cc33
-rw-r--r--sim/system.hh5
5 files changed, 37 insertions, 26 deletions
diff --git a/arch/alpha/ev5.hh b/arch/alpha/ev5.hh
index 8508162ed..a5a76b5bd 100644
--- a/arch/alpha/ev5.hh
+++ b/arch/alpha/ev5.hh
@@ -58,6 +58,16 @@ const Addr PAddrUncachedBit39 = ULL(0x8000000000);
const Addr PAddrUncachedBit40 = ULL(0x10000000000);
const Addr PAddrUncachedBit43 = ULL(0x80000000000);
const Addr PAddrUncachedMask = ULL(0x807ffffffff); // Clear PA<42:35>
+inline Addr Phys2K0Seg(Addr addr)
+{
+#ifndef ALPHA_TLASER
+ if (addr & PAddrUncachedBit43) {
+ addr &= PAddrUncachedMask;
+ addr |= PAddrUncachedBit40;
+ }
+#endif
+ return addr | AlphaISA::K0SegBase;
+}
inline int DTB_ASN_ASN(uint64_t reg) { return reg >> 57 & AsnMask; }
inline Addr DTB_PTE_PPN(uint64_t reg)
diff --git a/dev/alpha_access.h b/dev/alpha_access.h
index b62966ea0..a20a05535 100644
--- a/dev/alpha_access.h
+++ b/dev/alpha_access.h
@@ -38,12 +38,6 @@
#ifdef CONSOLE
typedef unsigned uint32_t;
typedef unsigned long uint64_t;
-#else
-#ifdef ALPHA_TLASER
-#define ALPHA_ACCESS_BASE ULL(0xfffffc8000a00000)
-#else
-#define ALPHA_ACCESS_BASE ULL(0xfffffd0200000000)
-#endif
#endif
// This structure hacked up from simos
diff --git a/dev/alpha_console.cc b/dev/alpha_console.cc
index 3c009d4bd..34c2978aa 100644
--- a/dev/alpha_console.cc
+++ b/dev/alpha_console.cc
@@ -35,23 +35,22 @@
#include <string>
#include "base/inifile.hh"
-#include "base/str.hh" // for to_number()
+#include "base/str.hh"
#include "base/trace.hh"
#include "cpu/base.hh"
#include "cpu/exec_context.hh"
#include "dev/alpha_console.hh"
#include "dev/simconsole.hh"
#include "dev/simple_disk.hh"
+#include "dev/tsunami_io.hh"
#include "mem/bus/bus.hh"
#include "mem/bus/pio_interface.hh"
#include "mem/bus/pio_interface_impl.hh"
#include "mem/functional/memory_control.hh"
#include "mem/functional/physical.hh"
#include "sim/builder.hh"
-#include "sim/system.hh"
-#include "dev/tsunami_io.hh"
#include "sim/sim_object.hh"
-#include "targetarch/byte_swap.hh"
+#include "sim/system.hh"
using namespace std;
@@ -85,6 +84,8 @@ AlphaConsole::AlphaConsole(const string &name, SimConsole *cons, SimpleDisk *d,
alphaAccess->bootStrapImpure = 0;
alphaAccess->bootStrapCPU = 0;
alphaAccess->align2 = 0;
+
+ system->setAlphaAccess(addr);
}
void
diff --git a/sim/system.cc b/sim/system.cc
index c1a4c2a87..8397b8e01 100644
--- a/sim/system.cc
+++ b/sim/system.cc
@@ -30,7 +30,6 @@
#include "base/loader/symtab.hh"
#include "base/remote_gdb.hh"
#include "cpu/exec_context.hh"
-#include "dev/alpha_access.h"
#include "kern/kernel_stats.hh"
#include "mem/functional/memory_control.hh"
#include "mem/functional/physical.hh"
@@ -145,21 +144,6 @@ System::System(Params *p)
}
/**
- * Set the m5AlphaAccess pointer in the console
- */
- if (consoleSymtab->findAddress("m5AlphaAccess", addr)) {
- Addr paddr = vtophys(physmem, addr);
- uint64_t *m5AlphaAccess =
- (uint64_t *)physmem->dma_addr(paddr, sizeof(uint64_t));
-
- if (!m5AlphaAccess)
- panic("could not translate m5AlphaAccess addr\n");
-
- *m5AlphaAccess = htoa(ALPHA_ACCESS_BASE);
- } else
- panic("could not find m5AlphaAccess\n");
-
- /**
* Set the hardware reset parameter block system type and revision
* information to Tsunami.
*/
@@ -196,6 +180,23 @@ System::~System()
#endif
}
+void
+System::setAlphaAccess(Addr access)
+{
+ Addr addr = 0;
+ if (consoleSymtab->findAddress("m5AlphaAccess", addr)) {
+ Addr paddr = vtophys(physmem, addr);
+ uint64_t *m5AlphaAccess =
+ (uint64_t *)physmem->dma_addr(paddr, sizeof(uint64_t));
+
+ if (!m5AlphaAccess)
+ panic("could not translate m5AlphaAccess addr\n");
+
+ *m5AlphaAccess = htoa(EV5::Phys2K0Seg(access));
+ } else
+ panic("could not find m5AlphaAccess\n");
+}
+
bool
System::breakpoint()
{
diff --git a/sim/system.hh b/sim/system.hh
index c3e4d6d68..ab6d264ea 100644
--- a/sim/system.hh
+++ b/sim/system.hh
@@ -128,6 +128,11 @@ class System : public SimObject
public:
/**
+ * Set the m5AlphaAccess pointer in the console
+ */
+ void setAlphaAccess(Addr access);
+
+ /**
* Returns the addess the kernel starts at.
* @return address the kernel starts at
*/