Add base ARM code to M5
authorStephen Hines <hines@cs.fsu.edu>
Wed, 6 Feb 2008 04:44:13 +0000 (23:44 -0500)
committerStephen Hines <hines@cs.fsu.edu>
Wed, 6 Feb 2008 04:44:13 +0000 (23:44 -0500)
--HG--
extra : convert_revision : d811bf87d1a0bfc712942ecd3db1b48fc75257af

.hgignore
src/arch/isa_specific.hh
src/base/loader/elf_object.cc
src/base/loader/object_file.hh
src/cpu/BaseCPU.py
src/cpu/o3/dyn_inst.hh
src/cpu/simple/timing.cc
src/cpu/static_inst.hh
src/sim/process.cc

index f536836de50bfc7f4a9fa2ef895b33b5809bc758..f6a91e6e3c76fdfcf4de9f8cc94fb85aab4d50c9 100644 (file)
--- a/.hgignore
+++ b/.hgignore
@@ -6,3 +6,4 @@ cscope.files
 cscope.out
 *.pyc
 *~
+.*.swp
index c241e5c6253d4c9171e6fc16f14640eb7a29f8e8..c10ce7350f42daa82bee4d56e0e2ea144f84244c 100644 (file)
@@ -49,6 +49,7 @@
 #define SPARC_ISA 42
 #define MIPS_ISA 34000
 #define X86_ISA 8086
+#define ARM_ISA 6
 
 //These tell the preprocessor where to find the files of a particular
 //ISA, and set the "TheISA" macro for use elsewhere.
@@ -60,6 +61,8 @@
     #define TheISA MipsISA
 #elif THE_ISA == X86_ISA
     #define TheISA X86ISA
+#elif THE_ISA == ARM_ISA
+    #define TheISA ArmISA
 #else
     #error "THE_ISA not set"
 #endif
index 23df1c5ba179781cd7371f02e8333911d9dff98d..8e41ffd16f0f7f3def84b6b73fd4913fb5bfce6f 100644 (file)
@@ -88,6 +88,8 @@ ElfObject::tryFile(const string &fname, int fd, size_t len, uint8_t *data)
             arch = ObjectFile::X86;
         } else if (ehdr.e_ident[EI_CLASS] == ELFCLASS64) {
             arch = ObjectFile::Alpha;
+        } else if (ehdr.e_machine == EM_ARM) {
+            arch = ObjectFile::Arm;
         } else {
             warn("Unknown architecture: %d\n", ehdr.e_machine);
             arch = ObjectFile::UnknownArch;
@@ -98,6 +100,7 @@ ElfObject::tryFile(const string &fname, int fd, size_t len, uint8_t *data)
         {
 
           case ELFOSABI_LINUX:
+          case ELFOSABI_ARM:
             opSys = ObjectFile::Linux;
             break;
           case ELFOSABI_SOLARIS:
index 4f0c17cc8f9dd1a1aa559a61cf2f57bd9fe4c630..7f2bef0bf6851158e4638ce10f77caa02f820c3a 100644 (file)
@@ -50,7 +50,8 @@ class ObjectFile
         SPARC64,
         SPARC32,
         Mips,
-        X86
+        X86,
+        Arm
     };
 
     enum OpSys {
index ee5ed0774b1e72e777106345e9caf8617a3b722e..c2a86511341d29d37a0f39f300be0e737fc8242b 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (c) 2005-2007 The Regents of The University of Michigan
+# Copyright (c) 2005-2008 The Regents of The University of Michigan
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -45,6 +45,8 @@ elif build_env['TARGET_ISA'] == 'x86':
     from X86TLB import X86DTB, X86ITB
 elif build_env['TARGET_ISA'] == 'mips':
     from MipsTLB import MipsTLB,MipsDTB, MipsITB, MipsUTB
+elif build_env['TARGET_ISA'] == 'arm':
+    from ArmTLB import ArmTLB, ArmDTB, ArmITB, ArmUTB
 
 class BaseCPU(SimObject):
     type = 'BaseCPU'
@@ -76,6 +78,11 @@ class BaseCPU(SimObject):
         dtb = Param.MipsDTB(MipsDTB(), "Data TLB")
         itb = Param.MipsITB(MipsITB(), "Instruction TLB")
         tlb = Param.MipsUTB(MipsUTB(), "Unified TLB")
+    elif build_env['TARGET_ISA'] == 'arm':
+        UnifiedTLB = Param.Bool(True, "Is this a Unified TLB?")
+        dtb = Param.ArmDTB(ArmDTB(), "Data TLB")
+        itb = Param.ArmITB(ArmITB(), "Instruction TLB")
+        tlb = Param.ArmUTB(ArmUTB(), "Unified TLB")
     else:
         print "Don't know what TLB to use for ISA %s" % \
             build_env['TARGET_ISA']
index c37f8007e5adba5698b307c79acfa2c7c8767654..a1f9e05911c7cceda98bcb9d74938907d1b95d9f 100644 (file)
     template <class Impl> class X86DynInst;
     struct X86SimpleImpl;
     typedef X86DynInst<X86SimpleImpl> O3DynInst;
+#elif THE_ISA == ARM_ISA
+    template <class Impl> class ArmDynInst;
+    struct ArmSimpleImpl;
+    typedef ArmDynInst<ArmSimpleImpl> O3DynInst;
 #else
     #error "O3DynInst not defined for this ISA"
 #endif
index fc35f2666d56c8b410dc216f7b02157b91d3a4e9..e1fc6882ff8f27e2900b8e6275d008d4d870c0e6 100644 (file)
@@ -598,13 +598,19 @@ TimingSimpleCPU::completeIfetch(PacketPtr pkt)
             assert(fault == NoFault);
         } else {
             if (fault == NoFault) {
+                // Note that ARM can have NULL packets if the instruction gets
+                // squashed due to predication
                 // early fail on store conditional: complete now
-                assert(dcache_pkt != NULL);
+                assert(dcache_pkt != NULL || THE_ISA == ARM_ISA);
+
                 fault = curStaticInst->completeAcc(dcache_pkt, this,
                                                    traceData);
-                delete dcache_pkt->req;
-                delete dcache_pkt;
-                dcache_pkt = NULL;
+                if (dcache_pkt != NULL)
+                {
+                    delete dcache_pkt->req;
+                    delete dcache_pkt;
+                    dcache_pkt = NULL;
+                }
 
                 // keep an instruction count
                 if (fault == NoFault)
index d2232bab7120f5a0b38dda6e7c3d2a077cbbeeab..ceda78d903c7d52ef8c7fd5ac395200e681f3b3a 100644 (file)
@@ -259,6 +259,7 @@ class StaticInstBase : public RefCounted
     bool isMicroBranch() const { return flags[IsMicroBranch]; }
     //@}
 
+    void setLastMicroop() { flags[IsLastMicroop] = true; }
     /// Operation class.  Used to select appropriate function unit in issue.
     OpClass opClass()     const { return _opClass; }
 };
index d83b0247e204b7a9c2044d1e7223d53be329419c..16037b2f42ac85eef54647358bfef0a63defd2da 100644 (file)
@@ -61,6 +61,8 @@
 #include "arch/sparc/solaris/process.hh"
 #elif THE_ISA == MIPS_ISA
 #include "arch/mips/linux/process.hh"
+#elif THE_ISA == ARM_ISA
+#include "arch/arm/linux/process.hh"
 #elif THE_ISA == X86_ISA
 #include "arch/x86/linux/process.hh"
 #else
@@ -697,6 +699,17 @@ LiveProcess::create(LiveProcessParams * params)
         process = new MipsLinuxProcess(params, objFile);
         break;
 
+      default:
+        fatal("Unknown/unsupported operating system.");
+    }
+#elif THE_ISA == ARM_ISA
+    if (objFile->getArch() != ObjectFile::Arm)
+        fatal("Object file architecture does not match compiled ISA (ARM).");
+    switch (objFile->getOpSys()) {
+      case ObjectFile::Linux:
+        process = new ArmLinuxProcess(params, objFile);
+        break;
+
       default:
         fatal("Unknown/unsupported operating system.");
     }