arch, base, dev, kern, sym: FreeBSD support
[gem5.git] / src / base / loader / object_file.hh
index 7f2bef0bf6851158e4638ce10f77caa02f820c3a..37f2aa585612cd78a824c2b83c33656ad10a7c33 100644 (file)
@@ -35,9 +35,9 @@
 #include <limits>
 #include <string>
 
-#include "sim/host.hh" // for Addr
+#include "base/types.hh"
 
-class Port;
+class PortProxy;
 class SymbolTable;
 
 class ObjectFile
@@ -50,15 +50,21 @@ class ObjectFile
         SPARC64,
         SPARC32,
         Mips,
-        X86,
-        Arm
+        X86_64,
+        I386,
+        Arm64,
+        Arm,
+        Thumb,
+        Power
     };
 
     enum OpSys {
         UnknownOpSys,
         Tru64,
         Linux,
-        Solaris
+        Solaris,
+        LinuxArmOABI,
+        FreeBSD
     };
 
   protected:
@@ -79,12 +85,16 @@ class ObjectFile
 
     void close();
 
-    virtual bool loadSections(Port *memPort, Addr addrMask =
-            std::numeric_limits<Addr>::max());
+    virtual bool loadSections(PortProxy& memProxy, Addr addrMask =
+                              std::numeric_limits<Addr>::max(),
+                              Addr offset = 0);
     virtual bool loadGlobalSymbols(SymbolTable *symtab, Addr addrMask =
             std::numeric_limits<Addr>::max()) = 0;
     virtual bool loadLocalSymbols(SymbolTable *symtab, Addr addrMask =
             std::numeric_limits<Addr>::max()) = 0;
+    virtual bool loadWeakSymbols(SymbolTable *symtab, Addr addrMask =
+            std::numeric_limits<Addr>::max())
+    { return false; }
 
     virtual bool isDynamic() { return false; }
     virtual bool hasTLS() { return false; }
@@ -107,7 +117,8 @@ class ObjectFile
     Section data;
     Section bss;
 
-    bool loadSection(Section *sec, Port *memPort, Addr addrMask);
+    bool loadSection(Section *sec, PortProxy& memProxy, Addr addrMask,
+                     Addr offset = 0);
     void setGlobalPointer(Addr global_ptr) { globalPtr = global_ptr; }
 
   public:
@@ -123,6 +134,11 @@ class ObjectFile
     size_t dataSize() const { return data.size; }
     size_t bssSize() const { return bss.size; }
 
+    /* This function allows you to override the base address where
+     * a binary is going to be loaded or set it if the binary is just a
+     * blob that doesn't include an object header.
+     * @param a address to load the binary/text section at
+     */
     void setTextBase(Addr a) { text.baseAddr = a; }
 };