arch: [Patch 1/5] Added RISC-V base instruction set RV64I
[gem5.git] / src / base / loader / object_file.hh
index 4f0c17cc8f9dd1a1aa559a61cf2f57bd9fe4c630..98e1fc538880700a4c8eabfc3183096451b536ba 100644 (file)
 #include <limits>
 #include <string>
 
-#include "sim/host.hh" // for Addr
+#include "base/misc.hh"
+#include "base/types.hh"
 
-class Port;
+class PortProxy;
 class SymbolTable;
 
 class ObjectFile
@@ -50,42 +51,61 @@ class ObjectFile
         SPARC64,
         SPARC32,
         Mips,
-        X86
+        X86_64,
+        I386,
+        Arm64,
+        Arm,
+        Thumb,
+        Power,
+        Riscv
     };
 
     enum OpSys {
         UnknownOpSys,
         Tru64,
         Linux,
-        Solaris
+        Solaris,
+        LinuxArmOABI,
+        FreeBSD
     };
 
   protected:
     const std::string filename;
-    int descriptor;
     uint8_t *fileData;
     size_t len;
 
     Arch  arch;
     OpSys opSys;
 
-    ObjectFile(const std::string &_filename, int _fd,
-               size_t _len, uint8_t *_data,
+    ObjectFile(const std::string &_filename, size_t _len, uint8_t *_data,
                Arch _arch, OpSys _opSys);
 
   public:
     virtual ~ObjectFile();
 
-    void close();
+    static const Addr maxAddr = std::numeric_limits<Addr>::max();
+
+    virtual bool loadSections(PortProxy& mem_proxy,
+                              Addr mask = maxAddr, Addr offset = 0);
+
+    virtual bool loadAllSymbols(SymbolTable *symtab, Addr base = 0,
+                                Addr offset = 0, Addr mask = maxAddr) = 0;
+    virtual bool loadGlobalSymbols(SymbolTable *symtab, Addr base = 0,
+                                   Addr offset = 0, Addr mask = maxAddr) = 0;
+    virtual bool loadLocalSymbols(SymbolTable *symtab, Addr base = 0,
+                                  Addr offset = 0, Addr mask = maxAddr) = 0;
+    virtual bool loadWeakSymbols(SymbolTable *symtab, Addr base = 0,
+                                 Addr offset = 0, Addr mask = maxAddr)
+    { return false; }
+
+    virtual ObjectFile *getInterpreter() const { return nullptr; }
+    virtual bool relocatable() const { return false; }
+    virtual Addr mapSize() const
+    { panic("mapSize() should only be called on relocatable objects\n"); }
+    virtual void updateBias(Addr bias_addr)
+    { panic("updateBias() should only be called on relocatable objects\n"); }
+    virtual Addr bias() const { return 0; }
 
-    virtual bool loadSections(Port *memPort, Addr addrMask =
-            std::numeric_limits<Addr>::max());
-    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 isDynamic() { return false; }
     virtual bool hasTLS() { return false; }
 
     Arch  getArch()  const { return arch; }
@@ -106,7 +126,8 @@ class ObjectFile
     Section data;
     Section bss;
 
-    bool loadSection(Section *sec, Port *memPort, Addr addrMask);
+    bool loadSection(Section *sec, PortProxy& mem_proxy, Addr mask,
+                     Addr offset = 0);
     void setGlobalPointer(Addr global_ptr) { globalPtr = global_ptr; }
 
   public:
@@ -122,6 +143,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; }
 };