ARM: Allow ARM processes to start in Thumb mode.
authorGabe Black <gblack@eecs.umich.edu>
Wed, 2 Jun 2010 17:58:00 +0000 (12:58 -0500)
committerGabe Black <gblack@eecs.umich.edu>
Wed, 2 Jun 2010 17:58:00 +0000 (12:58 -0500)
src/arch/arm/linux/process.cc
src/arch/arm/linux/process.hh
src/arch/arm/process.cc
src/arch/arm/process.hh
src/sim/process.cc

index f909d871ae72da6cf86835a808dc0a0183fb3ebd..7a5e9da56672a0a645bc30399f69693e60efc29e 100644 (file)
@@ -435,8 +435,8 @@ SyscallDesc ArmLinuxProcess::privSyscallDescs[] = {
 };
 
 ArmLinuxProcess::ArmLinuxProcess(LiveProcessParams * params,
-        ObjectFile *objFile)
-    : ArmLiveProcess(params, objFile),
+        ObjectFile *objFile, ObjectFile::Arch _arch)
+    : ArmLiveProcess(params, objFile, _arch),
      Num_Syscall_Descs(sizeof(syscallDescs) / sizeof(SyscallDesc)),
      Num_Priv_Syscall_Descs(sizeof(privSyscallDescs) / sizeof(SyscallDesc))
 { }
index ab836fab2273c61e447a90faa1be76a7a341d17e..7b9e5789ec9a5e4e313ef67cd527826bdccb2850 100644 (file)
@@ -38,7 +38,8 @@
 class ArmLinuxProcess : public ArmLiveProcess
 {
   public:
-    ArmLinuxProcess(LiveProcessParams * params, ObjectFile *objFile);
+    ArmLinuxProcess(LiveProcessParams * params, ObjectFile *objFile,
+                    ObjectFile::Arch _arch);
 
     virtual SyscallDesc* getDesc(int callnum);
 
index 702922a4330b5be55c4e1470f516edf9465aa40a..3c51c80a79e43e3885100dad7bf66a1090aa82f1 100644 (file)
@@ -43,8 +43,9 @@
 using namespace std;
 using namespace ArmISA;
 
-ArmLiveProcess::ArmLiveProcess(LiveProcessParams *params, ObjectFile *objFile)
-    : LiveProcess(params, objFile)
+ArmLiveProcess::ArmLiveProcess(LiveProcessParams *params, ObjectFile *objFile,
+                               ObjectFile::Arch _arch)
+    : LiveProcess(params, objFile), arch(_arch)
 {
     stack_base = 0xbf000000L;
 
@@ -316,6 +317,8 @@ ArmLiveProcess::argsInit(int intSize, int pageSize)
     }
 
     Addr prog_entry = objFile->entryPoint();
+    if (arch == ObjectFile::Thumb)
+        prog_entry = (prog_entry & ~mask(1)) | (ULL(1) << PcTBitShift);
     tc->setPC(prog_entry);
     tc->setNextPC(prog_entry + sizeof(MachInst));
 
index f793892d09bf488e7ea7d6d577730d21ebdc8285..a4dd5e8421177870ca6decd8559a20a537958581 100644 (file)
@@ -33,6 +33,7 @@
 
 #include <string>
 #include <vector>
+#include "base/loader/object_file.hh"
 #include "sim/process.hh"
 
 class LiveProcess;
@@ -42,7 +43,9 @@ class System;
 class ArmLiveProcess : public LiveProcess
 {
   protected:
-    ArmLiveProcess(LiveProcessParams * params, ObjectFile *objFile);
+    ObjectFile::Arch arch;
+    ArmLiveProcess(LiveProcessParams * params, ObjectFile *objFile,
+                   ObjectFile::Arch _arch);
 
     void startup();
 
index 18f33abdce152243ab0c7d43b8cb9fc3faaf3fd0..ba4a3905b825d04b011d7b4ce7d21ec47e7b0ca6 100644 (file)
@@ -763,10 +763,7 @@ LiveProcess::create(LiveProcessParams * params)
         warn("Unknown operating system; assuming Linux.");
         // fall through
       case ObjectFile::Linux:
-        if (objFile->getArch() == ObjectFile::Thumb)
-            panic("Thumb processes not yet supported.\n");
-        else
-            process = new ArmLinuxProcess(params, objFile);
+        process = new ArmLinuxProcess(params, objFile, objFile->getArch());
         break;
       case ObjectFile::LinuxArmOABI:
         fatal("M5 does not support ARM OABI binaries. Please recompile with an"