From 7a2cd15173a580df3e8061ae722e14c640db04c7 Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Wed, 5 Nov 2014 19:07:34 +0300 Subject: [PATCH] sceLibm, sceLibKernel drafts --- rpcs3/Emu/ARMv7/Modules/sceLibKernel.cpp | 382 +++++++++++++++++++++++ rpcs3/Emu/ARMv7/Modules/sceLibc.cpp | 8 +- rpcs3/Emu/ARMv7/Modules/sceLibm.cpp | 219 +++++++++++++ rpcs3/Emu/ARMv7/Modules/sceLibstdcxx.cpp | 23 +- rpcs3/Emu/ARMv7/PSVFuncList.cpp | 4 + rpcs3/Emu/ARMv7/PSVFuncList.h | 4 +- rpcs3/Loader/ELF32.cpp | 18 +- rpcs3/emucore.vcxproj | 2 + rpcs3/emucore.vcxproj.filters | 6 + 9 files changed, 648 insertions(+), 18 deletions(-) create mode 100644 rpcs3/Emu/ARMv7/Modules/sceLibKernel.cpp create mode 100644 rpcs3/Emu/ARMv7/Modules/sceLibm.cpp diff --git a/rpcs3/Emu/ARMv7/Modules/sceLibKernel.cpp b/rpcs3/Emu/ARMv7/Modules/sceLibKernel.cpp new file mode 100644 index 0000000000..d176f0012d --- /dev/null +++ b/rpcs3/Emu/ARMv7/Modules/sceLibKernel.cpp @@ -0,0 +1,382 @@ +#include "stdafx.h" +#include "Emu/System.h" +#include "Emu/Memory/Memory.h" +#include "Emu/ARMv7/PSVFuncList.h" + +extern psv_log_base& sceLibKernel; + + + +#define REG_FUNC(nid, name) reg_psv_func(nid, module, #name, &name) + +psv_log_base& sceLibKernel = []() -> psv_log_base& +{ + psv_log_base* module = new psv_log_base("sceLibKernel"); + + //REG_FUNC(0x23EAA62, sceKernelPuts); + //REG_FUNC(0xB0335388, sceClibToupper); + //REG_FUNC(0x4C5471BC, sceClibTolower); + //REG_FUNC(0xD8EBBB7E, sceClibLookCtypeTable); + //REG_FUNC(0x20EC3210, sceClibGetCtypeTable); + //REG_FUNC(0x407D6153, sceClibMemchr); + //REG_FUNC(0x9CC2BFDF, sceClibMemcmp); + //REG_FUNC(0x14E9DBD7, sceClibMemcpy); + //REG_FUNC(0x736753C8, sceClibMemmove); + //REG_FUNC(0x632980D7, sceClibMemset); + //REG_FUNC(0xFA26BC62, sceClibPrintf); + //REG_FUNC(0x5EA3B6CE, sceClibVprintf); + //REG_FUNC(0x8CBA03D5, sceClibSnprintf); + //REG_FUNC(0xFA6BE467, sceClibVsnprintf); + //REG_FUNC(0xA2FB4D9D, sceClibStrcmp); + //REG_FUNC(0x70CBC2D5, sceClibStrlcat); + //REG_FUNC(0x2CDFCD1C, sceClibStrlcpy); + //REG_FUNC(0xA37E6383, sceClibStrncat); + //REG_FUNC(0x660D1F6D, sceClibStrncmp); + //REG_FUNC(0xC458D60A, sceClibStrncpy); + //REG_FUNC(0xAC595E68, sceClibStrnlen); + //REG_FUNC(0x614076B7, sceClibStrchr); + //REG_FUNC(0x6E728AAE, sceClibStrrchr); + //REG_FUNC(0xE265498B, sceClibStrstr); + //REG_FUNC(0xB54C0BE4, sceClibStrncasecmp); + //REG_FUNC(0x2F2C6046, sceClibAbort); + //REG_FUNC(0x2E581B88, sceClibStrtoll); + //REG_FUNC(0x3B9E301A, sceClibMspaceCreate); + //REG_FUNC(0xAE1A21EC, sceClibMspaceDestroy); + //REG_FUNC(0x86EF7680, sceClibMspaceMalloc); + //REG_FUNC(0x9C56B4D1, sceClibMspaceFree); + //REG_FUNC(0x678374AD, sceClibMspaceCalloc); + //REG_FUNC(0x3C847D57, sceClibMspaceMemalign); + //REG_FUNC(0x774891D6, sceClibMspaceRealloc); + //REG_FUNC(0x586AC68D, sceClibMspaceReallocalign); + //REG_FUNC(0x46A02279, sceClibMspaceMallocUsableSize); + //REG_FUNC(0x8CC1D38E, sceClibMspaceMallocStats); + //REG_FUNC(0x738E0322, sceClibMspaceMallocStatsFast); + //REG_FUNC(0xD1D59701, sceClibMspaceIsHeapEmpty); + //REG_FUNC(0xE960FDA2, sceKernelAtomicSet8); + //REG_FUNC(0x450BFECF, sceKernelAtomicSet16); + //REG_FUNC(0xB69DA09B, sceKernelAtomicSet32); + //REG_FUNC(0xC8A4339C, sceKernelAtomicSet64); + //REG_FUNC(0x27A2AAFA, sceKernelAtomicGetAndAdd8); + //REG_FUNC(0x5674DB0C, sceKernelAtomicGetAndAdd16); + //REG_FUNC(0x2611CB0B, sceKernelAtomicGetAndAdd32); + //REG_FUNC(0x63DAF37D, sceKernelAtomicGetAndAdd64); + //REG_FUNC(0x8F7BD940, sceKernelAtomicAddAndGet8); + //REG_FUNC(0x495C52EC, sceKernelAtomicAddAndGet16); + //REG_FUNC(0x2E84A93B, sceKernelAtomicAddAndGet32); + //REG_FUNC(0xB6CE9B9A, sceKernelAtomicAddAndGet64); + //REG_FUNC(0xCDF5DF67, sceKernelAtomicGetAndSub8); + //REG_FUNC(0xAC51979C, sceKernelAtomicGetAndSub16); + //REG_FUNC(0x115C516F, sceKernelAtomicGetAndSub32); + //REG_FUNC(0x4AE9C8E6, sceKernelAtomicGetAndSub64); + //REG_FUNC(0x99E1796E, sceKernelAtomicSubAndGet8); + //REG_FUNC(0xC26BBBB1, sceKernelAtomicSubAndGet16); + //REG_FUNC(0x1C9CD92, sceKernelAtomicSubAndGet32); + //REG_FUNC(0x9BB4A94B, sceKernelAtomicSubAndGet64); + //REG_FUNC(0x53DCA02B, sceKernelAtomicGetAndAnd8); + //REG_FUNC(0x7A0CB056, sceKernelAtomicGetAndAnd16); + //REG_FUNC(0x8266595, sceKernelAtomicGetAndAnd32); + //REG_FUNC(0x4828BC43, sceKernelAtomicGetAndAnd64); + //REG_FUNC(0x86B9170F, sceKernelAtomicAndAndGet8); + //REG_FUNC(0xF9890F7E, sceKernelAtomicAndAndGet16); + //REG_FUNC(0x6709D30C, sceKernelAtomicAndAndGet32); + //REG_FUNC(0xAED2B370, sceKernelAtomicAndAndGet64); + //REG_FUNC(0x107A68DF, sceKernelAtomicGetAndOr8); + //REG_FUNC(0x31E49E73, sceKernelAtomicGetAndOr16); + //REG_FUNC(0x984AD276, sceKernelAtomicGetAndOr32); + //REG_FUNC(0xC39186CD, sceKernelAtomicGetAndOr64); + //REG_FUNC(0x51693931, sceKernelAtomicOrAndGet8); + //REG_FUNC(0x8E248EBD, sceKernelAtomicOrAndGet16); + //REG_FUNC(0xC3B2F7F8, sceKernelAtomicOrAndGet32); + //REG_FUNC(0x809BBC7D, sceKernelAtomicOrAndGet64); + //REG_FUNC(0x7350B2DF, sceKernelAtomicGetAndXor8); + //REG_FUNC(0x6E2D0B9E, sceKernelAtomicGetAndXor16); + //REG_FUNC(0x38739E2F, sceKernelAtomicGetAndXor32); + //REG_FUNC(0x6A19BBE9, sceKernelAtomicGetAndXor64); + //REG_FUNC(0x634AF062, sceKernelAtomicXorAndGet8); + //REG_FUNC(0x6F524195, sceKernelAtomicXorAndGet16); + //REG_FUNC(0x46940704, sceKernelAtomicXorAndGet32); + //REG_FUNC(0xDDC6866E, sceKernelAtomicXorAndGet64); + //REG_FUNC(0x327DB4C0, sceKernelAtomicCompareAndSet8); + //REG_FUNC(0xE8C01236, sceKernelAtomicCompareAndSet16); + //REG_FUNC(0x1124A1D4, sceKernelAtomicCompareAndSet32); + //REG_FUNC(0x1EBDFCCD, sceKernelAtomicCompareAndSet64); + //REG_FUNC(0xD7D49E36, sceKernelAtomicClearMask8); + //REG_FUNC(0x5FE7DFF8, sceKernelAtomicClearMask16); + //REG_FUNC(0xE3DF0CB3, sceKernelAtomicClearMask32); + //REG_FUNC(0x953D118A, sceKernelAtomicClearMask64); + //REG_FUNC(0x7FD94393, sceKernelAtomicAddUnless8); + //REG_FUNC(0x1CF4AA4B, sceKernelAtomicAddUnless16); + //REG_FUNC(0x4B33FD3C, sceKernelAtomicAddUnless32); + //REG_FUNC(0xFFCE7438, sceKernelAtomicAddUnless64); + //REG_FUNC(0x9DABE6C3, sceKernelAtomicDecIfPositive8); + //REG_FUNC(0x323718FB, sceKernelAtomicDecIfPositive16); + //REG_FUNC(0xCA3294F1, sceKernelAtomicDecIfPositive32); + //REG_FUNC(0x8BE2A007, sceKernelAtomicDecIfPositive64); + //REG_FUNC(0xBBE82155, sceKernelLoadModule); + //REG_FUNC(0x2DCC4AFA, sceKernelLoadStartModule); + //REG_FUNC(0x702425D5, sceKernelStartModule); + //REG_FUNC(0x3B2CBA09, sceKernelStopModule); + //REG_FUNC(0x1987920E, sceKernelUnloadModule); + //REG_FUNC(0x2415F8A4, sceKernelStopUnloadModule); + //REG_FUNC(0x15E2A45D, sceKernelCallModuleExit); + //REG_FUNC(0xD11A5103, sceKernelGetModuleInfoByAddr); + //REG_FUNC(0x4F2D8B15, sceKernelOpenModule); + //REG_FUNC(0x657FA50E, sceKernelCloseModule); + //REG_FUNC(0x7595D9AA, sceKernelExitProcess); + //REG_FUNC(0x4C7AD128, sceKernelPowerLock); + //REG_FUNC(0xAF8E9C11, sceKernelPowerUnlock); + //REG_FUNC(0xB295EB61, sceKernelGetTLSAddr); + //REG_FUNC(0xFB972F9, sceKernelGetThreadId); + //REG_FUNC(0xA37A6057, sceKernelGetCurrentThreadVfpException); + //REG_FUNC(0xCA71EA2, sceKernelSendMsgPipe); + //REG_FUNC(0xA5CA74AC, sceKernelSendMsgPipeCB); + //REG_FUNC(0xDFC670E0, sceKernelTrySendMsgPipe); + //REG_FUNC(0x4E81DD5C, sceKernelReceiveMsgPipe); + //REG_FUNC(0x33AF829B, sceKernelReceiveMsgPipeCB); + //REG_FUNC(0x5615B006, sceKernelTryReceiveMsgPipe); + //REG_FUNC(0xA7819967, sceKernelLockLwMutex); + //REG_FUNC(0x6F9C4CC1, sceKernelLockLwMutexCB); + //REG_FUNC(0x9EF798C1, sceKernelTryLockLwMutex); + //REG_FUNC(0x499EA781, sceKernelUnlockLwMutex); + //REG_FUNC(0xF7D8F1FC, sceKernelGetLwMutexInfo); + //REG_FUNC(0xDDB395A9, sceKernelWaitThreadEnd); + //REG_FUNC(0xC54941ED, sceKernelWaitThreadEndCB); + //REG_FUNC(0xD5DC26C4, sceKernelGetThreadExitStatus); + //REG_FUNC(0x4373B548, __sce_aeabi_idiv0); + //REG_FUNC(0xFB235848, __sce_aeabi_ldiv0); + //REG_FUNC(0xF08DE149, sceKernelStartThread); + //REG_FUNC(0x58DDAC4F, sceKernelDeleteThread); + //REG_FUNC(0x5150577B, sceKernelChangeThreadCpuAffinityMask); + //REG_FUNC(0x8C57AC2A, sceKernelGetThreadCpuAffinityMask); + //REG_FUNC(0xDF7E6EDA, sceKernelChangeThreadPriority); + //REG_FUNC(0xBCB63B66, sceKernelGetThreadStackFreeSize); + //REG_FUNC(0x8D9C5461, sceKernelGetThreadInfo); + //REG_FUNC(0xD6B01013, sceKernelGetThreadRunStatus); + //REG_FUNC(0xE0241FAA, sceKernelGetSystemInfo); + //REG_FUNC(0xF994FE65, sceKernelGetThreadmgrUIDClass); + //REG_FUNC(0xB4DE10C7, sceKernelGetActiveCpuMask); + //REG_FUNC(0x2C1321A3, sceKernelChangeThreadVfpException); + //REG_FUNC(0x3849359A, sceKernelCreateCallback); + //REG_FUNC(0x88DD1BC8, sceKernelGetCallbackInfo); + //REG_FUNC(0x464559D3, sceKernelDeleteCallback); + //REG_FUNC(0xBD9C8F2B, sceKernelNotifyCallback); + //REG_FUNC(0x3137A687, sceKernelCancelCallback); + //REG_FUNC(0x76A2EF81, sceKernelGetCallbackCount); + //REG_FUNC(0xD4F75281, sceKernelRegisterCallbackToEvent); + //REG_FUNC(0x8D3940DF, sceKernelUnregisterCallbackFromEvent); + //REG_FUNC(0x2BD1E682, sceKernelUnregisterCallbackFromEventAll); + //REG_FUNC(0x120F03AF, sceKernelWaitEvent); + //REG_FUNC(0xA0490795, sceKernelWaitEventCB); + //REG_FUNC(0x241F3634, sceKernelPollEvent); + //REG_FUNC(0x603AB770, sceKernelCancelEvent); + //REG_FUNC(0x10586418, sceKernelWaitMultipleEvents); + //REG_FUNC(0x4263DBC9, sceKernelWaitMultipleEventsCB); + //REG_FUNC(0x8516D040, sceKernelCreateEventFlag); + //REG_FUNC(0x11FE9B8B, sceKernelDeleteEventFlag); + //REG_FUNC(0xE04EC73A, sceKernelOpenEventFlag); + //REG_FUNC(0x9C0B8285, sceKernelCloseEventFlag); + //REG_FUNC(0x83C0E2AF, sceKernelWaitEventFlag); + //REG_FUNC(0xE737B1DF, sceKernelWaitEventFlagCB); + //REG_FUNC(0x1FBB0FE1, sceKernelPollEventFlag); + //REG_FUNC(0x2A12D9B7, sceKernelCancelEventFlag); + //REG_FUNC(0x8BA4C0C1, sceKernelGetEventFlagInfo); + //REG_FUNC(0x9EF9C0C5, sceKernelSetEventFlag); + //REG_FUNC(0xD018793F, sceKernelClearEventFlag); + //REG_FUNC(0x297AA2AE, sceKernelCreateSema); + //REG_FUNC(0xC08F5BC5, sceKernelDeleteSema); + //REG_FUNC(0xB028AB78, sceKernelOpenSema); + //REG_FUNC(0x817707AB, sceKernelCloseSema); + //REG_FUNC(0xC7B834B, sceKernelWaitSema); + //REG_FUNC(0x174692B4, sceKernelWaitSemaCB); + //REG_FUNC(0x66D6BF05, sceKernelCancelSema); + //REG_FUNC(0x595D3FA6, sceKernelGetSemaInfo); + //REG_FUNC(0x3012A9C6, sceKernelPollSema); + //REG_FUNC(0x2053A496, sceKernelSignalSema); + //REG_FUNC(0xED53334A, sceKernelCreateMutex); + //REG_FUNC(0x12D11F65, sceKernelDeleteMutex); + //REG_FUNC(0x16B85235, sceKernelOpenMutex); + //REG_FUNC(0x43DDC9CC, sceKernelCloseMutex); + //REG_FUNC(0x1D8D7945, sceKernelLockMutex); + //REG_FUNC(0x2BDAA524, sceKernelLockMutexCB); + //REG_FUNC(0x2144890D, sceKernelCancelMutex); + //REG_FUNC(0x9A6C43CA, sceKernelGetMutexInfo); + //REG_FUNC(0xE5901FF9, sceKernelTryLockMutex); + //REG_FUNC(0x34746309, sceKernelUnlockMutex); + //REG_FUNC(0x50572FDA, sceKernelCreateCond); + //REG_FUNC(0xFD295414, sceKernelDeleteCond); + //REG_FUNC(0xCB2A73A9, sceKernelOpenCond); + //REG_FUNC(0x4FB91A89, sceKernelCloseCond); + //REG_FUNC(0xC88D44AD, sceKernelWaitCond); + //REG_FUNC(0x4CE42CE2, sceKernelWaitCondCB); + //REG_FUNC(0x6864DCE2, sceKernelGetCondInfo); + //REG_FUNC(0x10A4976F, sceKernelSignalCond); + //REG_FUNC(0x2EB86929, sceKernelSignalCondAll); + //REG_FUNC(0x87629E6, sceKernelSignalCondTo); + //REG_FUNC(0xA10C1C8, sceKernelCreateMsgPipe); + //REG_FUNC(0x69F6575D, sceKernelDeleteMsgPipe); + //REG_FUNC(0x230691DA, sceKernelOpenMsgPipe); + //REG_FUNC(0x7E5C0C16, sceKernelCloseMsgPipe); + //REG_FUNC(0x94D506F7, sceKernelSendMsgPipeVector); + //REG_FUNC(0x9C6F7F79, sceKernelSendMsgPipeVectorCB); + //REG_FUNC(0x60DB346F, sceKernelTrySendMsgPipeVector); + //REG_FUNC(0x9F899087, sceKernelReceiveMsgPipeVector); + //REG_FUNC(0xBE5B3E27, sceKernelReceiveMsgPipeVectorCB); + //REG_FUNC(0x86ECC0FF, sceKernelTryReceiveMsgPipeVector); + //REG_FUNC(0xEF14BA37, sceKernelCancelMsgPipe); + //REG_FUNC(0x4046D16B, sceKernelGetMsgPipeInfo); + //REG_FUNC(0xDA6EC8EF, sceKernelCreateLwMutex); + //REG_FUNC(0x244E76D2, sceKernelDeleteLwMutex); + //REG_FUNC(0x4846613D, sceKernelGetLwMutexInfoById); + //REG_FUNC(0x48C7EAE6, sceKernelCreateLwCond); + //REG_FUNC(0x721F6CB3, sceKernelDeleteLwCond); + //REG_FUNC(0xE1878282, sceKernelWaitLwCond); + //REG_FUNC(0x8FA54B07, sceKernelWaitLwCondCB); + //REG_FUNC(0x3AC63B9A, sceKernelSignalLwCond); + //REG_FUNC(0xE5241A0C, sceKernelSignalLwCondAll); + //REG_FUNC(0xFC1A48EB, sceKernelSignalLwCondTo); + //REG_FUNC(0xE4DF36A0, sceKernelGetLwCondInfo); + //REG_FUNC(0x971F1DE8, sceKernelGetLwCondInfoById); + //REG_FUNC(0x2255B2A5, sceKernelCreateTimer); + //REG_FUNC(0x746F3290, sceKernelDeleteTimer); + //REG_FUNC(0x2F3D35A3, sceKernelOpenTimer); + //REG_FUNC(0x17283DE6, sceKernelCloseTimer); + //REG_FUNC(0x1478249B, sceKernelStartTimer); + //REG_FUNC(0x75B1329, sceKernelStopTimer); + //REG_FUNC(0x1F59E04D, sceKernelGetTimerBase); + //REG_FUNC(0x3223CCD1, sceKernelGetTimerBaseWide); + //REG_FUNC(0x381DC300, sceKernelGetTimerTime); + //REG_FUNC(0x53C5D833, sceKernelGetTimerTimeWide); + //REG_FUNC(0xFFAD717F, sceKernelSetTimerTime); + //REG_FUNC(0xAF67678B, sceKernelSetTimerTimeWide); + //REG_FUNC(0x621D293B, sceKernelSetTimerEvent); + //REG_FUNC(0x9CCF768C, sceKernelCancelTimer); + //REG_FUNC(0x7E35E10A, sceKernelGetTimerInfo); + //REG_FUNC(0x8667951D, sceKernelCreateRWLock); + //REG_FUNC(0x3D750204, sceKernelDeleteRWLock); + //REG_FUNC(0xBA4DAC9A, sceKernelOpenRWLock); + //REG_FUNC(0xA7F94E64, sceKernelCloseRWLock); + //REG_FUNC(0xFA670F0F, sceKernelLockReadRWLock); + //REG_FUNC(0x2D4A62B7, sceKernelLockReadRWLockCB); + //REG_FUNC(0x1B8586C0, sceKernelTryLockReadRWLock); + //REG_FUNC(0x675D10A8, sceKernelUnlockReadRWLock); + //REG_FUNC(0x67A187BB, sceKernelLockWriteRWLock); + //REG_FUNC(0xA4777082, sceKernelLockWriteRWLockCB); + //REG_FUNC(0x597D4607, sceKernelTryLockWriteRWLock); + //REG_FUNC(0xD9369DF2, sceKernelUnlockWriteRWLock); + //REG_FUNC(0x190CA94B, sceKernelCancelRWLock); + //REG_FUNC(0x79A573B, sceKernelGetRWLockInfo); + //REG_FUNC(0x8AF15B5F, sceKernelGetSystemTime); + //REG_FUNC(0x99B2BF15, sceKernelPMonThreadGetCounter); + //REG_FUNC(0x7C21C961, sceKernelPMonCpuGetCounter); + //REG_FUNC(0xADCA94E5, sceKernelWaitSignal); + //REG_FUNC(0x24460BB3, sceKernelWaitSignalCB); + //REG_FUNC(0x7BE9C4C8, sceKernelSendSignal); + //REG_FUNC(0xC5C11EE7, sceKernelCreateThread); + //REG_FUNC(0x6C60AC61, sceIoOpen); + //REG_FUNC(0xF5C6F098, sceIoClose); + //REG_FUNC(0x713523E1, sceIoRead); + //REG_FUNC(0x11FED231, sceIoWrite); + //REG_FUNC(0x99BA173E, sceIoLseek); + //REG_FUNC(0x5CC983AC, sceIoLseek32); + //REG_FUNC(0xE20ED0F3, sceIoRemove); + //REG_FUNC(0xF737E369, sceIoRename); + //REG_FUNC(0x9670D39F, sceIoMkdir); + //REG_FUNC(0xE9F91EC8, sceIoRmdir); + //REG_FUNC(0xA9283DD0, sceIoDopen); + //REG_FUNC(0x9DFF9C59, sceIoDclose); + //REG_FUNC(0x9C8B6624, sceIoDread); + //REG_FUNC(0xBCA5B623, sceIoGetstat); + //REG_FUNC(0x29482F7F, sceIoChstat); + //REG_FUNC(0x98ACED6D, sceIoSync); + //REG_FUNC(0x4B30CB2, sceIoDevctl); + //REG_FUNC(0x54ABACFA, sceIoIoctl); + //REG_FUNC(0x6A7EA9FD, sceIoOpenAsync); + //REG_FUNC(0x84201C9B, sceIoCloseAsync); + //REG_FUNC(0x7B3BE857, sceIoReadAsync); + //REG_FUNC(0x21329B20, sceIoWriteAsync); + //REG_FUNC(0xCAC5D672, sceIoLseekAsync); + //REG_FUNC(0x99C54B9, sceIoIoctlAsync); + //REG_FUNC(0x446A60AC, sceIoRemoveAsync); + //REG_FUNC(0x73FC184B, sceIoDopenAsync); + //REG_FUNC(0x4D0597D7, sceIoDcloseAsync); + //REG_FUNC(0xCE32490D, sceIoDreadAsync); + //REG_FUNC(0x8E5FCBB1, sceIoMkdirAsync); + //REG_FUNC(0x9694D00F, sceIoRmdirAsync); + //REG_FUNC(0xEE9857CD, sceIoRenameAsync); + //REG_FUNC(0x9739A5E2, sceIoChstatAsync); + //REG_FUNC(0x82B20B41, sceIoGetstatAsync); + //REG_FUNC(0x950F78EB, sceIoDevctlAsync); + //REG_FUNC(0xF7C7FBFE, sceIoSyncAsync); + //REG_FUNC(0xEC96EA71, sceIoCancel); + //REG_FUNC(0x857E0C71, sceIoComplete); + //REG_FUNC(0x52315AD7, sceIoPread); + //REG_FUNC(0x8FFFF5A8, sceIoPwrite); + //REG_FUNC(0xA010141E, sceIoPreadAsync); + //REG_FUNC(0xED25BEEF, sceIoPwriteAsync); + //REG_FUNC(0xA792C404, sceIoCompleteMultiple); + //REG_FUNC(0x894037E8, sceKernelBacktrace); + //REG_FUNC(0x20E2D4B7, sceKernelPrintBacktrace); + //REG_FUNC(0x963F4A99, sceSblACMgrIsGameProgram); + //REG_FUNC(0x261E2C34, sceKernelGetOpenPsId); + + /* SceModulemgr */ + //REG_FUNC(0x36585DAF, sceKernelGetModuleInfo); + //REG_FUNC(0x2EF2581F, sceKernelGetModuleList); + //REG_FUNC(0xF5798C7C, sceKernelGetModuleIdByAddr); + + /* SceProcessmgr */ + //REG_FUNC(0xCD248267, sceKernelGetCurrentProcess); + //REG_FUNC(0x2252890C, sceKernelPowerTick); + //REG_FUNC(0x9E45DA09, sceKernelLibcClock); + //REG_FUNC(0x39BE45, sceKernelLibcTime); + //REG_FUNC(0x4B879059, sceKernelLibcGettimeofday); + //REG_FUNC(0xC1727F59, sceKernelGetStdin); + //REG_FUNC(0xE5AA625C, sceKernelGetStdout); + //REG_FUNC(0xFA5E3ADA, sceKernelGetStderr); + //REG_FUNC(0xE6E9FCA3, sceKernelGetRemoteProcessTime); + //REG_FUNC(0xD37A8437, sceKernelGetProcessTime); + //REG_FUNC(0xF5D0D4C6, sceKernelGetProcessTimeLow); + //REG_FUNC(0x89DA0967, sceKernelGetProcessTimeWide); + //REG_FUNC(0x2BE3E066, sceKernelGetProcessParam); + + /* SceStdio */ + //REG_FUNC(0x54237407, sceKernelStdin); + //REG_FUNC(0x9033E9BD, sceKernelStdout); + //REG_FUNC(0x35EE7CF5, sceKernelStderr); + + /* SceSysmem */ + //REG_FUNC(0xB9D5EBDE, sceKernelAllocMemBlock); + //REG_FUNC(0xA91E15EE, sceKernelFreeMemBlock); + //REG_FUNC(0xB8EF5818, sceKernelGetMemBlockBase); + //REG_FUNC(0x3B29E0F5, sceKernelRemapMemBlock); + //REG_FUNC(0xA33B99D1, sceKernelFindMemBlockByAddr); + //REG_FUNC(0x4010AD65, sceKernelGetMemBlockInfoByAddr); + + /* SceCpu */ + //REG_FUNC(0x2704CFEE, sceKernelCpuId); + + /* SceDipsw */ + //REG_FUNC(0x1C783FB2, sceKernelCheckDipsw); + //REG_FUNC(0x817053D4, sceKernelSetDipsw); + //REG_FUNC(0x800EDCC1, sceKernelClearDipsw); + + /* SceThreadmgr */ + //REG_FUNC(0xC8A38E1, sceKernelExitThread); + //REG_FUNC(0x1D17DECF, sceKernelExitDeleteThread); + //REG_FUNC(0x4B675D05, sceKernelDelayThread); + //REG_FUNC(0x9C0180E1, sceKernelDelayThreadCB); + //REG_FUNC(0x1173F8, sceKernelChangeActiveCpuMask); + //REG_FUNC(0x1414F0B, sceKernelGetThreadCurrentPriority); + //REG_FUNC(0x751C9B7A, sceKernelChangeCurrentThreadAttr); + //REG_FUNC(0xD9BD74EB, sceKernelCheckWaitableStatus); + //REG_FUNC(0x9DCB4B7A, sceKernelGetProcessId); + //REG_FUNC(0xE53E41F6, sceKernelCheckCallback); + //REG_FUNC(0xF4EE4FA9, sceKernelGetSystemTimeWide); + //REG_FUNC(0x47F6DE49, sceKernelGetSystemTimeLow); + //REG_FUNC(0xC0FAF6A3, sceKernelCreateThreadForUser); + + /* SceDebugLed */ + //REG_FUNC(0x78E702D3, sceKernelSetGPO); + + return *module; +}(); diff --git a/rpcs3/Emu/ARMv7/Modules/sceLibc.cpp b/rpcs3/Emu/ARMv7/Modules/sceLibc.cpp index 2abe89f32b..eac21b99b1 100644 --- a/rpcs3/Emu/ARMv7/Modules/sceLibc.cpp +++ b/rpcs3/Emu/ARMv7/Modules/sceLibc.cpp @@ -10,12 +10,14 @@ namespace sce_libc_func void __cxa_atexit() { sceLibc.Todo(__FUNCTION__); + Emu.Pause(); } void exit() { sceLibc.Error("exit()"); Emu.Pause(); + sceLibc.Success("Process finished"); CallAfter([]() { @@ -36,11 +38,11 @@ namespace sce_libc_func } } +#define REG_FUNC(nid, name) reg_psv_func(nid, module, #name, &sce_libc_func::name) + psv_log_base& sceLibc = []() -> psv_log_base& { - psv_log_base* module = new psv_log_base("sceLibc"); - -#define REG_FUNC(nid, name) reg_psv_func(nid, module, &sce_libc_func::name) + psv_log_base* module = new psv_log_base("SceLibc"); REG_FUNC(0x33b83b70, __cxa_atexit); REG_FUNC(0x826bbbaf, exit); diff --git a/rpcs3/Emu/ARMv7/Modules/sceLibm.cpp b/rpcs3/Emu/ARMv7/Modules/sceLibm.cpp new file mode 100644 index 0000000000..910f110f49 --- /dev/null +++ b/rpcs3/Emu/ARMv7/Modules/sceLibm.cpp @@ -0,0 +1,219 @@ +#include "stdafx.h" +#include "Emu/System.h" +#include "Emu/Memory/Memory.h" +#include "Emu/ARMv7/PSVFuncList.h" + +extern psv_log_base& sceLibm; + +namespace sce_libm_func +{ + +} + +#define REG_FUNC(nid, name) reg_psv_func(nid, module, #name, &sce_libm_func::name) + +psv_log_base& sceLibm = []() -> psv_log_base& +{ + psv_log_base* module = new psv_log_base("SceLibm"); + + //REG_FUNC(0xC73FE76D, _Exp); + //REG_FUNC(0xFF4EAE04, _FExp); + //REG_FUNC(0xB363D7D4, _LExp); + //REG_FUNC(0xD72B5ACB, acos); + //REG_FUNC(0x27EAB8C1, acosf); + //REG_FUNC(0x1C053D0F, acosh); + //REG_FUNC(0x568ECFB0, acoshf); + //REG_FUNC(0xD3D6D36E, acoshl); + //REG_FUNC(0x3210F395, acosl); + //REG_FUNC(0x4016B2E6, asin); + //REG_FUNC(0x3A3E5424, asinf); + //REG_FUNC(0x7C93F1DD, asinh); + //REG_FUNC(0x285AEDEA, asinhf); + //REG_FUNC(0x9496E15E, asinhl); + //REG_FUNC(0x1724A81D, asinl); + //REG_FUNC(0x516D9970, atan); + //REG_FUNC(0xC9BE3F05, atan2); + //REG_FUNC(0x4E09DD53, atan2f); + //REG_FUNC(0xCE325597, atan2l); + //REG_FUNC(0xD78FC94E, atanf); + //REG_FUNC(0x434BCE01, atanh); + //REG_FUNC(0xC7B0AFBA, atanhf); + //REG_FUNC(0x6A6881A6, atanhl); + //REG_FUNC(0xD423A4AB, atanl); + //REG_FUNC(0xACC0DC5A, cbrt); + //REG_FUNC(0xD1699F4D, cbrtf); + //REG_FUNC(0x342F9501, cbrtl); + //REG_FUNC(0x63F05BD6, ceil); + //REG_FUNC(0x6BBFEC89, ceilf); + //REG_FUNC(0x48082D81, ceill); + //REG_FUNC(0xB918D13, copysign); + //REG_FUNC(0x16EB9E63, copysignf); + //REG_FUNC(0x19DFC0AA, copysignl); + //REG_FUNC(0x61D0244, cos); + //REG_FUNC(0x127F8302, cosf); + //REG_FUNC(0x89B9BE1F, cosl); + //REG_FUNC(0x110195E7, cosh); + //REG_FUNC(0x61DE0770, coshf); + //REG_FUNC(0x7EADDC5E, coshl); + //REG_FUNC(0x4B84C012, _Cosh); + //REG_FUNC(0x15993458, erf); + //REG_FUNC(0x524AEBFE, erfc); + //REG_FUNC(0x301F113, erfcf); + //REG_FUNC(0xD4C92471, erfcl); + //REG_FUNC(0x41DD1AB8, erff); + //REG_FUNC(0xFD431619, erfl); + //REG_FUNC(0xEB027358, exp); + //REG_FUNC(0x9B18F38F, exp2); + //REG_FUNC(0x79415BD3, exp2f); + //REG_FUNC(0x40053307, exp2l); + //REG_FUNC(0x56473BC7, expf); + //REG_FUNC(0xA71A81AA, expl); + //REG_FUNC(0x2A97A75F, expm1); + //REG_FUNC(0x64131D7B, expm1f); + //REG_FUNC(0x8BF1866C, expm1l); + //REG_FUNC(0x3E672BE3, fabs); + //REG_FUNC(0x75348906, fabsf); + //REG_FUNC(0x3ECA514, fabsl); + //REG_FUNC(0xA278B20D, _FCosh); + //REG_FUNC(0xD6FD5A2E, fdim); + //REG_FUNC(0x8B6CC137, fdimf); + //REG_FUNC(0xE6988B7B, fdiml); + //REG_FUNC(0xD5BD8D5C, _FLog); + //REG_FUNC(0x22BB8237, floor); + //REG_FUNC(0xCD7C05BD, floorf); + //REG_FUNC(0xFDFA4558, floorl); + //REG_FUNC(0x1EACA585, fma); + //REG_FUNC(0xB61672A7, fmaf); + //REG_FUNC(0xBCF6EA7C, fmal); + //REG_FUNC(0xBE30CC1E, fmax); + //REG_FUNC(0x7004FA75, fmaxf); + //REG_FUNC(0xBF5AF69E, fmaxl); + //REG_FUNC(0x2ABBDFF7, fmin); + //REG_FUNC(0x7673CC1E, fminf); + //REG_FUNC(0xE2F5A0F0, fminl); + //REG_FUNC(0x798587E4, fmod); + //REG_FUNC(0x1CD8F88E, fmodf); + //REG_FUNC(0x986011B4, fmodl); + //REG_FUNC(0x59197427, frexp); + //REG_FUNC(0xA6879AC, frexpf); + //REG_FUNC(0x6DC8D877, frexpl); + //REG_FUNC(0x4A496BC0, _FSin); + //REG_FUNC(0x7FBB4C55, _FSinh); + //REG_FUNC(0x2D2CD795, hypot); + //REG_FUNC(0xA397B929, hypotf); + //REG_FUNC(0x5BFBEE8, hypotl); + //REG_FUNC(0x667EE864, ilogb); + //REG_FUNC(0x80050A43, ilogbf); + //REG_FUNC(0x91298DCA, ilogbl); + //REG_FUNC(0x197C9D5, _LCosh); + //REG_FUNC(0x56061B, ldexp); + //REG_FUNC(0xE61E016, ldexpf); + //REG_FUNC(0x8280A7B1, ldexpl); + //REG_FUNC(0x2480AA54, lgamma); + //REG_FUNC(0x2D9556D5, lgammaf); + //REG_FUNC(0xADEBD201, lgammal); + //REG_FUNC(0x5B05329D, _LLog); + //REG_FUNC(0x7B41AC38, llrint); + //REG_FUNC(0xC1F6135B, llrintf); + //REG_FUNC(0x80558247, llrintl); + //REG_FUNC(0xD1251A18, llround); + //REG_FUNC(0x4595A04, llroundf); + //REG_FUNC(0x9AB5C7AF, llroundl); + //REG_FUNC(0x6037C48F, log); + //REG_FUNC(0x811ED68B, logf); + //REG_FUNC(0xC6FFBCD6, logl); + //REG_FUNC(0x67E99979, _Log); + //REG_FUNC(0x2CBE04D7, log1p); + //REG_FUNC(0xF1D7C851, log1pf); + //REG_FUNC(0x3359152C, log1pl); + //REG_FUNC(0xCF65F098, log10); + //REG_FUNC(0xFD2A3464, log10f); + //REG_FUNC(0x3D7E7201, log10l); + //REG_FUNC(0x73AFEE5F, log2); + //REG_FUNC(0x4095DBDB, log2f); + //REG_FUNC(0x720021A9, log2l); + //REG_FUNC(0x5EAE8AD4, logb); + //REG_FUNC(0x25F51CE, logbf); + //REG_FUNC(0x86C4B75F, logbl); + //REG_FUNC(0x207307D0, lrint); + //REG_FUNC(0xDA903135, lrintf); + //REG_FUNC(0xE8C1F6F8, lrintl); + //REG_FUNC(0xD35AFD56, lround); + //REG_FUNC(0xA24C6453, lroundf); + //REG_FUNC(0x8B3ACA4E, lroundl); + //REG_FUNC(0xB397FE83, _LSin); + //REG_FUNC(0xF247EE99, _LSinh); + //REG_FUNC(0x1167B5D2, modf); + //REG_FUNC(0x5D7A7EB2, modff); + //REG_FUNC(0xD41D68F2, modfl); + //REG_FUNC(0xC3FCA1FA, nan); + //REG_FUNC(0xB4761D24, nanf); + //REG_FUNC(0xBFA96D93, nanl); + //REG_FUNC(0x877187C4, nearbyint); + //REG_FUNC(0xD56E78F6, nearbyintf); + //REG_FUNC(0x8DD794DC, nearbyintl); + //REG_FUNC(0xE1A3D449, nextafter); + //REG_FUNC(0xC8A94A33, nextafterf); + //REG_FUNC(0xEAAB2055, nextafterl); + //REG_FUNC(0x39E605E6, nexttoward); + //REG_FUNC(0xDD652D4E, nexttowardf); + //REG_FUNC(0x41E6AEA4, nexttowardl); + //REG_FUNC(0x640DB443, pow); + //REG_FUNC(0x6DEA815A, powf); + //REG_FUNC(0x96328F3D, powl); + //REG_FUNC(0xE4D6117F, remainder); + //REG_FUNC(0xE6BB3DCF, remainderf); + //REG_FUNC(0x354E568E, remainderl); + //REG_FUNC(0x52337926, remquo); + //REG_FUNC(0xD8F6B5D3, remquof); + //REG_FUNC(0xBB353F24, remquol); + //REG_FUNC(0x943F218F, rint); + //REG_FUNC(0xCACE5A19, rintf); + //REG_FUNC(0xE3C097E0, rintl); + //REG_FUNC(0x64D37996, round); + //REG_FUNC(0xAAF31896, roundf); + //REG_FUNC(0x9AB1B1B1, roundl); + //REG_FUNC(0x8F8CF628, scalbln); + //REG_FUNC(0xDEB0A2D0, scalblnf); + //REG_FUNC(0x2113921E, scalblnl); + //REG_FUNC(0x569758D0, scalbn); + //REG_FUNC(0x78F70588, scalbnf); + //REG_FUNC(0x777C7463, scalbnl); + //REG_FUNC(0xB5519FF0, sin); + //REG_FUNC(0x7F00B590, sinf); + //REG_FUNC(0x3294447C, sinl); + //REG_FUNC(0xD92A7F85, _Sin); + //REG_FUNC(0xF2C0AF49, sinh); + //REG_FUNC(0xB5838E7D, sinhf); + //REG_FUNC(0x4B91F2E6, sinhl); + //REG_FUNC(0x40E42E8E, _Sinh); + //REG_FUNC(0xDA227FCC, sqrt); + //REG_FUNC(0xBA3F6937, sqrtf); + //REG_FUNC(0xC1343477, sqrtl); + //REG_FUNC(0x5BAE40B0, tan); + //REG_FUNC(0xA98E941B, tanf); + //REG_FUNC(0x26CD78CA, tanh); + //REG_FUNC(0xC4847578, tanhf); + //REG_FUNC(0x14F2BEA1, tanhl); + //REG_FUNC(0xDC742A5E, tanl); + //REG_FUNC(0x3A7FE686, tgamma); + //REG_FUNC(0xE6067AC0, tgammaf); + //REG_FUNC(0x2949109F, tgammal); + //REG_FUNC(0x212323E, trunc); + //REG_FUNC(0x90B899F, truncf); + //REG_FUNC(0xBC0F1B1A, truncl); + //REG_FUNC(0x98BBDAE0, _Dclass); + //REG_FUNC(0xBD8EF217, _FDclass); + //REG_FUNC(0x314CCE54, _LDclass); + //REG_FUNC(0xC5B9C8D8, _FDtest); + //REG_FUNC(0x27A55170, _Dtest); + //REG_FUNC(0x8DAE8767, _LDtest); + //REG_FUNC(0x622CBFEE, _Fpcomp); + //REG_FUNC(0x9CD4CEFE, _FFpcomp); + //REG_FUNC(0x18F43CD0, _LFpcomp); + //REG_FUNC(0x5BD0F71C, _Dsign); + //REG_FUNC(0xC4F7E42C, _FDsign); + //REG_FUNC(0x1DF73D2B, _LDsign); + + return *module; +}(); diff --git a/rpcs3/Emu/ARMv7/Modules/sceLibstdcxx.cpp b/rpcs3/Emu/ARMv7/Modules/sceLibstdcxx.cpp index 4dd98b24c4..a2ddd50388 100644 --- a/rpcs3/Emu/ARMv7/Modules/sceLibstdcxx.cpp +++ b/rpcs3/Emu/ARMv7/Modules/sceLibstdcxx.cpp @@ -10,16 +10,31 @@ namespace sce_libstdcxx_func void __aeabi_unwind_cpp_pr0() { sceLibstdcxx.Todo(__FUNCTION__); + Emu.Pause(); + } + + void __aeabi_unwind_cpp_pr1() + { + sceLibstdcxx.Todo(__FUNCTION__); + Emu.Pause(); + } + + void __aeabi_unwind_cpp_pr2() + { + sceLibstdcxx.Todo(__FUNCTION__); + Emu.Pause(); } } +#define REG_FUNC(nid, name) reg_psv_func(nid, module, #name, &sce_libstdcxx_func::name) + psv_log_base& sceLibstdcxx = []() -> psv_log_base& { - psv_log_base* module = new psv_log_base("sceLibstdcxx"); - -#define REG_FUNC(nid, name) reg_psv_func(nid, module, &sce_libstdcxx_func::name) + psv_log_base* module = new psv_log_base("SceLibstdcxx"); REG_FUNC(0x173E7421, __aeabi_unwind_cpp_pr0); + REG_FUNC(0x3C78DDE3, __aeabi_unwind_cpp_pr1); + REG_FUNC(0xF95BDD36, __aeabi_unwind_cpp_pr2); //REG_FUNC(0x52B0C625, std::bad_typeid::what() const); //REG_FUNC(0x64D7D074, std::bad_typeid::_Doraise() const); @@ -364,8 +379,6 @@ psv_log_base& sceLibstdcxx = []() -> psv_log_base& //REG_FUNC(0xE7889A5B, _Unwind_VRS_Get); //REG_FUNC(0xF106D050, _Unwind_VRS_Pop); //REG_FUNC(0x91CDA2F9, _Unwind_VRS_Set); - //REG_FUNC(0x3C78DDE3, __aeabi_unwind_cpp_pr1); - //REG_FUNC(0xF95BDD36, __aeabi_unwind_cpp_pr2); //REG_FUNC(0x8C93EFDA, __cxa_allocate_exception); //REG_FUNC(0x6165EE89, __cxa_begin_catch); //REG_FUNC(0x5D74285C, __cxa_begin_cleanup); diff --git a/rpcs3/Emu/ARMv7/PSVFuncList.cpp b/rpcs3/Emu/ARMv7/PSVFuncList.cpp index beb8379bb8..cdf34ab487 100644 --- a/rpcs3/Emu/ARMv7/PSVFuncList.cpp +++ b/rpcs3/Emu/ARMv7/PSVFuncList.cpp @@ -38,10 +38,14 @@ void execute_psv_func_by_index(ARMv7Thread& CPU, u32 index) } extern psv_log_base& sceLibc; +extern psv_log_base& sceLibm; extern psv_log_base& sceLibstdcxx; +extern psv_log_base& sceLibKernel; void list_known_psv_modules() { sceLibc.Log(""); + sceLibm.Log(""); sceLibstdcxx.Log(""); + sceLibKernel.Log(""); } diff --git a/rpcs3/Emu/ARMv7/PSVFuncList.h b/rpcs3/Emu/ARMv7/PSVFuncList.h index 99b691dee0..4b80b9d156 100644 --- a/rpcs3/Emu/ARMv7/PSVFuncList.h +++ b/rpcs3/Emu/ARMv7/PSVFuncList.h @@ -264,6 +264,7 @@ namespace psv_func_detail struct psv_func { const u32 nid; + const char* const name; psv_func_caller* const func; psv_log_base* const module; }; @@ -271,11 +272,12 @@ struct psv_func void add_psv_func(psv_func& data); template -void reg_psv_func(u32 nid, psv_log_base* module, RT(*func)(T...)) +void reg_psv_func(u32 nid, psv_log_base* module, const char* name, RT(*func)(T...)) { psv_func f = { nid, + name, new psv_func_detail::func_binder(func), module }; diff --git a/rpcs3/Loader/ELF32.cpp b/rpcs3/Loader/ELF32.cpp index 995a913ce9..2ec76cf384 100644 --- a/rpcs3/Loader/ELF32.cpp +++ b/rpcs3/Loader/ELF32.cpp @@ -344,15 +344,19 @@ bool ELF32Loader::LoadPhdrInfo() phdr_arr.back().Load(elf32_f); } - if(entry & 0x1) + if (machine == MACHINE_ARM) + { + entry = (entry & ~0x3) + 0x81000000; + } + else if(entry & 0x3) { //entry is physical, convert to virtual - entry &= ~0x1; + entry &= ~0x3; for(size_t i=0; i= entry && entry < phdr_arr[i].p_offset + phdr_arr[i].p_memsz) + if(phdr_arr[i].p_paddr >= entry && entry < phdr_arr[i].p_paddr + phdr_arr[i].p_memsz) { entry += phdr_arr[i].p_vaddr; LOG_WARNING(LOADER, "virtual entry = 0x%x", entry); @@ -360,10 +364,6 @@ bool ELF32Loader::LoadPhdrInfo() } } } - else if (machine == MACHINE_ARM) - { - entry += 0x81000000; - } return true; } @@ -556,7 +556,7 @@ bool ELF32Loader::LoadShdrData(u64 offset) if (auto func = get_psv_func_by_nid(nid)) { - LOG_NOTICE(LOADER, "Imported function 0x%x (addr=0x%x)", nid, addr); + func->module->Notice("Imported function %s (nid=0x%08x, addr=0x%x)", func->name, nid, addr); // writing Thumb code (temporarily, because it should be ARM) vm::psv::write16(addr + 0, 0xf870); // HACK (special instruction that calls HLE function @@ -566,7 +566,7 @@ bool ELF32Loader::LoadShdrData(u64 offset) } else { - LOG_ERROR(LOADER, "Unimplemented function 0x%x (addr=0x%x)", nid, addr); + LOG_ERROR(LOADER, "Unimplemented function 0x%08x (addr=0x%x)", nid, addr); // writing Thumb code (temporarily - it shouldn't be written in this case) vm::psv::write16(addr + 0, 0xf06f); // MVN r0,#0x0 diff --git a/rpcs3/emucore.vcxproj b/rpcs3/emucore.vcxproj index 6ae5e233f5..931d264818 100644 --- a/rpcs3/emucore.vcxproj +++ b/rpcs3/emucore.vcxproj @@ -57,7 +57,9 @@ + + diff --git a/rpcs3/emucore.vcxproj.filters b/rpcs3/emucore.vcxproj.filters index 3ce4681b32..083f30ae0c 100644 --- a/rpcs3/emucore.vcxproj.filters +++ b/rpcs3/emucore.vcxproj.filters @@ -650,6 +650,12 @@ Emu\ARMv7\Modules + + Emu\ARMv7\Modules + + + Emu\ARMv7\Modules +