src/Emu/PPC64Linux/PPC64LinuxLoader.cpp

説明を見る。
00001 // 
00002 // Copyright (c) 2005-2008 Kenichi Watanabe.
00003 // Copyright (c) 2005-2008 Yasuhiro Watari.
00004 // Copyright (c) 2005-2008 Hironori Ichibayashi.
00005 // Copyright (c) 2008-2009 Kazuo Horio.
00006 // Copyright (c) 2009-2013 Naruki Kurata.
00007 // Copyright (c) 2005-2013 Ryota Shioya.
00008 // Copyright (c) 2005-2013 Masahiro Goshima.
00009 // 
00010 // This software is provided 'as-is', without any express or implied
00011 // warranty. In no event will the authors be held liable for any damages
00012 // arising from the use of this software.
00013 // 
00014 // Permission is granted to anyone to use this software for any purpose,
00015 // including commercial applications, and to alter it and redistribute it
00016 // freely, subject to the following restrictions:
00017 // 
00018 // 1. The origin of this software must not be misrepresented; you must not
00019 // claim that you wrote the original software. If you use this software
00020 // in a product, an acknowledgment in the product documentation would be
00021 // appreciated but is not required.
00022 // 
00023 // 2. Altered source versions must be plainly marked as such, and must not be
00024 // misrepresented as being the original software.
00025 // 
00026 // 3. This notice may not be removed or altered from any source
00027 // distribution.
00028 // 
00029 // 
00030 
00031 
00032 #include <pch.h>
00033 #include "Emu/PPC64Linux/PPC64LinuxLoader.h"
00034 
00035 #include "Emu/Utility/System/Memory/MemorySystem.h"
00036 #include "Emu/Utility/System/Loader/ElfReader.h"
00037 #include "Emu/Utility/System/Memory/MemoryUtility.h"
00038 
00039 #include "Emu/PPC64Linux/PPC64Info.h"
00040 
00041 
00042 using namespace std;
00043 using namespace boost;
00044 using namespace Onikiri;
00045 using namespace Onikiri::EmulatorUtility;
00046 using namespace Onikiri::PPC64Linux;
00047 
00048 namespace {
00049     const u16 MACHINE_PPC64 = 0x0015;
00050 }
00051 
00052 PPC64LinuxLoader::PPC64LinuxLoader()
00053     : Linux64Loader(MACHINE_PPC64)  // machine = PPC64
00054 {
00055 }
00056 
00057 PPC64LinuxLoader::~PPC64LinuxLoader()
00058 {
00059 }
00060 
00061 u64 PPC64LinuxLoader::GetInitialRegValue(int index) const
00062 {
00063     const int STACK_POINTER_REGNUM = 1;
00064     const int TOC_POINTER_REGNUM = 2;
00065     const int TLS_POINTER_REGNUM = 13;
00066 
00067     switch (index) {
00068     case STACK_POINTER_REGNUM:
00069         return GetInitialSp();
00070     case TOC_POINTER_REGNUM:
00071         return m_startTocPointer;
00072     case PPC64Info::REG_FPSCR:
00073         return 0;
00074     case TLS_POINTER_REGNUM:
00075         // <TODO>
00076     default:
00077         return 0;
00078     }
00079 }
00080 
00081 u64 PPC64LinuxLoader::CalculateEntryPoint(EmulatorUtility::MemorySystem* memory, const ElfReader& elfReader)
00082 {
00083     // ELFGg|Cg_startfXNv^i[Coffset 0|C^i[
00084     //return memory->ReadMemory(elfReader.GetEntryPoint(), 8);
00085     EmuMemAccess access( elfReader.GetEntryPoint(), 8 );
00086     memory->ReadMemory( &access );
00087     return access.value;
00088 }
00089 
00090 
00091 void PPC64LinuxLoader::CalculateOthers(EmulatorUtility::MemorySystem* memory, const ElfReader& elfReader)
00092 {
00093     // fXNv^offset 8toc
00094     //m_startTocPointer = memory->ReadMemory(elfReader.GetEntryPoint()+8, 8);
00095 
00096     EmuMemAccess access( elfReader.GetEntryPoint()+8, 8 );
00097     memory->ReadMemory( &access );
00098     m_startTocPointer = access.value;
00099 }
00100 
00101 // AT_DCACHEBSIZE: cache_line_size
00102 // AT_SECURE: dl-support.c, enbl-secure.c
00103 

Onikiri2に対してTue Jun 18 14:34:19 2013に生成されました。  doxygen 1.4.7