00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #ifndef __EMULATORUTILITY_LINUX64LOADER_H__
00033 #define __EMULATORUTILITY_LINUX64LOADER_H__
00034
00035 #include "Emu/Utility/System/Loader/LoaderIF.h"
00036
00037 namespace Onikiri {
00038
00039 namespace EmulatorUtility {
00040
00041 class MemorySystem;
00042 class ElfReader;
00043
00044
00045 class Linux64Loader : public LoaderIF
00046 {
00047 public:
00048 Linux64Loader(u16 machine);
00049 virtual ~Linux64Loader();
00050
00051
00052 virtual void LoadBinary(EmulatorUtility::MemorySystem* memory, const String& command);
00053 virtual void InitArgs(EmulatorUtility::MemorySystem* memory, u64 stackHead, u64 stackSize, const String& command, const String& commandArgs);
00054 virtual u64 GetImageBase() const;
00055 virtual u64 GetEntryPoint() const;
00056 virtual std::pair<u64, size_t> GetCodeRange() const;
00057 virtual u64 GetInitialRegValue(int index) const = 0;
00058 protected:
00059 virtual u64 CalculateEntryPoint(EmulatorUtility::MemorySystem* memory, const EmulatorUtility::ElfReader& elfReader);
00060 virtual void CalculateOthers(EmulatorUtility::MemorySystem* memory, const EmulatorUtility::ElfReader& elfReader);
00061 u64 GetInitialSp() const;
00062 bool IsBigEndian() const;
00063 private:
00064 std::pair<u64, size_t> m_codeRange;
00065
00066
00067 void WriteMemory( MemorySystem* memory, u64 address, int size, u64 value );
00068
00069
00070 bool m_bigEndian;
00071
00072 u64 m_imageBase;
00073
00074 u64 m_entryPoint;
00075
00076 u64 m_initialSp;
00077
00078 u64 m_elfProgramHeaderOffset;
00079 u64 m_elfProgramHeaderCount;
00080
00081
00082 u16 m_machine;
00083 };
00084
00085 }
00086 }
00087
00088 #endif