From 7777be6fc10a44c2ea9884ed216174300b822d0c Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Thu, 23 Oct 2014 02:53:44 +0400 Subject: [PATCH 01/27] Some things simplified --- rpcs3/Emu/Cell/SPURecompiler.h | 12 +++- rpcs3/Emu/SysCalls/Modules/cellAdec.cpp | 7 +- rpcs3/Emu/SysCalls/Modules/cellAdec.h | 1 - rpcs3/Emu/SysCalls/Modules/cellDmux.cpp | 86 +++++-------------------- rpcs3/Emu/SysCalls/Modules/cellDmux.h | 3 +- rpcs3/Emu/SysCalls/Modules/cellVdec.cpp | 10 +-- rpcs3/Emu/SysCalls/Modules/cellVdec.h | 1 - 7 files changed, 33 insertions(+), 87 deletions(-) diff --git a/rpcs3/Emu/Cell/SPURecompiler.h b/rpcs3/Emu/Cell/SPURecompiler.h index 82c2c287f6..ee7cd7d883 100644 --- a/rpcs3/Emu/Cell/SPURecompiler.h +++ b/rpcs3/Emu/Cell/SPURecompiler.h @@ -631,7 +631,7 @@ private: } LOG_OPCODE(); } - void ROTH(u32 rt, u32 ra, u32 rb) + void ROTH(u32 rt, u32 ra, u32 rb) //nf { XmmInvalidate(rt); for (u32 i = 0; i < 8; i++) @@ -3472,6 +3472,16 @@ private: } WRAPPER_END(rc, rt, ra, rb);*/ + // hypothetical AVX-512 implementation: + // VPXORD mask, rc, [byte:0x0f] // 15 - rc (only for index bits) + // VPSHUFB res {k0}, ra, mask + // VPTESTMB k1 {k0}, rc, [byte:0x10] + // VPSHUFB res {k1}, rb, mask + // VPCMPNLTUB k1 {k0}, mask, [byte:0xc0] + // VPADDB res {k1}, res, [byte:0xff] + // VPCMPNLTUB k1 {k1}, mask, [byte:0xe0] + // VPSUBB res {k1}, res, [byte:0x7f] + const XmmLink& v0 = XmmGet(rc); // v0 = mask const XmmLink& v1 = XmmAlloc(); const XmmLink& v2 = XmmCopy(v0); // v2 = mask diff --git a/rpcs3/Emu/SysCalls/Modules/cellAdec.cpp b/rpcs3/Emu/SysCalls/Modules/cellAdec.cpp index 64774cc762..28605b2ee7 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellAdec.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellAdec.cpp @@ -27,7 +27,6 @@ AudioDecoder::AudioDecoder(AudioCodecType type, u32 addr, u32 size, vm::ptrWarning("adecEndSeq:"); adec.cbFunc.call(*adec.adecCb, adec.id, CELL_ADEC_MSG_TYPE_SEQDONE, CELL_OK, adec.cbArg); - adec.is_running = false; adec.just_finished = true; } break; @@ -722,7 +719,7 @@ int cellAdecGetPcm(u32 handle, vm::ptr outBuffer) AdecFrame af; if (!adec->frames.Pop(af, &sq_no_wait)) { - std::this_thread::sleep_for(std::chrono::milliseconds(1)); // hack + //std::this_thread::sleep_for(std::chrono::milliseconds(1)); // hack return CELL_ADEC_ERROR_EMPTY; } @@ -765,7 +762,7 @@ int cellAdecGetPcmItem(u32 handle, vm::ptr pcmItem_ptr) AdecFrame af; if (!adec->frames.Peek(af, &sq_no_wait)) { - std::this_thread::sleep_for(std::chrono::milliseconds(1)); // hack + //std::this_thread::sleep_for(std::chrono::milliseconds(1)); // hack return CELL_ADEC_ERROR_EMPTY; } diff --git a/rpcs3/Emu/SysCalls/Modules/cellAdec.h b/rpcs3/Emu/SysCalls/Modules/cellAdec.h index f751f0cfba..7249fd411e 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellAdec.h +++ b/rpcs3/Emu/SysCalls/Modules/cellAdec.h @@ -1073,7 +1073,6 @@ class AudioDecoder public: SQueue job; u32 id; - volatile bool is_running; volatile bool is_closed; volatile bool is_finished; bool just_started; diff --git a/rpcs3/Emu/SysCalls/Modules/cellDmux.cpp b/rpcs3/Emu/SysCalls/Modules/cellDmux.cpp index dccb5c3d74..0c8704c934 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellDmux.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellDmux.cpp @@ -326,7 +326,7 @@ u32 dmuxOpen(Demuxer* data) cellDmux->Notice("Demuxer thread started (mem=0x%x, size=0x%x, cb=0x%x, arg=0x%x)", dmux.memAddr, dmux.memSize, dmux.cbFunc, dmux.cbArg); DemuxerTask task; - DemuxerStream stream; + DemuxerStream stream = {}; ElementaryStream* esALL[192]; memset(esALL, 0, sizeof(esALL)); ElementaryStream** esAVC = &esALL[0]; // AVC (max 16) ElementaryStream** esM2V = &esALL[16]; // MPEG-2 (max 16) @@ -337,9 +337,6 @@ u32 dmuxOpen(Demuxer* data) u32 cb_add = 0; - u32 updates_count = 0; - u32 updates_signaled = 0; - while (true) { if (Emu.IsStopped() || dmux.is_closed) @@ -347,7 +344,7 @@ u32 dmuxOpen(Demuxer* data) break; } - if (!dmux.job.Peek(task, &sq_no_wait) && dmux.is_running) + if (!dmux.job.Peek(task, &sq_no_wait) && dmux.is_running && stream.addr) { // default task (demuxing) (if there is no other work) be_t code; @@ -356,14 +353,13 @@ u32 dmuxOpen(Demuxer* data) if (!stream.peek(code)) { - dmux.is_running = false; // demuxing finished auto dmuxMsg = vm::ptr::make(a128(dmux.memAddr) + (cb_add ^= 16)); dmuxMsg->msgType = CELL_DMUX_MSG_TYPE_DEMUX_DONE; dmuxMsg->supplementalInfo = stream.userdata; dmux.cbFunc.call(*dmux.dmuxCb, dmux.id, dmuxMsg, dmux.cbArg); - updates_signaled++; + dmux.is_running = false; } else switch (code.ToLE()) { @@ -425,13 +421,6 @@ u32 dmuxOpen(Demuxer* data) continue; } - /*if (es.hasunseen()) // hack, probably useless - { - stream = backup; - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - continue; - }*/ - stream.skip(4); len -= 4; @@ -480,12 +469,6 @@ u32 dmuxOpen(Demuxer* data) if (pes.new_au && es.hasdata()) // new AU detected { - /*if (es.hasunseen()) // hack, probably useless - { - stream = backup; - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - continue; - }*/ es.finish(stream); // callback auto esMsg = vm::ptr::make(a128(dmux.memAddr) + (cb_add ^= 16)); @@ -572,24 +555,11 @@ u32 dmuxOpen(Demuxer* data) esALL[i]->reset(); } } - updates_count = 0; - updates_signaled = 0; } - if (updates_count != updates_signaled) - { - cellDmux->Error("dmuxSetStream: stream update inconsistency (input=%d, signaled=%d)", updates_count, updates_signaled); - Emu.Pause(); - return; - } - - updates_count++; stream = task.stream; //LOG_NOTICE(HLE, "*** stream updated(addr=0x%x, size=0x%x, discont=%d, userdata=0x%llx)", //stream.addr, stream.size, stream.discontinuity, stream.userdata); - - dmux.is_running = true; - dmux.fbSetStream.Push(task.stream.addr, &dmux.is_closed); // feedback } break; @@ -601,12 +571,11 @@ u32 dmuxOpen(Demuxer* data) dmuxMsg->supplementalInfo = stream.userdata; dmux.cbFunc.call(*dmux.dmuxCb, dmux.id, dmuxMsg, dmux.cbArg); - updates_signaled++; + stream = {}; dmux.is_running = false; - if (task.type == dmuxResetStreamAndWaitDone) - { - dmux.fbSetStream.Push(0, &dmux.is_closed); - } + //if (task.type == dmuxResetStreamAndWaitDone) + //{ + //} } break; @@ -825,14 +794,9 @@ int cellDmuxSetStream(u32 demuxerHandle, const u32 streamAddress, u32 streamSize return CELL_DMUX_ERROR_ARG; } - if (dmux->is_running) + if (dmux->is_running.exchange(true)) { - if (Emu.IsStopped()) - { - cellDmux->Warning("cellDmuxSetStream(%d) aborted (waiting)", demuxerHandle); - return CELL_OK; - } - std::this_thread::sleep_for(std::chrono::milliseconds(1)); + //std::this_thread::sleep_for(std::chrono::milliseconds(1)); // hack return CELL_DMUX_ERROR_BUSY; } @@ -844,18 +808,6 @@ int cellDmuxSetStream(u32 demuxerHandle, const u32 streamAddress, u32 streamSize info.userdata = userData; dmux->job.Push(task, &dmux->is_closed); - - u32 addr; - if (!dmux->fbSetStream.Pop(addr, &dmux->is_closed)) - { - cellDmux->Warning("cellDmuxSetStream(%d) aborted (fbSetStream.Pop())", demuxerHandle); - return CELL_OK; - } - if (addr != info.addr) - { - cellDmux->Error("cellDmuxSetStream(%d): wrong stream queued (right=0x%x, queued=0x%x)", demuxerHandle, info.addr, addr); - Emu.Pause(); - } return CELL_OK; } @@ -870,7 +822,6 @@ int cellDmuxResetStream(u32 demuxerHandle) } dmux->job.Push(DemuxerTask(dmuxResetStream), &dmux->is_closed); - return CELL_OK; } @@ -885,17 +836,14 @@ int cellDmuxResetStreamAndWaitDone(u32 demuxerHandle) } dmux->job.Push(DemuxerTask(dmuxResetStreamAndWaitDone), &dmux->is_closed); - - u32 addr; - if (!dmux->fbSetStream.Pop(addr, &dmux->is_closed)) + while (dmux->is_running && !dmux->is_closed) // TODO: ensure that it is safe { - cellDmux->Warning("cellDmuxResetStreamAndWaitDone(%d) aborted (fbSetStream.Pop())", demuxerHandle); - return CELL_OK; - } - if (addr != 0) - { - cellDmux->Error("cellDmuxResetStreamAndWaitDone(%d): wrong stream queued (0x%x)", demuxerHandle, addr); - Emu.Pause(); + if (Emu.IsStopped()) + { + cellDmux->Warning("cellDmuxResetStreamAndWaitDone(%d) aborted", demuxerHandle); + return CELL_OK; + } + std::this_thread::sleep_for(std::chrono::milliseconds(1)); } return CELL_OK; } @@ -912,7 +860,6 @@ int cellDmuxQueryEsAttr(vm::ptr demuxerType, vm::ptr demuxerType2, vm::ptrstreamSpecificInfo_addr, esFilterId, esSpecificInfo_addr, esAttr); return CELL_OK; } diff --git a/rpcs3/Emu/SysCalls/Modules/cellDmux.h b/rpcs3/Emu/SysCalls/Modules/cellDmux.h index 053a776d5d..0eca5daef0 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellDmux.h +++ b/rpcs3/Emu/SysCalls/Modules/cellDmux.h @@ -408,7 +408,6 @@ class Demuxer { public: SQueue job; - SQueue fbSetStream; const u32 memAddr; const u32 memSize; const vm::ptr cbFunc; @@ -416,7 +415,7 @@ public: u32 id; volatile bool is_finished; volatile bool is_closed; - volatile bool is_running; + std::atomic is_running; PPUThread* dmuxCb; diff --git a/rpcs3/Emu/SysCalls/Modules/cellVdec.cpp b/rpcs3/Emu/SysCalls/Modules/cellVdec.cpp index b2751d7561..55f4b9c2ec 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellVdec.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellVdec.cpp @@ -29,7 +29,6 @@ VideoDecoder::VideoDecoder(CellVdecCodecType type, u32 profile, u32 addr, u32 si , cbArg(arg) , is_finished(false) , is_closed(false) - , is_running(false) , just_started(false) , just_finished(false) , ctx(nullptr) @@ -225,9 +224,7 @@ u32 vdecOpen(VideoDecoder* data) // TODO: reset data cellVdec->Warning("vdecStartSeq:"); - vdec.reader.addr = 0; - vdec.reader.size = 0; - vdec.is_running = true; + vdec.reader = {}; vdec.just_started = true; } break; @@ -239,7 +236,6 @@ u32 vdecOpen(VideoDecoder* data) vdec.cbFunc.call(*vdec.vdecCb, vdec.id, CELL_VDEC_MSG_TYPE_SEQDONE, CELL_OK, vdec.cbArg); - vdec.is_running = false; vdec.just_finished = true; } break; @@ -595,7 +591,7 @@ int cellVdecGetPicture(u32 handle, vm::ptr format, vm:: VdecFrame vf; if (!vdec->frames.Pop(vf, &sq_no_wait)) { - std::this_thread::sleep_for(std::chrono::milliseconds(1)); // hack + //std::this_thread::sleep_for(std::chrono::milliseconds(1)); // hack return CELL_VDEC_ERROR_EMPTY; } @@ -651,7 +647,7 @@ int cellVdecGetPicItem(u32 handle, vm::ptr picItem_ptr) VdecFrame vf; if (!vdec->frames.Peek(vf, &sq_no_wait)) { - std::this_thread::sleep_for(std::chrono::milliseconds(1)); // hack + //std::this_thread::sleep_for(std::chrono::milliseconds(1)); // hack return CELL_VDEC_ERROR_EMPTY; } diff --git a/rpcs3/Emu/SysCalls/Modules/cellVdec.h b/rpcs3/Emu/SysCalls/Modules/cellVdec.h index 5a6c276636..144c0766ad 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellVdec.h +++ b/rpcs3/Emu/SysCalls/Modules/cellVdec.h @@ -694,7 +694,6 @@ class VideoDecoder public: SQueue job; u32 id; - volatile bool is_running; volatile bool is_closed; volatile bool is_finished; bool just_started; From 973e3f8f7e19090aefed9ca7535b3862a34ffe13 Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Fri, 24 Oct 2014 02:06:15 +0400 Subject: [PATCH 02/27] Few instructions simplified --- rpcs3/Emu/Cell/SPURecompiler.h | 178 ++++++++++++++++++++++----------- 1 file changed, 117 insertions(+), 61 deletions(-) diff --git a/rpcs3/Emu/Cell/SPURecompiler.h b/rpcs3/Emu/Cell/SPURecompiler.h index ee7cd7d883..d1d3916d8d 100644 --- a/rpcs3/Emu/Cell/SPURecompiler.h +++ b/rpcs3/Emu/Cell/SPURecompiler.h @@ -1384,18 +1384,21 @@ private: } void CBX(u32 rt, u32 ra, u32 rb) { - c.mov(*addr, cpu_dword(GPR[ra]._u32[3])); - if (ra == rb) + c.mov(*addr, cpu_dword(GPR[rb]._u32[3])); + if (ra == 1) + { + // assuming that SP % 16 is always zero + } + else if (ra == rb) { c.add(*addr, *addr); } else { - c.add(*addr, cpu_dword(GPR[rb]._u32[3])); + c.add(*addr, cpu_dword(GPR[ra]._u32[3])); } + c.not_(*addr); c.and_(*addr, 0xf); - c.neg(*addr); - c.add(*addr, 0xf); const XmmLink& vr = XmmAlloc(rt); c.movdqa(vr.get(), XmmConst(_mm_set_epi32(0x10111213, 0x14151617, 0x18191a1b, 0x1c1d1e1f))); XmmFinalize(vr, rt); @@ -1405,18 +1408,21 @@ private: } void CHX(u32 rt, u32 ra, u32 rb) { - c.mov(*addr, cpu_dword(GPR[ra]._u32[3])); - if (ra == rb) + c.mov(*addr, cpu_dword(GPR[rb]._u32[3])); + if (ra == 1) + { + // assuming that SP % 16 is always zero + } + else if (ra == rb) { c.add(*addr, *addr); } else { - c.add(*addr, cpu_dword(GPR[rb]._u32[3])); + c.add(*addr, cpu_dword(GPR[ra]._u32[3])); } + c.not_(*addr); c.and_(*addr, 0xe); - c.neg(*addr); - c.add(*addr, 0xe); const XmmLink& vr = XmmAlloc(rt); c.movdqa(vr.get(), XmmConst(_mm_set_epi32(0x10111213, 0x14151617, 0x18191a1b, 0x1c1d1e1f))); XmmFinalize(vr, rt); @@ -1426,18 +1432,21 @@ private: } void CWX(u32 rt, u32 ra, u32 rb) { - c.mov(*addr, cpu_dword(GPR[ra]._u32[3])); - if (ra == rb) + c.mov(*addr, cpu_dword(GPR[rb]._u32[3])); + if (ra == 1) + { + // assuming that SP % 16 is always zero + } + else if (ra == rb) { c.add(*addr, *addr); } else { - c.add(*addr, cpu_dword(GPR[rb]._u32[3])); + c.add(*addr, cpu_dword(GPR[ra]._u32[3])); } + c.not_(*addr); c.and_(*addr, 0xc); - c.neg(*addr); - c.add(*addr, 0xc); const XmmLink& vr = XmmAlloc(rt); c.movdqa(vr.get(), XmmConst(_mm_set_epi32(0x10111213, 0x14151617, 0x18191a1b, 0x1c1d1e1f))); XmmFinalize(vr, rt); @@ -1447,18 +1456,21 @@ private: } void CDX(u32 rt, u32 ra, u32 rb) { - c.mov(*addr, cpu_dword(GPR[ra]._u32[3])); - if (ra == rb) + c.mov(*addr, cpu_dword(GPR[rb]._u32[3])); + if (ra == 1) + { + // assuming that SP % 16 is always zero + } + else if (ra == rb) { c.add(*addr, *addr); } else { - c.add(*addr, cpu_dword(GPR[rb]._u32[3])); + c.add(*addr, cpu_dword(GPR[ra]._u32[3])); } + c.not_(*addr); c.and_(*addr, 0x8); - c.neg(*addr); - c.add(*addr, 0x8); const XmmLink& vr = XmmAlloc(rt); c.movdqa(vr.get(), XmmConst(_mm_set_epi32(0x10111213, 0x14151617, 0x18191a1b, 0x1c1d1e1f))); XmmFinalize(vr, rt); @@ -1555,59 +1567,103 @@ private: } void CBD(u32 rt, u32 ra, s32 i7) { - c.mov(*addr, cpu_dword(GPR[ra]._u32[3])); - c.add(*addr, i7); - c.and_(*addr, 0xf); - c.neg(*addr); - c.add(*addr, 0xf); - const XmmLink& vr = XmmAlloc(rt); - c.movdqa(vr.get(), XmmConst(_mm_set_epi32(0x10111213, 0x14151617, 0x18191a1b, 0x1c1d1e1f))); - XmmFinalize(vr, rt); - XmmInvalidate(rt); - c.mov(byte_ptr(*cpu_var, *addr, 0, (s32)offsetof(SPUThread, GPR[rt]._u8[0])), 0x03); + if (ra == 1) + { + // assuming that SP % 16 is always zero + const XmmLink& vr = XmmAlloc(rt); + u128 value = u128::from32r(0x10111213, 0x14151617, 0x18191a1b, 0x1c1d1e1f); + value._u8[i7 & 0xf] = 0x03; + c.movdqa(vr.get(), XmmConst(value.vi)); + XmmFinalize(vr, rt); + } + else + { + c.mov(*addr, cpu_dword(GPR[ra]._u32[3])); + c.add(*addr, i7); + c.not_(*addr); + c.and_(*addr, 0xf); + const XmmLink& vr = XmmAlloc(rt); + c.movdqa(vr.get(), XmmConst(_mm_set_epi32(0x10111213, 0x14151617, 0x18191a1b, 0x1c1d1e1f))); + XmmFinalize(vr, rt); + XmmInvalidate(rt); + c.mov(byte_ptr(*cpu_var, *addr, 0, (s32)offsetof(SPUThread, GPR[rt]._u8[0])), 0x03); + } LOG_OPCODE(); } void CHD(u32 rt, u32 ra, s32 i7) { - c.mov(*addr, cpu_dword(GPR[ra]._u32[3])); - c.add(*addr, i7); - c.and_(*addr, 0xe); - c.neg(*addr); - c.add(*addr, 0xe); - const XmmLink& vr = XmmAlloc(rt); - c.movdqa(vr.get(), XmmConst(_mm_set_epi32(0x10111213, 0x14151617, 0x18191a1b, 0x1c1d1e1f))); - XmmFinalize(vr, rt); - XmmInvalidate(rt); - c.mov(word_ptr(*cpu_var, *addr, 0, (s32)offsetof(SPUThread, GPR[rt]._u16[0])), 0x0203); + if (ra == 1) + { + // assuming that SP % 16 is always zero + const XmmLink& vr = XmmAlloc(rt); + u128 value = u128::from32r(0x10111213, 0x14151617, 0x18191a1b, 0x1c1d1e1f); + value._u16[i7 & 0x7] = 0x0203; + c.movdqa(vr.get(), XmmConst(value.vi)); + XmmFinalize(vr, rt); + } + else + { + c.mov(*addr, cpu_dword(GPR[ra]._u32[3])); + c.add(*addr, i7); + c.not_(*addr); + c.and_(*addr, 0xe); + const XmmLink& vr = XmmAlloc(rt); + c.movdqa(vr.get(), XmmConst(_mm_set_epi32(0x10111213, 0x14151617, 0x18191a1b, 0x1c1d1e1f))); + XmmFinalize(vr, rt); + XmmInvalidate(rt); + c.mov(word_ptr(*cpu_var, *addr, 0, (s32)offsetof(SPUThread, GPR[rt]._u16[0])), 0x0203); + } LOG_OPCODE(); } void CWD(u32 rt, u32 ra, s32 i7) { - c.mov(*addr, cpu_dword(GPR[ra]._u32[3])); - c.add(*addr, i7); - c.and_(*addr, 0xc); - c.neg(*addr); - c.add(*addr, 0xc); - const XmmLink& vr = XmmAlloc(rt); - c.movdqa(vr.get(), XmmConst(_mm_set_epi32(0x10111213, 0x14151617, 0x18191a1b, 0x1c1d1e1f))); - XmmFinalize(vr, rt); - XmmInvalidate(rt); - c.mov(dword_ptr(*cpu_var, *addr, 0, (s32)offsetof(SPUThread, GPR[rt]._u32[0])), 0x00010203); + if (ra == 1) + { + // assuming that SP % 16 is always zero + const XmmLink& vr = XmmAlloc(rt); + u128 value = u128::from32r(0x10111213, 0x14151617, 0x18191a1b, 0x1c1d1e1f); + value._u32[i7 & 0x3] = 0x00010203; + c.movdqa(vr.get(), XmmConst(value.vi)); + XmmFinalize(vr, rt); + } + else + { + c.mov(*addr, cpu_dword(GPR[ra]._u32[3])); + c.add(*addr, i7); + c.not_(*addr); + c.and_(*addr, 0xc); + const XmmLink& vr = XmmAlloc(rt); + c.movdqa(vr.get(), XmmConst(_mm_set_epi32(0x10111213, 0x14151617, 0x18191a1b, 0x1c1d1e1f))); + XmmFinalize(vr, rt); + XmmInvalidate(rt); + c.mov(dword_ptr(*cpu_var, *addr, 0, (s32)offsetof(SPUThread, GPR[rt]._u32[0])), 0x00010203); + } LOG_OPCODE(); } void CDD(u32 rt, u32 ra, s32 i7) { - c.mov(*addr, cpu_dword(GPR[ra]._u32[3])); - c.add(*addr, i7); - c.and_(*addr, 0x8); - c.neg(*addr); - c.add(*addr, 0x8); - const XmmLink& vr = XmmAlloc(rt); - c.movdqa(vr.get(), XmmConst(_mm_set_epi32(0x10111213, 0x14151617, 0x18191a1b, 0x1c1d1e1f))); - XmmFinalize(vr, rt); - XmmInvalidate(rt); - c.mov(dword_ptr(*cpu_var, *addr, 0, (s32)offsetof(SPUThread, GPR[rt]._u32[0])), 0x04050607); - c.mov(dword_ptr(*cpu_var, *addr, 0, (s32)offsetof(SPUThread, GPR[rt]._u32[1])), 0x00010203); + if (ra == 1) + { + // assuming that SP % 16 is always zero + const XmmLink& vr = XmmAlloc(rt); + u128 value = u128::from32r(0x10111213, 0x14151617, 0x18191a1b, 0x1c1d1e1f); + value._u64[i7 & 0x1] = 0x0001020304050607ull; + c.movdqa(vr.get(), XmmConst(value.vi)); + XmmFinalize(vr, rt); + } + else + { + c.mov(*addr, cpu_dword(GPR[ra]._u32[3])); + c.add(*addr, i7); + c.not_(*addr); + c.and_(*addr, 0x8); + const XmmLink& vr = XmmAlloc(rt); + c.movdqa(vr.get(), XmmConst(_mm_set_epi32(0x10111213, 0x14151617, 0x18191a1b, 0x1c1d1e1f))); + XmmFinalize(vr, rt); + XmmInvalidate(rt); + c.mov(dword_ptr(*cpu_var, *addr, 0, (s32)offsetof(SPUThread, GPR[rt]._u32[0])), 0x04050607); + c.mov(dword_ptr(*cpu_var, *addr, 0, (s32)offsetof(SPUThread, GPR[rt]._u32[1])), 0x00010203); + } LOG_OPCODE(); } void ROTQBII(u32 rt, u32 ra, s32 i7) From 6df5ddb973e151eedb29081f17e9ca98dbf8897f Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Fri, 24 Oct 2014 17:24:09 +0400 Subject: [PATCH 03/27] Few warnings fixed --- Utilities/SQueue.h | 6 +- Utilities/rFile.cpp | 30 +- rpcs3.sln | 6 +- rpcs3/Emu/Cell/PPUInterpreter.h | 732 ++++++++++++++++--- rpcs3/Emu/Cell/SPUThread.cpp | 29 +- rpcs3/Emu/RSX/GL/GLShaderParam.h | 3 +- rpcs3/Emu/SysCalls/Modules.cpp | 30 +- rpcs3/Emu/SysCalls/Modules/cellAvconfExt.cpp | 6 +- rpcs3/Emu/SysCalls/Modules/cellPngDec.cpp | 6 +- rpcs3/Emu/SysCalls/Modules/cellSync.cpp | 18 +- rpcs3/Emu/SysCalls/Modules/libmixer.cpp | 2 +- rpcs3/Emu/SysCalls/Modules/sysPrxForUser.cpp | 2 +- rpcs3/Emu/SysCalls/lv2/sys_memory.cpp | 1 - rpcs3/Emu/SysCalls/lv2/sys_mutex.cpp | 3 +- rpcs3/Emu/System.cpp | 5 +- 15 files changed, 720 insertions(+), 159 deletions(-) diff --git a/Utilities/SQueue.h b/Utilities/SQueue.h index 35abca4654..9310bea613 100644 --- a/Utilities/SQueue.h +++ b/Utilities/SQueue.h @@ -28,7 +28,7 @@ public: { if (m_count >= SQSize) { - if (Emu.IsStopped() || do_exit && *do_exit) + if (Emu.IsStopped() || (do_exit && *do_exit)) { return false; } @@ -55,7 +55,7 @@ public: { if (!m_count) { - if (Emu.IsStopped() || do_exit && *do_exit) + if (Emu.IsStopped() || (do_exit && *do_exit)) { return false; } @@ -90,7 +90,7 @@ public: { if (m_count <= pos) { - if (Emu.IsStopped() || do_exit && *do_exit) + if (Emu.IsStopped() || (do_exit && *do_exit)) { return false; } diff --git a/Utilities/rFile.cpp b/Utilities/rFile.cpp index 554647c40b..912452ef89 100644 --- a/Utilities/rFile.cpp +++ b/Utilities/rFile.cpp @@ -21,6 +21,12 @@ std::wstring ConvertUTF8ToWString(const std::string &source) { } #endif +#ifdef _WIN32 +#define GET_API_ERROR GetLastError() +#else +#define GET_API_ERROR err +#endif + bool getFileInfo(const char *path, FileInfo *fileInfo) { // TODO: Expand relative paths? fileInfo->fullName = path; @@ -103,14 +109,15 @@ bool rMkpath(const std::string &path) bool rRmdir(const std::string &dir) { #ifdef _WIN32 - if (!RemoveDirectory(ConvertUTF8ToWString(dir).c_str())) { - LOG_ERROR(GENERAL, "Error deleting directory %s: %i", dir.c_str(), GetLastError()); + if (!RemoveDirectory(ConvertUTF8ToWString(dir).c_str())) +#else + if (int err = rmdir(dir.c_str())) +#endif + { + LOG_ERROR(GENERAL, "Error deleting directory %s: %i", dir.c_str(), GET_API_ERROR); return false; } return true; -#else - rmdir(dir.c_str()); -#endif } bool rRename(const std::string &from, const std::string &to) @@ -137,17 +144,14 @@ bool rExists(const std::string &file) bool rRemoveFile(const std::string &file) { #ifdef _WIN32 - if (!DeleteFile(ConvertUTF8ToWString(file).c_str())) { - LOG_ERROR(GENERAL, "Error deleting %s: %i", file.c_str(), GetLastError()); - return false; - } + if (!DeleteFile(ConvertUTF8ToWString(file).c_str())) #else - int err = unlink(file.c_str()); - if (err) { - LOG_ERROR(GENERAL, "Error unlinking %s: %i", file.c_str(), err); + if (int err = unlink(file.c_str())) +#endif + { + LOG_ERROR(GENERAL, "Error deleting %s: %i", file.c_str(), GET_API_ERROR); return false; } -#endif return true; } diff --git a/rpcs3.sln b/rpcs3.sln index 473c4354c2..9c10ade540 100644 --- a/rpcs3.sln +++ b/rpcs3.sln @@ -1,5 +1,5 @@ Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Express 2013 for Windows Desktop +# Visual Studio 2013 VisualStudioVersion = 12.0.30723.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "rpcs3", "rpcs3\rpcs3.vcxproj", "{70CD65B0-91D6-4FAE-9A7B-4AF55D0D1B12}" @@ -21,6 +21,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "rpcs3", "rpcs3\rpcs3.vcxpro {7047EE97-7F80-A70D-6147-BC11102DB6F4} = {7047EE97-7F80-A70D-6147-BC11102DB6F4} {87B42A9C-3F5C-53D7-9017-2B1CAE39457D} = {87B42A9C-3F5C-53D7-9017-2B1CAE39457D} {6FCB55A5-563F-4039-1D79-1EB6ED8AAB82} = {6FCB55A5-563F-4039-1D79-1EB6ED8AAB82} + {8BC303AB-25BE-4276-8E57-73F171B2D672} = {8BC303AB-25BE-4276-8E57-73F171B2D672} {949C6DB8-E638-6EC6-AB31-BCCFD1379E01} = {949C6DB8-E638-6EC6-AB31-BCCFD1379E01} {74827EBD-93DC-5110-BA95-3F2AB029B6B0} = {74827EBD-93DC-5110-BA95-3F2AB029B6B0} {46333DC3-B4A5-3DCC-E8BF-A3F20ADC56D2} = {46333DC3-B4A5-3DCC-E8BF-A3F20ADC56D2} @@ -138,9 +139,6 @@ EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "asmjit", "asmjit", "{E2A982F2-4B1A-48B1-8D77-A17A589C58D7}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "emucore", "rpcs3\emucore.vcxproj", "{C4A10229-4712-4BD2-B63E-50D93C67A038}" - ProjectSection(ProjectDependencies) = postProject - {8BC303AB-25BE-4276-8E57-73F171B2D672} = {8BC303AB-25BE-4276-8E57-73F171B2D672} - EndProjectSection EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "llvm", "llvm", "{C8068CE9-D626-4FEA-BEE7-893F06A25BF3}" EndProject diff --git a/rpcs3/Emu/Cell/PPUInterpreter.h b/rpcs3/Emu/Cell/PPUInterpreter.h index cdb7a2d2ce..f69c8c3c50 100644 --- a/rpcs3/Emu/Cell/PPUInterpreter.h +++ b/rpcs3/Emu/Cell/PPUInterpreter.h @@ -2271,7 +2271,13 @@ private: void LVEBX(u32 vd, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; - CPU.VPR[vd]._u8[15 - (addr & 0xf)] = vm::read8(addr); + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.VPR[vd]._u8[15 - (addr & 0xf)] = vm::read8((u32)addr); // check LVEWX comments } void SUBFC(u32 rd, u32 ra, u32 rb, u32 oe, bool rc) @@ -2337,16 +2343,36 @@ private: void LWARX(u32 rd, u32 ra, u32 rb) { CPU.R_ADDR = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; - CPU.R_VALUE = vm::get_ref(CPU.R_ADDR); + if ((u32)CPU.R_ADDR != CPU.R_ADDR) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, CPU.R_ADDR); + Emu.Pause(); + return; + } + CPU.R_VALUE = vm::get_ref((u32)CPU.R_ADDR); CPU.GPR[rd] = re32((u32)CPU.R_VALUE); } void LDX(u32 rd, u32 ra, u32 rb) { - CPU.GPR[rd] = vm::read64(ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]); + const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.GPR[rd] = vm::read64((u32)addr); } void LWZX(u32 rd, u32 ra, u32 rb) { - CPU.GPR[rd] = vm::read32(ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]); + const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.GPR[rd] = vm::read32((u32)addr); } void SLW(u32 ra, u32 rs, u32 rb, bool rc) { @@ -2418,7 +2444,13 @@ private: void LVEHX(u32 vd, u32 ra, u32 rb) { const u64 addr = (ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]) & ~1ULL; - CPU.VPR[vd]._u16[7 - ((addr >> 1) & 0x7)] = vm::read16(addr); + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.VPR[vd]._u16[7 - ((addr >> 1) & 0x7)] = vm::read16((u32)addr); // check LVEWX comments } void SUBF(u32 rd, u32 ra, u32 rb, u32 oe, bool rc) @@ -2430,7 +2462,13 @@ private: void LDUX(u32 rd, u32 ra, u32 rb) { const u64 addr = CPU.GPR[ra] + CPU.GPR[rb]; - CPU.GPR[rd] = vm::read64(addr); + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.GPR[rd] = vm::read64((u32)addr); CPU.GPR[ra] = addr; } void DCBST(u32 ra, u32 rb) @@ -2439,7 +2477,13 @@ private: void LWZUX(u32 rd, u32 ra, u32 rb) { const u64 addr = CPU.GPR[ra] + CPU.GPR[rb]; - CPU.GPR[rd] = vm::read32(addr); + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.GPR[rd] = vm::read32((u32)addr); CPU.GPR[ra] = addr; } void CNTLZD(u32 ra, u32 rs, bool rc) @@ -2465,7 +2509,13 @@ private: void LVEWX(u32 vd, u32 ra, u32 rb) { const u64 addr = (ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]) & ~3ULL; - CPU.VPR[vd]._u32[3 - ((addr >> 2) & 0x3)] = vm::read32(addr); + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.VPR[vd]._u32[3 - ((addr >> 2) & 0x3)] = vm::read32((u32)addr); // It's not very good idea to implement it using read128(), // because it can theoretically read RawSPU 32-bit MMIO register (read128() will fail) //CPU.VPR[vd] = vm::read128((ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]) & ~0xfULL); @@ -2485,7 +2535,13 @@ private: void LDARX(u32 rd, u32 ra, u32 rb) { CPU.R_ADDR = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; - CPU.R_VALUE = vm::get_ref(CPU.R_ADDR); + if ((u32)CPU.R_ADDR != CPU.R_ADDR) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, CPU.R_ADDR); + Emu.Pause(); + return; + } + CPU.R_VALUE = vm::get_ref((u32)CPU.R_ADDR); CPU.GPR[rd] = re64(CPU.R_VALUE); } void DCBF(u32 ra, u32 rb) @@ -2493,7 +2549,14 @@ private: } void LBZX(u32 rd, u32 ra, u32 rb) { - CPU.GPR[rd] = vm::read8(ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]); + const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.GPR[rd] = vm::read8((u32)addr); } void LVX(u32 vd, u32 ra, u32 rb) { @@ -2510,7 +2573,13 @@ private: //if(ra == 0 || ra == rd) throw "Bad instruction [LBZUX]"; const u64 addr = CPU.GPR[ra] + CPU.GPR[rb]; - CPU.GPR[rd] = vm::read8(addr); + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.GPR[rd] = vm::read8((u32)addr); CPU.GPR[ra] = addr; } void NOR(u32 ra, u32 rs, u32 rb, bool rc) @@ -2521,8 +2590,14 @@ private: void STVEBX(u32 vs, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } const u8 eb = addr & 0xf; - vm::write8(addr, CPU.VPR[vs]._u8[15 - eb]); + vm::write8((u32)addr, CPU.VPR[vs]._u8[15 - eb]); } void SUBFE(u32 rd, u32 ra, u32 rb, u32 oe, bool rc) { @@ -2593,15 +2668,28 @@ private: } void STDX(u32 rs, u32 ra, u32 rb) { - vm::write64((ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]), CPU.GPR[rs]); + const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + vm::write64((u32)addr, CPU.GPR[rs]); } void STWCX_(u32 rs, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } if (CPU.R_ADDR == addr) { - CPU.SetCR_EQ(0, InterlockedCompareExchange(vm::get_ptr(addr), re32((u32)CPU.GPR[rs]), (u32)CPU.R_VALUE) == (u32)CPU.R_VALUE); + CPU.SetCR_EQ(0, InterlockedCompareExchange(vm::get_ptr((u32)CPU.R_ADDR), re32((u32)CPU.GPR[rs]), (u32)CPU.R_VALUE) == (u32)CPU.R_VALUE); CPU.R_ADDR = 0; } else @@ -2611,31 +2699,62 @@ private: } void STWX(u32 rs, u32 ra, u32 rb) { - vm::write32(ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb], (u32)CPU.GPR[rs]); + const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + vm::write32((u32)addr, (u32)CPU.GPR[rs]); } void STVEHX(u32 vs, u32 ra, u32 rb) { const u64 addr = (ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]) & ~1ULL; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } const u8 eb = (addr & 0xf) >> 1; - vm::write16(addr, CPU.VPR[vs]._u16[7 - eb]); + vm::write16((u32)addr, CPU.VPR[vs]._u16[7 - eb]); } void STDUX(u32 rs, u32 ra, u32 rb) { const u64 addr = CPU.GPR[ra] + CPU.GPR[rb]; - vm::write64(addr, CPU.GPR[rs]); + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + vm::write64((u32)addr, CPU.GPR[rs]); CPU.GPR[ra] = addr; } void STWUX(u32 rs, u32 ra, u32 rb) { const u64 addr = CPU.GPR[ra] + CPU.GPR[rb]; - vm::write32(addr, (u32)CPU.GPR[rs]); + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + vm::write32((u32)addr, (u32)CPU.GPR[rs]); CPU.GPR[ra] = addr; } void STVEWX(u32 vs, u32 ra, u32 rb) { const u64 addr = (ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]) & ~3ULL; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } const u8 eb = (addr & 0xf) >> 2; - vm::write32(addr, CPU.VPR[vs]._u32[3 - eb]); + vm::write32((u32)addr, CPU.VPR[vs]._u32[3 - eb]); } void ADDZE(u32 rd, u32 ra, u32 oe, bool rc) { @@ -2656,10 +2775,16 @@ private: void STDCX_(u32 rs, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } if (CPU.R_ADDR == addr) { - CPU.SetCR_EQ(0, InterlockedCompareExchange(vm::get_ptr(addr), re64(CPU.GPR[rs]), CPU.R_VALUE) == CPU.R_VALUE); + CPU.SetCR_EQ(0, InterlockedCompareExchange(vm::get_ptr((u32)CPU.R_ADDR), re64(CPU.GPR[rs]), CPU.R_VALUE) == CPU.R_VALUE); CPU.R_ADDR = 0; } else @@ -2669,7 +2794,14 @@ private: } void STBX(u32 rs, u32 ra, u32 rb) { - vm::write8((ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]), (u8)CPU.GPR[rs]); + const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + vm::write8((u32)addr, (u8)CPU.GPR[rs]); } void STVX(u32 vs, u32 ra, u32 rb) { @@ -2710,7 +2842,13 @@ private: void STBUX(u32 rs, u32 ra, u32 rb) { const u64 addr = CPU.GPR[ra] + CPU.GPR[rb]; - vm::write8(addr, (u8)CPU.GPR[rs]); + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + vm::write8((u32)addr, (u8)CPU.GPR[rs]); CPU.GPR[ra] = addr; } void ADD(u32 rd, u32 ra, u32 rb, u32 oe, bool rc) @@ -2726,7 +2864,14 @@ private: } void LHZX(u32 rd, u32 ra, u32 rb) { - CPU.GPR[rd] = vm::read16(ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]); + const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.GPR[rd] = vm::read16((u32)addr); } void EQV(u32 ra, u32 rs, u32 rb, bool rc) { @@ -2736,12 +2881,25 @@ private: void ECIWX(u32 rd, u32 ra, u32 rb) { //HACK! - CPU.GPR[rd] = vm::read32(ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]); + const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.GPR[rd] = vm::read32((u32)addr); } void LHZUX(u32 rd, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; - CPU.GPR[rd] = vm::read16(addr); + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.GPR[rd] = vm::read16((u32)addr); CPU.GPR[ra] = addr; } void XOR(u32 ra, u32 rs, u32 rb, bool rc) @@ -2755,14 +2913,28 @@ private: } void LWAX(u32 rd, u32 ra, u32 rb) { - CPU.GPR[rd] = (s64)(s32)vm::read32(ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]); + const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.GPR[rd] = (s64)(s32)vm::read32((u32)addr); } void DST(u32 ra, u32 rb, u32 strm, u32 t) { } void LHAX(u32 rd, u32 ra, u32 rb) { - CPU.GPR[rd] = (s64)(s16)vm::read16(ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]); + const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.GPR[rd] = (s64)(s16)vm::read16((u32)addr); } void LVXL(u32 vd, u32 ra, u32 rb) { @@ -2783,7 +2955,13 @@ private: void LWAUX(u32 rd, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; - CPU.GPR[rd] = (s64)(s32)vm::read32(addr); + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.GPR[rd] = (s64)(s32)vm::read32((u32)addr); CPU.GPR[ra] = addr; } void DSTST(u32 ra, u32 rb, u32 strm, u32 t) @@ -2792,12 +2970,25 @@ private: void LHAUX(u32 rd, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; - CPU.GPR[rd] = (s64)(s16)vm::read16(addr); + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.GPR[rd] = (s64)(s16)vm::read16((u32)addr); CPU.GPR[ra] = addr; } void STHX(u32 rs, u32 ra, u32 rb) { - vm::write16(ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb], (u16)CPU.GPR[rs]); + const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + vm::write16((u32)addr, (u16)CPU.GPR[rs]); } void ORC(u32 ra, u32 rs, u32 rb, bool rc) { @@ -2807,12 +2998,25 @@ private: void ECOWX(u32 rs, u32 ra, u32 rb) { //HACK! - vm::write32((ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]), (u32)CPU.GPR[rs]); + const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + vm::write32((u32)addr, (u32)CPU.GPR[rs]); } void STHUX(u32 rs, u32 ra, u32 rb) { const u64 addr = CPU.GPR[ra] + CPU.GPR[rb]; - vm::write16(addr, (u16)CPU.GPR[rs]); + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + vm::write16((u32)addr, (u16)CPU.GPR[rs]); CPU.GPR[ra] = addr; } void OR(u32 ra, u32 rs, u32 rb, bool rc) @@ -2906,14 +3110,27 @@ private: void LVLX(u32 vd, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } const u32 eb = addr & 0xf; CPU.VPR[vd].clear(); - for (u32 i = 0; i < 16u - eb; ++i) CPU.VPR[vd]._u8[15 - i] = vm::read8(addr + i); + for (u32 i = 0; i < 16u - eb; ++i) CPU.VPR[vd]._u8[15 - i] = vm::read8((u32)addr + i); } void LDBRX(u32 rd, u32 ra, u32 rb) { - CPU.GPR[rd] = vm::get_ref(ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]); + const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.GPR[rd] = vm::get_ref((u32)addr); } void LSWX(u32 rd, u32 ra, u32 rb) { @@ -2921,11 +3138,25 @@ private: } void LWBRX(u32 rd, u32 ra, u32 rb) { - CPU.GPR[rd] = vm::get_ref(ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]); + const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.GPR[rd] = vm::get_ref((u32)addr); } void LFSX(u32 frd, u32 ra, u32 rb) { - CPU.FPR[frd] = vm::get_ref>(ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]).ToLE(); + const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.FPR[frd] = vm::get_ref>((u32)addr).ToLE(); } void SRW(u32 ra, u32 rs, u32 rb, bool rc) { @@ -2948,14 +3179,26 @@ private: void LVRX(u32 vd, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } const u8 eb = addr & 0xf; CPU.VPR[vd].clear(); - for (u32 i = 16 - eb; i < 16; ++i) CPU.VPR[vd]._u8[15 - i] = vm::read8(addr + i - 16); + for (u32 i = 16 - eb; i < 16; ++i) CPU.VPR[vd]._u8[15 - i] = vm::read8((u32)addr + i - 16); } void LSWI(u32 rd, u32 ra, u32 nb) { - u64 EA = ra ? CPU.GPR[ra] : 0; + u64 addr = ra ? CPU.GPR[ra] : 0; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } u64 N = nb ? nb : 32; u8 reg = rd; @@ -2963,8 +3206,8 @@ private: { if (N > 3) { - CPU.GPR[reg] = vm::read32(EA); - EA += 4; + CPU.GPR[reg] = vm::read32((u32)addr); + addr += 4; N -= 4; } else @@ -2974,8 +3217,8 @@ private: while (N > 0) { N = N - 1; - buf |= vm::read8(EA) << (i * 8); - EA = EA + 1; + buf |= vm::read8((u32)addr) << (i * 8); + addr++; i--; } CPU.GPR[reg] = buf; @@ -2986,7 +3229,13 @@ private: void LFSUX(u32 frd, u32 ra, u32 rb) { const u64 addr = CPU.GPR[ra] + CPU.GPR[rb]; - (u64&)CPU.FPR[frd] = vm::read32(addr); + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + (u64&)CPU.FPR[frd] = vm::read32((u32)addr); CPU.FPR[frd] = (float&)CPU.FPR[frd]; CPU.GPR[ra] = addr; } @@ -2996,20 +3245,39 @@ private: } void LFDX(u32 frd, u32 ra, u32 rb) { - (u64&)CPU.FPR[frd] = vm::read64(ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]); + const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + (u64&)CPU.FPR[frd] = vm::read64((u32)addr); } void LFDUX(u32 frd, u32 ra, u32 rb) { const u64 addr = CPU.GPR[ra] + CPU.GPR[rb]; - (u64&)CPU.FPR[frd] = vm::read64(addr); + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + (u64&)CPU.FPR[frd] = vm::read64((u32)addr); CPU.GPR[ra] = addr; } void STVLX(u32 vs, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } const u32 eb = addr & 0xf; - for (u32 i = 0; i < 16u - eb; ++i) vm::write8(addr + i, CPU.VPR[vs]._u8[15 - i]); + for (u32 i = 0; i < 16u - eb; ++i) vm::write8((u32)addr + i, CPU.VPR[vs]._u8[15 - i]); } void STSWX(u32 rs, u32 ra, u32 rb) { @@ -3017,28 +3285,60 @@ private: } void STWBRX(u32 rs, u32 ra, u32 rb) { - vm::get_ref(ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]) = (u32)CPU.GPR[rs]; + const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + vm::get_ref((u32)addr) = (u32)CPU.GPR[rs]; } void STFSX(u32 frs, u32 ra, u32 rb) { - vm::write32((ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]), CPU.FPR[frs].To32()); + const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + vm::write32((u32)addr, CPU.FPR[frs].To32()); } void STVRX(u32 vs, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } const u8 eb = addr & 0xf; - for (u32 i = 16 - eb; i < 16; ++i) vm::write8(addr + i - 16, CPU.VPR[vs]._u8[15 - i]); + for (u32 i = 16 - eb; i < 16; ++i) vm::write8((u32)addr + i - 16, CPU.VPR[vs]._u8[15 - i]); } void STFSUX(u32 frs, u32 ra, u32 rb) { const u64 addr = CPU.GPR[ra] + CPU.GPR[rb]; - vm::write32(addr, CPU.FPR[frs].To32()); + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + vm::write32((u32)addr, CPU.FPR[frs].To32()); CPU.GPR[ra] = addr; } void STSWI(u32 rd, u32 ra, u32 nb) { - u64 EA = ra ? CPU.GPR[ra] : 0; + u64 addr = ra ? CPU.GPR[ra] : 0; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } u64 N = nb ? nb : 32; u8 reg = rd; @@ -3046,8 +3346,8 @@ private: { if (N > 3) { - vm::write32(EA, (u32)CPU.GPR[reg]); - EA += 4; + vm::write32((u32)addr, (u32)CPU.GPR[reg]); + addr += 4; N -= 4; } else @@ -3056,9 +3356,9 @@ private: while (N > 0) { N = N - 1; - vm::write8(EA, (0xFF000000 & buf) >> 24); + vm::write8((u32)addr, (0xFF000000 & buf) >> 24); buf <<= 8; - EA = EA + 1; + addr++; } } reg = (reg + 1) % 32; @@ -3066,25 +3366,51 @@ private: } void STFDX(u32 frs, u32 ra, u32 rb) { - vm::write64((ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]), (u64&)CPU.FPR[frs]); + const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + vm::write64((u32)addr, (u64&)CPU.FPR[frs]); } void STFDUX(u32 frs, u32 ra, u32 rb) { const u64 addr = CPU.GPR[ra] + CPU.GPR[rb]; - vm::write64(addr, (u64&)CPU.FPR[frs]); + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + vm::write64((u32)addr, (u64&)CPU.FPR[frs]); CPU.GPR[ra] = addr; } void LVLXL(u32 vd, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } const u32 eb = addr & 0xf; CPU.VPR[vd].clear(); - for (u32 i = 0; i < 16u - eb; ++i) CPU.VPR[vd]._u8[15 - i] = vm::read8(addr + i); + for (u32 i = 0; i < 16u - eb; ++i) CPU.VPR[vd]._u8[15 - i] = vm::read8((u32)addr + i); } void LHBRX(u32 rd, u32 ra, u32 rb) { - CPU.GPR[rd] = vm::get_ref(ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]); + const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.GPR[rd] = vm::get_ref((u32)addr); } void SRAW(u32 ra, u32 rs, u32 rb, bool rc) { @@ -3123,10 +3449,16 @@ private: void LVRXL(u32 vd, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } const u8 eb = addr & 0xf; CPU.VPR[vd].clear(); - for (u32 i = 16 - eb; i < 16; ++i) CPU.VPR[vd]._u8[15 - i] = vm::read8(addr + i - 16); + for (u32 i = 16 - eb; i < 16; ++i) CPU.VPR[vd]._u8[15 - i] = vm::read8((u32)addr + i - 16); } void DSS(u32 strm, u32 a) { @@ -3158,13 +3490,26 @@ private: void STVLXL(u32 vs, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } const u32 eb = addr & 0xf; - for (u32 i = 0; i < 16u - eb; ++i) vm::write8(addr + i, CPU.VPR[vs]._u8[15 - i]); + for (u32 i = 0; i < 16u - eb; ++i) vm::write8((u32)addr + i, CPU.VPR[vs]._u8[15 - i]); } void STHBRX(u32 rs, u32 ra, u32 rb) { - vm::get_ref(ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]) = (u16)CPU.GPR[rs]; + const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + vm::get_ref((u32)addr) = (u16)CPU.GPR[rs]; } void EXTSH(u32 ra, u32 rs, bool rc) { @@ -3174,9 +3519,15 @@ private: void STVRXL(u32 vs, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } const u8 eb = addr & 0xf; - for (u32 i = 16 - eb; i < 16; ++i) vm::write8(addr + i - 16, CPU.VPR[vs]._u8[15 - i]); + for (u32 i = 16 - eb; i < 16; ++i) vm::write8((u32)addr + i - 16, CPU.VPR[vs]._u8[15 - i]); } void EXTSB(u32 ra, u32 rs, bool rc) { @@ -3185,7 +3536,14 @@ private: } void STFIWX(u32 frs, u32 ra, u32 rb) { - vm::write32(ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb], (u32&)CPU.FPR[frs]); + const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + vm::write32((u32)addr, (u32&)CPU.FPR[frs]); } void EXTSW(u32 ra, u32 rs, bool rc) { @@ -3205,146 +3563,321 @@ private: } void LWZ(u32 rd, u32 ra, s32 d) { - CPU.GPR[rd] = vm::read32(ra ? CPU.GPR[ra] + d : d); + const u64 addr = ra ? CPU.GPR[ra] + d : d; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.GPR[rd] = vm::read32((u32)addr); } void LWZU(u32 rd, u32 ra, s32 d) { const u64 addr = CPU.GPR[ra] + d; - CPU.GPR[rd] = vm::read32(addr); + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.GPR[rd] = vm::read32((u32)addr); CPU.GPR[ra] = addr; } void LBZ(u32 rd, u32 ra, s32 d) { - CPU.GPR[rd] = vm::read8(ra ? CPU.GPR[ra] + d : d); + const u64 addr = ra ? CPU.GPR[ra] + d : d; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.GPR[rd] = vm::read8((u32)addr); } void LBZU(u32 rd, u32 ra, s32 d) { const u64 addr = CPU.GPR[ra] + d; - CPU.GPR[rd] = vm::read8(addr); + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.GPR[rd] = vm::read8((u32)addr); CPU.GPR[ra] = addr; } void STW(u32 rs, u32 ra, s32 d) { - vm::write32(ra ? CPU.GPR[ra] + d : d, (u32)CPU.GPR[rs]); + const u64 addr = ra ? CPU.GPR[ra] + d : d; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + vm::write32((u32)addr, (u32)CPU.GPR[rs]); } void STWU(u32 rs, u32 ra, s32 d) { const u64 addr = CPU.GPR[ra] + d; - vm::write32(addr, (u32)CPU.GPR[rs]); + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + vm::write32((u32)addr, (u32)CPU.GPR[rs]); CPU.GPR[ra] = addr; } void STB(u32 rs, u32 ra, s32 d) { - vm::write8(ra ? CPU.GPR[ra] + d : d, (u8)CPU.GPR[rs]); + const u64 addr = ra ? CPU.GPR[ra] + d : d; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + vm::write8((u32)addr, (u8)CPU.GPR[rs]); } void STBU(u32 rs, u32 ra, s32 d) { const u64 addr = CPU.GPR[ra] + d; - vm::write8(addr, (u8)CPU.GPR[rs]); + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + vm::write8((u32)addr, (u8)CPU.GPR[rs]); CPU.GPR[ra] = addr; } void LHZ(u32 rd, u32 ra, s32 d) { - CPU.GPR[rd] = vm::read16(ra ? CPU.GPR[ra] + d : d); + const u64 addr = ra ? CPU.GPR[ra] + d : d; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.GPR[rd] = vm::read16((u32)addr); } void LHZU(u32 rd, u32 ra, s32 d) { const u64 addr = CPU.GPR[ra] + d; - CPU.GPR[rd] = vm::read16(addr); + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.GPR[rd] = vm::read16((u32)addr); CPU.GPR[ra] = addr; } void LHA(u32 rd, u32 ra, s32 d) { - CPU.GPR[rd] = (s64)(s16)vm::read16(ra ? CPU.GPR[ra] + d : d); + const u64 addr = ra ? CPU.GPR[ra] + d : d; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.GPR[rd] = (s64)(s16)vm::read16((u32)addr); } void LHAU(u32 rd, u32 ra, s32 d) { const u64 addr = CPU.GPR[ra] + d; - CPU.GPR[rd] = (s64)(s16)vm::read16(addr); + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.GPR[rd] = (s64)(s16)vm::read16((u32)addr); CPU.GPR[ra] = addr; } void STH(u32 rs, u32 ra, s32 d) { - vm::write16(ra ? CPU.GPR[ra] + d : d, (u16)CPU.GPR[rs]); + const u64 addr = ra ? CPU.GPR[ra] + d : d; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + vm::write16((u32)addr, (u16)CPU.GPR[rs]); } void STHU(u32 rs, u32 ra, s32 d) { const u64 addr = CPU.GPR[ra] + d; - vm::write16(addr, (u16)CPU.GPR[rs]); + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + vm::write16((u32)addr, (u16)CPU.GPR[rs]); CPU.GPR[ra] = addr; } void LMW(u32 rd, u32 ra, s32 d) { u64 addr = ra ? CPU.GPR[ra] + d : d; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } for(u32 i=rd; i<32; ++i, addr += 4) { - CPU.GPR[i] = vm::read32(addr); + CPU.GPR[i] = vm::read32((u32)addr); } } void STMW(u32 rs, u32 ra, s32 d) { u64 addr = ra ? CPU.GPR[ra] + d : d; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } for(u32 i=rs; i<32; ++i, addr += 4) { - vm::write32(addr, (u32)CPU.GPR[i]); + vm::write32((u32)addr, (u32)CPU.GPR[i]); } } void LFS(u32 frd, u32 ra, s32 d) { - const u32 v = vm::read32(ra ? CPU.GPR[ra] + d : d); + const u64 addr = ra ? CPU.GPR[ra] + d : d; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + const u32 v = vm::read32((u32)addr); CPU.FPR[frd] = (float&)v; } void LFSU(u32 frd, u32 ra, s32 ds) { const u64 addr = CPU.GPR[ra] + ds; - const u32 v = vm::read32(addr); + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + const u32 v = vm::read32((u32)addr); CPU.FPR[frd] = (float&)v; CPU.GPR[ra] = addr; } void LFD(u32 frd, u32 ra, s32 d) { - (u64&)CPU.FPR[frd] = vm::read64(ra ? CPU.GPR[ra] + d : d); + const u64 addr = ra ? CPU.GPR[ra] + d : d; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + (u64&)CPU.FPR[frd] = vm::read64((u32)addr); } void LFDU(u32 frd, u32 ra, s32 ds) { const u64 addr = CPU.GPR[ra] + ds; - (u64&)CPU.FPR[frd] = vm::read64(addr); + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + (u64&)CPU.FPR[frd] = vm::read64((u32)addr); CPU.GPR[ra] = addr; } void STFS(u32 frs, u32 ra, s32 d) { - vm::write32(ra ? CPU.GPR[ra] + d : d, CPU.FPR[frs].To32()); + const u64 addr = ra ? CPU.GPR[ra] + d : d; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + vm::write32((u32)addr, CPU.FPR[frs].To32()); } void STFSU(u32 frs, u32 ra, s32 d) { const u64 addr = CPU.GPR[ra] + d; - vm::write32(addr, CPU.FPR[frs].To32()); + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + vm::write32((u32)addr, CPU.FPR[frs].To32()); CPU.GPR[ra] = addr; } void STFD(u32 frs, u32 ra, s32 d) { - vm::write64(ra ? CPU.GPR[ra] + d : d, (u64&)CPU.FPR[frs]); + const u64 addr = ra ? CPU.GPR[ra] + d : d; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + vm::write64((u32)addr, (u64&)CPU.FPR[frs]); } void STFDU(u32 frs, u32 ra, s32 d) { const u64 addr = CPU.GPR[ra] + d; - vm::write64(addr, (u64&)CPU.FPR[frs]); + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + vm::write64((u32)addr, (u64&)CPU.FPR[frs]); CPU.GPR[ra] = addr; } void LD(u32 rd, u32 ra, s32 ds) { - CPU.GPR[rd] = vm::read64(ra ? CPU.GPR[ra] + ds : ds); + const u64 addr = ra ? CPU.GPR[ra] + ds : ds; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.GPR[rd] = vm::read64((u32)addr); } void LDU(u32 rd, u32 ra, s32 ds) { //if(ra == 0 || rt == ra) return; const u64 addr = CPU.GPR[ra] + ds; - CPU.GPR[rd] = vm::read64(addr); + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.GPR[rd] = vm::read64((u32)addr); CPU.GPR[ra] = addr; } void LWA(u32 rd, u32 ra, s32 ds) { - CPU.GPR[rd] = (s64)(s32)vm::read32(ra ? CPU.GPR[ra] + ds : ds); + const u64 addr = ra ? CPU.GPR[ra] + ds : ds; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.GPR[rd] = (s64)(s32)vm::read32((u32)addr); } void FDIVS(u32 frd, u32 fra, u32 frb, bool rc) { @@ -3447,13 +3980,26 @@ private: } void STD(u32 rs, u32 ra, s32 d) { - vm::write64(ra ? CPU.GPR[ra] + d : d, CPU.GPR[rs]); + const u64 addr = ra ? CPU.GPR[ra] + d : d; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + vm::write64((u32)addr, CPU.GPR[rs]); } void STDU(u32 rs, u32 ra, s32 ds) { //if(ra == 0 || rs == ra) return; const u64 addr = CPU.GPR[ra] + ds; - vm::write64(addr, CPU.GPR[rs]); + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + vm::write64((u32)addr, CPU.GPR[rs]); CPU.GPR[ra] = addr; } void MTFSB1(u32 crbd, bool rc) diff --git a/rpcs3/Emu/Cell/SPUThread.cpp b/rpcs3/Emu/Cell/SPUThread.cpp index 5d069af957..bf8d55b984 100644 --- a/rpcs3/Emu/Cell/SPUThread.cpp +++ b/rpcs3/Emu/Cell/SPUThread.cpp @@ -241,13 +241,13 @@ void SPUThread::ProcessCmd(u32 cmd, u32 tag, u32 lsa, u64 ea, u32 size) { case MFC_PUT_CMD: { - vm::write32(ea, ReadLS32(lsa)); + vm::write32((u32)ea, ReadLS32(lsa)); return; } case MFC_GET_CMD: { - WriteLS32(lsa, vm::read32(ea)); + WriteLS32(lsa, vm::read32((u32)ea)); return; } @@ -264,13 +264,13 @@ void SPUThread::ProcessCmd(u32 cmd, u32 tag, u32 lsa, u64 ea, u32 size) { case MFC_PUT_CMD: { - memcpy(vm::get_ptr(ea), vm::get_ptr(ls_offset + lsa), size); + memcpy(vm::get_ptr((u32)ea), vm::get_ptr(ls_offset + lsa), size); return; } case MFC_GET_CMD: { - memcpy(vm::get_ptr(ls_offset + lsa), vm::get_ptr(ea), size); + memcpy(vm::get_ptr(ls_offset + lsa), vm::get_ptr((u32)ea), size); return; } @@ -402,6 +402,17 @@ void SPUThread::EnqMfcCmd(MFCReg& MFCArgs) op == MFC_PUTLLUC_CMD ? "PUTLLUC" : "PUTQLLUC"), lsa, ea, tag, size, cmd); + if ((u32)ea != ea) + { + LOG_ERROR(Log::SPU, "DMA %s: Invalid external address (0x%llx)", + (op == MFC_GETLLAR_CMD ? "GETLLAR" : + op == MFC_PUTLLC_CMD ? "PUTLLC" : + op == MFC_PUTLLUC_CMD ? "PUTLLUC" : "PUTQLLUC"), + ea); + Emu.Pause(); + return; + } + if (op == MFC_GETLLAR_CMD) // get reservation { if (R_ADDR) @@ -412,7 +423,7 @@ void SPUThread::EnqMfcCmd(MFCReg& MFCArgs) R_ADDR = ea; for (u32 i = 0; i < 16; i++) { - R_DATA[i] = vm::get_ptr(R_ADDR)[i]; + R_DATA[i] = vm::get_ptr((u32)R_ADDR)[i]; vm::get_ptr(ls_offset + lsa)[i] = R_DATA[i]; } MFCArgs.AtomicStat.PushUncond(MFC_GETLLAR_SUCCESS); @@ -432,7 +443,7 @@ void SPUThread::EnqMfcCmd(MFCReg& MFCArgs) { changed++; mask |= (0x3 << (i * 2)); - if (vm::get_ptr(R_ADDR)[i] != R_DATA[i]) + if (vm::get_ptr((u32)R_ADDR)[i] != R_DATA[i]) { m_events |= SPU_EVENT_LR; MFCArgs.AtomicStat.PushUncond(MFC_PUTLLC_FAILURE); @@ -446,7 +457,7 @@ void SPUThread::EnqMfcCmd(MFCReg& MFCArgs) { if (buf[i] != R_DATA[i]) { - if (InterlockedCompareExchange(&vm::get_ptr(ea)[i], buf[i], R_DATA[i]) != R_DATA[i]) + if (InterlockedCompareExchange(&vm::get_ptr((u32)R_ADDR)[i], buf[i], R_DATA[i]) != R_DATA[i]) { m_events |= SPU_EVENT_LR; MFCArgs.AtomicStat.PushUncond(MFC_PUTLLC_FAILURE); @@ -520,7 +531,7 @@ bool SPUThread::CheckEvents() { for (u32 i = 0; i < 16; i++) { - if (vm::get_ptr(R_ADDR)[i] != R_DATA[i]) + if (vm::get_ptr((u32)R_ADDR)[i] != R_DATA[i]) { m_events |= SPU_EVENT_LR; R_ADDR = 0; @@ -1165,4 +1176,4 @@ void SPUThread::StopAndSignal(u32 code) break; } } -} \ No newline at end of file +} diff --git a/rpcs3/Emu/RSX/GL/GLShaderParam.h b/rpcs3/Emu/RSX/GL/GLShaderParam.h index f39846da44..80fa5a3dec 100644 --- a/rpcs3/Emu/RSX/GL/GLShaderParam.h +++ b/rpcs3/Emu/RSX/GL/GLShaderParam.h @@ -90,9 +90,8 @@ struct GLParamArray case PARAM_IN: return "in "; case PARAM_UNIFORM: return "uniform "; case PARAM_CONST: return "const "; + default: return ""; } - - return ""; } bool HasParam(const GLParamFlag flag, std::string type, const std::string& name) diff --git a/rpcs3/Emu/SysCalls/Modules.cpp b/rpcs3/Emu/SysCalls/Modules.cpp index c3e8002554..7951808e2a 100644 --- a/rpcs3/Emu/SysCalls/Modules.cpp +++ b/rpcs3/Emu/SysCalls/Modules.cpp @@ -201,36 +201,38 @@ void fix_relocs(Module* module, u32 lib, u32 start, u32 end, u32 seg2) for (u32 i = lib + start; i < lib + end; i += 24) { - u64 addr = vm::read64(i); + u64 addr = vm::read64(i) + lib; const u64 flag = vm::read64(i + 8); - if (flag == 0x10100000001ull) + if ((u32)addr != addr || (u32)(addr + seg2) != (addr + seg2)) { - addr = addr + seg2 + lib; - u32 value = vm::read32(addr); + module->Error("fix_relocs(): invalid address (0x%llx)", addr); + } + else if (flag == 0x10100000001ull) + { + addr = addr + seg2; + u32 value = vm::read32((u32)addr); assert(value == vm::read64(i + 16) + seg2); - vm::write32(addr, value + lib); + vm::write32((u32)addr, value + lib); } else if (flag == 0x100000001ull) { - addr = addr + seg2 + lib; - u32 value = vm::read32(addr); + addr = addr + seg2; + u32 value = vm::read32((u32)addr); assert(value == vm::read64(i + 16)); - vm::write32(addr, value + lib); + vm::write32((u32)addr, value + lib); } else if (flag == 0x10000000001ull) { - addr = addr + lib; - u32 value = vm::read32(addr); + u32 value = vm::read32((u32)addr); assert(value == vm::read64(i + 16) + seg2); - vm::write32(addr, value + lib); + vm::write32((u32)addr, value + lib); } else if (flag == 1) { - addr = addr + lib; - u32 value = vm::read32(addr); + u32 value = vm::read32((u32)addr); assert(value == vm::read64(i + 16)); - vm::write32(addr, value + lib); + vm::write32((u32)addr, value + lib); } else if (flag == 0x10000000004ull || flag == 0x10000000006ull) { diff --git a/rpcs3/Emu/SysCalls/Modules/cellAvconfExt.cpp b/rpcs3/Emu/SysCalls/Modules/cellAvconfExt.cpp index a29056057a..cbb9506377 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellAvconfExt.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellAvconfExt.cpp @@ -16,15 +16,15 @@ int cellVideoOutGetScreenSize(u32 videoOut, vm::ptr screenSize) { cellAvconfExt->Warning("cellVideoOutGetScreenSize(videoOut=%d, screenSize_addr=0x%x)", videoOut, screenSize.addr()); - if (!videoOut == CELL_VIDEO_OUT_PRIMARY) + if (videoOut != CELL_VIDEO_OUT_PRIMARY) return CELL_VIDEO_OUT_ERROR_UNSUPPORTED_VIDEO_OUT; #ifdef _WIN32 HDC screen = GetDC(NULL); - u32 diagonal = round(sqrt((pow(GetDeviceCaps(screen, HORZSIZE), 2) + pow(GetDeviceCaps(screen, VERTSIZE), 2))) * 0.0393); + float diagonal = roundf(sqrtf((powf(GetDeviceCaps(screen, HORZSIZE), 2) + powf(GetDeviceCaps(screen, VERTSIZE), 2))) * 0.0393); #else // TODO: Linux implementation, without using wx - // u32 diagonal = round(sqrt((pow(wxGetDisplaySizeMM().GetWidth(), 2) + pow(wxGetDisplaySizeMM().GetHeight(), 2))) * 0.0393); + // float diagonal = roundf(sqrtf((powf(wxGetDisplaySizeMM().GetWidth(), 2) + powf(wxGetDisplaySizeMM().GetHeight(), 2))) * 0.0393); #endif if (Ini.GS3DTV.GetValue()) diff --git a/rpcs3/Emu/SysCalls/Modules/cellPngDec.cpp b/rpcs3/Emu/SysCalls/Modules/cellPngDec.cpp index 9abe3d29c8..c0d3d84d97 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellPngDec.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellPngDec.cpp @@ -75,13 +75,13 @@ s32 pngDecOpen( stream->fd = 0; stream->src = *src; - switch (src->srcSelect.ToBE()) + switch (src->srcSelect) { - case se32(CELL_PNGDEC_BUFFER): + case CELL_PNGDEC_BUFFER: stream->fileSize = src->streamSize.ToLE(); break; - case se32(CELL_PNGDEC_FILE): + case CELL_PNGDEC_FILE: // Get file descriptor vm::var> fd; int ret = cellFsOpen(vm::ptr::make(src->fileName.addr()), 0, fd, vm::ptr::make(0), 0); diff --git a/rpcs3/Emu/SysCalls/Modules/cellSync.cpp b/rpcs3/Emu/SysCalls/Modules/cellSync.cpp index 4617bdc8ac..32cb8b42b4 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellSync.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellSync.cpp @@ -997,7 +997,7 @@ s32 cellSyncLFQueueInitialize(vm::ptr queue, vm::ptr buffer s32 syncLFQueueGetPushPointer(vm::ptr queue, s32& pointer, u32 isBlocking, u32 useEventQueue) { - if (queue->m_direction.ToBE() != se32(CELL_SYNC_QUEUE_PPU2SPU)) + if (queue->m_direction != CELL_SYNC_QUEUE_PPU2SPU) { return CELL_SYNC_ERROR_PERM; } @@ -1124,7 +1124,7 @@ s32 _cellSyncLFQueueGetPushPointer2(vm::ptr queue, vm::ptr s32 syncLFQueueCompletePushPointer(vm::ptr queue, s32 pointer, const std::function fpSendSignal) { - if (queue->m_direction.ToBE() != se32(CELL_SYNC_QUEUE_PPU2SPU)) + if (queue->m_direction != CELL_SYNC_QUEUE_PPU2SPU) { return CELL_SYNC_ERROR_PERM; } @@ -1305,7 +1305,7 @@ s32 _cellSyncLFQueuePushBody(vm::ptr queue, vm::ptr { s32 res; - if (queue->m_direction.ToBE() != se32(CELL_SYNC_QUEUE_ANY2ANY)) + if (queue->m_direction != CELL_SYNC_QUEUE_ANY2ANY) { #ifdef PRX_DEBUG_XXX res = cb_caller, u32, u32, u64>::call(GetCurrentPPUThread(), libsre + 0x24B0, libsre_rtoc, @@ -1351,7 +1351,7 @@ s32 _cellSyncLFQueuePushBody(vm::ptr queue, vm::ptr memcpy(vm::get_ptr((u64)(queue->m_buffer.addr() & ~1ull) + size * (position >= depth ? position - depth : position)), buffer.get_ptr(), size); s32 res; - if (queue->m_direction.ToBE() != se32(CELL_SYNC_QUEUE_ANY2ANY)) + if (queue->m_direction != CELL_SYNC_QUEUE_ANY2ANY) { #ifdef PRX_DEBUG_XXX res = cb_caller, s32, u64>::call(GetCurrentPPUThread(), libsre + 0x26C0, libsre_rtoc, @@ -1376,7 +1376,7 @@ s32 _cellSyncLFQueuePushBody(vm::ptr queue, vm::ptr s32 syncLFQueueGetPopPointer(vm::ptr queue, s32& pointer, u32 isBlocking, u32, u32 useEventQueue) { - if (queue->m_direction.ToBE() != se32(CELL_SYNC_QUEUE_SPU2PPU)) + if (queue->m_direction != CELL_SYNC_QUEUE_SPU2PPU) { return CELL_SYNC_ERROR_PERM; } @@ -1503,7 +1503,7 @@ s32 _cellSyncLFQueueGetPopPointer2(vm::ptr queue, vm::ptr s32 syncLFQueueCompletePopPointer(vm::ptr queue, s32 pointer, const std::function fpSendSignal, u32 noQueueFull) { - if (queue->m_direction.ToBE() != se32(CELL_SYNC_QUEUE_SPU2PPU)) + if (queue->m_direction != CELL_SYNC_QUEUE_SPU2PPU) { return CELL_SYNC_ERROR_PERM; } @@ -1681,7 +1681,7 @@ s32 _cellSyncLFQueuePopBody(vm::ptr queue, vm::ptr buffer while (true) { s32 res; - if (queue->m_direction.ToBE() != se32(CELL_SYNC_QUEUE_ANY2ANY)) + if (queue->m_direction != CELL_SYNC_QUEUE_ANY2ANY) { #ifdef PRX_DEBUG_XXX res = cb_caller, u32, u32, u64, u64>::call(GetCurrentPPUThread(), libsre + 0x2A90, libsre_rtoc, @@ -1724,7 +1724,7 @@ s32 _cellSyncLFQueuePopBody(vm::ptr queue, vm::ptr buffer memcpy(buffer.get_ptr(), vm::get_ptr((u64)(queue->m_buffer.addr() & ~1ull) + size * (position >= depth ? position - depth : position)), size); s32 res; - if (queue->m_direction.ToBE() != se32(CELL_SYNC_QUEUE_ANY2ANY)) + if (queue->m_direction != CELL_SYNC_QUEUE_ANY2ANY) { #ifdef PRX_DEBUG_XXX res = cb_caller, s32, u64, u64>::call(GetCurrentPPUThread(), libsre + 0x2CA8, libsre_rtoc, @@ -1767,7 +1767,7 @@ s32 cellSyncLFQueueClear(vm::ptr queue) const auto push = queue->push1.read_relaxed(); s32 var1, var2; - if (queue->m_direction.ToBE() != se32(CELL_SYNC_QUEUE_ANY2ANY)) + if (queue->m_direction != CELL_SYNC_QUEUE_ANY2ANY) { var1 = var2 = (u16)queue->pop2.read_relaxed().pack; } diff --git a/rpcs3/Emu/SysCalls/Modules/libmixer.cpp b/rpcs3/Emu/SysCalls/Modules/libmixer.cpp index fb55cca939..76fae67e3f 100644 --- a/rpcs3/Emu/SysCalls/Modules/libmixer.cpp +++ b/rpcs3/Emu/SysCalls/Modules/libmixer.cpp @@ -358,7 +358,7 @@ int cellSurMixerCreate(vm::ptr config) memset(mixdata, 0, sizeof(mixdata)); if (surMixerCb) { - surMixerCb.call(cb_thread, surMixerCbArg, mixcount, 256); + surMixerCb.call(cb_thread, surMixerCbArg, (u32)mixcount, 256); } //u64 stamp1 = get_system_time(); diff --git a/rpcs3/Emu/SysCalls/Modules/sysPrxForUser.cpp b/rpcs3/Emu/SysCalls/Modules/sysPrxForUser.cpp index 61430024f0..78c7054e82 100644 --- a/rpcs3/Emu/SysCalls/Modules/sysPrxForUser.cpp +++ b/rpcs3/Emu/SysCalls/Modules/sysPrxForUser.cpp @@ -157,7 +157,7 @@ int sys_get_random_number(vm::ptr addr, u64 size) if (size > 4096) size = 4096; - for (u64 i = 0; i < size - 1; i++) + for (u32 i = 0; i < (u32)size - 1; i++) { addr[i] = rand() % 256; } diff --git a/rpcs3/Emu/SysCalls/lv2/sys_memory.cpp b/rpcs3/Emu/SysCalls/lv2/sys_memory.cpp index 02b3ae4662..45526a143b 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_memory.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_memory.cpp @@ -154,7 +154,6 @@ s32 sys_memory_container_get_size(vm::ptr mem_info, u32 cid) return CELL_ESRCH; // HACK: Return all memory. - sys_memory_info_t info; mem_info->total_user_memory = ct->size; mem_info->available_user_memory = ct->size; return CELL_OK; diff --git a/rpcs3/Emu/SysCalls/lv2/sys_mutex.cpp b/rpcs3/Emu/SysCalls/lv2/sys_mutex.cpp index 92eff86687..f22dd97d87 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_mutex.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_mutex.cpp @@ -218,9 +218,8 @@ s32 sys_mutex_trylock(u32 mutex_id) switch (mutex->m_mutex.trylock(tid)) { case SMR_OK: mutex->recursive = 1; t.owned_mutexes++; return CELL_OK; + default: return CELL_EBUSY; } - - return CELL_EBUSY; } s32 sys_mutex_unlock(u32 mutex_id) diff --git a/rpcs3/Emu/System.cpp b/rpcs3/Emu/System.cpp index 07475922c0..ce48b9edc5 100644 --- a/rpcs3/Emu/System.cpp +++ b/rpcs3/Emu/System.cpp @@ -240,7 +240,7 @@ void Emulator::Load() try { - if(!(is_error = !l.Analyze()) && l.GetMachine() != MACHINE_Unknown) + if(!(is_error = !l.Analyze())) { switch(l.GetMachine()) { @@ -260,6 +260,9 @@ void Emulator::Load() case MACHINE_ARM: Memory.Init(Memory_PSV); break; + + default: + throw std::string("Unknown machine!"); } is_error = !l.Load(); From ffda60996d09f40c56367611d5eb26d48b95fc36 Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Fri, 24 Oct 2014 23:13:47 +0400 Subject: [PATCH 04/27] Compilation fix --- rpcs3/Emu/SysCalls/Modules/cellPngDec.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpcs3/Emu/SysCalls/Modules/cellPngDec.cpp b/rpcs3/Emu/SysCalls/Modules/cellPngDec.cpp index c0d3d84d97..fbace88771 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellPngDec.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellPngDec.cpp @@ -75,7 +75,7 @@ s32 pngDecOpen( stream->fd = 0; stream->src = *src; - switch (src->srcSelect) + switch (src->srcSelect.ToLE()) { case CELL_PNGDEC_BUFFER: stream->fileSize = src->streamSize.ToLE(); From 09a4d14f8f34c5623c3e9bbb692fc9f872b99862 Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Tue, 28 Oct 2014 00:24:11 +0300 Subject: [PATCH 05/27] cellAdec improved --- rpcs3/Emu/RSX/RSXThread.cpp | 2 +- rpcs3/Emu/SysCalls/Modules/cellAdec.cpp | 261 +++++++++++------------ rpcs3/Emu/SysCalls/Modules/cellAdec.h | 58 +++-- rpcs3/Emu/SysCalls/Modules/cellAtrac.cpp | 149 +++++++++++-- rpcs3/Emu/SysCalls/Modules/cellAtrac.h | 30 ++- rpcs3/Emu/SysCalls/Modules/cellAudio.cpp | 2 +- rpcs3/Emu/SysCalls/Modules/cellDmux.cpp | 5 - 7 files changed, 314 insertions(+), 193 deletions(-) diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index 7bfc5daa6c..c3e0f4ff95 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -2266,7 +2266,7 @@ void RSXThread::Task() if(cmd == 0) { LOG_ERROR(Log::RSX, "null cmd: cmd=0x%x, put=0x%x, get=0x%x (addr=0x%x)", cmd, put, get, (u32)Memory.RSXIOMem.RealAddr(get)); - //Emu.Pause(); + Emu.Pause(); //HACK! We shouldn't be here m_ctrl->get = get + (count + 1) * 4; continue; diff --git a/rpcs3/Emu/SysCalls/Modules/cellAdec.cpp b/rpcs3/Emu/SysCalls/Modules/cellAdec.cpp index 28605b2ee7..972eb1c593 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellAdec.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellAdec.cpp @@ -52,7 +52,7 @@ AudioDecoder::AudioDecoder(AudioCodecType type, u32 addr, u32 size, vm::ptrpb = avio_alloc_context(io_buf, 4096, 0, this, adecRead, NULL, NULL); + fmt->pb = avio_alloc_context(io_buf, 256, 0, this, adecRead, NULL, NULL); if (!fmt->pb) { cellAdec->Error("AudioDecoder(): avio_alloc_context failed"); @@ -86,13 +86,44 @@ AudioDecoder::~AudioDecoder() } } -int adecRawRead(void* opaque, u8* buf, int buf_size) +int adecRead(void* opaque, u8* buf, int buf_size) { AudioDecoder& adec = *(AudioDecoder*)opaque; int res = 0; next: + if (adec.reader.has_ats) + { + u8 code1 = vm::read8(adec.reader.addr + 2); + u8 code2 = vm::read8(adec.reader.addr + 3); + adec.channels = code1 >> 2; + adec.frame_size = ((((u32)code1 & 0x3) << 8) | (u32)code2) * 8 + 8; + adec.sample_rate = at3freq[code1 >> 5]; + + adec.reader.size -= 8; + adec.reader.addr += 8; + adec.reader.has_ats = false; + } + + if (!adec.reader.init) + { + OMAHeader oma(1 /* atrac3p id */, adec.sample_rate, adec.channels, adec.frame_size); + if (buf_size < sizeof(oma)) + { + cellAdec->Error("adecRead(): OMAHeader writing failed"); + Emu.Pause(); + return 0; + } + + memcpy(buf, &oma, sizeof(oma)); + buf += sizeof(oma); + buf_size -= sizeof(oma); + res += sizeof(oma); + + adec.reader.init = true; + } + if (adec.reader.size < (u32)buf_size /*&& !adec.just_started*/) { AdecTask task; @@ -125,6 +156,7 @@ next: adec.reader.addr = adec.task.au.addr; adec.reader.size = adec.task.au.size; + adec.reader.has_ats = adec.use_ats_headers; //LOG_NOTICE(HLE, "Audio AU: size = 0x%x, pts = 0x%llx", adec.task.au.size, adec.task.au.pts); } break; @@ -158,89 +190,6 @@ next: } } -int adecRead(void* opaque, u8* buf, int buf_size) -{ - AudioDecoder& adec = *(AudioDecoder*)opaque; - - int res = 0; - - if (adec.reader.rem_size && adec.reader.rem) - { - if (buf_size < (int)adec.reader.rem_size) - { - cellAdec->Error("adecRead(): too small buf_size (rem_size = %d, buf_size = %d)", adec.reader.rem_size, buf_size); - Emu.Pause(); - return 0; - } - - memcpy(buf, adec.reader.rem, adec.reader.rem_size); - free(adec.reader.rem); - adec.reader.rem = nullptr; - buf += adec.reader.rem_size; - buf_size -= adec.reader.rem_size; - res += adec.reader.rem_size; - adec.reader.rem_size = 0; - } - - while (buf_size) - { - u8 header[8]; - if (adecRawRead(opaque, header, 8) < 8) break; - if (header[0] != 0x0f || header[1] != 0xd0) - { - cellAdec->Error("adecRead(): 0x0FD0 header not found"); - Emu.Pause(); - return -1; - } - - if (!adec.reader.init) - { - OMAHeader oma(1 /* atrac3p id */, header[2], header[3]); - if (buf_size < sizeof(oma) + 8) - { - cellAdec->Error("adecRead(): OMAHeader writing failed"); - Emu.Pause(); - return 0; - } - - memcpy(buf, &oma, sizeof(oma)); - buf += sizeof(oma); - buf_size -= sizeof(oma); - res += sizeof(oma); - - adec.reader.init = true; - } - else - { - } - - u32 size = (((header[2] & 0x3) << 8) | header[3]) * 8 + 8; // data to be read before next header - - //LOG_NOTICE(HLE, "*** audio block read: size = 0x%x", size); - - if (buf_size < (int)size) - { - if (adecRawRead(opaque, buf, buf_size) < buf_size) break; // ??? - res += buf_size; - size -= buf_size; - buf_size = 0; - - adec.reader.rem = (u8*)malloc(size); - adec.reader.rem_size = size; - if (adecRawRead(opaque, adec.reader.rem, size) < (int)size) break; // ??? - } - else - { - if (adecRawRead(opaque, buf, size) < (int)size) break; // ??? - buf += size; - buf_size -= size; - res += size; - } - } - - return res; -} - u32 adecOpen(AudioDecoder* data) { AudioDecoder& adec = *data; @@ -292,10 +241,13 @@ u32 adecOpen(AudioDecoder* data) adec.reader.addr = 0; adec.reader.size = 0; adec.reader.init = false; - if (adec.reader.rem) free(adec.reader.rem); - adec.reader.rem = nullptr; - adec.reader.rem_size = 0; + adec.reader.has_ats = false; adec.just_started = true; + + adec.channels = task.at3p.channels; + adec.frame_size = task.at3p.frame_size; + adec.sample_rate = task.at3p.sample_rate; + adec.use_ats_headers = task.at3p.ats_header == 1; } break; @@ -315,12 +267,13 @@ u32 adecOpen(AudioDecoder* data) adec.reader.addr = task.au.addr; adec.reader.size = task.au.size; + adec.reader.has_ats = adec.use_ats_headers; //LOG_NOTICE(HLE, "Audio AU: size = 0x%x, pts = 0x%llx", task.au.size, task.au.pts); if (adec.just_started) { adec.first_pts = task.au.pts; - adec.last_pts = task.au.pts - 0x10000; // hack + adec.last_pts = task.au.pts - 0x10000; // hack? } struct AVPacketHolder : AVPacket @@ -344,36 +297,30 @@ u32 adecOpen(AudioDecoder* data) ~AVPacketHolder() { av_free(data); - //av_free_packet(this); } } au(0); - /*{ - wxFile dump; - dump.Open(wxString::Format("audio pts-0x%llx.dump", task.au.pts), wxFile::write); - u8* buf = (u8*)malloc(task.au.size); - if (Memory.CopyToReal(buf, task.au.addr, task.au.size)) dump.Write(buf, task.au.size); - free(buf); - dump.Close(); - }*/ - if (adec.just_started && adec.just_finished) { avcodec_flush_buffers(adec.ctx); - adec.reader.init = true; + + adec.reader.init = true; // wrong adec.just_finished = false; adec.just_started = false; } else if (adec.just_started) // deferred initialization { - err = avformat_open_input(&adec.fmt, NULL, av_find_input_format("oma"), NULL); - if (err) + AVDictionary* opts = nullptr; + av_dict_set(&opts, "probesize", "96", 0); + err = avformat_open_input(&adec.fmt, NULL, av_find_input_format("oma"), &opts); + if (err || opts) { - cellAdec->Error("adecDecodeAu: avformat_open_input() failed"); + cellAdec->Error("adecDecodeAu: avformat_open_input() failed (err=0x%x, opts=%d)", err, opts ? 1 : 0); Emu.Pause(); break; } + AVCodec* codec = avcodec_find_decoder(AV_CODEC_ID_ATRAC3P); // ??? if (!codec) { @@ -402,14 +349,14 @@ u32 adecOpen(AudioDecoder* data) } adec.ctx = adec.fmt->streams[0]->codec; // TODO: check data - AVDictionary* opts = nullptr; + opts = nullptr; av_dict_set(&opts, "refcounted_frames", "1", 0); { std::lock_guard lock(g_mutex_avcodec_open2); // not multithread-safe (???) err = avcodec_open2(adec.ctx, codec, &opts); } - if (err) + if (err || opts) { cellAdec->Error("adecDecodeAu: avcodec_open2() failed"); Emu.Pause(); @@ -428,22 +375,6 @@ u32 adecOpen(AudioDecoder* data) break; } - /*if (!adec.ctx) // fake - { - AdecFrame frame; - frame.pts = task.au.pts; - frame.auAddr = task.au.addr; - frame.auSize = task.au.size; - frame.userdata = task.au.userdata; - frame.size = 4096; - frame.data = nullptr; - adec.frames.Push(frame); - - adec.cbFunc.call(*adec.adecCb, adec.id, CELL_ADEC_MSG_TYPE_PCMOUT, CELL_OK, adec.cbArg); - - break; - }*/ - last_frame = av_read_frame(adec.fmt, &au) < 0; if (last_frame) { @@ -501,7 +432,7 @@ u32 adecOpen(AudioDecoder* data) } else { - adec.last_pts += ((u64)frame.data->nb_samples) * 90000 / 48000; + adec.last_pts += ((u64)frame.data->nb_samples) * 90000 / frame.data->sample_rate; frame.pts = adec.last_pts; } //frame.pts = adec.last_pts; @@ -517,12 +448,6 @@ u32 adecOpen(AudioDecoder* data) Emu.Pause(); break; } - if (frame.data->channels != 2) - { - cellAdec->Error("adecDecodeAu: unsupported channel count (%d)", frame.data->channels); - Emu.Pause(); - break; - } //LOG_NOTICE(HLE, "got audio frame (pts=0x%llx, nb_samples=%d, ch=%d, sample_rate=%d, nbps=%d)", //frame.pts, frame.data->nb_samples, frame.data->channels, frame.data->sample_rate, @@ -596,7 +521,7 @@ int cellAdecQueryAttr(vm::ptr type, vm::ptr attr) // TODO: check values attr->adecVerLower = 0x280000; // from dmux attr->adecVerUpper = 0x260000; - attr->workMemSize = 4 * 1024 * 1024; // 4 MB + attr->workMemSize = 256 * 1024; // 256 KB return CELL_OK; } @@ -655,7 +580,7 @@ int cellAdecClose(u32 handle) int cellAdecStartSeq(u32 handle, u32 param_addr) { - cellAdec->Todo("cellAdecStartSeq(handle=%d, param_addr=0x%x)", handle, param_addr); + cellAdec->Warning("cellAdecStartSeq(handle=%d, param_addr=0x%x)", handle, param_addr); AudioDecoder* adec; if (!Emu.GetIdManager().GetIDData(handle, adec)) @@ -665,7 +590,31 @@ int cellAdecStartSeq(u32 handle, u32 param_addr) AdecTask task(adecStartSeq); - // TODO: using parameters + switch (adec->type) + { + case CELL_ADEC_TYPE_ATRACX_2CH: + { + auto param = vm::ptr::make(param_addr); + + task.at3p.sample_rate = param->sampling_freq; + task.at3p.channel_config = param->ch_config_idx; + task.at3p.channels = param->nch_out; + task.at3p.frame_size = param->nbytes; + task.at3p.extra_config = param->extra_config_data; + task.at3p.output = param->bw_pcm; + task.at3p.downmix = param->downmix_flag; + task.at3p.ats_header = param->au_includes_ats_hdr_flg; + cellAdec->Todo("*** CellAdecParamAtracX: sr=%d, ch_cfg=%d(%d), frame_size=0x%x, extra=0x%x, output=%d, downmix=%d, ats_header=%d", + task.at3p.sample_rate, task.at3p.channel_config, task.at3p.channels, task.at3p.frame_size, (u32&)task.at3p.extra_config, task.at3p.output, task.at3p.downmix, task.at3p.ats_header); + break; + } + default: + { + cellAdec->Todo("cellAdecStartSeq(): Unimplemented audio codec type(%d)", adec->type); + Emu.Pause(); + return CELL_OK; + } + } adec->job.Push(task, &adec->is_closed); return CELL_OK; @@ -702,6 +651,7 @@ int cellAdecDecodeAu(u32 handle, vm::ptr auInfo) task.au.pts = ((u64)auInfo->pts.upper << 32) | (u64)auInfo->pts.lower; task.au.userdata = auInfo->userData; + cellAdec->Notice("cellAdecDecodeAu(): addr=0x%x, size=0x%x, pts=0x%llx", task.au.addr, task.au.size, task.au.pts); adec->job.Push(task, &adec->is_closed); return CELL_OK; } @@ -733,14 +683,30 @@ int cellAdecGetPcm(u32 handle, vm::ptr outBuffer) if (outBuffer) { - // reverse byte order, extract data: - float* in_f[2]; - in_f[0] = (float*)frame->extended_data[0]; - in_f[1] = (float*)frame->extended_data[1]; - for (u32 i = 0; i < af.size / 8; i++) + // reverse byte order: + if (frame->channels == 1) { - outBuffer[i * 2 + 0] = in_f[0][i]; - outBuffer[i * 2 + 1] = in_f[1][i]; + float* in_f = (float*)frame->extended_data[0]; + for (u32 i = 0; i < af.size / 4; i++) + { + outBuffer[i] = in_f[i]; + } + } + else if (frame->channels == 2) + { + float* in_f[2]; + in_f[0] = (float*)frame->extended_data[0]; + in_f[1] = (float*)frame->extended_data[1]; + for (u32 i = 0; i < af.size / 8; i++) + { + outBuffer[i * 2 + 0] = in_f[0][i]; + outBuffer[i * 2 + 1] = in_f[1][i]; + } + } + else + { + cellAdec->Error("cellAdecGetPcm(): unsupported channel count (%d)", frame->channels); + Emu.Pause(); } } @@ -788,12 +754,23 @@ int cellAdecGetPcmItem(u32 handle, vm::ptr pcmItem_ptr) pcm->auInfo.userData = af.userdata; auto atx = vm::ptr::make(pcm.addr() + sizeof(CellAdecPcmItem)); - atx->samplingFreq = frame->sample_rate; // ??? - atx->nbytes = frame->nb_samples * frame->channels * sizeof(float); // ??? - atx->channelConfigIndex = CELL_ADEC_CH_STEREO; // ??? + atx->samplingFreq = frame->sample_rate; + atx->nbytes = frame->nb_samples * sizeof(float); + if (frame->channels == 1) + { + atx->channelConfigIndex = 1; + } + else if (frame->channels == 2) + { + atx->channelConfigIndex = 2; + } + else + { + cellAdec->Error("cellAdecGetPcmItem(): unsupported channel count (%d)", frame->channels); + Emu.Pause(); + } *pcmItem_ptr = pcm.addr(); - return CELL_OK; } diff --git a/rpcs3/Emu/SysCalls/Modules/cellAdec.h b/rpcs3/Emu/SysCalls/Modules/cellAdec.h index 7249fd411e..414d986dee 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellAdec.h +++ b/rpcs3/Emu/SysCalls/Modules/cellAdec.h @@ -790,7 +790,7 @@ struct CellAdecParamAtracX be_t ch_config_idx; be_t nch_out; be_t nbytes; - u8 extra_config_data[4]; // downmix coefficients + std::array extra_config_data; // downmix coefficients be_t bw_pcm; ATRACX_DownmixFlag downmix_flag; ATRACX_ATSHeaderInclude au_includes_ats_hdr_flg; @@ -1010,6 +1010,18 @@ struct AdecTask u64 pts; u64 userdata; } au; + + struct + { + s32 sample_rate; + s32 channel_config; + s32 channels; + s32 frame_size; + std::array extra_config; + s32 output; + u8 downmix; + u8 ats_header; + } at3p; }; AdecTask(AdecJobType type) @@ -1034,6 +1046,8 @@ struct AdecFrame int adecRead(void* opaque, u8* buf, int buf_size); +static const u32 at3freq[8] = { 32000, 44100, 48000, 88200, 96000, 0, 0, 0 }; + struct OMAHeader // OMA Header { u32 magic; // 0x01334145 @@ -1043,26 +1057,34 @@ struct OMAHeader // OMA Header u64 unk2; // 0xcef5000000000400ULL u64 unk3; // 0x1c458024329192d2ULL u8 codecId; // 1 for ATRAC3P - u8 reserved0; // 0 + u8 code0; // 0 u8 code1; u8 code2; - u32 reserved1; // 0 - u64 reserved[7]; // 0 + u32 reserved[15]; // 0 - OMAHeader(u8 id, u8 code1, u8 code2) + OMAHeader(u8 codec_id, u32 freq, u8 channel_count, u32 frame_size) : magic(0x01334145) , size(96 << 8) , unk0(0xffff) , unk1(0x00500f0100000000ULL) , unk2(0xcef5000000000400ULL) , unk3(0x1c458024329192d2ULL) - , codecId(id) - , reserved0(0) - , code1(code1) - , code2(code2) - , reserved1(0) + , codecId(codec_id) + , code0(0) { memset(reserved, 0, sizeof(reserved)); + + u8 freq_code; + for (freq_code = 0; freq_code < 5; freq_code++) + { + if (at3freq[freq_code] == freq) + { + break; + } + } + u32 prepared_frame_size = (frame_size - 8) / 8; + code1 = ((prepared_frame_size >> 8) & 0x3) | ((channel_count & 0x7) << 2) | (freq_code << 5); + code2 = prepared_frame_size & 0xff; } }; @@ -1087,20 +1109,13 @@ public: u32 addr; u32 size; bool init; - u8* rem; - u32 rem_size; + bool has_ats; AudioReader() - : rem(nullptr) - , rem_size(0) + : init(false) { } - ~AudioReader() - { - if (rem) free(rem); - rem = nullptr; - } } reader; SQueue frames; @@ -1115,6 +1130,11 @@ public: AdecTask task; u64 last_pts, first_pts; + u32 channels; + u32 frame_size; + u32 sample_rate; + bool use_ats_headers; + PPUThread* adecCb; AudioDecoder(AudioCodecType type, u32 addr, u32 size, vm::ptr func, u32 arg); diff --git a/rpcs3/Emu/SysCalls/Modules/cellAtrac.cpp b/rpcs3/Emu/SysCalls/Modules/cellAtrac.cpp index d619d0ff9f..d2cf50a532 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellAtrac.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellAtrac.cpp @@ -1,48 +1,71 @@ #include "stdafx.h" #include "Emu/Memory/Memory.h" +#include "Emu/System.h" #include "Emu/SysCalls/Modules.h" Module *cellAtrac = nullptr; #include "cellAtrac.h" -int cellAtracSetDataAndGetMemSize(vm::ptr pHandle, u32 pucBufferAddr, u32 uiReadByte, u32 uiBufferByte, vm::ptr puiWorkMemByte) +#ifdef PRX_DEBUG +#include "prx_libatrac3plus.h" +u32 libatrac3plus; +u32 libatrac3plus_rtoc; +#endif + +s32 cellAtracSetDataAndGetMemSize(vm::ptr pHandle, u32 pucBufferAddr, u32 uiReadByte, u32 uiBufferByte, vm::ptr puiWorkMemByte) { cellAtrac->Todo("cellAtracSetDataAndGetMemSize(pHandle=0x%x, pucBufferAddr=0x%x, uiReadByte=0x%x, uiBufferByte=0x%x, puiWorkMemByte_addr=0x%x)", pHandle.addr(), pucBufferAddr, uiReadByte, uiBufferByte, puiWorkMemByte.addr()); +#ifdef PRX_DEBUG + return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x11F4, libatrac3plus_rtoc); +#endif *puiWorkMemByte = 0x1000; // unproved return CELL_OK; } -int cellAtracCreateDecoder(vm::ptr pHandle, u32 pucWorkMem_addr, u32 uiPpuThreadPriority, u32 uiSpuThreadPriority) +s32 cellAtracCreateDecoder(vm::ptr pHandle, u32 pucWorkMem_addr, u32 uiPpuThreadPriority, u32 uiSpuThreadPriority) { cellAtrac->Todo("cellAtracCreateDecoder(pHandle=0x%x, pucWorkMem_addr=0x%x, uiPpuThreadPriority=%d, uiSpuThreadPriority=%d)", pHandle.addr(), pucWorkMem_addr, uiPpuThreadPriority, uiSpuThreadPriority); +#ifdef PRX_DEBUG + return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x0FF0, libatrac3plus_rtoc); +#endif pHandle->data.pucWorkMem_addr = pucWorkMem_addr; return CELL_OK; } -int cellAtracCreateDecoderExt(vm::ptr pHandle, u32 pucWorkMem_addr, u32 uiPpuThreadPriority, vm::ptr pExtRes) +s32 cellAtracCreateDecoderExt(vm::ptr pHandle, u32 pucWorkMem_addr, u32 uiPpuThreadPriority, vm::ptr pExtRes) { cellAtrac->Todo("cellAtracCreateDecoderExt(pHandle=0x%x, pucWorkMem_addr=0x%x, uiPpuThreadPriority=%d, pExtRes_addr=0x%x)", pHandle.addr(), pucWorkMem_addr, uiPpuThreadPriority, pExtRes.addr()); +#ifdef PRX_DEBUG + return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x0DB0, libatrac3plus_rtoc); +#endif pHandle->data.pucWorkMem_addr = pucWorkMem_addr; return CELL_OK; } -int cellAtracDeleteDecoder(vm::ptr pHandle) +s32 cellAtracDeleteDecoder(vm::ptr pHandle) { cellAtrac->Todo("cellAtracDeleteDecoder(pHandle=0x%x)", pHandle.addr()); +#ifdef PRX_DEBUG + return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x0D08, libatrac3plus_rtoc); +#endif + return CELL_OK; } -int cellAtracDecode(vm::ptr pHandle, u32 pfOutAddr, vm::ptr puiSamples, vm::ptr puiFinishflag, vm::ptr piRemainFrame) +s32 cellAtracDecode(vm::ptr pHandle, u32 pfOutAddr, vm::ptr puiSamples, vm::ptr puiFinishflag, vm::ptr piRemainFrame) { cellAtrac->Todo("cellAtracDecode(pHandle=0x%x, pfOutAddr=0x%x, puiSamples_addr=0x%x, puiFinishFlag_addr=0x%x, piRemainFrame_addr=0x%x)", pHandle.addr(), pfOutAddr, puiSamples.addr(), puiFinishflag.addr(), piRemainFrame.addr()); +#ifdef PRX_DEBUG + return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x09A8, libatrac3plus_rtoc); +#endif *puiSamples = 0; *puiFinishflag = 1; @@ -50,10 +73,13 @@ int cellAtracDecode(vm::ptr pHandle, u32 pfOutAddr, vm::ptr pHandle, vm::ptr ppucWritePointer, vm::ptr puiWritableByte, vm::ptr puiReadPosition) +s32 cellAtracGetStreamDataInfo(vm::ptr pHandle, vm::ptr ppucWritePointer, vm::ptr puiWritableByte, vm::ptr puiReadPosition) { cellAtrac->Todo("cellAtracGetStreamDataInfo(pHandle=0x%x, ppucWritePointer_addr=0x%x, puiWritableByte_addr=0x%x, puiReadPosition_addr=0x%x)", pHandle.addr(), ppucWritePointer.addr(), puiWritableByte.addr(), puiReadPosition.addr()); +#ifdef PRX_DEBUG + return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x0BE8, libatrac3plus_rtoc); +#endif *ppucWritePointer = pHandle->data.pucWorkMem_addr; *puiWritableByte = 0x1000; @@ -61,79 +87,112 @@ int cellAtracGetStreamDataInfo(vm::ptr pHandle, vm::ptr pp return CELL_OK; } -int cellAtracAddStreamData(vm::ptr pHandle, u32 uiAddByte) +s32 cellAtracAddStreamData(vm::ptr pHandle, u32 uiAddByte) { cellAtrac->Todo("cellAtracAddStreamData(pHandle=0x%x, uiAddByte=0x%x)", pHandle.addr(), uiAddByte); +#ifdef PRX_DEBUG + return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x0AFC, libatrac3plus_rtoc); +#endif + return CELL_OK; } -int cellAtracGetRemainFrame(vm::ptr pHandle, vm::ptr piRemainFrame) +s32 cellAtracGetRemainFrame(vm::ptr pHandle, vm::ptr piRemainFrame) { cellAtrac->Todo("cellAtracGetRemainFrame(pHandle=0x%x, piRemainFrame_addr=0x%x)", pHandle.addr(), piRemainFrame.addr()); +#ifdef PRX_DEBUG + return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x092C, libatrac3plus_rtoc); +#endif *piRemainFrame = CELL_ATRAC_ALLDATA_IS_ON_MEMORY; return CELL_OK; } -int cellAtracGetVacantSize(vm::ptr pHandle, vm::ptr puiVacantSize) +s32 cellAtracGetVacantSize(vm::ptr pHandle, vm::ptr puiVacantSize) { cellAtrac->Todo("cellAtracGetVacantSize(pHandle=0x%x, puiVacantSize_addr=0x%x)", pHandle.addr(), puiVacantSize.addr()); +#ifdef PRX_DEBUG + return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x08B0, libatrac3plus_rtoc); +#endif *puiVacantSize = 0x1000; return CELL_OK; } -int cellAtracIsSecondBufferNeeded(vm::ptr pHandle) +s32 cellAtracIsSecondBufferNeeded(vm::ptr pHandle) { cellAtrac->Todo("cellAtracIsSecondBufferNeeded(pHandle=0x%x)", pHandle.addr()); +#ifdef PRX_DEBUG + return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x0010, libatrac3plus_rtoc); +#endif + return CELL_OK; } -int cellAtracGetSecondBufferInfo(vm::ptr pHandle, vm::ptr puiReadPosition, vm::ptr puiDataByte) +s32 cellAtracGetSecondBufferInfo(vm::ptr pHandle, vm::ptr puiReadPosition, vm::ptr puiDataByte) { cellAtrac->Todo("cellAtracGetSecondBufferInfo(pHandle=0x%x, puiReadPosition_addr=0x%x, puiDataByte_addr=0x%x)", pHandle.addr(), puiReadPosition.addr(), puiDataByte.addr()); +#ifdef PRX_DEBUG + return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x07E8, libatrac3plus_rtoc); +#endif *puiReadPosition = 0; *puiDataByte = 0; // write to null block will occur return CELL_OK; } -int cellAtracSetSecondBuffer(vm::ptr pHandle, u32 pucSecondBufferAddr, u32 uiSecondBufferByte) +s32 cellAtracSetSecondBuffer(vm::ptr pHandle, u32 pucSecondBufferAddr, u32 uiSecondBufferByte) { cellAtrac->Todo("cellAtracSetSecondBuffer(pHandle=0x%x, pucSecondBufferAddr=0x%x, uiSecondBufferByte=0x%x)", pHandle.addr(), pucSecondBufferAddr, uiSecondBufferByte); +#ifdef PRX_DEBUG + return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x0704, libatrac3plus_rtoc); +#endif + return CELL_OK; } -int cellAtracGetChannel(vm::ptr pHandle, vm::ptr puiChannel) +s32 cellAtracGetChannel(vm::ptr pHandle, vm::ptr puiChannel) { cellAtrac->Todo("cellAtracGetChannel(pHandle=0x%x, puiChannel_addr=0x%x)", pHandle.addr(), puiChannel.addr()); +#ifdef PRX_DEBUG + return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x0060, libatrac3plus_rtoc); +#endif *puiChannel = 2; return CELL_OK; } -int cellAtracGetMaxSample(vm::ptr pHandle, vm::ptr puiMaxSample) +s32 cellAtracGetMaxSample(vm::ptr pHandle, vm::ptr puiMaxSample) { cellAtrac->Todo("cellAtracGetMaxSample(pHandle=0x%x, puiMaxSample_addr=0x%x)", pHandle.addr(), puiMaxSample.addr()); +#ifdef PRX_DEBUG + return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x00AC, libatrac3plus_rtoc); +#endif *puiMaxSample = 512; return CELL_OK; } -int cellAtracGetNextSample(vm::ptr pHandle, vm::ptr puiNextSample) +s32 cellAtracGetNextSample(vm::ptr pHandle, vm::ptr puiNextSample) { cellAtrac->Todo("cellAtracGetNextSample(pHandle=0x%x, puiNextSample_addr=0x%x)", pHandle.addr(), puiNextSample.addr()); +#ifdef PRX_DEBUG + return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x0688, libatrac3plus_rtoc); +#endif *puiNextSample = 0; return CELL_OK; } -int cellAtracGetSoundInfo(vm::ptr pHandle, vm::ptr piEndSample, vm::ptr piLoopStartSample, vm::ptr piLoopEndSample) +s32 cellAtracGetSoundInfo(vm::ptr pHandle, vm::ptr piEndSample, vm::ptr piLoopStartSample, vm::ptr piLoopEndSample) { cellAtrac->Todo("cellAtracGetSoundInfo(pHandle=0x%x, piEndSample_addr=0x%x, piLoopStartSample_addr=0x%x, piLoopEndSample_addr=0x%x)", pHandle.addr(), piEndSample.addr(), piLoopStartSample.addr(), piLoopEndSample.addr()); +#ifdef PRX_DEBUG + return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x0104, libatrac3plus_rtoc); +#endif *piEndSample = 0; *piLoopStartSample = 0; @@ -141,44 +200,60 @@ int cellAtracGetSoundInfo(vm::ptr pHandle, vm::ptr piEndSa return CELL_OK; } -int cellAtracGetNextDecodePosition(vm::ptr pHandle, vm::ptr puiSamplePosition) +s32 cellAtracGetNextDecodePosition(vm::ptr pHandle, vm::ptr puiSamplePosition) { cellAtrac->Todo("cellAtracGetNextDecodePosition(pHandle=0x%x, puiSamplePosition_addr=0x%x)", pHandle.addr(), puiSamplePosition.addr()); +#ifdef PRX_DEBUG + return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x0190, libatrac3plus_rtoc); +#endif *puiSamplePosition = 0; return CELL_ATRAC_ERROR_ALLDATA_WAS_DECODED; } -int cellAtracGetBitrate(vm::ptr pHandle, vm::ptr puiBitrate) +s32 cellAtracGetBitrate(vm::ptr pHandle, vm::ptr puiBitrate) { cellAtrac->Todo("cellAtracGetBitrate(pHandle=0x%x, puiBitrate_addr=0x%x)", pHandle.addr(), puiBitrate.addr()); +#ifdef PRX_DEBUG + return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x0374, libatrac3plus_rtoc); +#endif *puiBitrate = 128; return CELL_OK; } -int cellAtracGetLoopInfo(vm::ptr pHandle, vm::ptr piLoopNum, vm::ptr puiLoopStatus) +s32 cellAtracGetLoopInfo(vm::ptr pHandle, vm::ptr piLoopNum, vm::ptr puiLoopStatus) { cellAtrac->Todo("cellAtracGetLoopInfo(pHandle=0x%x, piLoopNum_addr=0x%x, puiLoopStatus_addr=0x%x)", pHandle.addr(), piLoopNum.addr(), puiLoopStatus.addr()); +#ifdef PRX_DEBUG + return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x025C, libatrac3plus_rtoc); +#endif *piLoopNum = 0; *puiLoopStatus = 0; return CELL_OK; } -int cellAtracSetLoopNum(vm::ptr pHandle, int iLoopNum) +s32 cellAtracSetLoopNum(vm::ptr pHandle, int iLoopNum) { cellAtrac->Todo("cellAtracSetLoopNum(pHandle=0x%x, iLoopNum=0x%x)", pHandle.addr(), iLoopNum); +#ifdef PRX_DEBUG + return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x1538, libatrac3plus_rtoc); +#endif + return CELL_OK; } -int cellAtracGetBufferInfoForResetting(vm::ptr pHandle, u32 uiSample, vm::ptr pBufferInfo) +s32 cellAtracGetBufferInfoForResetting(vm::ptr pHandle, u32 uiSample, vm::ptr pBufferInfo) { cellAtrac->Todo("cellAtracGetBufferInfoForResetting(pHandle=0x%x, uiSample=0x%x, pBufferInfo_addr=0x%x)", pHandle.addr(), uiSample, pBufferInfo.addr()); +#ifdef PRX_DEBUG + return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x05BC, libatrac3plus_rtoc); +#endif pBufferInfo->pucWriteAddr = pHandle->data.pucWorkMem_addr; pBufferInfo->uiWritableByte = 0x1000; @@ -187,17 +262,24 @@ int cellAtracGetBufferInfoForResetting(vm::ptr pHandle, u32 uiS return CELL_OK; } -int cellAtracResetPlayPosition(vm::ptr pHandle, u32 uiSample, u32 uiWriteByte) +s32 cellAtracResetPlayPosition(vm::ptr pHandle, u32 uiSample, u32 uiWriteByte) { cellAtrac->Todo("cellAtracResetPlayPosition(pHandle=0x%x, uiSample=0x%x, uiWriteByte=0x%x)", pHandle.addr(), uiSample, uiWriteByte); +#ifdef PRX_DEBUG + return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x04E4, libatrac3plus_rtoc); +#endif + return CELL_OK; } -int cellAtracGetInternalErrorInfo(vm::ptr pHandle, vm::ptr piResult) +s32 cellAtracGetInternalErrorInfo(vm::ptr pHandle, vm::ptr piResult) { cellAtrac->Todo("cellAtracGetInternalErrorInfo(pHandle=0x%x, piResult_addr=0x%x)", pHandle.addr(), piResult.addr()); +#ifdef PRX_DEBUG + return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x02E4, libatrac3plus_rtoc); +#endif *piResult = 0; return CELL_OK; @@ -237,4 +319,25 @@ void cellAtrac_init(Module *pxThis) cellAtrac->AddFunc(0x7772eb2b, cellAtracResetPlayPosition); cellAtrac->AddFunc(0xb5c11938, cellAtracGetInternalErrorInfo); + +#ifdef PRX_DEBUG + CallAfter([]() + { + libatrac3plus = (u32)Memory.MainMem.AllocAlign(sizeof(libatrac3plus_data), 0x100000); + memcpy(vm::get_ptr(libatrac3plus), libatrac3plus_data, sizeof(libatrac3plus_data)); + libatrac3plus_rtoc = libatrac3plus + 0xBED0; + + extern Module* cellAdec; + + FIX_IMPORT(cellAdec, cellAdecDecodeAu, libatrac3plus + 0x399C); + FIX_IMPORT(cellAdec, cellAdecStartSeq, libatrac3plus + 0x39BC); + FIX_IMPORT(cellAdec, cellAdecQueryAttr, libatrac3plus + 0x39DC); + FIX_IMPORT(cellAdec, cellAdecClose, libatrac3plus + 0x39FC); + FIX_IMPORT(cellAdec, cellAdecGetPcm, libatrac3plus + 0x3A1C); + FIX_IMPORT(cellAdec, cellAdecOpen, libatrac3plus + 0x3A3C); + fix_import(cellAdec, 0xDF982D2C, libatrac3plus + 0x3A5C); + + fix_relocs(cellAtrac, libatrac3plus, 0x3EF0, 0x5048, 0x3CE0); + }); +#endif } diff --git a/rpcs3/Emu/SysCalls/Modules/cellAtrac.h b/rpcs3/Emu/SysCalls/Modules/cellAtrac.h index 809bcc6d10..c6102316b9 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellAtrac.h +++ b/rpcs3/Emu/SysCalls/Modules/cellAtrac.h @@ -3,7 +3,6 @@ // Return Codes enum { - CELL_ATRAC_OK = 0x00000000, CELL_ATRAC_ERROR_API_FAIL = 0x80610301, CELL_ATRAC_ERROR_READSIZE_OVER_BUFFER = 0x80610311, CELL_ATRAC_ERROR_UNKNOWN_FORMAT = 0x80610312, @@ -27,6 +26,32 @@ enum CELL_ATRAC_ERROR_ILLEGAL_SPU_THREAD_PRIORITY = 0x80610382, }; +enum +{ + CELL_ATRACMULTI_ERROR_API_FAIL = 0x80610b01, + CELL_ATRACMULTI_ERROR_READSIZE_OVER_BUFFER = 0x80610b11, + CELL_ATRACMULTI_ERROR_UNKNOWN_FORMAT = 0x80610b12, + CELL_ATRACMULTI_ERROR_READSIZE_IS_TOO_SMALL = 0x80610b13, + CELL_ATRACMULTI_ERROR_ILLEGAL_SAMPLING_RATE = 0x80610b14, + CELL_ATRACMULTI_ERROR_ILLEGAL_DATA = 0x80610b15, + CELL_ATRACMULTI_ERROR_NO_DECODER = 0x80610b21, + CELL_ATRACMULTI_ERROR_UNSET_DATA = 0x80610b22, + CELL_ATRACMULTI_ERROR_DECODER_WAS_CREATED = 0x80610b23, + CELL_ATRACMULTI_ERROR_ALLDATA_WAS_DECODED = 0x80610b31, + CELL_ATRACMULTI_ERROR_NODATA_IN_BUFFER = 0x80610b32, + CELL_ATRACMULTI_ERROR_NOT_ALIGNED_OUT_BUFFER = 0x80610b33, + CELL_ATRACMULTI_ERROR_NEED_SECOND_BUFFER = 0x80610b34, + CELL_ATRACMULTI_ERROR_ALLDATA_IS_ONMEMORY = 0x80610b41, + CELL_ATRACMULTI_ERROR_ADD_DATA_IS_TOO_BIG = 0x80610b42, + CELL_ATRACMULTI_ERROR_NONEED_SECOND_BUFFER = 0x80610b51, + CELL_ATRACMULTI_ERROR_UNSET_LOOP_NUM = 0x80610b61, + CELL_ATRACMULTI_ERROR_ILLEGAL_SAMPLE = 0x80610b71, + CELL_ATRACMULTI_ERROR_ILLEGAL_RESET_BYTE = 0x80610b72, + CELL_ATRACMULTI_ERROR_ILLEGAL_PPU_THREAD_PRIORITY = 0x80610b81, + CELL_ATRACMULTI_ERROR_ILLEGAL_SPU_THREAD_PRIORITY = 0x80610b82, + CELL_ATRACMULTI_ERROR_API_PARAMETER = 0x80610b91, +}; + // Remain Frame enum { @@ -38,6 +63,7 @@ enum union CellAtracHandle { u8 uiWorkMem[512]; + struct AtracHandle { u32 pucWorkMem_addr; @@ -56,4 +82,4 @@ struct CellAtracExtRes { be_t pSpurs_addr; u8 priority[8]; -}; \ No newline at end of file +}; diff --git a/rpcs3/Emu/SysCalls/Modules/cellAudio.cpp b/rpcs3/Emu/SysCalls/Modules/cellAudio.cpp index 0b179d54e1..f302a9fc2f 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellAudio.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellAudio.cpp @@ -337,7 +337,7 @@ int cellAudioInit() // 2x MAXPS (optional) // 2x MINPS (optional) // 2x CVTPS2DQ (converts float to s32) - // PACKSSDW (converts s32 to s16 with clipping) + // PACKSSDW (converts s32 to s16 with signed saturation) if (g_is_u16) { diff --git a/rpcs3/Emu/SysCalls/Modules/cellDmux.cpp b/rpcs3/Emu/SysCalls/Modules/cellDmux.cpp index 0c8704c934..116169406e 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellDmux.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellDmux.cpp @@ -401,11 +401,6 @@ u32 dmuxOpen(Demuxer* data) PesHeader pes(stream); - if (!pes.new_au) // temporarily - { - cellDmux->Error("No pts info found"); - } - // read additional header: stream.peek(ch); // ??? //stream.skip(4); From 65ddf980e086d1e9487c2d3f2108de05d907d72f Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Tue, 28 Oct 2014 15:30:37 +0300 Subject: [PATCH 06/27] Small fix --- rpcs3/Emu/Cell/SPUInterpreter.h | 48 +++++++++++++++++++++++++ rpcs3/Emu/SysCalls/Modules/cellAdec.cpp | 8 +---- 2 files changed, 49 insertions(+), 7 deletions(-) diff --git a/rpcs3/Emu/Cell/SPUInterpreter.h b/rpcs3/Emu/Cell/SPUInterpreter.h index 7f88e6e3ec..4d8125575f 100644 --- a/rpcs3/Emu/Cell/SPUInterpreter.h +++ b/rpcs3/Emu/Cell/SPUInterpreter.h @@ -475,6 +475,12 @@ private: { const u32 t = (CPU.GPR[rb]._u32[3] + CPU.GPR[ra]._u32[3]) & 0xF; + if (ra == 1 && (CPU.GPR[ra]._u32[3] & 0xF)) + { + LOG_ERROR(SPU, "%s(): SP = 0x%x", __FUNCTION__, CPU.GPR[ra]._u32[3]); + Emu.Pause(); + } + CPU.GPR[rt]._u64[0] = (u64)0x18191A1B1C1D1E1F; CPU.GPR[rt]._u64[1] = (u64)0x1011121314151617; CPU.GPR[rt]._u8[15 - t] = 0x03; @@ -483,6 +489,12 @@ private: { const u32 t = (CPU.GPR[rb]._u32[3] + CPU.GPR[ra]._u32[3]) & 0xE; + if (ra == 1 && (CPU.GPR[ra]._u32[3] & 0xF)) + { + LOG_ERROR(SPU, "%s(): SP = 0x%x", __FUNCTION__, CPU.GPR[ra]._u32[3]); + Emu.Pause(); + } + CPU.GPR[rt]._u64[0] = (u64)0x18191A1B1C1D1E1F; CPU.GPR[rt]._u64[1] = (u64)0x1011121314151617; CPU.GPR[rt]._u16[7 - (t >> 1)] = 0x0203; @@ -490,6 +502,12 @@ private: void CWX(u32 rt, u32 ra, u32 rb) { const u32 t = (CPU.GPR[ra]._u32[3] + CPU.GPR[rb]._u32[3]) & 0xC; + + if (ra == 1 && (CPU.GPR[ra]._u32[3] & 0xF)) + { + LOG_ERROR(SPU, "%s(): SP = 0x%x", __FUNCTION__, CPU.GPR[ra]._u32[3]); + Emu.Pause(); + } CPU.GPR[rt]._u64[0] = (u64)0x18191A1B1C1D1E1F; CPU.GPR[rt]._u64[1] = (u64)0x1011121314151617; @@ -499,6 +517,12 @@ private: { const u32 t = (CPU.GPR[rb]._u32[3] + CPU.GPR[ra]._u32[3]) & 0x8; + if (ra == 1 && (CPU.GPR[ra]._u32[3] & 0xF)) + { + LOG_ERROR(SPU, "%s(): SP = 0x%x", __FUNCTION__, CPU.GPR[ra]._u32[3]); + Emu.Pause(); + } + CPU.GPR[rt]._u64[0] = (u64)0x18191A1B1C1D1E1F; CPU.GPR[rt]._u64[1] = (u64)0x1011121314151617; CPU.GPR[rt]._u64[1 - (t >> 3)] = (u64)0x0001020304050607; @@ -584,6 +608,12 @@ private: { const int t = (CPU.GPR[ra]._u32[3] + i7) & 0xF; + if (ra == 1 && (CPU.GPR[ra]._u32[3] & 0xF)) + { + LOG_ERROR(SPU, "%s(): SP = 0x%x", __FUNCTION__, CPU.GPR[ra]._u32[3]); + Emu.Pause(); + } + CPU.GPR[rt]._u64[0] = (u64)0x18191A1B1C1D1E1F; CPU.GPR[rt]._u64[1] = (u64)0x1011121314151617; CPU.GPR[rt]._u8[15 - t] = 0x03; @@ -592,6 +622,12 @@ private: { const int t = (CPU.GPR[ra]._u32[3] + i7) & 0xE; + if (ra == 1 && (CPU.GPR[ra]._u32[3] & 0xF)) + { + LOG_ERROR(SPU, "%s(): SP = 0x%x", __FUNCTION__, CPU.GPR[ra]._u32[3]); + Emu.Pause(); + } + CPU.GPR[rt]._u64[0] = (u64)0x18191A1B1C1D1E1F; CPU.GPR[rt]._u64[1] = (u64)0x1011121314151617; CPU.GPR[rt]._u16[7 - (t >> 1)] = 0x0203; @@ -600,6 +636,12 @@ private: { const int t = (CPU.GPR[ra]._u32[3] + i7) & 0xC; + if (ra == 1 && (CPU.GPR[ra]._u32[3] & 0xF)) + { + LOG_ERROR(SPU, "%s(): SP = 0x%x", __FUNCTION__, CPU.GPR[ra]._u32[3]); + Emu.Pause(); + } + CPU.GPR[rt]._u64[0] = (u64)0x18191A1B1C1D1E1F; CPU.GPR[rt]._u64[1] = (u64)0x1011121314151617; CPU.GPR[rt]._u32[3 - (t >> 2)] = 0x00010203; @@ -608,6 +650,12 @@ private: { const int t = (CPU.GPR[ra]._u32[3] + i7) & 0x8; + if (ra == 1 && (CPU.GPR[ra]._u32[3] & 0xF)) + { + LOG_ERROR(SPU, "%s(): SP = 0x%x", __FUNCTION__, CPU.GPR[ra]._u32[3]); + Emu.Pause(); + } + CPU.GPR[rt]._u64[0] = (u64)0x18191A1B1C1D1E1F; CPU.GPR[rt]._u64[1] = (u64)0x1011121314151617; CPU.GPR[rt]._u64[1 - (t >> 3)] = (u64)0x0001020304050607; diff --git a/rpcs3/Emu/SysCalls/Modules/cellAdec.cpp b/rpcs3/Emu/SysCalls/Modules/cellAdec.cpp index 972eb1c593..e23461cda8 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellAdec.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellAdec.cpp @@ -651,7 +651,7 @@ int cellAdecDecodeAu(u32 handle, vm::ptr auInfo) task.au.pts = ((u64)auInfo->pts.upper << 32) | (u64)auInfo->pts.lower; task.au.userdata = auInfo->userData; - cellAdec->Notice("cellAdecDecodeAu(): addr=0x%x, size=0x%x, pts=0x%llx", task.au.addr, task.au.size, task.au.pts); + //cellAdec->Notice("cellAdecDecodeAu(): addr=0x%x, size=0x%x, pts=0x%llx", task.au.addr, task.au.size, task.au.pts); adec->job.Push(task, &adec->is_closed); return CELL_OK; } @@ -675,12 +675,6 @@ int cellAdecGetPcm(u32 handle, vm::ptr outBuffer) AVFrame* frame = af.data; - if (!af.data) - { - // hack - return CELL_OK; - } - if (outBuffer) { // reverse byte order: From 0f602e0e13d8fec6a604a1e254e168e70c764f7f Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Tue, 28 Oct 2014 19:46:14 +0300 Subject: [PATCH 07/27] Bugfix --- rpcs3/Emu/Cell/SPURecompiler.h | 16 ++++----- rpcs3/Emu/SysCalls/Modules/cellAtrac.cpp | 46 ++++++++++++------------ 2 files changed, 31 insertions(+), 31 deletions(-) diff --git a/rpcs3/Emu/Cell/SPURecompiler.h b/rpcs3/Emu/Cell/SPURecompiler.h index d1d3916d8d..437ebbcd97 100644 --- a/rpcs3/Emu/Cell/SPURecompiler.h +++ b/rpcs3/Emu/Cell/SPURecompiler.h @@ -1571,8 +1571,8 @@ private: { // assuming that SP % 16 is always zero const XmmLink& vr = XmmAlloc(rt); - u128 value = u128::from32r(0x10111213, 0x14151617, 0x18191a1b, 0x1c1d1e1f); - value._u8[i7 & 0xf] = 0x03; + u128 value = u128::fromV(_mm_set_epi32(0x10111213, 0x14151617, 0x18191a1b, 0x1c1d1e1f)); + value.u8r[i7 & 0xf] = 0x03; c.movdqa(vr.get(), XmmConst(value.vi)); XmmFinalize(vr, rt); } @@ -1596,8 +1596,8 @@ private: { // assuming that SP % 16 is always zero const XmmLink& vr = XmmAlloc(rt); - u128 value = u128::from32r(0x10111213, 0x14151617, 0x18191a1b, 0x1c1d1e1f); - value._u16[i7 & 0x7] = 0x0203; + u128 value = u128::fromV(_mm_set_epi32(0x10111213, 0x14151617, 0x18191a1b, 0x1c1d1e1f)); + value.u16r[(i7 >> 1) & 0x7] = 0x0203; c.movdqa(vr.get(), XmmConst(value.vi)); XmmFinalize(vr, rt); } @@ -1621,8 +1621,8 @@ private: { // assuming that SP % 16 is always zero const XmmLink& vr = XmmAlloc(rt); - u128 value = u128::from32r(0x10111213, 0x14151617, 0x18191a1b, 0x1c1d1e1f); - value._u32[i7 & 0x3] = 0x00010203; + u128 value = u128::fromV(_mm_set_epi32(0x10111213, 0x14151617, 0x18191a1b, 0x1c1d1e1f)); + value.u32r[(i7 >> 2) & 0x3] = 0x00010203; c.movdqa(vr.get(), XmmConst(value.vi)); XmmFinalize(vr, rt); } @@ -1646,8 +1646,8 @@ private: { // assuming that SP % 16 is always zero const XmmLink& vr = XmmAlloc(rt); - u128 value = u128::from32r(0x10111213, 0x14151617, 0x18191a1b, 0x1c1d1e1f); - value._u64[i7 & 0x1] = 0x0001020304050607ull; + u128 value = u128::fromV(_mm_set_epi32(0x10111213, 0x14151617, 0x18191a1b, 0x1c1d1e1f)); + value.u64r[(i7 >> 3) & 0x1] = 0x0001020304050607ull; c.movdqa(vr.get(), XmmConst(value.vi)); XmmFinalize(vr, rt); } diff --git a/rpcs3/Emu/SysCalls/Modules/cellAtrac.cpp b/rpcs3/Emu/SysCalls/Modules/cellAtrac.cpp index d2cf50a532..57442cdd91 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellAtrac.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellAtrac.cpp @@ -15,7 +15,7 @@ u32 libatrac3plus_rtoc; s32 cellAtracSetDataAndGetMemSize(vm::ptr pHandle, u32 pucBufferAddr, u32 uiReadByte, u32 uiBufferByte, vm::ptr puiWorkMemByte) { - cellAtrac->Todo("cellAtracSetDataAndGetMemSize(pHandle=0x%x, pucBufferAddr=0x%x, uiReadByte=0x%x, uiBufferByte=0x%x, puiWorkMemByte_addr=0x%x)", + cellAtrac->Warning("cellAtracSetDataAndGetMemSize(pHandle=0x%x, pucBufferAddr=0x%x, uiReadByte=0x%x, uiBufferByte=0x%x, puiWorkMemByte_addr=0x%x)", pHandle.addr(), pucBufferAddr, uiReadByte, uiBufferByte, puiWorkMemByte.addr()); #ifdef PRX_DEBUG return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x11F4, libatrac3plus_rtoc); @@ -27,7 +27,7 @@ s32 cellAtracSetDataAndGetMemSize(vm::ptr pHandle, u32 pucBuffe s32 cellAtracCreateDecoder(vm::ptr pHandle, u32 pucWorkMem_addr, u32 uiPpuThreadPriority, u32 uiSpuThreadPriority) { - cellAtrac->Todo("cellAtracCreateDecoder(pHandle=0x%x, pucWorkMem_addr=0x%x, uiPpuThreadPriority=%d, uiSpuThreadPriority=%d)", + cellAtrac->Warning("cellAtracCreateDecoder(pHandle=0x%x, pucWorkMem_addr=0x%x, uiPpuThreadPriority=%d, uiSpuThreadPriority=%d)", pHandle.addr(), pucWorkMem_addr, uiPpuThreadPriority, uiSpuThreadPriority); #ifdef PRX_DEBUG return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x0FF0, libatrac3plus_rtoc); @@ -39,7 +39,7 @@ s32 cellAtracCreateDecoder(vm::ptr pHandle, u32 pucWorkMem_addr s32 cellAtracCreateDecoderExt(vm::ptr pHandle, u32 pucWorkMem_addr, u32 uiPpuThreadPriority, vm::ptr pExtRes) { - cellAtrac->Todo("cellAtracCreateDecoderExt(pHandle=0x%x, pucWorkMem_addr=0x%x, uiPpuThreadPriority=%d, pExtRes_addr=0x%x)", + cellAtrac->Warning("cellAtracCreateDecoderExt(pHandle=0x%x, pucWorkMem_addr=0x%x, uiPpuThreadPriority=%d, pExtRes_addr=0x%x)", pHandle.addr(), pucWorkMem_addr, uiPpuThreadPriority, pExtRes.addr()); #ifdef PRX_DEBUG return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x0DB0, libatrac3plus_rtoc); @@ -51,7 +51,7 @@ s32 cellAtracCreateDecoderExt(vm::ptr pHandle, u32 pucWorkMem_a s32 cellAtracDeleteDecoder(vm::ptr pHandle) { - cellAtrac->Todo("cellAtracDeleteDecoder(pHandle=0x%x)", pHandle.addr()); + cellAtrac->Warning("cellAtracDeleteDecoder(pHandle=0x%x)", pHandle.addr()); #ifdef PRX_DEBUG return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x0D08, libatrac3plus_rtoc); #endif @@ -61,7 +61,7 @@ s32 cellAtracDeleteDecoder(vm::ptr pHandle) s32 cellAtracDecode(vm::ptr pHandle, u32 pfOutAddr, vm::ptr puiSamples, vm::ptr puiFinishflag, vm::ptr piRemainFrame) { - cellAtrac->Todo("cellAtracDecode(pHandle=0x%x, pfOutAddr=0x%x, puiSamples_addr=0x%x, puiFinishFlag_addr=0x%x, piRemainFrame_addr=0x%x)", + cellAtrac->Warning("cellAtracDecode(pHandle=0x%x, pfOutAddr=0x%x, puiSamples_addr=0x%x, puiFinishFlag_addr=0x%x, piRemainFrame_addr=0x%x)", pHandle.addr(), pfOutAddr, puiSamples.addr(), puiFinishflag.addr(), piRemainFrame.addr()); #ifdef PRX_DEBUG return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x09A8, libatrac3plus_rtoc); @@ -75,7 +75,7 @@ s32 cellAtracDecode(vm::ptr pHandle, u32 pfOutAddr, vm::ptr pHandle, vm::ptr ppucWritePointer, vm::ptr puiWritableByte, vm::ptr puiReadPosition) { - cellAtrac->Todo("cellAtracGetStreamDataInfo(pHandle=0x%x, ppucWritePointer_addr=0x%x, puiWritableByte_addr=0x%x, puiReadPosition_addr=0x%x)", + cellAtrac->Warning("cellAtracGetStreamDataInfo(pHandle=0x%x, ppucWritePointer_addr=0x%x, puiWritableByte_addr=0x%x, puiReadPosition_addr=0x%x)", pHandle.addr(), ppucWritePointer.addr(), puiWritableByte.addr(), puiReadPosition.addr()); #ifdef PRX_DEBUG return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x0BE8, libatrac3plus_rtoc); @@ -89,7 +89,7 @@ s32 cellAtracGetStreamDataInfo(vm::ptr pHandle, vm::ptr pp s32 cellAtracAddStreamData(vm::ptr pHandle, u32 uiAddByte) { - cellAtrac->Todo("cellAtracAddStreamData(pHandle=0x%x, uiAddByte=0x%x)", pHandle.addr(), uiAddByte); + cellAtrac->Warning("cellAtracAddStreamData(pHandle=0x%x, uiAddByte=0x%x)", pHandle.addr(), uiAddByte); #ifdef PRX_DEBUG return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x0AFC, libatrac3plus_rtoc); #endif @@ -99,7 +99,7 @@ s32 cellAtracAddStreamData(vm::ptr pHandle, u32 uiAddByte) s32 cellAtracGetRemainFrame(vm::ptr pHandle, vm::ptr piRemainFrame) { - cellAtrac->Todo("cellAtracGetRemainFrame(pHandle=0x%x, piRemainFrame_addr=0x%x)", pHandle.addr(), piRemainFrame.addr()); + cellAtrac->Warning("cellAtracGetRemainFrame(pHandle=0x%x, piRemainFrame_addr=0x%x)", pHandle.addr(), piRemainFrame.addr()); #ifdef PRX_DEBUG return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x092C, libatrac3plus_rtoc); #endif @@ -110,7 +110,7 @@ s32 cellAtracGetRemainFrame(vm::ptr pHandle, vm::ptr piRem s32 cellAtracGetVacantSize(vm::ptr pHandle, vm::ptr puiVacantSize) { - cellAtrac->Todo("cellAtracGetVacantSize(pHandle=0x%x, puiVacantSize_addr=0x%x)", pHandle.addr(), puiVacantSize.addr()); + cellAtrac->Warning("cellAtracGetVacantSize(pHandle=0x%x, puiVacantSize_addr=0x%x)", pHandle.addr(), puiVacantSize.addr()); #ifdef PRX_DEBUG return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x08B0, libatrac3plus_rtoc); #endif @@ -121,7 +121,7 @@ s32 cellAtracGetVacantSize(vm::ptr pHandle, vm::ptr puiVac s32 cellAtracIsSecondBufferNeeded(vm::ptr pHandle) { - cellAtrac->Todo("cellAtracIsSecondBufferNeeded(pHandle=0x%x)", pHandle.addr()); + cellAtrac->Warning("cellAtracIsSecondBufferNeeded(pHandle=0x%x)", pHandle.addr()); #ifdef PRX_DEBUG return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x0010, libatrac3plus_rtoc); #endif @@ -131,7 +131,7 @@ s32 cellAtracIsSecondBufferNeeded(vm::ptr pHandle) s32 cellAtracGetSecondBufferInfo(vm::ptr pHandle, vm::ptr puiReadPosition, vm::ptr puiDataByte) { - cellAtrac->Todo("cellAtracGetSecondBufferInfo(pHandle=0x%x, puiReadPosition_addr=0x%x, puiDataByte_addr=0x%x)", + cellAtrac->Warning("cellAtracGetSecondBufferInfo(pHandle=0x%x, puiReadPosition_addr=0x%x, puiDataByte_addr=0x%x)", pHandle.addr(), puiReadPosition.addr(), puiDataByte.addr()); #ifdef PRX_DEBUG return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x07E8, libatrac3plus_rtoc); @@ -144,7 +144,7 @@ s32 cellAtracGetSecondBufferInfo(vm::ptr pHandle, vm::ptr s32 cellAtracSetSecondBuffer(vm::ptr pHandle, u32 pucSecondBufferAddr, u32 uiSecondBufferByte) { - cellAtrac->Todo("cellAtracSetSecondBuffer(pHandle=0x%x, pucSecondBufferAddr=0x%x, uiSecondBufferByte=0x%x)", + cellAtrac->Warning("cellAtracSetSecondBuffer(pHandle=0x%x, pucSecondBufferAddr=0x%x, uiSecondBufferByte=0x%x)", pHandle.addr(), pucSecondBufferAddr, uiSecondBufferByte); #ifdef PRX_DEBUG return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x0704, libatrac3plus_rtoc); @@ -155,7 +155,7 @@ s32 cellAtracSetSecondBuffer(vm::ptr pHandle, u32 pucSecondBuff s32 cellAtracGetChannel(vm::ptr pHandle, vm::ptr puiChannel) { - cellAtrac->Todo("cellAtracGetChannel(pHandle=0x%x, puiChannel_addr=0x%x)", pHandle.addr(), puiChannel.addr()); + cellAtrac->Warning("cellAtracGetChannel(pHandle=0x%x, puiChannel_addr=0x%x)", pHandle.addr(), puiChannel.addr()); #ifdef PRX_DEBUG return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x0060, libatrac3plus_rtoc); #endif @@ -166,7 +166,7 @@ s32 cellAtracGetChannel(vm::ptr pHandle, vm::ptr puiChanne s32 cellAtracGetMaxSample(vm::ptr pHandle, vm::ptr puiMaxSample) { - cellAtrac->Todo("cellAtracGetMaxSample(pHandle=0x%x, puiMaxSample_addr=0x%x)", pHandle.addr(), puiMaxSample.addr()); + cellAtrac->Warning("cellAtracGetMaxSample(pHandle=0x%x, puiMaxSample_addr=0x%x)", pHandle.addr(), puiMaxSample.addr()); #ifdef PRX_DEBUG return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x00AC, libatrac3plus_rtoc); #endif @@ -177,7 +177,7 @@ s32 cellAtracGetMaxSample(vm::ptr pHandle, vm::ptr puiMaxS s32 cellAtracGetNextSample(vm::ptr pHandle, vm::ptr puiNextSample) { - cellAtrac->Todo("cellAtracGetNextSample(pHandle=0x%x, puiNextSample_addr=0x%x)", pHandle.addr(), puiNextSample.addr()); + cellAtrac->Warning("cellAtracGetNextSample(pHandle=0x%x, puiNextSample_addr=0x%x)", pHandle.addr(), puiNextSample.addr()); #ifdef PRX_DEBUG return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x0688, libatrac3plus_rtoc); #endif @@ -188,7 +188,7 @@ s32 cellAtracGetNextSample(vm::ptr pHandle, vm::ptr puiNex s32 cellAtracGetSoundInfo(vm::ptr pHandle, vm::ptr piEndSample, vm::ptr piLoopStartSample, vm::ptr piLoopEndSample) { - cellAtrac->Todo("cellAtracGetSoundInfo(pHandle=0x%x, piEndSample_addr=0x%x, piLoopStartSample_addr=0x%x, piLoopEndSample_addr=0x%x)", + cellAtrac->Warning("cellAtracGetSoundInfo(pHandle=0x%x, piEndSample_addr=0x%x, piLoopStartSample_addr=0x%x, piLoopEndSample_addr=0x%x)", pHandle.addr(), piEndSample.addr(), piLoopStartSample.addr(), piLoopEndSample.addr()); #ifdef PRX_DEBUG return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x0104, libatrac3plus_rtoc); @@ -202,7 +202,7 @@ s32 cellAtracGetSoundInfo(vm::ptr pHandle, vm::ptr piEndSa s32 cellAtracGetNextDecodePosition(vm::ptr pHandle, vm::ptr puiSamplePosition) { - cellAtrac->Todo("cellAtracGetNextDecodePosition(pHandle=0x%x, puiSamplePosition_addr=0x%x)", + cellAtrac->Warning("cellAtracGetNextDecodePosition(pHandle=0x%x, puiSamplePosition_addr=0x%x)", pHandle.addr(), puiSamplePosition.addr()); #ifdef PRX_DEBUG return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x0190, libatrac3plus_rtoc); @@ -214,7 +214,7 @@ s32 cellAtracGetNextDecodePosition(vm::ptr pHandle, vm::ptr pHandle, vm::ptr puiBitrate) { - cellAtrac->Todo("cellAtracGetBitrate(pHandle=0x%x, puiBitrate_addr=0x%x)", + cellAtrac->Warning("cellAtracGetBitrate(pHandle=0x%x, puiBitrate_addr=0x%x)", pHandle.addr(), puiBitrate.addr()); #ifdef PRX_DEBUG return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x0374, libatrac3plus_rtoc); @@ -226,7 +226,7 @@ s32 cellAtracGetBitrate(vm::ptr pHandle, vm::ptr puiBitrat s32 cellAtracGetLoopInfo(vm::ptr pHandle, vm::ptr piLoopNum, vm::ptr puiLoopStatus) { - cellAtrac->Todo("cellAtracGetLoopInfo(pHandle=0x%x, piLoopNum_addr=0x%x, puiLoopStatus_addr=0x%x)", + cellAtrac->Warning("cellAtracGetLoopInfo(pHandle=0x%x, piLoopNum_addr=0x%x, puiLoopStatus_addr=0x%x)", pHandle.addr(), piLoopNum.addr(), puiLoopStatus.addr()); #ifdef PRX_DEBUG return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x025C, libatrac3plus_rtoc); @@ -239,7 +239,7 @@ s32 cellAtracGetLoopInfo(vm::ptr pHandle, vm::ptr piLoopNu s32 cellAtracSetLoopNum(vm::ptr pHandle, int iLoopNum) { - cellAtrac->Todo("cellAtracSetLoopNum(pHandle=0x%x, iLoopNum=0x%x)", pHandle.addr(), iLoopNum); + cellAtrac->Warning("cellAtracSetLoopNum(pHandle=0x%x, iLoopNum=0x%x)", pHandle.addr(), iLoopNum); #ifdef PRX_DEBUG return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x1538, libatrac3plus_rtoc); #endif @@ -249,7 +249,7 @@ s32 cellAtracSetLoopNum(vm::ptr pHandle, int iLoopNum) s32 cellAtracGetBufferInfoForResetting(vm::ptr pHandle, u32 uiSample, vm::ptr pBufferInfo) { - cellAtrac->Todo("cellAtracGetBufferInfoForResetting(pHandle=0x%x, uiSample=0x%x, pBufferInfo_addr=0x%x)", + cellAtrac->Warning("cellAtracGetBufferInfoForResetting(pHandle=0x%x, uiSample=0x%x, pBufferInfo_addr=0x%x)", pHandle.addr(), uiSample, pBufferInfo.addr()); #ifdef PRX_DEBUG return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x05BC, libatrac3plus_rtoc); @@ -264,7 +264,7 @@ s32 cellAtracGetBufferInfoForResetting(vm::ptr pHandle, u32 uiS s32 cellAtracResetPlayPosition(vm::ptr pHandle, u32 uiSample, u32 uiWriteByte) { - cellAtrac->Todo("cellAtracResetPlayPosition(pHandle=0x%x, uiSample=0x%x, uiWriteByte=0x%x)", + cellAtrac->Warning("cellAtracResetPlayPosition(pHandle=0x%x, uiSample=0x%x, uiWriteByte=0x%x)", pHandle.addr(), uiSample, uiWriteByte); #ifdef PRX_DEBUG return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x04E4, libatrac3plus_rtoc); @@ -275,7 +275,7 @@ s32 cellAtracResetPlayPosition(vm::ptr pHandle, u32 uiSample, u s32 cellAtracGetInternalErrorInfo(vm::ptr pHandle, vm::ptr piResult) { - cellAtrac->Todo("cellAtracGetInternalErrorInfo(pHandle=0x%x, piResult_addr=0x%x)", + cellAtrac->Warning("cellAtracGetInternalErrorInfo(pHandle=0x%x, piResult_addr=0x%x)", pHandle.addr(), piResult.addr()); #ifdef PRX_DEBUG return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x02E4, libatrac3plus_rtoc); From bf6415accd26c6633c89281113079a96965204ba Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Wed, 29 Oct 2014 07:13:34 +0300 Subject: [PATCH 08/27] Tiny ARMv7 interpreter update --- rpcs3/Emu/ARMv7/ARMv7Decoder.h | 119 +---------- rpcs3/Emu/ARMv7/ARMv7DisAsm.cpp | 92 +++++++++ rpcs3/Emu/ARMv7/ARMv7DisAsm.h | 57 ++---- rpcs3/Emu/ARMv7/ARMv7Interpreter.cpp | 291 +++++++++++++++++++++++++++ rpcs3/Emu/ARMv7/ARMv7Interpreter.h | 72 ++----- rpcs3/Emu/ARMv7/ARMv7Opcodes.h | 88 +++++++- rpcs3/Emu/ARMv7/ARMv7Thread.cpp | 1 + rpcs3/emucore.vcxproj | 2 + rpcs3/emucore.vcxproj.filters | 6 + 9 files changed, 509 insertions(+), 219 deletions(-) create mode 100644 rpcs3/Emu/ARMv7/ARMv7DisAsm.cpp create mode 100644 rpcs3/Emu/ARMv7/ARMv7Interpreter.cpp diff --git a/rpcs3/Emu/ARMv7/ARMv7Decoder.h b/rpcs3/Emu/ARMv7/ARMv7Decoder.h index 298a23be51..923dc6a0f1 100644 --- a/rpcs3/Emu/ARMv7/ARMv7Decoder.h +++ b/rpcs3/Emu/ARMv7/ARMv7Decoder.h @@ -13,125 +13,22 @@ public: { } - u32 branchTarget(u32 imm) - { - return imm << 1; - } - virtual u8 DecodeMemory(const u32 address) { - using namespace ARMv7_opcodes; - const u16 code0 = vm::psv::read16(address); - const u16 code1 = vm::psv::read16(address + 2); + const u32 code0 = vm::psv::read16(address & ~1); + const u32 code1 = vm::psv::read16(address + 2 & ~1); + const u32 data = code0 << 16 | code1; - switch(code0 >> 12) //15 - 12 + for (auto& opcode : ARMv7_opcode_table) { - case T1_CBZ: - switch((code0 >> 10) & 0x1) + if ((opcode.type >= A1) == ((address & 1) == 0) && (data & opcode.mask) == opcode.code) { - case 0: - switch((code0 >> 8) & 0x1) - { - case 1: - m_op.CBZ((code0 >> 11) & 0x1, branchTarget((((code0 >> 9) & 0x1) << 5) | ((code0 >> 3) & 0x1f)), code0 & 0x7, 2); - return 2; - } - break; - } - break; - - case T1_B: - m_op.B((code0 >> 8) & 0xf, branchTarget(code0 & 0xff), 2); - return 2; - } - - switch(code0 >> 11) //15 - 11 - { - case T2_B: - m_op.B(0xf, branchTarget(code0 & 0xfff), 2); - return 2; - - case T3_B: - { - u8 S = (code0 >> 10) & 0x1; - u8 J1 = (code1 >> 13) & 0x1; - u8 J2 = (code1 >> 11) & 0x1; - u8 I1 = 1 - (J1 ^ S); - u8 I2 = 1 - (J2 ^ S); - u16 imm11 = code1 & 0x7ff; - u32 imm32 = 0; - - switch(code1 >> 14) - { - case 2: //B - { - u8 cond; - switch((code1 >> 12) & 0x1) - { - case 0: - { - cond = (code0 >> 6) & 0xf; - u32 imm6 = code0 & 0x3f; - imm32 = sign<19, u32>((S << 19) | (I1 << 18) | (I2 << 17) | (imm6 << 11) | imm11); - } - break; - - case 1: - cond = 0xf; - u32 imm10 = code0 & 0x7ff; - imm32 = sign<23, u32>((S << 23) | (I1 << 22) | (I2 << 21) | (imm10 << 11) | imm11); - break; - } - - m_op.B(cond, branchTarget(imm32), 4); - } - return 4; - - case 3: //BL - switch((code1 >> 12) & 0x1) - { - case 0: - break; - - case 1: - u32 imm10 = code0 & 0x7ff; - imm32 = sign<23, u32>((S << 23) | (I1 << 22) | (I2 << 21) | (imm10 << 11) | imm11); - m_op.BL(branchTarget(imm32), 4); - return 4; - } - break; + (m_op.*opcode.func)(opcode.length == 2 ? code0 : data, opcode.type); + return opcode.length; } } - break; - } - switch(code0 >> 9) - { - case T1_PUSH: - m_op.PUSH((((code0 >> 8) & 0x1) << 14) | (code0 & 0xff)); - return 2; - - case T1_POP: - m_op.POP((((code0 >> 8) & 0x1) << 15) | (code0 & 0xff)); - return 2; - } - - switch(code0) - { - case T2_PUSH: - m_op.PUSH(code1); - return 4; - - case T2_POP: - m_op.POP(code1); - return 4; - - case T1_NOP: - m_op.NOP(); - return 2; - } - - m_op.UNK(code0, code1); + m_op.UNK(data); return 2; } }; diff --git a/rpcs3/Emu/ARMv7/ARMv7DisAsm.cpp b/rpcs3/Emu/ARMv7/ARMv7DisAsm.cpp new file mode 100644 index 0000000000..fddba98bec --- /dev/null +++ b/rpcs3/Emu/ARMv7/ARMv7DisAsm.cpp @@ -0,0 +1,92 @@ +#include "stdafx.h" +#include "ARMv7DisAsm.h" + +void ARMv7DisAsm::UNK(const u32 data) +{ + Write("Unknown/illegal opcode"); +} + +void ARMv7DisAsm::NULL_OP(const u32 data, const ARMv7_encoding type) +{ + Write("NULL"); +} + +void ARMv7DisAsm::PUSH(const u32 data, const ARMv7_encoding type) +{ + Write("PUSH..."); + //Write(fmt::Format("push {%s}", GetRegsListString(regs_list).c_str())); +} + +void ARMv7DisAsm::POP(const u32 data, const ARMv7_encoding type) +{ + Write("POP..."); + //Write(fmt::Format("pop {%s}", GetRegsListString(regs_list).c_str())); +} + +void ARMv7DisAsm::NOP(const u32 data, const ARMv7_encoding type) +{ + Write("NOP"); +} + +void ARMv7DisAsm::B(const u32 data, const ARMv7_encoding type) +{ + Write("B..."); + //if ((cond & 0xe) == 0xe) + //{ + // Write(fmt::Format("b 0x%x", DisAsmBranchTarget(imm) + intstr_size)); + //} + //else + //{ + // Write(fmt::Format("b[%s] 0x%x", g_arm_cond_name[cond], DisAsmBranchTarget(imm) + intstr_size)); + //} +} + +void ARMv7DisAsm::CBZ(const u32 data, const ARMv7_encoding type) +{ + Write("CBZ..."); + //Write(fmt::Format("cbz 0x%x,%s", DisAsmBranchTarget(imm) + intstr_size, g_arm_reg_name[rn])); +} + +void ARMv7DisAsm::CBNZ(const u32 data, const ARMv7_encoding type) +{ + Write("CBNZ..."); + //Write(fmt::Format("cbnz 0x%x,%s", DisAsmBranchTarget(imm) + intstr_size, g_arm_reg_name[rn])); +} + +void ARMv7DisAsm::BL(const u32 data, const ARMv7_encoding type) +{ + Write("BL..."); + //Write(fmt::Format("bl 0x%x", DisAsmBranchTarget(imm) + intstr_size)); +} + +void ARMv7DisAsm::BLX(const u32 data, const ARMv7_encoding type) +{ + Write("BLX..."); + //Write(fmt::Format("bl 0x%x", DisAsmBranchTarget(imm) + intstr_size)); +} + +void ARMv7DisAsm::SUB_IMM(const u32 data, const ARMv7_encoding type) +{ + Write("SUB..."); +} + +void ARMv7DisAsm::SUB_REG(const u32 data, const ARMv7_encoding type) +{ + Write("SUB..."); +} + +void ARMv7DisAsm::SUB_RSR(const u32 data, const ARMv7_encoding type) +{ + Write("SUB..."); +} + +void ARMv7DisAsm::SUB_SPI(const u32 data, const ARMv7_encoding type) +{ + Write("SUB SP..."); +} + +void ARMv7DisAsm::SUB_SPR(const u32 data, const ARMv7_encoding type) +{ + Write("SUB SP..."); +} + diff --git a/rpcs3/Emu/ARMv7/ARMv7DisAsm.h b/rpcs3/Emu/ARMv7/ARMv7DisAsm.h index cf84835cd8..54067890b2 100644 --- a/rpcs3/Emu/ARMv7/ARMv7DisAsm.h +++ b/rpcs3/Emu/ARMv7/ARMv7DisAsm.h @@ -45,50 +45,23 @@ protected: return regs_str; } - void NULL_OP() - { - Write("null"); - } + void UNK(const u32 data); - void PUSH(u16 regs_list) - { - Write(fmt::Format("push {%s}", GetRegsListString(regs_list).c_str())); - } + void NULL_OP(const u32 data, const ARMv7_encoding type); + void NOP(const u32 data, const ARMv7_encoding type); - void POP(u16 regs_list) - { - Write(fmt::Format("pop {%s}", GetRegsListString(regs_list).c_str())); - } + void PUSH(const u32 data, const ARMv7_encoding type); + void POP(const u32 data, const ARMv7_encoding type); - void NOP() - { - Write("nop"); - } + void B(const u32 data, const ARMv7_encoding type); + void CBZ(const u32 data, const ARMv7_encoding type); + void CBNZ(const u32 data, const ARMv7_encoding type); + void BL(const u32 data, const ARMv7_encoding type); + void BLX(const u32 data, const ARMv7_encoding type); - void B(u8 cond, u32 imm, u8 intstr_size) - { - if((cond & 0xe) == 0xe) - { - Write(fmt::Format("b 0x%x", DisAsmBranchTarget(imm) + intstr_size)); - } - else - { - Write(fmt::Format("b[%s] 0x%x", g_arm_cond_name[cond], DisAsmBranchTarget(imm) + intstr_size)); - } - } - - virtual void CBZ(u8 op, u32 imm, u8 rn, u8 intstr_size) - { - Write(fmt::Format("cb%sz 0x%x,%s", (op ? "n" : ""), DisAsmBranchTarget(imm) + intstr_size, g_arm_reg_name[rn])); - } - - void BL(u32 imm, u8 intstr_size) - { - Write(fmt::Format("bl 0x%x", DisAsmBranchTarget(imm) + intstr_size)); - } - - void UNK(const u16 code0, const u16 code1) - { - Write(fmt::Format("Unknown/Illegal opcode! (0x%04x : 0x%04x)", code0, code1)); - } + void SUB_IMM(const u32 data, const ARMv7_encoding type); + void SUB_REG(const u32 data, const ARMv7_encoding type); + void SUB_RSR(const u32 data, const ARMv7_encoding type); + void SUB_SPI(const u32 data, const ARMv7_encoding type); + void SUB_SPR(const u32 data, const ARMv7_encoding type); }; diff --git a/rpcs3/Emu/ARMv7/ARMv7Interpreter.cpp b/rpcs3/Emu/ARMv7/ARMv7Interpreter.cpp new file mode 100644 index 0000000000..e20a0dd29c --- /dev/null +++ b/rpcs3/Emu/ARMv7/ARMv7Interpreter.cpp @@ -0,0 +1,291 @@ +#include "stdafx.h" +#include "Emu/System.h" +#include "Emu/Memory/Memory.h" +#include "Emu/CPU/CPUDecoder.h" +#include "ARMv7Thread.h" +#include "ARMv7Interpreter.h" + +void ARMv7Interpreter::UNK(const u32 data) +{ + LOG_ERROR(HLE, "Unknown/illegal opcode! (0x%04x : 0x%04x)", data >> 16, data & 0xffff); + Emu.Pause(); +} + +void ARMv7Interpreter::NULL_OP(const u32 data, const ARMv7_encoding type) +{ + LOG_ERROR(HLE, "Null opcode found"); + Emu.Pause(); +} + +void ARMv7Interpreter::NOP(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case T1: break; + case T2: break; + case A1: break; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::PUSH(const u32 data, const ARMv7_encoding type) +{ + u16 reg_list = 0; + + switch (type) + { + case T1: + { + reg_list = ((data & 0x100) << 6) | (data & 0xff); + break; + } + case T2: + { + reg_list = data & 0x5fff; + break; + } + case T3: + { + reg_list = 1 << (data >> 12); + break; + } + case A1: + { + reg_list = data & 0xffff; if (BitCount(reg_list) < 2) throw "STMDB / STMFD"; + if (!ConditionPassed(data >> 28)) return; + break; + } + case A2: + { + reg_list = 1 << ((data >> 12) & 0xf); + if (!ConditionPassed(data >> 28)) return; + break; + } + default: throw __FUNCTION__; + } + + for (u16 mask = 1 << 15, i = 15; mask; mask >>= 1, i--) + { + if (reg_list & mask) + { + CPU.SP -= 4; + vm::psv::write32(CPU.SP, CPU.read_gpr(i)); + } + } +} + +void ARMv7Interpreter::POP(const u32 data, const ARMv7_encoding type) +{ + u16 reg_list = 0; + + switch (type) + { + case T1: + { + reg_list = ((data & 0x100) << 6) | (data & 0xff); + break; + } + case T2: + { + reg_list = data & 0xdfff; + break; + } + case T3: + { + reg_list = 1 << (data >> 12); + break; + } + case A1: + { + reg_list = data & 0xffff; if (BitCount(reg_list) < 2) throw "LDM / LDMIA / LDMFD"; + if (!ConditionPassed(data >> 28)) return; + break; + } + case A2: + { + reg_list = 1 << ((data >> 12) & 0xf); + if (!ConditionPassed(data >> 28)) return; + break; + } + default: throw __FUNCTION__; + } + + for (u16 mask = 1, i = 0; mask; mask <<= 1, i++) + { + if (reg_list & mask) + { + CPU.write_gpr(i, vm::psv::read32(CPU.SP)); + CPU.SP += 4; + } + } +} + +void ARMv7Interpreter::B(const u32 data, const ARMv7_encoding type) +{ + u8 cond = 0xf; + u32 jump = 0; // jump = instr_size + imm32 + + switch (type) + { + case T1: + { + jump = 2 + sign<9, u32>((data & 0xff) << 1); + cond = (data >> 8) & 0xf; if (cond == 0xf) throw "SVC"; + break; + } + case T2: + { + jump = 2 + sign<12, u32>((data & 0x7ff) << 1); + break; + } + case T3: + { + u32 s = (data >> 26) & 0x1; + u32 j1 = (data >> 13) & 0x1; + u32 j2 = (data >> 11) & 0x1; + jump = 4 + sign<21, u32>(s << 20 | j2 << 19 | j1 << 18 | (data & 0x3f0000) >> 4 | (data & 0x7ff) << 1); + cond = (data >> 6) & 0xf; if (cond >= 0xe) throw "Related encodings"; + break; + } + case T4: + { + u32 s = (data >> 26) & 0x1; + u32 i1 = (data >> 13) & 0x1 ^ s ^ 1; + u32 i2 = (data >> 11) & 0x1 ^ s ^ 1; + jump = 4 + sign<25, u32>(s << 24 | i2 << 23 | i1 << 22 | (data & 0x3ff0000) >> 4 | (data & 0x7ff) << 1); + break; + } + case A1: + { + jump = 1 + 4 + sign<26, u32>((data & 0xffffff) << 2); + cond = (data >> 28) & 0xf; + break; + } + } + + if (ConditionPassed(cond)) + { + CPU.SetBranch(CPU.PC + jump); + } +} + +void ARMv7Interpreter::CBZ(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case T1: break; + default: throw __FUNCTION__; + } + + if (CPU.GPR[data & 0x7] == 0) + { + CPU.SetBranch(CPU.PC + 2 + ((data & 0xf8) >> 2) + ((data & 0x200) >> 3)); + } +} + +void ARMv7Interpreter::CBNZ(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case T1: break; + default: throw __FUNCTION__; + } + + if (CPU.GPR[data & 0x7] != 0) + { + CPU.SetBranch(CPU.PC + 2 + ((data & 0xf8) >> 2) + ((data & 0x200) >> 3)); + } +} + +void ARMv7Interpreter::BL(const u32 data, const ARMv7_encoding type) +{ + u32 jump = 0; + + switch (type) + { + case T1: + { + u32 s = (data >> 26) & 0x1; + u32 i1 = (data >> 13) & 0x1 ^ s ^ 1; + u32 i2 = (data >> 11) & 0x1 ^ s ^ 1; + jump = 4 + sign<25, u32>(s << 24 | i2 << 23 | i1 << 22 | (data & 0x3ff0000) >> 4 | (data & 0x7ff) << 1); + break; + } + case A1: + { + jump = 4 + sign<26, u32>((data & 0xffffff) << 2); + break; + } + default: throw __FUNCTION__; + } + + CPU.LR = (CPU.PC & 1) ? CPU.PC - 4 : CPU.PC; + CPU.SetBranch(CPU.PC + jump); +} + +void ARMv7Interpreter::BLX(const u32 data, const ARMv7_encoding type) +{ + u32 target; + + switch (type) + { + case T1: + { + target = CPU.GPR[(data >> 3) & 0xf]; + break; + } + case T2: + { + u32 s = (data >> 26) & 0x1; + u32 i1 = (data >> 13) & 0x1 ^ s ^ 1; + u32 i2 = (data >> 11) & 0x1 ^ s ^ 1; + target = CPU.PC + 4 + sign<25, u32>(s << 24 | i2 << 23 | i1 << 22 | (data & 0x3ff0000) >> 4 | (data & 0x7ff) << 1) & ~1; + break; + } + case A1: + { + target = CPU.GPR[data & 0xf]; + if (!ConditionPassed(data >> 28)) return; + break; + } + case A2: + { + target = CPU.PC + 5 + sign<25, u32>((data & 0xffffff) << 2 | (data & 0x1000000) >> 23); + break; + } + default: throw __FUNCTION__; + } + + CPU.LR = (CPU.PC & 1) ? CPU.PC - (type == T1 ? 2 : 4) : CPU.PC - 4; // ??? + CPU.SetBranch(target); +} + +void ARMv7Interpreter::SUB_IMM(const u32 data, const ARMv7_encoding type) +{ + +} + +void ARMv7Interpreter::SUB_REG(const u32 data, const ARMv7_encoding type) +{ + +} + +void ARMv7Interpreter::SUB_RSR(const u32 data, const ARMv7_encoding type) +{ + +} + +void ARMv7Interpreter::SUB_SPI(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case T1: CPU.SP -= (data & 0x7f) << 2; return; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SUB_SPR(const u32 data, const ARMv7_encoding type) +{ + +} + diff --git a/rpcs3/Emu/ARMv7/ARMv7Interpreter.h b/rpcs3/Emu/ARMv7/ARMv7Interpreter.h index eaac69aafa..15f59f6639 100644 --- a/rpcs3/Emu/ARMv7/ARMv7Interpreter.h +++ b/rpcs3/Emu/ARMv7/ARMv7Interpreter.h @@ -258,65 +258,23 @@ public: } protected: - void NULL_OP() - { - LOG_ERROR(HLE, "null"); - Emu.Pause(); - } + void UNK(const u32 data); - void NOP() - { - } + void NULL_OP(const u32 data, const ARMv7_encoding type); + void NOP(const u32 data, const ARMv7_encoding type); - void PUSH(u16 regs_list) - { - for(u16 mask=0x1, i=0; mask; mask <<= 1, i++) - { - if(regs_list & mask) - { - CPU.SP -= 4; - vm::psv::write32(CPU.SP, CPU.read_gpr(i)); - } - } - } + void PUSH(const u32 data, const ARMv7_encoding type); + void POP(const u32 data, const ARMv7_encoding type); - void POP(u16 regs_list) - { - for(u16 mask=(0x1 << 15), i=15; mask; mask >>= 1, i--) - { - if(regs_list & mask) - { - CPU.write_gpr(i, vm::psv::read32(CPU.SP)); - CPU.SP += 4; - } - } - } + void B(const u32 data, const ARMv7_encoding type); + void CBZ(const u32 data, const ARMv7_encoding type); + void CBNZ(const u32 data, const ARMv7_encoding type); + void BL(const u32 data, const ARMv7_encoding type); + void BLX(const u32 data, const ARMv7_encoding type); - void B(u8 cond, u32 imm, u8 intstr_size) - { - if(ConditionPassed(cond)) - { - CPU.SetBranch(CPU.PC + intstr_size + imm); - } - } - - void CBZ(u8 op, u32 imm, u8 rn, u8 intstr_size) - { - if((CPU.GPR[rn] == 0) ^ op) - { - CPU.SetBranch(CPU.PC + intstr_size + imm); - } - } - - void BL(u32 imm, u8 intstr_size) - { - CPU.LR = (CPU.PC + intstr_size) | 1; - CPU.SetBranch(CPU.PC + intstr_size + imm); - } - - void UNK(const u16 code0, const u16 code1) - { - LOG_ERROR(HLE, "Unknown/Illegal opcode! (0x%04x : 0x%04x)", code0, code1); - Emu.Pause(); - } + void SUB_IMM(const u32 data, const ARMv7_encoding type); + void SUB_REG(const u32 data, const ARMv7_encoding type); + void SUB_RSR(const u32 data, const ARMv7_encoding type); + void SUB_SPI(const u32 data, const ARMv7_encoding type); + void SUB_SPR(const u32 data, const ARMv7_encoding type); }; diff --git a/rpcs3/Emu/ARMv7/ARMv7Opcodes.h b/rpcs3/Emu/ARMv7/ARMv7Opcodes.h index 35d3684c8e..edbe9d84f3 100644 --- a/rpcs3/Emu/ARMv7/ARMv7Opcodes.h +++ b/rpcs3/Emu/ARMv7/ARMv7Opcodes.h @@ -32,18 +32,88 @@ namespace ARMv7_opcodes }; } +enum ARMv7_encoding +{ + T1, + T2, + T3, + T4, + A1, + A2, +}; + class ARMv7Opcodes { public: - virtual void NULL_OP() = 0; - virtual void NOP() = 0; + virtual void UNK(const u32 data) = 0; - virtual void PUSH(u16 regs_list) = 0; - virtual void POP(u16 regs_list) = 0; + virtual void NULL_OP(const u32 data, const ARMv7_encoding type) = 0; + virtual void NOP(const u32 data, const ARMv7_encoding type) = 0; - virtual void B(u8 cond, u32 imm, u8 intstr_size) = 0; - virtual void CBZ(u8 op, u32 imm, u8 rn, u8 intstr_size) = 0; - virtual void BL(u32 imm, u8 intstr_size)=0; - - virtual void UNK(const u16 code0, const u16 code1) = 0; + virtual void PUSH(const u32 data, const ARMv7_encoding type) = 0; + virtual void POP(const u32 data, const ARMv7_encoding type) = 0; + + virtual void B(const u32 data, const ARMv7_encoding type) = 0; + virtual void CBZ(const u32 data, const ARMv7_encoding type) = 0; + virtual void CBNZ(const u32 data, const ARMv7_encoding type) = 0; + virtual void BL(const u32 data, const ARMv7_encoding type) = 0; + virtual void BLX(const u32 data, const ARMv7_encoding type) = 0; + + virtual void SUB_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void SUB_REG(const u32 data, const ARMv7_encoding type) = 0; + virtual void SUB_RSR(const u32 data, const ARMv7_encoding type) = 0; + virtual void SUB_SPI(const u32 data, const ARMv7_encoding type) = 0; + virtual void SUB_SPR(const u32 data, const ARMv7_encoding type) = 0; }; + +struct ARMv7_opcode_t +{ + u32 mask; + u32 code; + u32 length; // 2 or 4 + char* name; + ARMv7_encoding type; + void (ARMv7Opcodes::*func)(const u32 data, const ARMv7_encoding type); +}; + +// single 16-bit value +#define ARMv7_OP2(mask, code, type, name) { (mask) << 16, (code) << 16, 2, #name, type, &ARMv7Opcodes::name } +// two 16-bit values +#define ARMv7_OP4(mask0, mask1, code0, code1, type, name) { ((mask0) << 16) | (mask1), ((code0) << 16) | (code1), 4, #name, type, &ARMv7Opcodes::name } + +static const ARMv7_opcode_t ARMv7_opcode_table[] = +{ + ARMv7_OP2(0xffff, 0x0000, T1, NULL_OP), + ARMv7_OP2(0xffff, 0xbf00, T1, NOP), + ARMv7_OP4(0xffff, 0xffff, 0xf3af, 0x8000, T2, NOP), + ARMv7_OP4(0x0fff, 0xffff, 0x0320, 0xf000, A1, NOP), + ARMv7_OP2(0xfe00, 0xb400, T1, PUSH), + ARMv7_OP4(0xffff, 0x0000, 0xe92d, 0x0000, T2, PUSH), // had an error in arch ref + ARMv7_OP4(0xffff, 0x0fff, 0xf84d, 0x0d04, T3, PUSH), + ARMv7_OP4(0x0fff, 0x0000, 0x092d, 0x0000, A1, PUSH), + ARMv7_OP4(0x0fff, 0x0fff, 0x052d, 0x0004, A2, PUSH), + ARMv7_OP2(0xfe00, 0xbc00, T1, POP), + ARMv7_OP4(0xffff, 0x0000, 0xe8bd, 0x0000, T2, POP), + ARMv7_OP4(0xffff, 0x0fff, 0xf85d, 0x0b04, T3, POP), + ARMv7_OP4(0x0fff, 0x0000, 0x08bd, 0x0000, A1, POP), + ARMv7_OP4(0x0fff, 0x0fff, 0x049d, 0x0004, A2, POP), + ARMv7_OP2(0xf000, 0xd000, T1, B), + ARMv7_OP2(0xf800, 0xe000, T2, B), + ARMv7_OP4(0xf800, 0xd000, 0xf000, 0x8000, T3, B), + ARMv7_OP4(0xf800, 0xd000, 0xf000, 0x9000, T4, B), + ARMv7_OP4(0x0f00, 0x0000, 0x0a00, 0x0000, A1, B), + ARMv7_OP2(0xfd00, 0xb100, T1, CBZ), + ARMv7_OP2(0xfd00, 0xb900, T1, CBNZ), + ARMv7_OP4(0xf800, 0xd000, 0xf000, 0xd000, T1, BL), + ARMv7_OP4(0x0f00, 0x0000, 0x0b00, 0x0000, A1, BL), + ARMv7_OP2(0xff80, 0x4780, T1, BLX), + ARMv7_OP4(0xf800, 0xc001, 0xf000, 0xc000, T2, BLX), + ARMv7_OP4(0x0fff, 0xfff0, 0x012f, 0xff30, A1, BLX), + ARMv7_OP4(0xfe00, 0x0000, 0xfa00, 0x0000, A2, BLX), + + ARMv7_OP2(0xff80, 0xb080, T1, SUB_SPI), +}; + +#undef ARMv7_OP +#undef ARMv7_OPP + diff --git a/rpcs3/Emu/ARMv7/ARMv7Thread.cpp b/rpcs3/Emu/ARMv7/ARMv7Thread.cpp index 3fe6595994..162f08a918 100644 --- a/rpcs3/Emu/ARMv7/ARMv7Thread.cpp +++ b/rpcs3/Emu/ARMv7/ARMv7Thread.cpp @@ -18,6 +18,7 @@ void ARMv7Thread::InitRegs() memset(GPR, 0, sizeof(GPR[0]) * 15); APSR.APSR = 0; IPSR.IPSR = 0; + PC |= 1; SP = m_stack_addr + m_stack_size; } diff --git a/rpcs3/emucore.vcxproj b/rpcs3/emucore.vcxproj index 007b956615..158775bfe8 100644 --- a/rpcs3/emucore.vcxproj +++ b/rpcs3/emucore.vcxproj @@ -54,6 +54,8 @@ + + diff --git a/rpcs3/emucore.vcxproj.filters b/rpcs3/emucore.vcxproj.filters index e164e1c531..e82a2cae4a 100644 --- a/rpcs3/emucore.vcxproj.filters +++ b/rpcs3/emucore.vcxproj.filters @@ -632,6 +632,12 @@ Source Files + + Emu\ARMv7 + + + Emu\ARMv7 + From 94213bb398b6437ead77de4be3d98312fba5e203 Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Wed, 29 Oct 2014 18:30:35 +0300 Subject: [PATCH 09/27] ARMv7: more opcodes --- rpcs3/Emu/ARMv7/ARMv7Decoder.h | 3 +- rpcs3/Emu/ARMv7/ARMv7DisAsm.cpp | 64 ++++++++++++++ rpcs3/Emu/ARMv7/ARMv7DisAsm.h | 47 ++++++---- rpcs3/Emu/ARMv7/ARMv7Interpreter.cpp | 123 ++++++++++++++++++++++++++- rpcs3/Emu/ARMv7/ARMv7Interpreter.h | 47 ++++++---- rpcs3/Emu/ARMv7/ARMv7Opcodes.h | 85 +++++++++++++++++- 6 files changed, 331 insertions(+), 38 deletions(-) diff --git a/rpcs3/Emu/ARMv7/ARMv7Decoder.h b/rpcs3/Emu/ARMv7/ARMv7Decoder.h index 923dc6a0f1..9b8b5e0d34 100644 --- a/rpcs3/Emu/ARMv7/ARMv7Decoder.h +++ b/rpcs3/Emu/ARMv7/ARMv7Decoder.h @@ -18,12 +18,13 @@ public: const u32 code0 = vm::psv::read16(address & ~1); const u32 code1 = vm::psv::read16(address + 2 & ~1); const u32 data = code0 << 16 | code1; + const u32 arg = address & 1 ? data : code1 << 16 | code0; for (auto& opcode : ARMv7_opcode_table) { if ((opcode.type >= A1) == ((address & 1) == 0) && (data & opcode.mask) == opcode.code) { - (m_op.*opcode.func)(opcode.length == 2 ? code0 : data, opcode.type); + (m_op.*opcode.func)(opcode.length == 2 ? code0 : arg, opcode.type); return opcode.length; } } diff --git a/rpcs3/Emu/ARMv7/ARMv7DisAsm.cpp b/rpcs3/Emu/ARMv7/ARMv7DisAsm.cpp index fddba98bec..751462d2fb 100644 --- a/rpcs3/Emu/ARMv7/ARMv7DisAsm.cpp +++ b/rpcs3/Emu/ARMv7/ARMv7DisAsm.cpp @@ -65,6 +65,61 @@ void ARMv7DisAsm::BLX(const u32 data, const ARMv7_encoding type) //Write(fmt::Format("bl 0x%x", DisAsmBranchTarget(imm) + intstr_size)); } +void ARMv7DisAsm::ADC_IMM(const u32 data, const ARMv7_encoding type) +{ + Write("ADC..."); +} + +void ARMv7DisAsm::ADC_REG(const u32 data, const ARMv7_encoding type) +{ + Write("ADC..."); +} + +void ARMv7DisAsm::ADC_RSR(const u32 data, const ARMv7_encoding type) +{ + Write("ADC..."); +} + +void ARMv7DisAsm::ADD_IMM(const u32 data, const ARMv7_encoding type) +{ + Write("ADD..."); +} + +void ARMv7DisAsm::ADD_REG(const u32 data, const ARMv7_encoding type) +{ + Write("ADD..."); +} + +void ARMv7DisAsm::ADD_RSR(const u32 data, const ARMv7_encoding type) +{ + Write("ADD..."); +} + +void ARMv7DisAsm::ADD_SPI(const u32 data, const ARMv7_encoding type) +{ + Write("ADD SP..."); +} + +void ARMv7DisAsm::ADD_SPR(const u32 data, const ARMv7_encoding type) +{ + Write("ADD SP..."); +} + +void ARMv7DisAsm::MOV_IMM(const u32 data, const ARMv7_encoding type) +{ + Write("MOV..."); +} + +void ARMv7DisAsm::MOV_REG(const u32 data, const ARMv7_encoding type) +{ + Write("MOV..."); +} + +void ARMv7DisAsm::MOVT(const u32 data, const ARMv7_encoding type) +{ + Write("MOVT..."); +} + void ARMv7DisAsm::SUB_IMM(const u32 data, const ARMv7_encoding type) { Write("SUB..."); @@ -90,3 +145,12 @@ void ARMv7DisAsm::SUB_SPR(const u32 data, const ARMv7_encoding type) Write("SUB SP..."); } +void ARMv7DisAsm::STR_IMM(const u32 data, const ARMv7_encoding type) +{ + Write("STR..."); +} + +void ARMv7DisAsm::STR_REG(const u32 data, const ARMv7_encoding type) +{ + Write("STR..."); +} diff --git a/rpcs3/Emu/ARMv7/ARMv7DisAsm.h b/rpcs3/Emu/ARMv7/ARMv7DisAsm.h index 54067890b2..a3a9ac63fc 100644 --- a/rpcs3/Emu/ARMv7/ARMv7DisAsm.h +++ b/rpcs3/Emu/ARMv7/ARMv7DisAsm.h @@ -45,23 +45,40 @@ protected: return regs_str; } - void UNK(const u32 data); + virtual void UNK(const u32 data); - void NULL_OP(const u32 data, const ARMv7_encoding type); - void NOP(const u32 data, const ARMv7_encoding type); + virtual void NULL_OP(const u32 data, const ARMv7_encoding type); + virtual void NOP(const u32 data, const ARMv7_encoding type); - void PUSH(const u32 data, const ARMv7_encoding type); - void POP(const u32 data, const ARMv7_encoding type); + virtual void PUSH(const u32 data, const ARMv7_encoding type); + virtual void POP(const u32 data, const ARMv7_encoding type); - void B(const u32 data, const ARMv7_encoding type); - void CBZ(const u32 data, const ARMv7_encoding type); - void CBNZ(const u32 data, const ARMv7_encoding type); - void BL(const u32 data, const ARMv7_encoding type); - void BLX(const u32 data, const ARMv7_encoding type); + virtual void B(const u32 data, const ARMv7_encoding type); + virtual void CBZ(const u32 data, const ARMv7_encoding type); + virtual void CBNZ(const u32 data, const ARMv7_encoding type); + virtual void BL(const u32 data, const ARMv7_encoding type); + virtual void BLX(const u32 data, const ARMv7_encoding type); - void SUB_IMM(const u32 data, const ARMv7_encoding type); - void SUB_REG(const u32 data, const ARMv7_encoding type); - void SUB_RSR(const u32 data, const ARMv7_encoding type); - void SUB_SPI(const u32 data, const ARMv7_encoding type); - void SUB_SPR(const u32 data, const ARMv7_encoding type); + virtual void ADC_IMM(const u32 data, const ARMv7_encoding type); + virtual void ADC_REG(const u32 data, const ARMv7_encoding type); + virtual void ADC_RSR(const u32 data, const ARMv7_encoding type); + + virtual void ADD_IMM(const u32 data, const ARMv7_encoding type); + virtual void ADD_REG(const u32 data, const ARMv7_encoding type); + virtual void ADD_RSR(const u32 data, const ARMv7_encoding type); + virtual void ADD_SPI(const u32 data, const ARMv7_encoding type); + virtual void ADD_SPR(const u32 data, const ARMv7_encoding type); + + virtual void MOV_IMM(const u32 data, const ARMv7_encoding type); + virtual void MOV_REG(const u32 data, const ARMv7_encoding type); + virtual void MOVT(const u32 data, const ARMv7_encoding type); + + virtual void SUB_IMM(const u32 data, const ARMv7_encoding type); + virtual void SUB_REG(const u32 data, const ARMv7_encoding type); + virtual void SUB_RSR(const u32 data, const ARMv7_encoding type); + virtual void SUB_SPI(const u32 data, const ARMv7_encoding type); + virtual void SUB_SPR(const u32 data, const ARMv7_encoding type); + + virtual void STR_IMM(const u32 data, const ARMv7_encoding type); + virtual void STR_REG(const u32 data, const ARMv7_encoding type); }; diff --git a/rpcs3/Emu/ARMv7/ARMv7Interpreter.cpp b/rpcs3/Emu/ARMv7/ARMv7Interpreter.cpp index e20a0dd29c..28990ee9b1 100644 --- a/rpcs3/Emu/ARMv7/ARMv7Interpreter.cpp +++ b/rpcs3/Emu/ARMv7/ARMv7Interpreter.cpp @@ -260,19 +260,116 @@ void ARMv7Interpreter::BLX(const u32 data, const ARMv7_encoding type) CPU.SetBranch(target); } +void ARMv7Interpreter::ADC_IMM(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::ADC_REG(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::ADC_RSR(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::ADD_IMM(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::ADD_REG(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::ADD_RSR(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::ADD_SPI(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::ADD_SPR(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::MOV_IMM(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::MOV_REG(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::MOVT(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + default: throw __FUNCTION__; + } +} + void ARMv7Interpreter::SUB_IMM(const u32 data, const ARMv7_encoding type) { - + switch (type) + { + default: throw __FUNCTION__; + } } void ARMv7Interpreter::SUB_REG(const u32 data, const ARMv7_encoding type) { - + switch (type) + { + default: throw __FUNCTION__; + } } void ARMv7Interpreter::SUB_RSR(const u32 data, const ARMv7_encoding type) { - + switch (type) + { + default: throw __FUNCTION__; + } } void ARMv7Interpreter::SUB_SPI(const u32 data, const ARMv7_encoding type) @@ -286,6 +383,24 @@ void ARMv7Interpreter::SUB_SPI(const u32 data, const ARMv7_encoding type) void ARMv7Interpreter::SUB_SPR(const u32 data, const ARMv7_encoding type) { - + switch (type) + { + default: throw __FUNCTION__; + } } +void ARMv7Interpreter::STR_IMM(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::STR_REG(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + default: throw __FUNCTION__; + } +} diff --git a/rpcs3/Emu/ARMv7/ARMv7Interpreter.h b/rpcs3/Emu/ARMv7/ARMv7Interpreter.h index 15f59f6639..92f0cdb84c 100644 --- a/rpcs3/Emu/ARMv7/ARMv7Interpreter.h +++ b/rpcs3/Emu/ARMv7/ARMv7Interpreter.h @@ -258,23 +258,40 @@ public: } protected: - void UNK(const u32 data); + virtual void UNK(const u32 data); - void NULL_OP(const u32 data, const ARMv7_encoding type); - void NOP(const u32 data, const ARMv7_encoding type); + virtual void NULL_OP(const u32 data, const ARMv7_encoding type); + virtual void NOP(const u32 data, const ARMv7_encoding type); - void PUSH(const u32 data, const ARMv7_encoding type); - void POP(const u32 data, const ARMv7_encoding type); + virtual void PUSH(const u32 data, const ARMv7_encoding type); + virtual void POP(const u32 data, const ARMv7_encoding type); - void B(const u32 data, const ARMv7_encoding type); - void CBZ(const u32 data, const ARMv7_encoding type); - void CBNZ(const u32 data, const ARMv7_encoding type); - void BL(const u32 data, const ARMv7_encoding type); - void BLX(const u32 data, const ARMv7_encoding type); + virtual void B(const u32 data, const ARMv7_encoding type); + virtual void CBZ(const u32 data, const ARMv7_encoding type); + virtual void CBNZ(const u32 data, const ARMv7_encoding type); + virtual void BL(const u32 data, const ARMv7_encoding type); + virtual void BLX(const u32 data, const ARMv7_encoding type); - void SUB_IMM(const u32 data, const ARMv7_encoding type); - void SUB_REG(const u32 data, const ARMv7_encoding type); - void SUB_RSR(const u32 data, const ARMv7_encoding type); - void SUB_SPI(const u32 data, const ARMv7_encoding type); - void SUB_SPR(const u32 data, const ARMv7_encoding type); + virtual void ADC_IMM(const u32 data, const ARMv7_encoding type); + virtual void ADC_REG(const u32 data, const ARMv7_encoding type); + virtual void ADC_RSR(const u32 data, const ARMv7_encoding type); + + virtual void ADD_IMM(const u32 data, const ARMv7_encoding type); + virtual void ADD_REG(const u32 data, const ARMv7_encoding type); + virtual void ADD_RSR(const u32 data, const ARMv7_encoding type); + virtual void ADD_SPI(const u32 data, const ARMv7_encoding type); + virtual void ADD_SPR(const u32 data, const ARMv7_encoding type); + + virtual void MOV_IMM(const u32 data, const ARMv7_encoding type); + virtual void MOV_REG(const u32 data, const ARMv7_encoding type); + virtual void MOVT(const u32 data, const ARMv7_encoding type); + + virtual void SUB_IMM(const u32 data, const ARMv7_encoding type); + virtual void SUB_REG(const u32 data, const ARMv7_encoding type); + virtual void SUB_RSR(const u32 data, const ARMv7_encoding type); + virtual void SUB_SPI(const u32 data, const ARMv7_encoding type); + virtual void SUB_SPR(const u32 data, const ARMv7_encoding type); + + virtual void STR_IMM(const u32 data, const ARMv7_encoding type); + virtual void STR_REG(const u32 data, const ARMv7_encoding type); }; diff --git a/rpcs3/Emu/ARMv7/ARMv7Opcodes.h b/rpcs3/Emu/ARMv7/ARMv7Opcodes.h index edbe9d84f3..ede8c4bd8c 100644 --- a/rpcs3/Emu/ARMv7/ARMv7Opcodes.h +++ b/rpcs3/Emu/ARMv7/ARMv7Opcodes.h @@ -59,11 +59,28 @@ public: virtual void BL(const u32 data, const ARMv7_encoding type) = 0; virtual void BLX(const u32 data, const ARMv7_encoding type) = 0; + virtual void ADC_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void ADC_REG(const u32 data, const ARMv7_encoding type) = 0; + virtual void ADC_RSR(const u32 data, const ARMv7_encoding type) = 0; + + virtual void ADD_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void ADD_REG(const u32 data, const ARMv7_encoding type) = 0; + virtual void ADD_RSR(const u32 data, const ARMv7_encoding type) = 0; + virtual void ADD_SPI(const u32 data, const ARMv7_encoding type) = 0; + virtual void ADD_SPR(const u32 data, const ARMv7_encoding type) = 0; + + virtual void MOV_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void MOV_REG(const u32 data, const ARMv7_encoding type) = 0; + virtual void MOVT(const u32 data, const ARMv7_encoding type) = 0; + virtual void SUB_IMM(const u32 data, const ARMv7_encoding type) = 0; virtual void SUB_REG(const u32 data, const ARMv7_encoding type) = 0; virtual void SUB_RSR(const u32 data, const ARMv7_encoding type) = 0; virtual void SUB_SPI(const u32 data, const ARMv7_encoding type) = 0; virtual void SUB_SPR(const u32 data, const ARMv7_encoding type) = 0; + + virtual void STR_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void STR_REG(const u32 data, const ARMv7_encoding type) = 0; }; struct ARMv7_opcode_t @@ -71,15 +88,15 @@ struct ARMv7_opcode_t u32 mask; u32 code; u32 length; // 2 or 4 - char* name; + const char* name; ARMv7_encoding type; void (ARMv7Opcodes::*func)(const u32 data, const ARMv7_encoding type); }; // single 16-bit value -#define ARMv7_OP2(mask, code, type, name) { (mask) << 16, (code) << 16, 2, #name, type, &ARMv7Opcodes::name } +#define ARMv7_OP2(mask, code, type, name) { (u32)((mask) << 16), (u32)((code) << 16), 2, #name "_" #type, type, &ARMv7Opcodes::name } // two 16-bit values -#define ARMv7_OP4(mask0, mask1, code0, code1, type, name) { ((mask0) << 16) | (mask1), ((code0) << 16) | (code1), 4, #name, type, &ARMv7Opcodes::name } +#define ARMv7_OP4(mask0, mask1, code0, code1, type, name) { (u32)((mask0) << 16) | (mask1), (u32)((code0) << 16) | (code1), 4, #name "_" #type, type, &ARMv7Opcodes::name } static const ARMv7_opcode_t ARMv7_opcode_table[] = { @@ -111,7 +128,69 @@ static const ARMv7_opcode_t ARMv7_opcode_table[] = ARMv7_OP4(0x0fff, 0xfff0, 0x012f, 0xff30, A1, BLX), ARMv7_OP4(0xfe00, 0x0000, 0xfa00, 0x0000, A2, BLX), + ARMv7_OP4(0xfbe0, 0x8000, 0xf140, 0x0000, T1, ADC_IMM), + ARMv7_OP4(0x0fe0, 0x0000, 0x02a0, 0x0000, A1, ADC_IMM), + ARMv7_OP2(0xffc0, 0x4040, T1, ADC_REG), + ARMv7_OP4(0xffe0, 0x8000, 0xeb40, 0x0000, T2, ADC_REG), + ARMv7_OP4(0x0fe0, 0x0010, 0x00a0, 0x0000, A1, ADC_REG), + ARMv7_OP4(0x0fe0, 0x0090, 0x00a0, 0x0010, A1, ADC_RSR), + + ARMv7_OP2(0xfe00, 0x1c00, T1, ADD_IMM), + ARMv7_OP2(0xf800, 0x3000, T2, ADD_IMM), + ARMv7_OP4(0xfbe0, 0x8000, 0xf100, 0x0000, T3, ADD_IMM), + ARMv7_OP4(0xfbf0, 0x8000, 0xf200, 0x0000, T4, ADD_IMM), + ARMv7_OP4(0x0fe0, 0x0000, 0x0280, 0x0000, A1, ADD_IMM), + ARMv7_OP2(0xfe00, 0x1800, T1, ADD_REG), + ARMv7_OP2(0xff00, 0x4400, T2, ADD_REG), + ARMv7_OP4(0xffe0, 0x8000, 0xeb00, 0x0000, T3, ADD_REG), + ARMv7_OP4(0x0fe0, 0x0010, 0x0080, 0x0000, A1, ADD_REG), + ARMv7_OP4(0x0fe0, 0x0090, 0x0080, 0x0010, A1, ADD_RSR), + ARMv7_OP2(0xf800, 0xa800, T1, ADD_SPI), + ARMv7_OP2(0xff80, 0xb000, T2, ADD_SPI), + ARMv7_OP4(0xfbef, 0x8000, 0xf10d, 0x0000, T3, ADD_SPI), + ARMv7_OP4(0xfbff, 0x8000, 0xf20d, 0x0000, T4, ADD_SPI), + ARMv7_OP4(0x0fef, 0x0000, 0x028d, 0x0000, A1, ADD_SPI), + ARMv7_OP2(0xff78, 0x4468, T1, ADD_SPR), + ARMv7_OP2(0xff87, 0x4485, T2, ADD_SPR), + ARMv7_OP4(0xffef, 0x8000, 0xeb0d, 0x0000, T3, ADD_SPR), + ARMv7_OP4(0x0fef, 0x0010, 0x008d, 0x0000, A1, ADD_SPR), + + ARMv7_OP2(0xf800, 0x2000, T1, MOV_IMM), + ARMv7_OP4(0xfbef, 0x8000, 0xf04f, 0x0000, T2, MOV_IMM), + ARMv7_OP4(0xfbf0, 0x8000, 0xf240, 0x0000, T3, MOV_IMM), + ARMv7_OP4(0x0fef, 0x0000, 0x03a0, 0x0000, A1, MOV_IMM), + ARMv7_OP4(0x0ff0, 0x0000, 0x0300, 0x0000, A2, MOV_IMM), + ARMv7_OP2(0xff00, 0x4600, T1, MOV_REG), + ARMv7_OP2(0xffc0, 0x0000, T2, MOV_REG), + ARMv7_OP4(0xffef, 0xf0f0, 0xea4f, 0x0000, T3, MOV_REG), + ARMv7_OP4(0x0fef, 0x0ff0, 0x01a0, 0x0000, A1, MOV_REG), + ARMv7_OP4(0xfbf0, 0x8000, 0xf2c0, 0x0000, T1, MOVT), + ARMv7_OP4(0x0ff0, 0x0000, 0x0340, 0x0000, A1, MOVT), + + ARMv7_OP2(0xfe00, 0x1e00, T1, SUB_IMM), + ARMv7_OP2(0xf800, 0x3800, T2, SUB_IMM), + ARMv7_OP4(0xfbe0, 0x8000, 0xf1a0, 0x0000, T3, SUB_IMM), + ARMv7_OP4(0xfbf0, 0x8000, 0xf2a0, 0x0000, T4, SUB_IMM), + ARMv7_OP4(0x0fe0, 0x0000, 0x0240, 0x0000, A1, SUB_IMM), + ARMv7_OP2(0xfe00, 0x1a00, T1, SUB_REG), + ARMv7_OP4(0xffe0, 0x8000, 0xeba0, 0x0000, T2, SUB_REG), + ARMv7_OP4(0x0fe0, 0x0010, 0x0040, 0x0000, A1, SUB_REG), + ARMv7_OP4(0x0fe0, 0x0090, 0x0040, 0x0010, A1, SUB_RSR), ARMv7_OP2(0xff80, 0xb080, T1, SUB_SPI), + ARMv7_OP4(0xfbef, 0x8000, 0xf1ad, 0x0000, T2, SUB_SPI), + ARMv7_OP4(0xfbff, 0x8000, 0xf2ad, 0x0000, T3, SUB_SPI), + ARMv7_OP4(0x0fef, 0x0000, 0x024d, 0x0000, A1, SUB_SPI), + ARMv7_OP4(0xffef, 0x8000, 0xebad, 0x0000, T1, SUB_SPR), + ARMv7_OP4(0x0fef, 0x0010, 0x004d, 0x0000, A1, SUB_SPR), + + ARMv7_OP2(0xf800, 0x6000, T1, STR_IMM), + ARMv7_OP2(0xf800, 0x9000, T2, STR_IMM), + ARMv7_OP4(0xfff0, 0x0000, 0xf8c0, 0x0000, T3, STR_IMM), + ARMv7_OP4(0xfff0, 0x0800, 0xf840, 0x0800, T4, STR_IMM), + ARMv7_OP4(0x0e50, 0x0000, 0x0400, 0x0000, A1, STR_IMM), + ARMv7_OP2(0xfe00, 0x5000, T1, STR_REG), + ARMv7_OP4(0xfff0, 0x0fc0, 0xf840, 0x0000, T2, STR_REG), + ARMv7_OP4(0x0e50, 0x0010, 0x0600, 0x0000, A1, STR_REG), }; #undef ARMv7_OP From 7aeda3b0c72540095354661febb42903446f41d8 Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Thu, 30 Oct 2014 18:17:51 +0300 Subject: [PATCH 10/27] ARMv7: more opcodes --- rpcs3/Emu/ARMv7/ARMv7DisAsm.cpp | 1077 +++++++++++++- rpcs3/Emu/ARMv7/ARMv7DisAsm.h | 264 +++- rpcs3/Emu/ARMv7/ARMv7Interpreter.cpp | 1929 ++++++++++++++++++++++++-- rpcs3/Emu/ARMv7/ARMv7Interpreter.h | 266 +++- rpcs3/Emu/ARMv7/ARMv7Opcodes.h | 392 +++++- rpcs3/Emu/Cell/PPCDecoder.cpp | 2 +- 6 files changed, 3707 insertions(+), 223 deletions(-) diff --git a/rpcs3/Emu/ARMv7/ARMv7DisAsm.cpp b/rpcs3/Emu/ARMv7/ARMv7DisAsm.cpp index 751462d2fb..89829191c8 100644 --- a/rpcs3/Emu/ARMv7/ARMv7DisAsm.cpp +++ b/rpcs3/Emu/ARMv7/ARMv7DisAsm.cpp @@ -8,29 +8,87 @@ void ARMv7DisAsm::UNK(const u32 data) void ARMv7DisAsm::NULL_OP(const u32 data, const ARMv7_encoding type) { - Write("NULL"); + Write("Illegal opcode (null)"); } -void ARMv7DisAsm::PUSH(const u32 data, const ARMv7_encoding type) +void ARMv7DisAsm::ADC_IMM(const u32 data, const ARMv7_encoding type) { - Write("PUSH..."); - //Write(fmt::Format("push {%s}", GetRegsListString(regs_list).c_str())); + Write(__FUNCTION__); } -void ARMv7DisAsm::POP(const u32 data, const ARMv7_encoding type) +void ARMv7DisAsm::ADC_REG(const u32 data, const ARMv7_encoding type) { - Write("POP..."); - //Write(fmt::Format("pop {%s}", GetRegsListString(regs_list).c_str())); + Write(__FUNCTION__); } -void ARMv7DisAsm::NOP(const u32 data, const ARMv7_encoding type) +void ARMv7DisAsm::ADC_RSR(const u32 data, const ARMv7_encoding type) { - Write("NOP"); + Write(__FUNCTION__); } + +void ARMv7DisAsm::ADD_IMM(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::ADD_REG(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::ADD_RSR(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::ADD_SPI(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::ADD_SPR(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::ADR(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::AND_IMM(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::AND_REG(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::AND_RSR(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::ASR_IMM(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::ASR_REG(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + void ARMv7DisAsm::B(const u32 data, const ARMv7_encoding type) { - Write("B..."); + Write(__FUNCTION__); //if ((cond & 0xe) == 0xe) //{ // Write(fmt::Format("b 0x%x", DisAsmBranchTarget(imm) + intstr_size)); @@ -41,116 +99,1037 @@ void ARMv7DisAsm::B(const u32 data, const ARMv7_encoding type) //} } -void ARMv7DisAsm::CBZ(const u32 data, const ARMv7_encoding type) + +void ARMv7DisAsm::BFC(const u32 data, const ARMv7_encoding type) { - Write("CBZ..."); - //Write(fmt::Format("cbz 0x%x,%s", DisAsmBranchTarget(imm) + intstr_size, g_arm_reg_name[rn])); + Write(__FUNCTION__); } -void ARMv7DisAsm::CBNZ(const u32 data, const ARMv7_encoding type) +void ARMv7DisAsm::BFI(const u32 data, const ARMv7_encoding type) { - Write("CBNZ..."); - //Write(fmt::Format("cbnz 0x%x,%s", DisAsmBranchTarget(imm) + intstr_size, g_arm_reg_name[rn])); + Write(__FUNCTION__); } + +void ARMv7DisAsm::BIC_IMM(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::BIC_REG(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::BIC_RSR(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::BKPT(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + void ARMv7DisAsm::BL(const u32 data, const ARMv7_encoding type) { - Write("BL..."); + Write(__FUNCTION__); //Write(fmt::Format("bl 0x%x", DisAsmBranchTarget(imm) + intstr_size)); } void ARMv7DisAsm::BLX(const u32 data, const ARMv7_encoding type) { - Write("BLX..."); + Write(__FUNCTION__); //Write(fmt::Format("bl 0x%x", DisAsmBranchTarget(imm) + intstr_size)); } -void ARMv7DisAsm::ADC_IMM(const u32 data, const ARMv7_encoding type) +void ARMv7DisAsm::BX(const u32 data, const ARMv7_encoding type) { - Write("ADC..."); + Write(__FUNCTION__); } -void ARMv7DisAsm::ADC_REG(const u32 data, const ARMv7_encoding type) + +void ARMv7DisAsm::CB_Z(const u32 data, const ARMv7_encoding type) { - Write("ADC..."); + Write(__FUNCTION__); + //Write(fmt::Format("cbz 0x%x,%s", DisAsmBranchTarget(imm) + intstr_size, g_arm_reg_name[rn])); + //Write(fmt::Format("cbnz 0x%x,%s", DisAsmBranchTarget(imm) + intstr_size, g_arm_reg_name[rn])); } -void ARMv7DisAsm::ADC_RSR(const u32 data, const ARMv7_encoding type) + +void ARMv7DisAsm::CLZ(const u32 data, const ARMv7_encoding type) { - Write("ADC..."); + Write(__FUNCTION__); } -void ARMv7DisAsm::ADD_IMM(const u32 data, const ARMv7_encoding type) + +void ARMv7DisAsm::CMN_IMM(const u32 data, const ARMv7_encoding type) { - Write("ADD..."); + Write(__FUNCTION__); } -void ARMv7DisAsm::ADD_REG(const u32 data, const ARMv7_encoding type) +void ARMv7DisAsm::CMN_REG(const u32 data, const ARMv7_encoding type) { - Write("ADD..."); + Write(__FUNCTION__); } -void ARMv7DisAsm::ADD_RSR(const u32 data, const ARMv7_encoding type) +void ARMv7DisAsm::CMN_RSR(const u32 data, const ARMv7_encoding type) { - Write("ADD..."); + Write(__FUNCTION__); } -void ARMv7DisAsm::ADD_SPI(const u32 data, const ARMv7_encoding type) + +void ARMv7DisAsm::CMP_IMM(const u32 data, const ARMv7_encoding type) { - Write("ADD SP..."); + Write(__FUNCTION__); } -void ARMv7DisAsm::ADD_SPR(const u32 data, const ARMv7_encoding type) +void ARMv7DisAsm::CMP_REG(const u32 data, const ARMv7_encoding type) { - Write("ADD SP..."); + Write(__FUNCTION__); } +void ARMv7DisAsm::CMP_RSR(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::DBG(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::EOR_IMM(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::EOR_REG(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::EOR_RSR(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::IT(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::LDM(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::LDMDA(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::LDMDB(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::LDMIB(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::LDR_IMM(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::LDR_LIT(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::LDR_REG(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::LDRB_IMM(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::LDRB_LIT(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::LDRB_REG(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::LDRD_IMM(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::LDRD_LIT(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::LDRD_REG(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::LDRH_IMM(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::LDRH_LIT(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::LDRH_REG(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::LDRSB_IMM(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::LDRSB_LIT(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::LDRSB_REG(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::LDRSH_IMM(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::LDRSH_LIT(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::LDRSH_REG(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::LSL_IMM(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::LSL_REG(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::LSR_IMM(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::LSR_REG(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::MLA(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::MLS(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + void ARMv7DisAsm::MOV_IMM(const u32 data, const ARMv7_encoding type) { - Write("MOV..."); + Write(__FUNCTION__); } void ARMv7DisAsm::MOV_REG(const u32 data, const ARMv7_encoding type) { - Write("MOV..."); + Write(__FUNCTION__); } void ARMv7DisAsm::MOVT(const u32 data, const ARMv7_encoding type) { - Write("MOVT..."); + Write(__FUNCTION__); } -void ARMv7DisAsm::SUB_IMM(const u32 data, const ARMv7_encoding type) + +void ARMv7DisAsm::MRS(const u32 data, const ARMv7_encoding type) { - Write("SUB..."); + Write(__FUNCTION__); } -void ARMv7DisAsm::SUB_REG(const u32 data, const ARMv7_encoding type) +void ARMv7DisAsm::MSR_IMM(const u32 data, const ARMv7_encoding type) { - Write("SUB..."); + Write(__FUNCTION__); } -void ARMv7DisAsm::SUB_RSR(const u32 data, const ARMv7_encoding type) +void ARMv7DisAsm::MSR_REG(const u32 data, const ARMv7_encoding type) { - Write("SUB..."); + Write(__FUNCTION__); } -void ARMv7DisAsm::SUB_SPI(const u32 data, const ARMv7_encoding type) + +void ARMv7DisAsm::MUL(const u32 data, const ARMv7_encoding type) { - Write("SUB SP..."); + Write(__FUNCTION__); } -void ARMv7DisAsm::SUB_SPR(const u32 data, const ARMv7_encoding type) + +void ARMv7DisAsm::MVN_IMM(const u32 data, const ARMv7_encoding type) { - Write("SUB SP..."); + Write(__FUNCTION__); } +void ARMv7DisAsm::MVN_REG(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::MVN_RSR(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::NEG(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::NOP(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::ORN_IMM(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::ORN_REG(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::ORR_IMM(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::ORR_REG(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::ORR_RSR(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::PKH(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::POP(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); + //Write(fmt::Format("pop {%s}", GetRegsListString(regs_list).c_str())); +} + +void ARMv7DisAsm::PUSH(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); + //Write(fmt::Format("push {%s}", GetRegsListString(regs_list).c_str())); +} + + +void ARMv7DisAsm::QADD(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::QADD16(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::QADD8(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::QASX(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::QDADD(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::QDSUB(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::QSAX(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::QSUB(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::QSUB16(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::QSUB8(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::RBIT(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::REV(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::REV16(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::REVSH(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::ROR_IMM(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::ROR_REG(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::RRX(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::RSB_IMM(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::RSB_REG(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::RSB_RSR(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::RSC_IMM(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::RSC_REG(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::RSC_RSR(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::SADD16(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SADD8(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SASX(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::SBC_IMM(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SBC_REG(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SBC_RSR(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::SBFX(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::SDIV(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::SEL(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::SHADD16(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SHADD8(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SHASX(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SHSAX(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SHSUB16(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SHSUB8(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::SMLA__(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SMLAD(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SMLAL(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SMLAL__(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SMLALD(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SMLAW_(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SMLSD(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SMLSLD(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SMMLA(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SMMLS(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SMMUL(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SMUAD(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SMUL__(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SMULL(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SMULW_(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SMUSD(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::SSAT(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SSAT16(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SSAX(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SSUB16(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SSUB8(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::STM(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::STMDA(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::STMDB(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::STMIB(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + void ARMv7DisAsm::STR_IMM(const u32 data, const ARMv7_encoding type) { - Write("STR..."); + Write(__FUNCTION__); } void ARMv7DisAsm::STR_REG(const u32 data, const ARMv7_encoding type) { - Write("STR..."); + Write(__FUNCTION__); } + + +void ARMv7DisAsm::STRB_IMM(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::STRB_REG(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::STRD_IMM(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::STRD_REG(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::STRH_IMM(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::STRH_REG(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::SUB_IMM(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SUB_REG(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SUB_RSR(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SUB_SPI(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SUB_SPR(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::SVC(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::SWP_(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::SXTAB(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SXTAB16(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SXTAH(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SXTB(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SXTB16(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SXTH(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::TB_(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::TEQ_IMM(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::TEQ_REG(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::TEQ_RSR(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::TST_IMM(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::TST_REG(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::TST_RSR(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::UADD16(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::UADD8(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::UASX(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::UBFX(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::UDIV(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::UHADD16(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::UHADD8(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::UHASX(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::UHSAX(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::UHSUB16(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::UHSUB8(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::UMAAL(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::UMLAL(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::UMULL(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::UQADD16(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::UQADD8(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::UQASX(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::UQSAX(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::UQSUB16(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::UQSUB8(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::USAD8(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::USADA8(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::USAT(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::USAT16(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::USAX(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::USUB16(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::USUB8(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::UXTAB(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::UXTAB16(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::UXTAH(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::UXTB(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::UXTB16(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::UXTH(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + diff --git a/rpcs3/Emu/ARMv7/ARMv7DisAsm.h b/rpcs3/Emu/ARMv7/ARMv7DisAsm.h index a3a9ac63fc..e6a7fe1f8b 100644 --- a/rpcs3/Emu/ARMv7/ARMv7DisAsm.h +++ b/rpcs3/Emu/ARMv7/ARMv7DisAsm.h @@ -48,16 +48,6 @@ protected: virtual void UNK(const u32 data); virtual void NULL_OP(const u32 data, const ARMv7_encoding type); - virtual void NOP(const u32 data, const ARMv7_encoding type); - - virtual void PUSH(const u32 data, const ARMv7_encoding type); - virtual void POP(const u32 data, const ARMv7_encoding type); - - virtual void B(const u32 data, const ARMv7_encoding type); - virtual void CBZ(const u32 data, const ARMv7_encoding type); - virtual void CBNZ(const u32 data, const ARMv7_encoding type); - virtual void BL(const u32 data, const ARMv7_encoding type); - virtual void BLX(const u32 data, const ARMv7_encoding type); virtual void ADC_IMM(const u32 data, const ARMv7_encoding type); virtual void ADC_REG(const u32 data, const ARMv7_encoding type); @@ -69,16 +59,266 @@ protected: virtual void ADD_SPI(const u32 data, const ARMv7_encoding type); virtual void ADD_SPR(const u32 data, const ARMv7_encoding type); + virtual void ADR(const u32 data, const ARMv7_encoding type); + + virtual void AND_IMM(const u32 data, const ARMv7_encoding type); + virtual void AND_REG(const u32 data, const ARMv7_encoding type); + virtual void AND_RSR(const u32 data, const ARMv7_encoding type); + + virtual void ASR_IMM(const u32 data, const ARMv7_encoding type); + virtual void ASR_REG(const u32 data, const ARMv7_encoding type); + + virtual void B(const u32 data, const ARMv7_encoding type); + + virtual void BFC(const u32 data, const ARMv7_encoding type); + virtual void BFI(const u32 data, const ARMv7_encoding type); + + virtual void BIC_IMM(const u32 data, const ARMv7_encoding type); + virtual void BIC_REG(const u32 data, const ARMv7_encoding type); + virtual void BIC_RSR(const u32 data, const ARMv7_encoding type); + + virtual void BKPT(const u32 data, const ARMv7_encoding type); + + virtual void BL(const u32 data, const ARMv7_encoding type); + virtual void BLX(const u32 data, const ARMv7_encoding type); + virtual void BX(const u32 data, const ARMv7_encoding type); + + virtual void CB_Z(const u32 data, const ARMv7_encoding type); + + virtual void CLZ(const u32 data, const ARMv7_encoding type); + + virtual void CMN_IMM(const u32 data, const ARMv7_encoding type); + virtual void CMN_REG(const u32 data, const ARMv7_encoding type); + virtual void CMN_RSR(const u32 data, const ARMv7_encoding type); + + virtual void CMP_IMM(const u32 data, const ARMv7_encoding type); + virtual void CMP_REG(const u32 data, const ARMv7_encoding type); + virtual void CMP_RSR(const u32 data, const ARMv7_encoding type); + + virtual void DBG(const u32 data, const ARMv7_encoding type); + + virtual void EOR_IMM(const u32 data, const ARMv7_encoding type); + virtual void EOR_REG(const u32 data, const ARMv7_encoding type); + virtual void EOR_RSR(const u32 data, const ARMv7_encoding type); + + virtual void IT(const u32 data, const ARMv7_encoding type); + + virtual void LDM(const u32 data, const ARMv7_encoding type); + virtual void LDMDA(const u32 data, const ARMv7_encoding type); + virtual void LDMDB(const u32 data, const ARMv7_encoding type); + virtual void LDMIB(const u32 data, const ARMv7_encoding type); + + virtual void LDR_IMM(const u32 data, const ARMv7_encoding type); + virtual void LDR_LIT(const u32 data, const ARMv7_encoding type); + virtual void LDR_REG(const u32 data, const ARMv7_encoding type); + + virtual void LDRB_IMM(const u32 data, const ARMv7_encoding type); + virtual void LDRB_LIT(const u32 data, const ARMv7_encoding type); + virtual void LDRB_REG(const u32 data, const ARMv7_encoding type); + + virtual void LDRD_IMM(const u32 data, const ARMv7_encoding type); + virtual void LDRD_LIT(const u32 data, const ARMv7_encoding type); + virtual void LDRD_REG(const u32 data, const ARMv7_encoding type); + + virtual void LDRH_IMM(const u32 data, const ARMv7_encoding type); + virtual void LDRH_LIT(const u32 data, const ARMv7_encoding type); + virtual void LDRH_REG(const u32 data, const ARMv7_encoding type); + + virtual void LDRSB_IMM(const u32 data, const ARMv7_encoding type); + virtual void LDRSB_LIT(const u32 data, const ARMv7_encoding type); + virtual void LDRSB_REG(const u32 data, const ARMv7_encoding type); + + virtual void LDRSH_IMM(const u32 data, const ARMv7_encoding type); + virtual void LDRSH_LIT(const u32 data, const ARMv7_encoding type); + virtual void LDRSH_REG(const u32 data, const ARMv7_encoding type); + + virtual void LSL_IMM(const u32 data, const ARMv7_encoding type); + virtual void LSL_REG(const u32 data, const ARMv7_encoding type); + + virtual void LSR_IMM(const u32 data, const ARMv7_encoding type); + virtual void LSR_REG(const u32 data, const ARMv7_encoding type); + + virtual void MLA(const u32 data, const ARMv7_encoding type); + virtual void MLS(const u32 data, const ARMv7_encoding type); + virtual void MOV_IMM(const u32 data, const ARMv7_encoding type); virtual void MOV_REG(const u32 data, const ARMv7_encoding type); virtual void MOVT(const u32 data, const ARMv7_encoding type); + virtual void MRS(const u32 data, const ARMv7_encoding type); + virtual void MSR_IMM(const u32 data, const ARMv7_encoding type); + virtual void MSR_REG(const u32 data, const ARMv7_encoding type); + + virtual void MUL(const u32 data, const ARMv7_encoding type); + + virtual void MVN_IMM(const u32 data, const ARMv7_encoding type); + virtual void MVN_REG(const u32 data, const ARMv7_encoding type); + virtual void MVN_RSR(const u32 data, const ARMv7_encoding type); + + virtual void NEG(const u32 data, const ARMv7_encoding type); + + virtual void NOP(const u32 data, const ARMv7_encoding type); + + virtual void ORN_IMM(const u32 data, const ARMv7_encoding type); + virtual void ORN_REG(const u32 data, const ARMv7_encoding type); + + virtual void ORR_IMM(const u32 data, const ARMv7_encoding type); + virtual void ORR_REG(const u32 data, const ARMv7_encoding type); + virtual void ORR_RSR(const u32 data, const ARMv7_encoding type); + + virtual void PKH(const u32 data, const ARMv7_encoding type); + + virtual void POP(const u32 data, const ARMv7_encoding type); + virtual void PUSH(const u32 data, const ARMv7_encoding type); + + virtual void QADD(const u32 data, const ARMv7_encoding type); + virtual void QADD16(const u32 data, const ARMv7_encoding type); + virtual void QADD8(const u32 data, const ARMv7_encoding type); + virtual void QASX(const u32 data, const ARMv7_encoding type); + virtual void QDADD(const u32 data, const ARMv7_encoding type); + virtual void QDSUB(const u32 data, const ARMv7_encoding type); + virtual void QSAX(const u32 data, const ARMv7_encoding type); + virtual void QSUB(const u32 data, const ARMv7_encoding type); + virtual void QSUB16(const u32 data, const ARMv7_encoding type); + virtual void QSUB8(const u32 data, const ARMv7_encoding type); + + virtual void RBIT(const u32 data, const ARMv7_encoding type); + virtual void REV(const u32 data, const ARMv7_encoding type); + virtual void REV16(const u32 data, const ARMv7_encoding type); + virtual void REVSH(const u32 data, const ARMv7_encoding type); + + virtual void ROR_IMM(const u32 data, const ARMv7_encoding type); + virtual void ROR_REG(const u32 data, const ARMv7_encoding type); + + virtual void RRX(const u32 data, const ARMv7_encoding type); + + virtual void RSB_IMM(const u32 data, const ARMv7_encoding type); + virtual void RSB_REG(const u32 data, const ARMv7_encoding type); + virtual void RSB_RSR(const u32 data, const ARMv7_encoding type); + + virtual void RSC_IMM(const u32 data, const ARMv7_encoding type); + virtual void RSC_REG(const u32 data, const ARMv7_encoding type); + virtual void RSC_RSR(const u32 data, const ARMv7_encoding type); + + virtual void SADD16(const u32 data, const ARMv7_encoding type); + virtual void SADD8(const u32 data, const ARMv7_encoding type); + virtual void SASX(const u32 data, const ARMv7_encoding type); + + virtual void SBC_IMM(const u32 data, const ARMv7_encoding type); + virtual void SBC_REG(const u32 data, const ARMv7_encoding type); + virtual void SBC_RSR(const u32 data, const ARMv7_encoding type); + + virtual void SBFX(const u32 data, const ARMv7_encoding type); + + virtual void SDIV(const u32 data, const ARMv7_encoding type); + + virtual void SEL(const u32 data, const ARMv7_encoding type); + + virtual void SHADD16(const u32 data, const ARMv7_encoding type); + virtual void SHADD8(const u32 data, const ARMv7_encoding type); + virtual void SHASX(const u32 data, const ARMv7_encoding type); + virtual void SHSAX(const u32 data, const ARMv7_encoding type); + virtual void SHSUB16(const u32 data, const ARMv7_encoding type); + virtual void SHSUB8(const u32 data, const ARMv7_encoding type); + + virtual void SMLA__(const u32 data, const ARMv7_encoding type); + virtual void SMLAD(const u32 data, const ARMv7_encoding type); + virtual void SMLAL(const u32 data, const ARMv7_encoding type); + virtual void SMLAL__(const u32 data, const ARMv7_encoding type); + virtual void SMLALD(const u32 data, const ARMv7_encoding type); + virtual void SMLAW_(const u32 data, const ARMv7_encoding type); + virtual void SMLSD(const u32 data, const ARMv7_encoding type); + virtual void SMLSLD(const u32 data, const ARMv7_encoding type); + virtual void SMMLA(const u32 data, const ARMv7_encoding type); + virtual void SMMLS(const u32 data, const ARMv7_encoding type); + virtual void SMMUL(const u32 data, const ARMv7_encoding type); + virtual void SMUAD(const u32 data, const ARMv7_encoding type); + virtual void SMUL__(const u32 data, const ARMv7_encoding type); + virtual void SMULL(const u32 data, const ARMv7_encoding type); + virtual void SMULW_(const u32 data, const ARMv7_encoding type); + virtual void SMUSD(const u32 data, const ARMv7_encoding type); + + virtual void SSAT(const u32 data, const ARMv7_encoding type); + virtual void SSAT16(const u32 data, const ARMv7_encoding type); + virtual void SSAX(const u32 data, const ARMv7_encoding type); + virtual void SSUB16(const u32 data, const ARMv7_encoding type); + virtual void SSUB8(const u32 data, const ARMv7_encoding type); + + virtual void STM(const u32 data, const ARMv7_encoding type); + virtual void STMDA(const u32 data, const ARMv7_encoding type); + virtual void STMDB(const u32 data, const ARMv7_encoding type); + virtual void STMIB(const u32 data, const ARMv7_encoding type); + + virtual void STR_IMM(const u32 data, const ARMv7_encoding type); + virtual void STR_REG(const u32 data, const ARMv7_encoding type); + + virtual void STRB_IMM(const u32 data, const ARMv7_encoding type); + virtual void STRB_REG(const u32 data, const ARMv7_encoding type); + + virtual void STRD_IMM(const u32 data, const ARMv7_encoding type); + virtual void STRD_REG(const u32 data, const ARMv7_encoding type); + + virtual void STRH_IMM(const u32 data, const ARMv7_encoding type); + virtual void STRH_REG(const u32 data, const ARMv7_encoding type); + virtual void SUB_IMM(const u32 data, const ARMv7_encoding type); virtual void SUB_REG(const u32 data, const ARMv7_encoding type); virtual void SUB_RSR(const u32 data, const ARMv7_encoding type); virtual void SUB_SPI(const u32 data, const ARMv7_encoding type); virtual void SUB_SPR(const u32 data, const ARMv7_encoding type); - virtual void STR_IMM(const u32 data, const ARMv7_encoding type); - virtual void STR_REG(const u32 data, const ARMv7_encoding type); + virtual void SVC(const u32 data, const ARMv7_encoding type); + + virtual void SWP_(const u32 data, const ARMv7_encoding type); + + virtual void SXTAB(const u32 data, const ARMv7_encoding type); + virtual void SXTAB16(const u32 data, const ARMv7_encoding type); + virtual void SXTAH(const u32 data, const ARMv7_encoding type); + virtual void SXTB(const u32 data, const ARMv7_encoding type); + virtual void SXTB16(const u32 data, const ARMv7_encoding type); + virtual void SXTH(const u32 data, const ARMv7_encoding type); + + virtual void TB_(const u32 data, const ARMv7_encoding type); + + virtual void TEQ_IMM(const u32 data, const ARMv7_encoding type); + virtual void TEQ_REG(const u32 data, const ARMv7_encoding type); + virtual void TEQ_RSR(const u32 data, const ARMv7_encoding type); + + virtual void TST_IMM(const u32 data, const ARMv7_encoding type); + virtual void TST_REG(const u32 data, const ARMv7_encoding type); + virtual void TST_RSR(const u32 data, const ARMv7_encoding type); + + virtual void UADD16(const u32 data, const ARMv7_encoding type); + virtual void UADD8(const u32 data, const ARMv7_encoding type); + virtual void UASX(const u32 data, const ARMv7_encoding type); + virtual void UBFX(const u32 data, const ARMv7_encoding type); + virtual void UDIV(const u32 data, const ARMv7_encoding type); + virtual void UHADD16(const u32 data, const ARMv7_encoding type); + virtual void UHADD8(const u32 data, const ARMv7_encoding type); + virtual void UHASX(const u32 data, const ARMv7_encoding type); + virtual void UHSAX(const u32 data, const ARMv7_encoding type); + virtual void UHSUB16(const u32 data, const ARMv7_encoding type); + virtual void UHSUB8(const u32 data, const ARMv7_encoding type); + virtual void UMAAL(const u32 data, const ARMv7_encoding type); + virtual void UMLAL(const u32 data, const ARMv7_encoding type); + virtual void UMULL(const u32 data, const ARMv7_encoding type); + virtual void UQADD16(const u32 data, const ARMv7_encoding type); + virtual void UQADD8(const u32 data, const ARMv7_encoding type); + virtual void UQASX(const u32 data, const ARMv7_encoding type); + virtual void UQSAX(const u32 data, const ARMv7_encoding type); + virtual void UQSUB16(const u32 data, const ARMv7_encoding type); + virtual void UQSUB8(const u32 data, const ARMv7_encoding type); + virtual void USAD8(const u32 data, const ARMv7_encoding type); + virtual void USADA8(const u32 data, const ARMv7_encoding type); + virtual void USAT(const u32 data, const ARMv7_encoding type); + virtual void USAT16(const u32 data, const ARMv7_encoding type); + virtual void USAX(const u32 data, const ARMv7_encoding type); + virtual void USUB16(const u32 data, const ARMv7_encoding type); + virtual void USUB8(const u32 data, const ARMv7_encoding type); + virtual void UXTAB(const u32 data, const ARMv7_encoding type); + virtual void UXTAB16(const u32 data, const ARMv7_encoding type); + virtual void UXTAH(const u32 data, const ARMv7_encoding type); + virtual void UXTB(const u32 data, const ARMv7_encoding type); + virtual void UXTB16(const u32 data, const ARMv7_encoding type); + virtual void UXTH(const u32 data, const ARMv7_encoding type); }; diff --git a/rpcs3/Emu/ARMv7/ARMv7Interpreter.cpp b/rpcs3/Emu/ARMv7/ARMv7Interpreter.cpp index 28990ee9b1..355a445aa3 100644 --- a/rpcs3/Emu/ARMv7/ARMv7Interpreter.cpp +++ b/rpcs3/Emu/ARMv7/ARMv7Interpreter.cpp @@ -17,112 +17,140 @@ void ARMv7Interpreter::NULL_OP(const u32 data, const ARMv7_encoding type) Emu.Pause(); } -void ARMv7Interpreter::NOP(const u32 data, const ARMv7_encoding type) +void ARMv7Interpreter::ADC_IMM(const u32 data, const ARMv7_encoding type) { switch (type) { - case T1: break; - case T2: break; - case A1: break; + case A1: throw __FUNCTION__; default: throw __FUNCTION__; } } -void ARMv7Interpreter::PUSH(const u32 data, const ARMv7_encoding type) +void ARMv7Interpreter::ADC_REG(const u32 data, const ARMv7_encoding type) { - u16 reg_list = 0; - switch (type) { - case T1: - { - reg_list = ((data & 0x100) << 6) | (data & 0xff); - break; - } - case T2: - { - reg_list = data & 0x5fff; - break; - } - case T3: - { - reg_list = 1 << (data >> 12); - break; - } - case A1: - { - reg_list = data & 0xffff; if (BitCount(reg_list) < 2) throw "STMDB / STMFD"; - if (!ConditionPassed(data >> 28)) return; - break; - } - case A2: - { - reg_list = 1 << ((data >> 12) & 0xf); - if (!ConditionPassed(data >> 28)) return; - break; - } + case A1: throw __FUNCTION__; default: throw __FUNCTION__; } - - for (u16 mask = 1 << 15, i = 15; mask; mask >>= 1, i--) - { - if (reg_list & mask) - { - CPU.SP -= 4; - vm::psv::write32(CPU.SP, CPU.read_gpr(i)); - } - } } -void ARMv7Interpreter::POP(const u32 data, const ARMv7_encoding type) +void ARMv7Interpreter::ADC_RSR(const u32 data, const ARMv7_encoding type) { - u16 reg_list = 0; - switch (type) { - case T1: - { - reg_list = ((data & 0x100) << 6) | (data & 0xff); - break; - } - case T2: - { - reg_list = data & 0xdfff; - break; - } - case T3: - { - reg_list = 1 << (data >> 12); - break; - } - case A1: - { - reg_list = data & 0xffff; if (BitCount(reg_list) < 2) throw "LDM / LDMIA / LDMFD"; - if (!ConditionPassed(data >> 28)) return; - break; - } - case A2: - { - reg_list = 1 << ((data >> 12) & 0xf); - if (!ConditionPassed(data >> 28)) return; - break; - } + case A1: throw __FUNCTION__; default: throw __FUNCTION__; } +} - for (u16 mask = 1, i = 0; mask; mask <<= 1, i++) + +void ARMv7Interpreter::ADD_IMM(const u32 data, const ARMv7_encoding type) +{ + switch (type) { - if (reg_list & mask) - { - CPU.write_gpr(i, vm::psv::read32(CPU.SP)); - CPU.SP += 4; - } + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; } } +void ARMv7Interpreter::ADD_REG(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::ADD_RSR(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::ADD_SPI(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::ADD_SPR(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::ADR(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::AND_IMM(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::AND_REG(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::AND_RSR(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::ASR_IMM(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::ASR_REG(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + void ARMv7Interpreter::B(const u32 data, const ARMv7_encoding type) { - u8 cond = 0xf; + u32 cond = 0xf; u32 jump = 0; // jump = instr_size + imm32 switch (type) @@ -169,34 +197,64 @@ void ARMv7Interpreter::B(const u32 data, const ARMv7_encoding type) } } -void ARMv7Interpreter::CBZ(const u32 data, const ARMv7_encoding type) + +void ARMv7Interpreter::BFC(const u32 data, const ARMv7_encoding type) { switch (type) { - case T1: break; + case A1: throw __FUNCTION__; default: throw __FUNCTION__; } - - if (CPU.GPR[data & 0x7] == 0) - { - CPU.SetBranch(CPU.PC + 2 + ((data & 0xf8) >> 2) + ((data & 0x200) >> 3)); - } } -void ARMv7Interpreter::CBNZ(const u32 data, const ARMv7_encoding type) +void ARMv7Interpreter::BFI(const u32 data, const ARMv7_encoding type) { switch (type) { - case T1: break; + case A1: throw __FUNCTION__; default: throw __FUNCTION__; } +} - if (CPU.GPR[data & 0x7] != 0) + +void ARMv7Interpreter::BIC_IMM(const u32 data, const ARMv7_encoding type) +{ + switch (type) { - CPU.SetBranch(CPU.PC + 2 + ((data & 0xf8) >> 2) + ((data & 0x200) >> 3)); + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; } } +void ARMv7Interpreter::BIC_REG(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::BIC_RSR(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::BKPT(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + void ARMv7Interpreter::BL(const u32 data, const ARMv7_encoding type) { u32 jump = 0; @@ -260,82 +318,426 @@ void ARMv7Interpreter::BLX(const u32 data, const ARMv7_encoding type) CPU.SetBranch(target); } -void ARMv7Interpreter::ADC_IMM(const u32 data, const ARMv7_encoding type) +void ARMv7Interpreter::BX(const u32 data, const ARMv7_encoding type) { switch (type) { + case A1: throw __FUNCTION__; default: throw __FUNCTION__; } } -void ARMv7Interpreter::ADC_REG(const u32 data, const ARMv7_encoding type) + +void ARMv7Interpreter::CB_Z(const u32 data, const ARMv7_encoding type) { switch (type) { + case T1: break; + default: throw __FUNCTION__; + } + + if ((CPU.GPR[data & 0x7] == 0) ^ (data & 0x800)) + { + CPU.SetBranch(CPU.PC + 2 + ((data & 0xf8) >> 2) + ((data & 0x200) >> 3)); + } +} + + +void ARMv7Interpreter::CLZ(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; default: throw __FUNCTION__; } } -void ARMv7Interpreter::ADC_RSR(const u32 data, const ARMv7_encoding type) + +void ARMv7Interpreter::CMN_IMM(const u32 data, const ARMv7_encoding type) { switch (type) { + case A1: throw __FUNCTION__; default: throw __FUNCTION__; } } -void ARMv7Interpreter::ADD_IMM(const u32 data, const ARMv7_encoding type) +void ARMv7Interpreter::CMN_REG(const u32 data, const ARMv7_encoding type) { switch (type) { + case A1: throw __FUNCTION__; default: throw __FUNCTION__; } } -void ARMv7Interpreter::ADD_REG(const u32 data, const ARMv7_encoding type) +void ARMv7Interpreter::CMN_RSR(const u32 data, const ARMv7_encoding type) { switch (type) { + case A1: throw __FUNCTION__; default: throw __FUNCTION__; } } -void ARMv7Interpreter::ADD_RSR(const u32 data, const ARMv7_encoding type) + +void ARMv7Interpreter::CMP_IMM(const u32 data, const ARMv7_encoding type) { switch (type) { + case A1: throw __FUNCTION__; default: throw __FUNCTION__; } } -void ARMv7Interpreter::ADD_SPI(const u32 data, const ARMv7_encoding type) +void ARMv7Interpreter::CMP_REG(const u32 data, const ARMv7_encoding type) { switch (type) { + case A1: throw __FUNCTION__; default: throw __FUNCTION__; } } -void ARMv7Interpreter::ADD_SPR(const u32 data, const ARMv7_encoding type) +void ARMv7Interpreter::CMP_RSR(const u32 data, const ARMv7_encoding type) { switch (type) { + case A1: throw __FUNCTION__; default: throw __FUNCTION__; } } + +void ARMv7Interpreter::DBG(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::EOR_IMM(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::EOR_REG(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::EOR_RSR(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::IT(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::LDM(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::LDMDA(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::LDMDB(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::LDMIB(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::LDR_IMM(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::LDR_LIT(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::LDR_REG(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::LDRB_IMM(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::LDRB_LIT(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::LDRB_REG(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::LDRD_IMM(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::LDRD_LIT(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::LDRD_REG(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::LDRH_IMM(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::LDRH_LIT(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::LDRH_REG(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::LDRSB_IMM(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::LDRSB_LIT(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::LDRSB_REG(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::LDRSH_IMM(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::LDRSH_LIT(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::LDRSH_REG(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::LSL_IMM(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::LSL_REG(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::LSR_IMM(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::LSR_REG(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::MLA(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::MLS(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + void ARMv7Interpreter::MOV_IMM(const u32 data, const ARMv7_encoding type) { + u32 d; + u32 imm; + switch (type) { + case T1: d = (data >> 8) & 0x7; imm = sign<8, u32>(data & 0xff); break; default: throw __FUNCTION__; } + + CPU.write_gpr(d, imm); } void ARMv7Interpreter::MOV_REG(const u32 data, const ARMv7_encoding type) { switch (type) { + case A1: throw __FUNCTION__; default: throw __FUNCTION__; } } @@ -344,14 +746,913 @@ void ARMv7Interpreter::MOVT(const u32 data, const ARMv7_encoding type) { switch (type) { + case A1: throw __FUNCTION__; default: throw __FUNCTION__; } } + +void ARMv7Interpreter::MRS(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::MSR_IMM(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::MSR_REG(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::MUL(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::MVN_IMM(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::MVN_REG(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::MVN_RSR(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::NEG(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::NOP(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case T1: break; + case T2: break; + case A1: break; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::ORN_IMM(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::ORN_REG(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::ORR_IMM(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::ORR_REG(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::ORR_RSR(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::PKH(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::POP(const u32 data, const ARMv7_encoding type) +{ + u16 reg_list = 0; + + switch (type) + { + case T1: + { + reg_list = ((data & 0x100) << 6) | (data & 0xff); + break; + } + case T2: + { + reg_list = data & 0xdfff; + break; + } + case T3: + { + reg_list = 1 << (data >> 12); + break; + } + case A1: + { + reg_list = data & 0xffff; if (BitCount(reg_list) < 2) throw "LDM / LDMIA / LDMFD"; + if (!ConditionPassed(data >> 28)) return; + break; + } + case A2: + { + reg_list = 1 << ((data >> 12) & 0xf); + if (!ConditionPassed(data >> 28)) return; + break; + } + default: throw __FUNCTION__; + } + + for (u16 mask = 1, i = 0; mask; mask <<= 1, i++) + { + if (reg_list & mask) + { + CPU.write_gpr(i, vm::psv::read32(CPU.SP)); + CPU.SP += 4; + } + } +} + +void ARMv7Interpreter::PUSH(const u32 data, const ARMv7_encoding type) +{ + u16 reg_list = 0; + + switch (type) + { + case T1: + { + reg_list = ((data & 0x100) << 6) | (data & 0xff); + break; + } + case T2: + { + reg_list = data & 0x5fff; + break; + } + case T3: + { + reg_list = 1 << (data >> 12); + break; + } + case A1: + { + reg_list = data & 0xffff; if (BitCount(reg_list) < 2) throw "STMDB / STMFD"; + if (!ConditionPassed(data >> 28)) return; + break; + } + case A2: + { + reg_list = 1 << ((data >> 12) & 0xf); + if (!ConditionPassed(data >> 28)) return; + break; + } + default: throw __FUNCTION__; + } + + for (u16 mask = 1 << 15, i = 15; mask; mask >>= 1, i--) + { + if (reg_list & mask) + { + CPU.SP -= 4; + vm::psv::write32(CPU.SP, CPU.read_gpr(i)); + } + } +} + + +void ARMv7Interpreter::QADD(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::QADD16(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::QADD8(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::QASX(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::QDADD(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::QDSUB(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::QSAX(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::QSUB(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::QSUB16(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::QSUB8(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::RBIT(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::REV(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::REV16(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::REVSH(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::ROR_IMM(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::ROR_REG(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::RRX(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::RSB_IMM(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::RSB_REG(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::RSB_RSR(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::RSC_IMM(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::RSC_REG(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::RSC_RSR(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::SADD16(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SADD8(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SASX(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::SBC_IMM(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SBC_REG(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SBC_RSR(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::SBFX(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::SDIV(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::SEL(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::SHADD16(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SHADD8(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SHASX(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SHSAX(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SHSUB16(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SHSUB8(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::SMLA__(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SMLAD(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SMLAL(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SMLAL__(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SMLALD(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SMLAW_(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SMLSD(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SMLSLD(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SMMLA(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SMMLS(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SMMUL(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SMUAD(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SMUL__(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SMULL(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SMULW_(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SMUSD(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::SSAT(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SSAT16(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SSAX(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SSUB16(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SSUB8(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::STM(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::STMDA(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::STMDB(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::STMIB(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::STR_IMM(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::STR_REG(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::STRB_IMM(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::STRB_REG(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::STRD_IMM(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::STRD_REG(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::STRH_IMM(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::STRH_REG(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + void ARMv7Interpreter::SUB_IMM(const u32 data, const ARMv7_encoding type) { switch (type) { + case A1: throw __FUNCTION__; default: throw __FUNCTION__; } } @@ -360,6 +1661,7 @@ void ARMv7Interpreter::SUB_REG(const u32 data, const ARMv7_encoding type) { switch (type) { + case A1: throw __FUNCTION__; default: throw __FUNCTION__; } } @@ -368,6 +1670,7 @@ void ARMv7Interpreter::SUB_RSR(const u32 data, const ARMv7_encoding type) { switch (type) { + case A1: throw __FUNCTION__; default: throw __FUNCTION__; } } @@ -385,22 +1688,446 @@ void ARMv7Interpreter::SUB_SPR(const u32 data, const ARMv7_encoding type) { switch (type) { + case A1: throw __FUNCTION__; default: throw __FUNCTION__; } } -void ARMv7Interpreter::STR_IMM(const u32 data, const ARMv7_encoding type) + +void ARMv7Interpreter::SVC(const u32 data, const ARMv7_encoding type) { switch (type) { + case A1: throw __FUNCTION__; default: throw __FUNCTION__; } } -void ARMv7Interpreter::STR_REG(const u32 data, const ARMv7_encoding type) + +void ARMv7Interpreter::SWP_(const u32 data, const ARMv7_encoding type) { switch (type) { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::SXTAB(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SXTAB16(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SXTAH(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SXTB(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SXTB16(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SXTH(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::TB_(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::TEQ_IMM(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::TEQ_REG(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::TEQ_RSR(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::TST_IMM(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::TST_REG(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::TST_RSR(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::UADD16(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::UADD8(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::UASX(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::UBFX(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::UDIV(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::UHADD16(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::UHADD8(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::UHASX(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::UHSAX(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::UHSUB16(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::UHSUB8(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::UMAAL(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::UMLAL(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::UMULL(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::UQADD16(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::UQADD8(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::UQASX(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::UQSAX(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::UQSUB16(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::UQSUB8(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::USAD8(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::USADA8(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::USAT(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::USAT16(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::USAX(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::USUB16(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::USUB8(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::UXTAB(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::UXTAB16(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::UXTAH(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::UXTB(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::UXTB16(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::UXTH(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; default: throw __FUNCTION__; } } diff --git a/rpcs3/Emu/ARMv7/ARMv7Interpreter.h b/rpcs3/Emu/ARMv7/ARMv7Interpreter.h index 92f0cdb84c..1f7099fbe4 100644 --- a/rpcs3/Emu/ARMv7/ARMv7Interpreter.h +++ b/rpcs3/Emu/ARMv7/ARMv7Interpreter.h @@ -233,7 +233,7 @@ public: return result; } - bool ConditionPassed(u8 cond) const + bool ConditionPassed(u32 cond) const { bool result = false; @@ -261,16 +261,6 @@ protected: virtual void UNK(const u32 data); virtual void NULL_OP(const u32 data, const ARMv7_encoding type); - virtual void NOP(const u32 data, const ARMv7_encoding type); - - virtual void PUSH(const u32 data, const ARMv7_encoding type); - virtual void POP(const u32 data, const ARMv7_encoding type); - - virtual void B(const u32 data, const ARMv7_encoding type); - virtual void CBZ(const u32 data, const ARMv7_encoding type); - virtual void CBNZ(const u32 data, const ARMv7_encoding type); - virtual void BL(const u32 data, const ARMv7_encoding type); - virtual void BLX(const u32 data, const ARMv7_encoding type); virtual void ADC_IMM(const u32 data, const ARMv7_encoding type); virtual void ADC_REG(const u32 data, const ARMv7_encoding type); @@ -282,16 +272,266 @@ protected: virtual void ADD_SPI(const u32 data, const ARMv7_encoding type); virtual void ADD_SPR(const u32 data, const ARMv7_encoding type); + virtual void ADR(const u32 data, const ARMv7_encoding type); + + virtual void AND_IMM(const u32 data, const ARMv7_encoding type); + virtual void AND_REG(const u32 data, const ARMv7_encoding type); + virtual void AND_RSR(const u32 data, const ARMv7_encoding type); + + virtual void ASR_IMM(const u32 data, const ARMv7_encoding type); + virtual void ASR_REG(const u32 data, const ARMv7_encoding type); + + virtual void B(const u32 data, const ARMv7_encoding type); + + virtual void BFC(const u32 data, const ARMv7_encoding type); + virtual void BFI(const u32 data, const ARMv7_encoding type); + + virtual void BIC_IMM(const u32 data, const ARMv7_encoding type); + virtual void BIC_REG(const u32 data, const ARMv7_encoding type); + virtual void BIC_RSR(const u32 data, const ARMv7_encoding type); + + virtual void BKPT(const u32 data, const ARMv7_encoding type); + + virtual void BL(const u32 data, const ARMv7_encoding type); + virtual void BLX(const u32 data, const ARMv7_encoding type); + virtual void BX(const u32 data, const ARMv7_encoding type); + + virtual void CB_Z(const u32 data, const ARMv7_encoding type); + + virtual void CLZ(const u32 data, const ARMv7_encoding type); + + virtual void CMN_IMM(const u32 data, const ARMv7_encoding type); + virtual void CMN_REG(const u32 data, const ARMv7_encoding type); + virtual void CMN_RSR(const u32 data, const ARMv7_encoding type); + + virtual void CMP_IMM(const u32 data, const ARMv7_encoding type); + virtual void CMP_REG(const u32 data, const ARMv7_encoding type); + virtual void CMP_RSR(const u32 data, const ARMv7_encoding type); + + virtual void DBG(const u32 data, const ARMv7_encoding type); + + virtual void EOR_IMM(const u32 data, const ARMv7_encoding type); + virtual void EOR_REG(const u32 data, const ARMv7_encoding type); + virtual void EOR_RSR(const u32 data, const ARMv7_encoding type); + + virtual void IT(const u32 data, const ARMv7_encoding type); + + virtual void LDM(const u32 data, const ARMv7_encoding type); + virtual void LDMDA(const u32 data, const ARMv7_encoding type); + virtual void LDMDB(const u32 data, const ARMv7_encoding type); + virtual void LDMIB(const u32 data, const ARMv7_encoding type); + + virtual void LDR_IMM(const u32 data, const ARMv7_encoding type); + virtual void LDR_LIT(const u32 data, const ARMv7_encoding type); + virtual void LDR_REG(const u32 data, const ARMv7_encoding type); + + virtual void LDRB_IMM(const u32 data, const ARMv7_encoding type); + virtual void LDRB_LIT(const u32 data, const ARMv7_encoding type); + virtual void LDRB_REG(const u32 data, const ARMv7_encoding type); + + virtual void LDRD_IMM(const u32 data, const ARMv7_encoding type); + virtual void LDRD_LIT(const u32 data, const ARMv7_encoding type); + virtual void LDRD_REG(const u32 data, const ARMv7_encoding type); + + virtual void LDRH_IMM(const u32 data, const ARMv7_encoding type); + virtual void LDRH_LIT(const u32 data, const ARMv7_encoding type); + virtual void LDRH_REG(const u32 data, const ARMv7_encoding type); + + virtual void LDRSB_IMM(const u32 data, const ARMv7_encoding type); + virtual void LDRSB_LIT(const u32 data, const ARMv7_encoding type); + virtual void LDRSB_REG(const u32 data, const ARMv7_encoding type); + + virtual void LDRSH_IMM(const u32 data, const ARMv7_encoding type); + virtual void LDRSH_LIT(const u32 data, const ARMv7_encoding type); + virtual void LDRSH_REG(const u32 data, const ARMv7_encoding type); + + virtual void LSL_IMM(const u32 data, const ARMv7_encoding type); + virtual void LSL_REG(const u32 data, const ARMv7_encoding type); + + virtual void LSR_IMM(const u32 data, const ARMv7_encoding type); + virtual void LSR_REG(const u32 data, const ARMv7_encoding type); + + virtual void MLA(const u32 data, const ARMv7_encoding type); + virtual void MLS(const u32 data, const ARMv7_encoding type); + virtual void MOV_IMM(const u32 data, const ARMv7_encoding type); virtual void MOV_REG(const u32 data, const ARMv7_encoding type); virtual void MOVT(const u32 data, const ARMv7_encoding type); + virtual void MRS(const u32 data, const ARMv7_encoding type); + virtual void MSR_IMM(const u32 data, const ARMv7_encoding type); + virtual void MSR_REG(const u32 data, const ARMv7_encoding type); + + virtual void MUL(const u32 data, const ARMv7_encoding type); + + virtual void MVN_IMM(const u32 data, const ARMv7_encoding type); + virtual void MVN_REG(const u32 data, const ARMv7_encoding type); + virtual void MVN_RSR(const u32 data, const ARMv7_encoding type); + + virtual void NEG(const u32 data, const ARMv7_encoding type); + + virtual void NOP(const u32 data, const ARMv7_encoding type); + + virtual void ORN_IMM(const u32 data, const ARMv7_encoding type); + virtual void ORN_REG(const u32 data, const ARMv7_encoding type); + + virtual void ORR_IMM(const u32 data, const ARMv7_encoding type); + virtual void ORR_REG(const u32 data, const ARMv7_encoding type); + virtual void ORR_RSR(const u32 data, const ARMv7_encoding type); + + virtual void PKH(const u32 data, const ARMv7_encoding type); + + virtual void POP(const u32 data, const ARMv7_encoding type); + virtual void PUSH(const u32 data, const ARMv7_encoding type); + + virtual void QADD(const u32 data, const ARMv7_encoding type); + virtual void QADD16(const u32 data, const ARMv7_encoding type); + virtual void QADD8(const u32 data, const ARMv7_encoding type); + virtual void QASX(const u32 data, const ARMv7_encoding type); + virtual void QDADD(const u32 data, const ARMv7_encoding type); + virtual void QDSUB(const u32 data, const ARMv7_encoding type); + virtual void QSAX(const u32 data, const ARMv7_encoding type); + virtual void QSUB(const u32 data, const ARMv7_encoding type); + virtual void QSUB16(const u32 data, const ARMv7_encoding type); + virtual void QSUB8(const u32 data, const ARMv7_encoding type); + + virtual void RBIT(const u32 data, const ARMv7_encoding type); + virtual void REV(const u32 data, const ARMv7_encoding type); + virtual void REV16(const u32 data, const ARMv7_encoding type); + virtual void REVSH(const u32 data, const ARMv7_encoding type); + + virtual void ROR_IMM(const u32 data, const ARMv7_encoding type); + virtual void ROR_REG(const u32 data, const ARMv7_encoding type); + + virtual void RRX(const u32 data, const ARMv7_encoding type); + + virtual void RSB_IMM(const u32 data, const ARMv7_encoding type); + virtual void RSB_REG(const u32 data, const ARMv7_encoding type); + virtual void RSB_RSR(const u32 data, const ARMv7_encoding type); + + virtual void RSC_IMM(const u32 data, const ARMv7_encoding type); + virtual void RSC_REG(const u32 data, const ARMv7_encoding type); + virtual void RSC_RSR(const u32 data, const ARMv7_encoding type); + + virtual void SADD16(const u32 data, const ARMv7_encoding type); + virtual void SADD8(const u32 data, const ARMv7_encoding type); + virtual void SASX(const u32 data, const ARMv7_encoding type); + + virtual void SBC_IMM(const u32 data, const ARMv7_encoding type); + virtual void SBC_REG(const u32 data, const ARMv7_encoding type); + virtual void SBC_RSR(const u32 data, const ARMv7_encoding type); + + virtual void SBFX(const u32 data, const ARMv7_encoding type); + + virtual void SDIV(const u32 data, const ARMv7_encoding type); + + virtual void SEL(const u32 data, const ARMv7_encoding type); + + virtual void SHADD16(const u32 data, const ARMv7_encoding type); + virtual void SHADD8(const u32 data, const ARMv7_encoding type); + virtual void SHASX(const u32 data, const ARMv7_encoding type); + virtual void SHSAX(const u32 data, const ARMv7_encoding type); + virtual void SHSUB16(const u32 data, const ARMv7_encoding type); + virtual void SHSUB8(const u32 data, const ARMv7_encoding type); + + virtual void SMLA__(const u32 data, const ARMv7_encoding type); + virtual void SMLAD(const u32 data, const ARMv7_encoding type); + virtual void SMLAL(const u32 data, const ARMv7_encoding type); + virtual void SMLAL__(const u32 data, const ARMv7_encoding type); + virtual void SMLALD(const u32 data, const ARMv7_encoding type); + virtual void SMLAW_(const u32 data, const ARMv7_encoding type); + virtual void SMLSD(const u32 data, const ARMv7_encoding type); + virtual void SMLSLD(const u32 data, const ARMv7_encoding type); + virtual void SMMLA(const u32 data, const ARMv7_encoding type); + virtual void SMMLS(const u32 data, const ARMv7_encoding type); + virtual void SMMUL(const u32 data, const ARMv7_encoding type); + virtual void SMUAD(const u32 data, const ARMv7_encoding type); + virtual void SMUL__(const u32 data, const ARMv7_encoding type); + virtual void SMULL(const u32 data, const ARMv7_encoding type); + virtual void SMULW_(const u32 data, const ARMv7_encoding type); + virtual void SMUSD(const u32 data, const ARMv7_encoding type); + + virtual void SSAT(const u32 data, const ARMv7_encoding type); + virtual void SSAT16(const u32 data, const ARMv7_encoding type); + virtual void SSAX(const u32 data, const ARMv7_encoding type); + virtual void SSUB16(const u32 data, const ARMv7_encoding type); + virtual void SSUB8(const u32 data, const ARMv7_encoding type); + + virtual void STM(const u32 data, const ARMv7_encoding type); + virtual void STMDA(const u32 data, const ARMv7_encoding type); + virtual void STMDB(const u32 data, const ARMv7_encoding type); + virtual void STMIB(const u32 data, const ARMv7_encoding type); + + virtual void STR_IMM(const u32 data, const ARMv7_encoding type); + virtual void STR_REG(const u32 data, const ARMv7_encoding type); + + virtual void STRB_IMM(const u32 data, const ARMv7_encoding type); + virtual void STRB_REG(const u32 data, const ARMv7_encoding type); + + virtual void STRD_IMM(const u32 data, const ARMv7_encoding type); + virtual void STRD_REG(const u32 data, const ARMv7_encoding type); + + virtual void STRH_IMM(const u32 data, const ARMv7_encoding type); + virtual void STRH_REG(const u32 data, const ARMv7_encoding type); + virtual void SUB_IMM(const u32 data, const ARMv7_encoding type); virtual void SUB_REG(const u32 data, const ARMv7_encoding type); virtual void SUB_RSR(const u32 data, const ARMv7_encoding type); virtual void SUB_SPI(const u32 data, const ARMv7_encoding type); virtual void SUB_SPR(const u32 data, const ARMv7_encoding type); - virtual void STR_IMM(const u32 data, const ARMv7_encoding type); - virtual void STR_REG(const u32 data, const ARMv7_encoding type); + virtual void SVC(const u32 data, const ARMv7_encoding type); + + virtual void SWP_(const u32 data, const ARMv7_encoding type); + + virtual void SXTAB(const u32 data, const ARMv7_encoding type); + virtual void SXTAB16(const u32 data, const ARMv7_encoding type); + virtual void SXTAH(const u32 data, const ARMv7_encoding type); + virtual void SXTB(const u32 data, const ARMv7_encoding type); + virtual void SXTB16(const u32 data, const ARMv7_encoding type); + virtual void SXTH(const u32 data, const ARMv7_encoding type); + + virtual void TB_(const u32 data, const ARMv7_encoding type); + + virtual void TEQ_IMM(const u32 data, const ARMv7_encoding type); + virtual void TEQ_REG(const u32 data, const ARMv7_encoding type); + virtual void TEQ_RSR(const u32 data, const ARMv7_encoding type); + + virtual void TST_IMM(const u32 data, const ARMv7_encoding type); + virtual void TST_REG(const u32 data, const ARMv7_encoding type); + virtual void TST_RSR(const u32 data, const ARMv7_encoding type); + + virtual void UADD16(const u32 data, const ARMv7_encoding type); + virtual void UADD8(const u32 data, const ARMv7_encoding type); + virtual void UASX(const u32 data, const ARMv7_encoding type); + virtual void UBFX(const u32 data, const ARMv7_encoding type); + virtual void UDIV(const u32 data, const ARMv7_encoding type); + virtual void UHADD16(const u32 data, const ARMv7_encoding type); + virtual void UHADD8(const u32 data, const ARMv7_encoding type); + virtual void UHASX(const u32 data, const ARMv7_encoding type); + virtual void UHSAX(const u32 data, const ARMv7_encoding type); + virtual void UHSUB16(const u32 data, const ARMv7_encoding type); + virtual void UHSUB8(const u32 data, const ARMv7_encoding type); + virtual void UMAAL(const u32 data, const ARMv7_encoding type); + virtual void UMLAL(const u32 data, const ARMv7_encoding type); + virtual void UMULL(const u32 data, const ARMv7_encoding type); + virtual void UQADD16(const u32 data, const ARMv7_encoding type); + virtual void UQADD8(const u32 data, const ARMv7_encoding type); + virtual void UQASX(const u32 data, const ARMv7_encoding type); + virtual void UQSAX(const u32 data, const ARMv7_encoding type); + virtual void UQSUB16(const u32 data, const ARMv7_encoding type); + virtual void UQSUB8(const u32 data, const ARMv7_encoding type); + virtual void USAD8(const u32 data, const ARMv7_encoding type); + virtual void USADA8(const u32 data, const ARMv7_encoding type); + virtual void USAT(const u32 data, const ARMv7_encoding type); + virtual void USAT16(const u32 data, const ARMv7_encoding type); + virtual void USAX(const u32 data, const ARMv7_encoding type); + virtual void USUB16(const u32 data, const ARMv7_encoding type); + virtual void USUB8(const u32 data, const ARMv7_encoding type); + virtual void UXTAB(const u32 data, const ARMv7_encoding type); + virtual void UXTAB16(const u32 data, const ARMv7_encoding type); + virtual void UXTAH(const u32 data, const ARMv7_encoding type); + virtual void UXTB(const u32 data, const ARMv7_encoding type); + virtual void UXTB16(const u32 data, const ARMv7_encoding type); + virtual void UXTH(const u32 data, const ARMv7_encoding type); }; diff --git a/rpcs3/Emu/ARMv7/ARMv7Opcodes.h b/rpcs3/Emu/ARMv7/ARMv7Opcodes.h index ede8c4bd8c..5fa8af6fed 100644 --- a/rpcs3/Emu/ARMv7/ARMv7Opcodes.h +++ b/rpcs3/Emu/ARMv7/ARMv7Opcodes.h @@ -48,16 +48,6 @@ public: virtual void UNK(const u32 data) = 0; virtual void NULL_OP(const u32 data, const ARMv7_encoding type) = 0; - virtual void NOP(const u32 data, const ARMv7_encoding type) = 0; - - virtual void PUSH(const u32 data, const ARMv7_encoding type) = 0; - virtual void POP(const u32 data, const ARMv7_encoding type) = 0; - - virtual void B(const u32 data, const ARMv7_encoding type) = 0; - virtual void CBZ(const u32 data, const ARMv7_encoding type) = 0; - virtual void CBNZ(const u32 data, const ARMv7_encoding type) = 0; - virtual void BL(const u32 data, const ARMv7_encoding type) = 0; - virtual void BLX(const u32 data, const ARMv7_encoding type) = 0; virtual void ADC_IMM(const u32 data, const ARMv7_encoding type) = 0; virtual void ADC_REG(const u32 data, const ARMv7_encoding type) = 0; @@ -69,18 +59,270 @@ public: virtual void ADD_SPI(const u32 data, const ARMv7_encoding type) = 0; virtual void ADD_SPR(const u32 data, const ARMv7_encoding type) = 0; + virtual void ADR(const u32 data, const ARMv7_encoding type) = 0; + + virtual void AND_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void AND_REG(const u32 data, const ARMv7_encoding type) = 0; + virtual void AND_RSR(const u32 data, const ARMv7_encoding type) = 0; + + virtual void ASR_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void ASR_REG(const u32 data, const ARMv7_encoding type) = 0; + + virtual void B(const u32 data, const ARMv7_encoding type) = 0; + + virtual void BFC(const u32 data, const ARMv7_encoding type) = 0; + virtual void BFI(const u32 data, const ARMv7_encoding type) = 0; + + virtual void BIC_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void BIC_REG(const u32 data, const ARMv7_encoding type) = 0; + virtual void BIC_RSR(const u32 data, const ARMv7_encoding type) = 0; + + virtual void BKPT(const u32 data, const ARMv7_encoding type) = 0; + + virtual void BL(const u32 data, const ARMv7_encoding type) = 0; + virtual void BLX(const u32 data, const ARMv7_encoding type) = 0; + virtual void BX(const u32 data, const ARMv7_encoding type) = 0; + + virtual void CB_Z(const u32 data, const ARMv7_encoding type) = 0; + + virtual void CLZ(const u32 data, const ARMv7_encoding type) = 0; + + virtual void CMN_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void CMN_REG(const u32 data, const ARMv7_encoding type) = 0; + virtual void CMN_RSR(const u32 data, const ARMv7_encoding type) = 0; + + virtual void CMP_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void CMP_REG(const u32 data, const ARMv7_encoding type) = 0; + virtual void CMP_RSR(const u32 data, const ARMv7_encoding type) = 0; + + virtual void DBG(const u32 data, const ARMv7_encoding type) = 0; + + virtual void EOR_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void EOR_REG(const u32 data, const ARMv7_encoding type) = 0; + virtual void EOR_RSR(const u32 data, const ARMv7_encoding type) = 0; + + virtual void IT(const u32 data, const ARMv7_encoding type) = 0; + + virtual void LDM(const u32 data, const ARMv7_encoding type) = 0; + virtual void LDMDA(const u32 data, const ARMv7_encoding type) = 0; + virtual void LDMDB(const u32 data, const ARMv7_encoding type) = 0; + virtual void LDMIB(const u32 data, const ARMv7_encoding type) = 0; + + virtual void LDR_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void LDR_LIT(const u32 data, const ARMv7_encoding type) = 0; + virtual void LDR_REG(const u32 data, const ARMv7_encoding type) = 0; + + virtual void LDRB_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void LDRB_LIT(const u32 data, const ARMv7_encoding type) = 0; + virtual void LDRB_REG(const u32 data, const ARMv7_encoding type) = 0; + + virtual void LDRD_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void LDRD_LIT(const u32 data, const ARMv7_encoding type) = 0; + virtual void LDRD_REG(const u32 data, const ARMv7_encoding type) = 0; + + virtual void LDRH_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void LDRH_LIT(const u32 data, const ARMv7_encoding type) = 0; + virtual void LDRH_REG(const u32 data, const ARMv7_encoding type) = 0; + + virtual void LDRSB_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void LDRSB_LIT(const u32 data, const ARMv7_encoding type) = 0; + virtual void LDRSB_REG(const u32 data, const ARMv7_encoding type) = 0; + + virtual void LDRSH_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void LDRSH_LIT(const u32 data, const ARMv7_encoding type) = 0; + virtual void LDRSH_REG(const u32 data, const ARMv7_encoding type) = 0; + + virtual void LSL_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void LSL_REG(const u32 data, const ARMv7_encoding type) = 0; + + virtual void LSR_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void LSR_REG(const u32 data, const ARMv7_encoding type) = 0; + + virtual void MLA(const u32 data, const ARMv7_encoding type) = 0; + virtual void MLS(const u32 data, const ARMv7_encoding type) = 0; + virtual void MOV_IMM(const u32 data, const ARMv7_encoding type) = 0; virtual void MOV_REG(const u32 data, const ARMv7_encoding type) = 0; virtual void MOVT(const u32 data, const ARMv7_encoding type) = 0; + virtual void MRS(const u32 data, const ARMv7_encoding type) = 0; + virtual void MSR_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void MSR_REG(const u32 data, const ARMv7_encoding type) = 0; + + virtual void MUL(const u32 data, const ARMv7_encoding type) = 0; + + virtual void MVN_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void MVN_REG(const u32 data, const ARMv7_encoding type) = 0; + virtual void MVN_RSR(const u32 data, const ARMv7_encoding type) = 0; + + virtual void NEG(const u32 data, const ARMv7_encoding type) = 0; + + virtual void NOP(const u32 data, const ARMv7_encoding type) = 0; + + virtual void ORN_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void ORN_REG(const u32 data, const ARMv7_encoding type) = 0; + + virtual void ORR_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void ORR_REG(const u32 data, const ARMv7_encoding type) = 0; + virtual void ORR_RSR(const u32 data, const ARMv7_encoding type) = 0; + + virtual void PKH(const u32 data, const ARMv7_encoding type) = 0; + + virtual void POP(const u32 data, const ARMv7_encoding type) = 0; + virtual void PUSH(const u32 data, const ARMv7_encoding type) = 0; + + virtual void QADD(const u32 data, const ARMv7_encoding type) = 0; + virtual void QADD16(const u32 data, const ARMv7_encoding type) = 0; + virtual void QADD8(const u32 data, const ARMv7_encoding type) = 0; + virtual void QASX(const u32 data, const ARMv7_encoding type) = 0; + virtual void QDADD(const u32 data, const ARMv7_encoding type) = 0; + virtual void QDSUB(const u32 data, const ARMv7_encoding type) = 0; + virtual void QSAX(const u32 data, const ARMv7_encoding type) = 0; + virtual void QSUB(const u32 data, const ARMv7_encoding type) = 0; + virtual void QSUB16(const u32 data, const ARMv7_encoding type) = 0; + virtual void QSUB8(const u32 data, const ARMv7_encoding type) = 0; + + virtual void RBIT(const u32 data, const ARMv7_encoding type) = 0; + virtual void REV(const u32 data, const ARMv7_encoding type) = 0; + virtual void REV16(const u32 data, const ARMv7_encoding type) = 0; + virtual void REVSH(const u32 data, const ARMv7_encoding type) = 0; + + virtual void ROR_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void ROR_REG(const u32 data, const ARMv7_encoding type) = 0; + + virtual void RRX(const u32 data, const ARMv7_encoding type) = 0; + + virtual void RSB_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void RSB_REG(const u32 data, const ARMv7_encoding type) = 0; + virtual void RSB_RSR(const u32 data, const ARMv7_encoding type) = 0; + + virtual void RSC_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void RSC_REG(const u32 data, const ARMv7_encoding type) = 0; + virtual void RSC_RSR(const u32 data, const ARMv7_encoding type) = 0; + + virtual void SADD16(const u32 data, const ARMv7_encoding type) = 0; + virtual void SADD8(const u32 data, const ARMv7_encoding type) = 0; + virtual void SASX(const u32 data, const ARMv7_encoding type) = 0; + + virtual void SBC_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void SBC_REG(const u32 data, const ARMv7_encoding type) = 0; + virtual void SBC_RSR(const u32 data, const ARMv7_encoding type) = 0; + + virtual void SBFX(const u32 data, const ARMv7_encoding type) = 0; + + virtual void SDIV(const u32 data, const ARMv7_encoding type) = 0; + + virtual void SEL(const u32 data, const ARMv7_encoding type) = 0; + + virtual void SHADD16(const u32 data, const ARMv7_encoding type) = 0; + virtual void SHADD8(const u32 data, const ARMv7_encoding type) = 0; + virtual void SHASX(const u32 data, const ARMv7_encoding type) = 0; + virtual void SHSAX(const u32 data, const ARMv7_encoding type) = 0; + virtual void SHSUB16(const u32 data, const ARMv7_encoding type) = 0; + virtual void SHSUB8(const u32 data, const ARMv7_encoding type) = 0; + + virtual void SMLA__(const u32 data, const ARMv7_encoding type) = 0; + virtual void SMLAD(const u32 data, const ARMv7_encoding type) = 0; + virtual void SMLAL(const u32 data, const ARMv7_encoding type) = 0; + virtual void SMLAL__(const u32 data, const ARMv7_encoding type) = 0; + virtual void SMLALD(const u32 data, const ARMv7_encoding type) = 0; + virtual void SMLAW_(const u32 data, const ARMv7_encoding type) = 0; + virtual void SMLSD(const u32 data, const ARMv7_encoding type) = 0; + virtual void SMLSLD(const u32 data, const ARMv7_encoding type) = 0; + virtual void SMMLA(const u32 data, const ARMv7_encoding type) = 0; + virtual void SMMLS(const u32 data, const ARMv7_encoding type) = 0; + virtual void SMMUL(const u32 data, const ARMv7_encoding type) = 0; + virtual void SMUAD(const u32 data, const ARMv7_encoding type) = 0; + virtual void SMUL__(const u32 data, const ARMv7_encoding type) = 0; + virtual void SMULL(const u32 data, const ARMv7_encoding type) = 0; + virtual void SMULW_(const u32 data, const ARMv7_encoding type) = 0; + virtual void SMUSD(const u32 data, const ARMv7_encoding type) = 0; + + virtual void SSAT(const u32 data, const ARMv7_encoding type) = 0; + virtual void SSAT16(const u32 data, const ARMv7_encoding type) = 0; + virtual void SSAX(const u32 data, const ARMv7_encoding type) = 0; + virtual void SSUB16(const u32 data, const ARMv7_encoding type) = 0; + virtual void SSUB8(const u32 data, const ARMv7_encoding type) = 0; + + virtual void STM(const u32 data, const ARMv7_encoding type) = 0; + virtual void STMDA(const u32 data, const ARMv7_encoding type) = 0; + virtual void STMDB(const u32 data, const ARMv7_encoding type) = 0; + virtual void STMIB(const u32 data, const ARMv7_encoding type) = 0; + + virtual void STR_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void STR_REG(const u32 data, const ARMv7_encoding type) = 0; + + virtual void STRB_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void STRB_REG(const u32 data, const ARMv7_encoding type) = 0; + + virtual void STRD_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void STRD_REG(const u32 data, const ARMv7_encoding type) = 0; + + virtual void STRH_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void STRH_REG(const u32 data, const ARMv7_encoding type) = 0; + virtual void SUB_IMM(const u32 data, const ARMv7_encoding type) = 0; virtual void SUB_REG(const u32 data, const ARMv7_encoding type) = 0; virtual void SUB_RSR(const u32 data, const ARMv7_encoding type) = 0; virtual void SUB_SPI(const u32 data, const ARMv7_encoding type) = 0; virtual void SUB_SPR(const u32 data, const ARMv7_encoding type) = 0; - virtual void STR_IMM(const u32 data, const ARMv7_encoding type) = 0; - virtual void STR_REG(const u32 data, const ARMv7_encoding type) = 0; + virtual void SVC(const u32 data, const ARMv7_encoding type) = 0; + + virtual void SWP_(const u32 data, const ARMv7_encoding type) = 0; + + virtual void SXTAB(const u32 data, const ARMv7_encoding type) = 0; + virtual void SXTAB16(const u32 data, const ARMv7_encoding type) = 0; + virtual void SXTAH(const u32 data, const ARMv7_encoding type) = 0; + virtual void SXTB(const u32 data, const ARMv7_encoding type) = 0; + virtual void SXTB16(const u32 data, const ARMv7_encoding type) = 0; + virtual void SXTH(const u32 data, const ARMv7_encoding type) = 0; + + virtual void TB_(const u32 data, const ARMv7_encoding type) = 0; + + virtual void TEQ_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void TEQ_REG(const u32 data, const ARMv7_encoding type) = 0; + virtual void TEQ_RSR(const u32 data, const ARMv7_encoding type) = 0; + + virtual void TST_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void TST_REG(const u32 data, const ARMv7_encoding type) = 0; + virtual void TST_RSR(const u32 data, const ARMv7_encoding type) = 0; + + virtual void UADD16(const u32 data, const ARMv7_encoding type) = 0; + virtual void UADD8(const u32 data, const ARMv7_encoding type) = 0; + virtual void UASX(const u32 data, const ARMv7_encoding type) = 0; + virtual void UBFX(const u32 data, const ARMv7_encoding type) = 0; + virtual void UDIV(const u32 data, const ARMv7_encoding type) = 0; + virtual void UHADD16(const u32 data, const ARMv7_encoding type) = 0; + virtual void UHADD8(const u32 data, const ARMv7_encoding type) = 0; + virtual void UHASX(const u32 data, const ARMv7_encoding type) = 0; + virtual void UHSAX(const u32 data, const ARMv7_encoding type) = 0; + virtual void UHSUB16(const u32 data, const ARMv7_encoding type) = 0; + virtual void UHSUB8(const u32 data, const ARMv7_encoding type) = 0; + virtual void UMAAL(const u32 data, const ARMv7_encoding type) = 0; + virtual void UMLAL(const u32 data, const ARMv7_encoding type) = 0; + virtual void UMULL(const u32 data, const ARMv7_encoding type) = 0; + virtual void UQADD16(const u32 data, const ARMv7_encoding type) = 0; + virtual void UQADD8(const u32 data, const ARMv7_encoding type) = 0; + virtual void UQASX(const u32 data, const ARMv7_encoding type) = 0; + virtual void UQSAX(const u32 data, const ARMv7_encoding type) = 0; + virtual void UQSUB16(const u32 data, const ARMv7_encoding type) = 0; + virtual void UQSUB8(const u32 data, const ARMv7_encoding type) = 0; + virtual void USAD8(const u32 data, const ARMv7_encoding type) = 0; + virtual void USADA8(const u32 data, const ARMv7_encoding type) = 0; + virtual void USAT(const u32 data, const ARMv7_encoding type) = 0; + virtual void USAT16(const u32 data, const ARMv7_encoding type) = 0; + virtual void USAX(const u32 data, const ARMv7_encoding type) = 0; + virtual void USUB16(const u32 data, const ARMv7_encoding type) = 0; + virtual void USUB8(const u32 data, const ARMv7_encoding type) = 0; + virtual void UXTAB(const u32 data, const ARMv7_encoding type) = 0; + virtual void UXTAB16(const u32 data, const ARMv7_encoding type) = 0; + virtual void UXTAH(const u32 data, const ARMv7_encoding type) = 0; + virtual void UXTB(const u32 data, const ARMv7_encoding type) = 0; + virtual void UXTB16(const u32 data, const ARMv7_encoding type) = 0; + virtual void UXTH(const u32 data, const ARMv7_encoding type) = 0; + + // TODO: vector ops }; struct ARMv7_opcode_t @@ -101,32 +343,6 @@ struct ARMv7_opcode_t static const ARMv7_opcode_t ARMv7_opcode_table[] = { ARMv7_OP2(0xffff, 0x0000, T1, NULL_OP), - ARMv7_OP2(0xffff, 0xbf00, T1, NOP), - ARMv7_OP4(0xffff, 0xffff, 0xf3af, 0x8000, T2, NOP), - ARMv7_OP4(0x0fff, 0xffff, 0x0320, 0xf000, A1, NOP), - ARMv7_OP2(0xfe00, 0xb400, T1, PUSH), - ARMv7_OP4(0xffff, 0x0000, 0xe92d, 0x0000, T2, PUSH), // had an error in arch ref - ARMv7_OP4(0xffff, 0x0fff, 0xf84d, 0x0d04, T3, PUSH), - ARMv7_OP4(0x0fff, 0x0000, 0x092d, 0x0000, A1, PUSH), - ARMv7_OP4(0x0fff, 0x0fff, 0x052d, 0x0004, A2, PUSH), - ARMv7_OP2(0xfe00, 0xbc00, T1, POP), - ARMv7_OP4(0xffff, 0x0000, 0xe8bd, 0x0000, T2, POP), - ARMv7_OP4(0xffff, 0x0fff, 0xf85d, 0x0b04, T3, POP), - ARMv7_OP4(0x0fff, 0x0000, 0x08bd, 0x0000, A1, POP), - ARMv7_OP4(0x0fff, 0x0fff, 0x049d, 0x0004, A2, POP), - ARMv7_OP2(0xf000, 0xd000, T1, B), - ARMv7_OP2(0xf800, 0xe000, T2, B), - ARMv7_OP4(0xf800, 0xd000, 0xf000, 0x8000, T3, B), - ARMv7_OP4(0xf800, 0xd000, 0xf000, 0x9000, T4, B), - ARMv7_OP4(0x0f00, 0x0000, 0x0a00, 0x0000, A1, B), - ARMv7_OP2(0xfd00, 0xb100, T1, CBZ), - ARMv7_OP2(0xfd00, 0xb900, T1, CBNZ), - ARMv7_OP4(0xf800, 0xd000, 0xf000, 0xd000, T1, BL), - ARMv7_OP4(0x0f00, 0x0000, 0x0b00, 0x0000, A1, BL), - ARMv7_OP2(0xff80, 0x4780, T1, BLX), - ARMv7_OP4(0xf800, 0xc001, 0xf000, 0xc000, T2, BLX), - ARMv7_OP4(0x0fff, 0xfff0, 0x012f, 0xff30, A1, BLX), - ARMv7_OP4(0xfe00, 0x0000, 0xfa00, 0x0000, A2, BLX), ARMv7_OP4(0xfbe0, 0x8000, 0xf140, 0x0000, T1, ADC_IMM), ARMv7_OP4(0x0fe0, 0x0000, 0x02a0, 0x0000, A1, ADC_IMM), @@ -155,6 +371,64 @@ static const ARMv7_opcode_t ARMv7_opcode_table[] = ARMv7_OP4(0xffef, 0x8000, 0xeb0d, 0x0000, T3, ADD_SPR), ARMv7_OP4(0x0fef, 0x0010, 0x008d, 0x0000, A1, ADD_SPR), + ARMv7_OP2(0xf800, 0xa000, T1, ADR), + ARMv7_OP4(0xfbff, 0x8000, 0xf2af, 0x0000, T2, ADR), + ARMv7_OP4(0xfbff, 0x8000, 0xf20f, 0x0000, T3, ADR), + ARMv7_OP4(0x0fff, 0x0000, 0x028f, 0x0000, A1, ADR), + ARMv7_OP4(0x0fff, 0x0000, 0x024f, 0x0000, A2, ADR), + + ARMv7_OP4(0xfbe0, 0x8000, 0xf000, 0x0000, T1, AND_IMM), + ARMv7_OP4(0x0fe0, 0x0000, 0x0200, 0x0000, A1, AND_IMM), + ARMv7_OP2(0xffc0, 0x4000, T1, AND_REG), + ARMv7_OP4(0xffe0, 0x8000, 0xea00, 0x0000, T2, AND_REG), + ARMv7_OP4(0x0fe0, 0x0010, 0x0000, 0x0000, A1, AND_REG), + ARMv7_OP4(0x0fe0, 0x0090, 0x0000, 0x0010, A1, AND_RSR), + + ARMv7_OP2(0xf800, 0x1000, T1, ASR_IMM), + ARMv7_OP4(0xffef, 0x8030, 0xea4f, 0x0020, T2, ASR_IMM), + ARMv7_OP4(0x0fef, 0x0070, 0x01a0, 0x0040, A1, ASR_IMM), + ARMv7_OP2(0xffc0, 0x4100, T1, ASR_REG), + ARMv7_OP4(0xffe0, 0xf0f0, 0xfa40, 0xf000, T2, ASR_REG), + ARMv7_OP4(0x0fef, 0x00f0, 0x01a0, 0x0050, A1, ASR_REG), + + ARMv7_OP2(0xf000, 0xd000, T1, B), + ARMv7_OP2(0xf800, 0xe000, T2, B), + ARMv7_OP4(0xf800, 0xd000, 0xf000, 0x8000, T3, B), + ARMv7_OP4(0xf800, 0xd000, 0xf000, 0x9000, T4, B), + ARMv7_OP4(0x0f00, 0x0000, 0x0a00, 0x0000, A1, B), + + ARMv7_OP4(0xffff, 0x8020, 0xf36f, 0x0000, T1, BFC), + ARMv7_OP4(0x0fe0, 0x007f, 0x07c0, 0x001f, A1, BFC), + ARMv7_OP4(0xfff0, 0x8020, 0xf360, 0x0000, T1, BFI), + ARMv7_OP4(0x0fe0, 0x0070, 0x07c0, 0x0010, A1, BFI), + + ARMv7_OP4(0xfbe0, 0x8000, 0xf020, 0x0000, T1, BIC_IMM), + ARMv7_OP4(0x0fe0, 0x0000, 0x03c0, 0x0000, A1, BIC_IMM), + ARMv7_OP2(0xffc0, 0x4380, T1, BIC_REG), + ARMv7_OP4(0xffe0, 0x8000, 0xea20, 0x0000, T2, BIC_REG), + ARMv7_OP4(0x0fe0, 0x0010, 0x01c0, 0x0000, A1, BIC_REG), + ARMv7_OP4(0x0fe0, 0x0090, 0x01c0, 0x0010, A1, BIC_RSR), + + ARMv7_OP2(0xff00, 0xbe00, T1, BKPT), + ARMv7_OP4(0x0ff0, 0x00f0, 0x0120, 0x0070, A1, BKPT), + + ARMv7_OP4(0xf800, 0xd000, 0xf000, 0xd000, T1, BL), + ARMv7_OP4(0x0f00, 0x0000, 0x0b00, 0x0000, A1, BL), + ARMv7_OP2(0xff80, 0x4780, T1, BLX), + ARMv7_OP4(0xf800, 0xc001, 0xf000, 0xc000, T2, BLX), + ARMv7_OP4(0x0fff, 0xfff0, 0x012f, 0xff30, A1, BLX), + ARMv7_OP4(0xfe00, 0x0000, 0xfa00, 0x0000, A2, BLX), + + ARMv7_OP2(0xff87, 0x4700, T1, BX), + ARMv7_OP4(0x0fff, 0xfff0, 0x012f, 0xff10, A1, BX), + + ARMv7_OP2(0xf500, 0xb100, T1, CB_Z), + + ARMv7_OP4(0xfff0, 0xf0f0, 0xfab0, 0xf080, T1, CLZ), + ARMv7_OP4(0x0fff, 0x0ff0, 0x016f, 0x0f10, A1, CLZ), + + // + ARMv7_OP2(0xf800, 0x2000, T1, MOV_IMM), ARMv7_OP4(0xfbef, 0x8000, 0xf04f, 0x0000, T2, MOV_IMM), ARMv7_OP4(0xfbf0, 0x8000, 0xf240, 0x0000, T3, MOV_IMM), @@ -167,6 +441,39 @@ static const ARMv7_opcode_t ARMv7_opcode_table[] = ARMv7_OP4(0xfbf0, 0x8000, 0xf2c0, 0x0000, T1, MOVT), ARMv7_OP4(0x0ff0, 0x0000, 0x0340, 0x0000, A1, MOVT), + // + + ARMv7_OP2(0xffff, 0xbf00, T1, NOP), + ARMv7_OP4(0xffff, 0xffff, 0xf3af, 0x8000, T2, NOP), + ARMv7_OP4(0x0fff, 0xffff, 0x0320, 0xf000, A1, NOP), + + // + + ARMv7_OP2(0xfe00, 0xbc00, T1, POP), + ARMv7_OP4(0xffff, 0x0000, 0xe8bd, 0x0000, T2, POP), + ARMv7_OP4(0xffff, 0x0fff, 0xf85d, 0x0b04, T3, POP), + ARMv7_OP4(0x0fff, 0x0000, 0x08bd, 0x0000, A1, POP), + ARMv7_OP4(0x0fff, 0x0fff, 0x049d, 0x0004, A2, POP), + + ARMv7_OP2(0xfe00, 0xb400, T1, PUSH), + ARMv7_OP4(0xffff, 0x0000, 0xe92d, 0x0000, T2, PUSH), // had an error in arch ref + ARMv7_OP4(0xffff, 0x0fff, 0xf84d, 0x0d04, T3, PUSH), + ARMv7_OP4(0x0fff, 0x0000, 0x092d, 0x0000, A1, PUSH), + ARMv7_OP4(0x0fff, 0x0fff, 0x052d, 0x0004, A2, PUSH), + + // + + ARMv7_OP2(0xf800, 0x6000, T1, STR_IMM), + ARMv7_OP2(0xf800, 0x9000, T2, STR_IMM), + ARMv7_OP4(0xfff0, 0x0000, 0xf8c0, 0x0000, T3, STR_IMM), + ARMv7_OP4(0xfff0, 0x0800, 0xf840, 0x0800, T4, STR_IMM), + ARMv7_OP4(0x0e50, 0x0000, 0x0400, 0x0000, A1, STR_IMM), + ARMv7_OP2(0xfe00, 0x5000, T1, STR_REG), + ARMv7_OP4(0xfff0, 0x0fc0, 0xf840, 0x0000, T2, STR_REG), + ARMv7_OP4(0x0e50, 0x0010, 0x0600, 0x0000, A1, STR_REG), + + // + ARMv7_OP2(0xfe00, 0x1e00, T1, SUB_IMM), ARMv7_OP2(0xf800, 0x3800, T2, SUB_IMM), ARMv7_OP4(0xfbe0, 0x8000, 0xf1a0, 0x0000, T3, SUB_IMM), @@ -182,15 +489,6 @@ static const ARMv7_opcode_t ARMv7_opcode_table[] = ARMv7_OP4(0x0fef, 0x0000, 0x024d, 0x0000, A1, SUB_SPI), ARMv7_OP4(0xffef, 0x8000, 0xebad, 0x0000, T1, SUB_SPR), ARMv7_OP4(0x0fef, 0x0010, 0x004d, 0x0000, A1, SUB_SPR), - - ARMv7_OP2(0xf800, 0x6000, T1, STR_IMM), - ARMv7_OP2(0xf800, 0x9000, T2, STR_IMM), - ARMv7_OP4(0xfff0, 0x0000, 0xf8c0, 0x0000, T3, STR_IMM), - ARMv7_OP4(0xfff0, 0x0800, 0xf840, 0x0800, T4, STR_IMM), - ARMv7_OP4(0x0e50, 0x0000, 0x0400, 0x0000, A1, STR_IMM), - ARMv7_OP2(0xfe00, 0x5000, T1, STR_REG), - ARMv7_OP4(0xfff0, 0x0fc0, 0xf840, 0x0000, T2, STR_REG), - ARMv7_OP4(0x0e50, 0x0010, 0x0600, 0x0000, A1, STR_REG), }; #undef ARMv7_OP diff --git a/rpcs3/Emu/Cell/PPCDecoder.cpp b/rpcs3/Emu/Cell/PPCDecoder.cpp index de2b55fdf9..52e28b9e91 100644 --- a/rpcs3/Emu/Cell/PPCDecoder.cpp +++ b/rpcs3/Emu/Cell/PPCDecoder.cpp @@ -8,4 +8,4 @@ u8 PPCDecoder::DecodeMemory(const u32 address) Decode(instr); return sizeof(u32); -} \ No newline at end of file +} From de156c59e4c2dddeeb62b713db3c48f8c20b7717 Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Thu, 30 Oct 2014 23:07:47 +0300 Subject: [PATCH 11/27] ARMv7: more opcodes --- rpcs3/Emu/ARMv7/ARMv7DisAsm.cpp | 12 --- rpcs3/Emu/ARMv7/ARMv7DisAsm.h | 4 - rpcs3/Emu/ARMv7/ARMv7Interpreter.cpp | 20 ----- rpcs3/Emu/ARMv7/ARMv7Interpreter.h | 4 - rpcs3/Emu/ARMv7/ARMv7Opcodes.h | 120 +++++++++++++++++++++++++-- 5 files changed, 114 insertions(+), 46 deletions(-) diff --git a/rpcs3/Emu/ARMv7/ARMv7DisAsm.cpp b/rpcs3/Emu/ARMv7/ARMv7DisAsm.cpp index 89829191c8..ab4f5fcc11 100644 --- a/rpcs3/Emu/ARMv7/ARMv7DisAsm.cpp +++ b/rpcs3/Emu/ARMv7/ARMv7DisAsm.cpp @@ -197,12 +197,6 @@ void ARMv7DisAsm::CMP_RSR(const u32 data, const ARMv7_encoding type) } -void ARMv7DisAsm::DBG(const u32 data, const ARMv7_encoding type) -{ - Write(__FUNCTION__); -} - - void ARMv7DisAsm::EOR_IMM(const u32 data, const ARMv7_encoding type) { Write(__FUNCTION__); @@ -429,12 +423,6 @@ void ARMv7DisAsm::MVN_RSR(const u32 data, const ARMv7_encoding type) } -void ARMv7DisAsm::NEG(const u32 data, const ARMv7_encoding type) -{ - Write(__FUNCTION__); -} - - void ARMv7DisAsm::NOP(const u32 data, const ARMv7_encoding type) { Write(__FUNCTION__); diff --git a/rpcs3/Emu/ARMv7/ARMv7DisAsm.h b/rpcs3/Emu/ARMv7/ARMv7DisAsm.h index e6a7fe1f8b..16f0a5df67 100644 --- a/rpcs3/Emu/ARMv7/ARMv7DisAsm.h +++ b/rpcs3/Emu/ARMv7/ARMv7DisAsm.h @@ -95,8 +95,6 @@ protected: virtual void CMP_REG(const u32 data, const ARMv7_encoding type); virtual void CMP_RSR(const u32 data, const ARMv7_encoding type); - virtual void DBG(const u32 data, const ARMv7_encoding type); - virtual void EOR_IMM(const u32 data, const ARMv7_encoding type); virtual void EOR_REG(const u32 data, const ARMv7_encoding type); virtual void EOR_RSR(const u32 data, const ARMv7_encoding type); @@ -155,8 +153,6 @@ protected: virtual void MVN_REG(const u32 data, const ARMv7_encoding type); virtual void MVN_RSR(const u32 data, const ARMv7_encoding type); - virtual void NEG(const u32 data, const ARMv7_encoding type); - virtual void NOP(const u32 data, const ARMv7_encoding type); virtual void ORN_IMM(const u32 data, const ARMv7_encoding type); diff --git a/rpcs3/Emu/ARMv7/ARMv7Interpreter.cpp b/rpcs3/Emu/ARMv7/ARMv7Interpreter.cpp index 355a445aa3..9ecf2b4735 100644 --- a/rpcs3/Emu/ARMv7/ARMv7Interpreter.cpp +++ b/rpcs3/Emu/ARMv7/ARMv7Interpreter.cpp @@ -409,16 +409,6 @@ void ARMv7Interpreter::CMP_RSR(const u32 data, const ARMv7_encoding type) } -void ARMv7Interpreter::DBG(const u32 data, const ARMv7_encoding type) -{ - switch (type) - { - case A1: throw __FUNCTION__; - default: throw __FUNCTION__; - } -} - - void ARMv7Interpreter::EOR_IMM(const u32 data, const ARMv7_encoding type) { switch (type) @@ -818,16 +808,6 @@ void ARMv7Interpreter::MVN_RSR(const u32 data, const ARMv7_encoding type) } -void ARMv7Interpreter::NEG(const u32 data, const ARMv7_encoding type) -{ - switch (type) - { - case A1: throw __FUNCTION__; - default: throw __FUNCTION__; - } -} - - void ARMv7Interpreter::NOP(const u32 data, const ARMv7_encoding type) { switch (type) diff --git a/rpcs3/Emu/ARMv7/ARMv7Interpreter.h b/rpcs3/Emu/ARMv7/ARMv7Interpreter.h index 1f7099fbe4..da9ea99af0 100644 --- a/rpcs3/Emu/ARMv7/ARMv7Interpreter.h +++ b/rpcs3/Emu/ARMv7/ARMv7Interpreter.h @@ -308,8 +308,6 @@ protected: virtual void CMP_REG(const u32 data, const ARMv7_encoding type); virtual void CMP_RSR(const u32 data, const ARMv7_encoding type); - virtual void DBG(const u32 data, const ARMv7_encoding type); - virtual void EOR_IMM(const u32 data, const ARMv7_encoding type); virtual void EOR_REG(const u32 data, const ARMv7_encoding type); virtual void EOR_RSR(const u32 data, const ARMv7_encoding type); @@ -368,8 +366,6 @@ protected: virtual void MVN_REG(const u32 data, const ARMv7_encoding type); virtual void MVN_RSR(const u32 data, const ARMv7_encoding type); - virtual void NEG(const u32 data, const ARMv7_encoding type); - virtual void NOP(const u32 data, const ARMv7_encoding type); virtual void ORN_IMM(const u32 data, const ARMv7_encoding type); diff --git a/rpcs3/Emu/ARMv7/ARMv7Opcodes.h b/rpcs3/Emu/ARMv7/ARMv7Opcodes.h index 5fa8af6fed..e73f44899f 100644 --- a/rpcs3/Emu/ARMv7/ARMv7Opcodes.h +++ b/rpcs3/Emu/ARMv7/ARMv7Opcodes.h @@ -95,8 +95,6 @@ public: virtual void CMP_REG(const u32 data, const ARMv7_encoding type) = 0; virtual void CMP_RSR(const u32 data, const ARMv7_encoding type) = 0; - virtual void DBG(const u32 data, const ARMv7_encoding type) = 0; - virtual void EOR_IMM(const u32 data, const ARMv7_encoding type) = 0; virtual void EOR_REG(const u32 data, const ARMv7_encoding type) = 0; virtual void EOR_RSR(const u32 data, const ARMv7_encoding type) = 0; @@ -155,8 +153,6 @@ public: virtual void MVN_REG(const u32 data, const ARMv7_encoding type) = 0; virtual void MVN_RSR(const u32 data, const ARMv7_encoding type) = 0; - virtual void NEG(const u32 data, const ARMv7_encoding type) = 0; - virtual void NOP(const u32 data, const ARMv7_encoding type) = 0; virtual void ORN_IMM(const u32 data, const ARMv7_encoding type) = 0; @@ -427,7 +423,104 @@ static const ARMv7_opcode_t ARMv7_opcode_table[] = ARMv7_OP4(0xfff0, 0xf0f0, 0xfab0, 0xf080, T1, CLZ), ARMv7_OP4(0x0fff, 0x0ff0, 0x016f, 0x0f10, A1, CLZ), - // + ARMv7_OP4(0xfbf0, 0x8f00, 0xf110, 0x0f00, T1, CMN_IMM), + ARMv7_OP4(0x0ff0, 0xf000, 0x0370, 0x0000, A1, CMN_IMM), + ARMv7_OP2(0xffc0, 0x42c0, T1, CMN_REG), + ARMv7_OP4(0xfff0, 0x8f00, 0xeb10, 0x0f00, T2, CMN_REG), + ARMv7_OP4(0x0ff0, 0xf010, 0x0170, 0x0000, A1, CMN_REG), + ARMv7_OP4(0x0ff0, 0xf090, 0x0170, 0x0010, A1, CMN_RSR), + + ARMv7_OP2(0xf800, 0x2800, T1, CMP_IMM), + ARMv7_OP4(0xfbf0, 0x8f00, 0xf1b0, 0x0f00, T2, CMP_IMM), + ARMv7_OP4(0x0ff0, 0xf000, 0x0350, 0x0000, A1, CMP_IMM), + ARMv7_OP2(0xffc0, 0x4280, T1, CMP_REG), + ARMv7_OP2(0xff00, 0x4500, T2, CMP_REG), + ARMv7_OP4(0xfff0, 0x8f00, 0xebb0, 0x0f00, T3, CMP_REG), + ARMv7_OP4(0x0ff0, 0xf010, 0x0150, 0x0000, A1, CMP_REG), + ARMv7_OP4(0x0ff0, 0xf090, 0x0150, 0x0010, A1, CMP_RSR), + + ARMv7_OP4(0xfbe0, 0x8000, 0xf080, 0x0000, T1, EOR_IMM), + ARMv7_OP4(0x0fe0, 0x0000, 0x0220, 0x0000, A1, EOR_IMM), + ARMv7_OP2(0xffc0, 0x4040, T1, EOR_REG), + ARMv7_OP4(0xffe0, 0x8000, 0xea80, 0x0000, T2, EOR_REG), + ARMv7_OP4(0x0fe0, 0x0010, 0x0020, 0x0000, A1, EOR_REG), + ARMv7_OP4(0x0fe0, 0x0090, 0x0020, 0x0010, A1, EOR_RSR), + + ARMv7_OP2(0xff00, 0xbf00, T1, IT), + + ARMv7_OP2(0xf800, 0xc800, T1, LDM), + ARMv7_OP4(0xffd0, 0x2000, 0xe890, 0x0000, T2, LDM), + ARMv7_OP4(0x0fd0, 0x0000, 0x0890, 0x0000, A1, LDM), + ARMv7_OP4(0x0fd0, 0x0000, 0x0810, 0x0000, A1, LDMDA), + ARMv7_OP4(0xffd0, 0x2000, 0xe910, 0x0000, T1, LDMDB), + ARMv7_OP4(0x0fd0, 0x0000, 0x0910, 0x0000, A1, LDMDB), + ARMv7_OP4(0x0fd0, 0x0000, 0x0990, 0x0000, A1, LDMIB), + + ARMv7_OP2(0xf800, 0x6800, T1, LDR_IMM), + ARMv7_OP2(0xf800, 0x9800, T2, LDR_IMM), + ARMv7_OP4(0xfff0, 0x0000, 0xf8d0, 0x0000, T3, LDR_IMM), + ARMv7_OP4(0xfff0, 0x0800, 0xf850, 0x0800, T4, LDR_IMM), + ARMv7_OP4(0x0e50, 0x0000, 0x0410, 0x0000, A1, LDR_IMM), + ARMv7_OP2(0xf800, 0x4800, T1, LDR_LIT), + ARMv7_OP4(0xff7f, 0x0000, 0xf85f, 0x0000, T2, LDR_LIT), + ARMv7_OP4(0x0f7f, 0x0000, 0x051f, 0x0000, A1, LDR_LIT), + ARMv7_OP2(0xfe00, 0x5800, T1, LDR_REG), + ARMv7_OP4(0xfff0, 0x0fc0, 0xf850, 0x0000, T2, LDR_REG), + ARMv7_OP4(0x0e50, 0x0010, 0x0610, 0x0000, A1, LDR_REG), + + ARMv7_OP2(0xf800, 0x7800, T1, LDRB_IMM), + ARMv7_OP4(0xfff0, 0x0000, 0xf890, 0x0000, T2, LDRB_IMM), + ARMv7_OP4(0xfff0, 0x0800, 0xf810, 0x0800, T3, LDRB_IMM), + ARMv7_OP4(0x0e50, 0x0000, 0x0450, 0x0000, A1, LDRB_IMM), + ARMv7_OP4(0xff7f, 0x0000, 0xf81f, 0x0000, T1, LDRB_LIT), + ARMv7_OP4(0x0f7f, 0x0000, 0x055f, 0x0000, A1, LDRB_LIT), + ARMv7_OP2(0xfe00, 0x5c00, T1, LDRB_REG), + ARMv7_OP4(0xfff0, 0x0fc0, 0xf810, 0x0000, T2, LDRB_REG), + ARMv7_OP4(0x0e50, 0x0010, 0x0650, 0x0000, A1, LDRB_REG), + + ARMv7_OP4(0xfe50, 0x0000, 0xe850, 0x0000, T1, LDRD_IMM), + ARMv7_OP4(0x0e50, 0x00f0, 0x0040, 0x00d0, A1, LDRD_IMM), + ARMv7_OP4(0xfe7f, 0x0000, 0xe85f, 0x0000, T1, LDRD_LIT), + ARMv7_OP4(0x0f7f, 0x00f0, 0x014f, 0x00d0, A1, LDRD_LIT), + ARMv7_OP4(0x0e50, 0x0ff0, 0x0000, 0x00d0, A1, LDRD_REG), + + ARMv7_OP4(0xfff0, 0x0000, 0xf990, 0x0000, T1, LDRSB_IMM), + ARMv7_OP4(0xfff0, 0x0800, 0xf910, 0x0800, T2, LDRSB_IMM), + ARMv7_OP4(0x0e50, 0x00f0, 0x0050, 0x00d0, A1, LDRSB_IMM), + ARMv7_OP4(0xff7f, 0x0000, 0xf91f, 0x0000, T1, LDRSB_LIT), + ARMv7_OP4(0x0f7f, 0x00f0, 0x015f, 0x00d0, A1, LDRSB_LIT), + ARMv7_OP2(0xfe00, 0x5600, T1, LDRSB_REG), + ARMv7_OP4(0xfff0, 0x0fc0, 0xf910, 0x0000, T2, LDRSB_REG), + ARMv7_OP4(0x0e50, 0x0ff0, 0x0010, 0x00d0, A1, LDRSB_REG), + + ARMv7_OP4(0xfff0, 0x0000, 0xf9b0, 0x0000, T1, LDRSH_IMM), + ARMv7_OP4(0xfff0, 0x0800, 0xf930, 0x0800, T2, LDRSH_IMM), + ARMv7_OP4(0x0e50, 0x00f0, 0x0050, 0x00f0, A1, LDRSH_IMM), + ARMv7_OP4(0xff7f, 0x0000, 0xf93f, 0x0000, T1, LDRSH_LIT), + ARMv7_OP4(0x0f7f, 0x00f0, 0x015f, 0x00f0, A1, LDRSH_LIT), + ARMv7_OP2(0xfe00, 0x5e00, T1, LDRSH_REG), + ARMv7_OP4(0xfff0, 0x0fc0, 0xf930, 0x0000, T2, LDRSH_REG), + ARMv7_OP4(0x0e50, 0x0ff0, 0x0010, 0x00f0, A1, LDRSH_REG), + + ARMv7_OP2(0xf800, 0x0000, T1, LSL_IMM), + ARMv7_OP4(0xffef, 0x8030, 0xea4f, 0x0000, T2, LSL_IMM), + ARMv7_OP4(0x0fef, 0x0070, 0x01a0, 0x0000, A1, LSL_IMM), + ARMv7_OP2(0xffc0, 0x4080, T1, LSL_REG), + ARMv7_OP4(0xffe0, 0xf0f0, 0xfa00, 0xf000, T2, LSL_REG), + ARMv7_OP4(0x0fef, 0x00f0, 0x01a0, 0x0010, A1, LSL_REG), + + ARMv7_OP2(0xf800, 0x0800, T1, LSR_IMM), + ARMv7_OP4(0xffef, 0x8030, 0xea4f, 0x0010, T2, LSR_IMM), + ARMv7_OP4(0x0fef, 0x0030, 0x01a0, 0x0020, A1, LSR_IMM), + ARMv7_OP2(0xffc0, 0x40c0, T1, LSR_REG), + ARMv7_OP4(0xffe0, 0xf0f0, 0xfa20, 0xf000, T2, LSR_REG), + ARMv7_OP4(0x0fef, 0x00f0, 0x01a0, 0x0030, A1, LSR_REG), + + ARMv7_OP4(0xfff0, 0x00f0, 0xfb00, 0x0000, T1, MLA), + ARMv7_OP4(0x0fe0, 0x00f0, 0x0020, 0x0090, A1, MLA), + + ARMv7_OP4(0xfff0, 0x00f0, 0xfb00, 0x0010, T1, MLS), + ARMv7_OP4(0x0ff0, 0x00f0, 0x0060, 0x0090, A1, MLS), ARMv7_OP2(0xf800, 0x2000, T1, MOV_IMM), ARMv7_OP4(0xfbef, 0x8000, 0xf04f, 0x0000, T2, MOV_IMM), @@ -441,7 +534,22 @@ static const ARMv7_opcode_t ARMv7_opcode_table[] = ARMv7_OP4(0xfbf0, 0x8000, 0xf2c0, 0x0000, T1, MOVT), ARMv7_OP4(0x0ff0, 0x0000, 0x0340, 0x0000, A1, MOVT), - // + ARMv7_OP4(0xffff, 0xf0ff, 0xf3ef, 0x8000, T1, MRS), + ARMv7_OP4(0x0fff, 0x0fff, 0x010f, 0x0000, A1, MRS), + ARMv7_OP4(0x0ff3, 0xf000, 0x0320, 0xf000, A1, MSR_IMM), + ARMv7_OP4(0xfff0, 0xf3ff, 0xf380, 0x8000, T1, MSR_REG), + ARMv7_OP4(0x0ff3, 0xfff0, 0x0120, 0xf000, A1, MSR_REG), + + ARMv7_OP2(0xffc0, 0x4340, T1, MUL), + ARMv7_OP4(0xfff0, 0xf0f0, 0xfb00, 0xf000, T2, MUL), + ARMv7_OP4(0x0fe0, 0xf0f0, 0x0000, 0x0090, A1, MUL), + + ARMv7_OP4(0xfbef, 0x8000, 0xf06f, 0x0000, T1, MVN_IMM), + ARMv7_OP4(0x0fef, 0x0000, 0x03e0, 0x0000, A1, MVN_IMM), + ARMv7_OP2(0xffc0, 0x43c0, T1, MVN_REG), + ARMv7_OP4(0xffef, 0x8000, 0xea6f, 0x0000, T2, MVN_REG), + ARMv7_OP4(0xffef, 0x0010, 0x01e0, 0x0000, A1, MVN_REG), + ARMv7_OP4(0x0fef, 0x0090, 0x01e0, 0x0010, A1, MVN_RSR), ARMv7_OP2(0xffff, 0xbf00, T1, NOP), ARMv7_OP4(0xffff, 0xffff, 0xf3af, 0x8000, T2, NOP), From 3895c083cbd5af2f0155a05682ee106255ad08eb Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Fri, 31 Oct 2014 04:12:07 +0300 Subject: [PATCH 12/27] ARMv7: BX, MOV_IMM, IT (ITSTATE register) --- rpcs3/Emu/ARMv7/ARMv7Decoder.h | 6 +- rpcs3/Emu/ARMv7/ARMv7Interpreter.cpp | 221 ++++++++++++++++++++++----- rpcs3/Emu/ARMv7/ARMv7Opcodes.h | 16 +- rpcs3/Emu/ARMv7/ARMv7Thread.cpp | 3 +- rpcs3/Emu/ARMv7/ARMv7Thread.h | 42 +++++ 5 files changed, 239 insertions(+), 49 deletions(-) diff --git a/rpcs3/Emu/ARMv7/ARMv7Decoder.h b/rpcs3/Emu/ARMv7/ARMv7Decoder.h index 9b8b5e0d34..81b58e9939 100644 --- a/rpcs3/Emu/ARMv7/ARMv7Decoder.h +++ b/rpcs3/Emu/ARMv7/ARMv7Decoder.h @@ -18,11 +18,11 @@ public: const u32 code0 = vm::psv::read16(address & ~1); const u32 code1 = vm::psv::read16(address + 2 & ~1); const u32 data = code0 << 16 | code1; - const u32 arg = address & 1 ? data : code1 << 16 | code0; + const u32 arg = address & 1 ? code1 << 16 | code0 : data; for (auto& opcode : ARMv7_opcode_table) { - if ((opcode.type >= A1) == ((address & 1) == 0) && (data & opcode.mask) == opcode.code) + if ((opcode.type < A1) == ((address & 1) == 0) && (arg & opcode.mask) == opcode.code) { (m_op.*opcode.func)(opcode.length == 2 ? code0 : arg, opcode.type); return opcode.length; @@ -30,6 +30,6 @@ public: } m_op.UNK(data); - return 2; + return address & 1 ? 4 : 2; } }; diff --git a/rpcs3/Emu/ARMv7/ARMv7Interpreter.cpp b/rpcs3/Emu/ARMv7/ARMv7Interpreter.cpp index 9ecf2b4735..f5cf8d64a6 100644 --- a/rpcs3/Emu/ARMv7/ARMv7Interpreter.cpp +++ b/rpcs3/Emu/ARMv7/ARMv7Interpreter.cpp @@ -150,15 +150,20 @@ void ARMv7Interpreter::ASR_REG(const u32 data, const ARMv7_encoding type) void ARMv7Interpreter::B(const u32 data, const ARMv7_encoding type) { - u32 cond = 0xf; + u32 cond = CPU.ITSTATE.advance(); u32 jump = 0; // jump = instr_size + imm32 switch (type) { case T1: { + cond = (data >> 8) & 0xf; + if (cond == 0xf) + { + throw "SVC"; + } + jump = 2 + sign<9, u32>((data & 0xff) << 1); - cond = (data >> 8) & 0xf; if (cond == 0xf) throw "SVC"; break; } case T2: @@ -168,11 +173,16 @@ void ARMv7Interpreter::B(const u32 data, const ARMv7_encoding type) } case T3: { + cond = (data >> 6) & 0xf; + if (cond >= 0xe) + { + throw "Related encodings"; + } + u32 s = (data >> 26) & 0x1; u32 j1 = (data >> 13) & 0x1; u32 j2 = (data >> 11) & 0x1; jump = 4 + sign<21, u32>(s << 20 | j2 << 19 | j1 << 18 | (data & 0x3f0000) >> 4 | (data & 0x7ff) << 1); - cond = (data >> 6) & 0xf; if (cond >= 0xe) throw "Related encodings"; break; } case T4: @@ -185,8 +195,8 @@ void ARMv7Interpreter::B(const u32 data, const ARMv7_encoding type) } case A1: { - jump = 1 + 4 + sign<26, u32>((data & 0xffffff) << 2); cond = (data >> 28) & 0xf; + jump = 1 + 4 + sign<26, u32>((data & 0xffffff) << 2); break; } } @@ -257,7 +267,9 @@ void ARMv7Interpreter::BKPT(const u32 data, const ARMv7_encoding type) void ARMv7Interpreter::BL(const u32 data, const ARMv7_encoding type) { - u32 jump = 0; + u32 cond = CPU.ITSTATE.advance(); + u32 newLR = CPU.PC; + u32 imm32 = 0; switch (type) { @@ -266,30 +278,39 @@ void ARMv7Interpreter::BL(const u32 data, const ARMv7_encoding type) u32 s = (data >> 26) & 0x1; u32 i1 = (data >> 13) & 0x1 ^ s ^ 1; u32 i2 = (data >> 11) & 0x1 ^ s ^ 1; - jump = 4 + sign<25, u32>(s << 24 | i2 << 23 | i1 << 22 | (data & 0x3ff0000) >> 4 | (data & 0x7ff) << 1); + imm32 = 4 + sign<25, u32>(s << 24 | i2 << 23 | i1 << 22 | (data & 0x3ff0000) >> 4 | (data & 0x7ff) << 1); + newLR = (CPU.PC + 4) | 1; break; } case A1: { - jump = 4 + sign<26, u32>((data & 0xffffff) << 2); + cond = data >> 28; + imm32 = 4 + sign<26, u32>((data & 0xffffff) << 2); + newLR = (CPU.PC + 4) - 4; break; } default: throw __FUNCTION__; } - CPU.LR = (CPU.PC & 1) ? CPU.PC - 4 : CPU.PC; - CPU.SetBranch(CPU.PC + jump); + if (ConditionPassed(cond)) + { + CPU.LR = newLR; + CPU.SetBranch(CPU.PC + imm32); + } } void ARMv7Interpreter::BLX(const u32 data, const ARMv7_encoding type) { - u32 target; + u32 cond = CPU.ITSTATE.advance(); + u32 newLR = CPU.PC; + u32 target = 0; switch (type) { case T1: { - target = CPU.GPR[(data >> 3) & 0xf]; + target = CPU.read_gpr((data >> 3) & 0xf); + newLR = ((CPU.PC + 2) - 2) | 1; // ??? break; } case T2: @@ -297,34 +318,75 @@ void ARMv7Interpreter::BLX(const u32 data, const ARMv7_encoding type) u32 s = (data >> 26) & 0x1; u32 i1 = (data >> 13) & 0x1 ^ s ^ 1; u32 i2 = (data >> 11) & 0x1 ^ s ^ 1; - target = CPU.PC + 4 + sign<25, u32>(s << 24 | i2 << 23 | i1 << 22 | (data & 0x3ff0000) >> 4 | (data & 0x7ff) << 1) & ~1; + target = (CPU.PC + 4 & ~3) + sign<25, u32>(s << 24 | i2 << 23 | i1 << 22 | (data & 0x3ff0000) >> 4 | (data & 0x7ff) << 1); + newLR = (CPU.PC + 4) | 1; break; } case A1: { - target = CPU.GPR[data & 0xf]; - if (!ConditionPassed(data >> 28)) return; + cond = data >> 28; + target = CPU.read_gpr(data & 0xf); + newLR = (CPU.PC + 4) - 4; break; } case A2: { - target = CPU.PC + 5 + sign<25, u32>((data & 0xffffff) << 2 | (data & 0x1000000) >> 23); + target = (CPU.PC + 4 | 1) + sign<25, u32>((data & 0xffffff) << 2 | (data & 0x1000000) >> 23); + newLR = (CPU.PC + 4) - 4; break; } default: throw __FUNCTION__; } - CPU.LR = (CPU.PC & 1) ? CPU.PC - (type == T1 ? 2 : 4) : CPU.PC - 4; // ??? - CPU.SetBranch(target); + if (ConditionPassed(cond)) + { + CPU.LR = newLR; + if (target & 1) + { + CPU.ISET = Thumb; + CPU.SetBranch(target & ~1); + } + else + { + CPU.ISET = ARM; + CPU.SetBranch(target); + } + } } void ARMv7Interpreter::BX(const u32 data, const ARMv7_encoding type) { + u32 cond = CPU.ITSTATE.advance(); + u32 target = 0; + switch (type) { - case A1: throw __FUNCTION__; + case T1: + { + target = CPU.read_gpr((data >> 3) & 0xf); + break; + } + case A1: + { + cond = data >> 28; + target = CPU.read_gpr(data & 0xf); + } default: throw __FUNCTION__; } + + if (ConditionPassed(cond)) + { + if (target & 1) + { + CPU.ISET = Thumb; + CPU.SetBranch(target & ~1); + } + else + { + CPU.ISET = ARM; + CPU.SetBranch(target); + } + } } @@ -336,7 +398,7 @@ void ARMv7Interpreter::CB_Z(const u32 data, const ARMv7_encoding type) default: throw __FUNCTION__; } - if ((CPU.GPR[data & 0x7] == 0) ^ (data & 0x800)) + if ((CPU.read_gpr(data & 0x7) == 0) ^ (data & 0x800)) { CPU.SetBranch(CPU.PC + 2 + ((data & 0xf8) >> 2) + ((data & 0x200) >> 3)); } @@ -441,7 +503,16 @@ void ARMv7Interpreter::IT(const u32 data, const ARMv7_encoding type) { switch (type) { - case A1: throw __FUNCTION__; + case T1: + { + if ((data & 0xf) == 0) + { + throw "Related encodings"; + } + + CPU.ITSTATE.IT = data & 0xff; + return; + } default: throw __FUNCTION__; } } @@ -711,16 +782,48 @@ void ARMv7Interpreter::MLS(const u32 data, const ARMv7_encoding type) void ARMv7Interpreter::MOV_IMM(const u32 data, const ARMv7_encoding type) { - u32 d; - u32 imm; + bool set_flags = CPU.ITSTATE; + bool carry = CPU.APSR.C; + + u32 cond = CPU.ITSTATE.advance(); + u32 d = 0; + u32 imm32 = 0; switch (type) { - case T1: d = (data >> 8) & 0x7; imm = sign<8, u32>(data & 0xff); break; + case T1: + { + d = (data >> 8) & 0x7; + imm32 = sign<8, u32>(data & 0xff); + break; + } + //case T2: + //{ + // set_flags = data & 0x100000; + // d = (data >> 8) & 0xf; + // imm32 = ThumbExpandImm_C((data & 0x4000000) >> 15 | (data & 0x7000) >> 4 | (data & 0xff), carry); + // break; + //} + case T3: + { + set_flags = false; + d = (data >> 8) & 0xf; + imm32 = (data & 0xf0000) >> 4 | (data & 0x4000000) >> 15 | (data & 0x7000) >> 4 | (data & 0xff); + break; + } default: throw __FUNCTION__; } - CPU.write_gpr(d, imm); + if (ConditionPassed(cond)) + { + CPU.write_gpr(d, imm32); + if (set_flags) + { + CPU.APSR.N = imm32 >> 31; + CPU.APSR.Z = imm32 == 0; + CPU.APSR.C = carry; + } + } } void ARMv7Interpreter::MOV_REG(const u32 data, const ARMv7_encoding type) @@ -810,13 +913,29 @@ void ARMv7Interpreter::MVN_RSR(const u32 data, const ARMv7_encoding type) void ARMv7Interpreter::NOP(const u32 data, const ARMv7_encoding type) { + u32 cond = CPU.ITSTATE.advance(); + switch (type) { - case T1: break; - case T2: break; - case A1: break; + case T1: + { + break; + } + case T2: + { + break; + } + case A1: + { + cond = data >> 28; + break; + } default: throw __FUNCTION__; } + + if (ConditionPassed(cond)) + { + } } @@ -879,6 +998,7 @@ void ARMv7Interpreter::PKH(const u32 data, const ARMv7_encoding type) void ARMv7Interpreter::POP(const u32 data, const ARMv7_encoding type) { + u32 cond = CPU.ITSTATE.advance(); u16 reg_list = 0; switch (type) @@ -900,31 +1020,39 @@ void ARMv7Interpreter::POP(const u32 data, const ARMv7_encoding type) } case A1: { - reg_list = data & 0xffff; if (BitCount(reg_list) < 2) throw "LDM / LDMIA / LDMFD"; - if (!ConditionPassed(data >> 28)) return; + cond = data >> 28; + reg_list = data & 0xffff; + if (BitCount(reg_list) < 2) + { + throw "LDM / LDMIA / LDMFD"; + } break; } case A2: { + cond = data >> 28; reg_list = 1 << ((data >> 12) & 0xf); - if (!ConditionPassed(data >> 28)) return; break; } default: throw __FUNCTION__; } - for (u16 mask = 1, i = 0; mask; mask <<= 1, i++) + if (ConditionPassed(cond)) { - if (reg_list & mask) + for (u16 mask = 1, i = 0; mask; mask <<= 1, i++) { - CPU.write_gpr(i, vm::psv::read32(CPU.SP)); - CPU.SP += 4; + if (reg_list & mask) + { + CPU.write_gpr(i, vm::psv::read32(CPU.SP)); + CPU.SP += 4; + } } } } void ARMv7Interpreter::PUSH(const u32 data, const ARMv7_encoding type) { + u32 cond = CPU.ITSTATE.advance(); u16 reg_list = 0; switch (type) @@ -946,25 +1074,32 @@ void ARMv7Interpreter::PUSH(const u32 data, const ARMv7_encoding type) } case A1: { - reg_list = data & 0xffff; if (BitCount(reg_list) < 2) throw "STMDB / STMFD"; - if (!ConditionPassed(data >> 28)) return; + cond = data >> 28; + reg_list = data & 0xffff; + if (BitCount(reg_list) < 2) + { + throw "STMDB / STMFD"; + } break; } case A2: { + cond = data >> 28; reg_list = 1 << ((data >> 12) & 0xf); - if (!ConditionPassed(data >> 28)) return; break; } default: throw __FUNCTION__; } - for (u16 mask = 1 << 15, i = 15; mask; mask >>= 1, i--) + if (ConditionPassed(cond)) { - if (reg_list & mask) + for (u16 mask = 1 << 15, i = 15; mask; mask >>= 1, i--) { - CPU.SP -= 4; - vm::psv::write32(CPU.SP, CPU.read_gpr(i)); + if (reg_list & mask) + { + CPU.SP -= 4; + vm::psv::write32(CPU.SP, CPU.read_gpr(i)); + } } } } @@ -1657,9 +1792,11 @@ void ARMv7Interpreter::SUB_RSR(const u32 data, const ARMv7_encoding type) void ARMv7Interpreter::SUB_SPI(const u32 data, const ARMv7_encoding type) { + u32 cond = CPU.ITSTATE.advance(); + switch (type) { - case T1: CPU.SP -= (data & 0x7f) << 2; return; + case T1: if (ConditionPassed(cond)) CPU.SP -= (data & 0x7f) << 2; return; default: throw __FUNCTION__; } } diff --git a/rpcs3/Emu/ARMv7/ARMv7Opcodes.h b/rpcs3/Emu/ARMv7/ARMv7Opcodes.h index e73f44899f..d391b7fcd1 100644 --- a/rpcs3/Emu/ARMv7/ARMv7Opcodes.h +++ b/rpcs3/Emu/ARMv7/ARMv7Opcodes.h @@ -338,7 +338,7 @@ struct ARMv7_opcode_t static const ARMv7_opcode_t ARMv7_opcode_table[] = { - ARMv7_OP2(0xffff, 0x0000, T1, NULL_OP), + ARMv7_OP2(0xffff, 0x0000, T1, NULL_OP), // ??? ARMv7_OP4(0xfbe0, 0x8000, 0xf140, 0x0000, T1, ADC_IMM), ARMv7_OP4(0x0fe0, 0x0000, 0x02a0, 0x0000, A1, ADC_IMM), @@ -555,7 +555,17 @@ static const ARMv7_opcode_t ARMv7_opcode_table[] = ARMv7_OP4(0xffff, 0xffff, 0xf3af, 0x8000, T2, NOP), ARMv7_OP4(0x0fff, 0xffff, 0x0320, 0xf000, A1, NOP), - // + ARMv7_OP4(0xfbe0, 0x8000, 0xf060, 0x0000, T1, ORN_IMM), + ARMv7_OP4(0xffe0, 0x8000, 0xea60, 0x0000, T1, ORN_REG), + + ARMv7_OP4(0xfbe0, 0x8000, 0xf040, 0x0000, T1, ORR_IMM), + ARMv7_OP4(0x0fe0, 0x0000, 0x0380, 0x0000, A1, ORR_IMM), + ARMv7_OP2(0xffc0, 0x4300, T1, ORR_REG), + ARMv7_OP4(0xffe0, 0x8000, 0xea40, 0x0000, T2, ORR_REG), + ARMv7_OP4(0x0fe0, 0x0010, 0x0180, 0x0000, A1, ORR_REG), + ARMv7_OP4(0x0fe0, 0x0090, 0x0180, 0x0010, A1, ORR_RSR), + + // TODO (PKH...) ARMv7_OP2(0xfe00, 0xbc00, T1, POP), ARMv7_OP4(0xffff, 0x0000, 0xe8bd, 0x0000, T2, POP), @@ -569,7 +579,7 @@ static const ARMv7_opcode_t ARMv7_opcode_table[] = ARMv7_OP4(0x0fff, 0x0000, 0x092d, 0x0000, A1, PUSH), ARMv7_OP4(0x0fff, 0x0fff, 0x052d, 0x0004, A2, PUSH), - // + // TODO (Q*...) ARMv7_OP2(0xf800, 0x6000, T1, STR_IMM), ARMv7_OP2(0xf800, 0x9000, T2, STR_IMM), diff --git a/rpcs3/Emu/ARMv7/ARMv7Thread.cpp b/rpcs3/Emu/ARMv7/ARMv7Thread.cpp index 162f08a918..ea8976b38e 100644 --- a/rpcs3/Emu/ARMv7/ARMv7Thread.cpp +++ b/rpcs3/Emu/ARMv7/ARMv7Thread.cpp @@ -18,7 +18,8 @@ void ARMv7Thread::InitRegs() memset(GPR, 0, sizeof(GPR[0]) * 15); APSR.APSR = 0; IPSR.IPSR = 0; - PC |= 1; + ISET = Thumb; + ITSTATE.IT = 0; SP = m_stack_addr + m_stack_size; } diff --git a/rpcs3/Emu/ARMv7/ARMv7Thread.h b/rpcs3/Emu/ARMv7/ARMv7Thread.h index e95e9b49ec..0ef26562ff 100644 --- a/rpcs3/Emu/ARMv7/ARMv7Thread.h +++ b/rpcs3/Emu/ARMv7/ARMv7Thread.h @@ -1,6 +1,14 @@ #pragma once #include "Emu/CPU/CPUThread.h" +enum ARMv7InstructionSet +{ + ARM, + Thumb, + Jazelle, + ThumbEE, +}; + class ARMv7Thread : public CPUThread { public: @@ -38,6 +46,7 @@ public: }; u32 APSR; + } APSR; union @@ -49,8 +58,41 @@ public: }; u32 IPSR; + } IPSR; + ARMv7InstructionSet ISET; + + union + { + struct + { + u8 cond : 3; + u8 state : 5; + }; + + u8 IT; + + u32 advance() + { + const u32 res = (state & 0xf) ? (cond << 1 | state >> 4) : 0xe /* true */; + + state <<= 1; + if ((state & 0xf) == 0) // if no d + { + IT = 0; // clear ITSTATE + } + + return res; + } + + operator bool() const + { + return (state & 0xf) != 0; + } + + } ITSTATE; + void write_gpr(u32 n, u32 value) { assert(n < 16); From 536c5a900a02a16ae24de68642ef72c7a7695cf6 Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Sat, 1 Nov 2014 01:00:36 +0300 Subject: [PATCH 13/27] ARMv7: more opcodes + STR --- rpcs3/Emu/ARMv7/ARMv7DisAsm.cpp | 11 ++- rpcs3/Emu/ARMv7/ARMv7DisAsm.h | 4 +- rpcs3/Emu/ARMv7/ARMv7Interpreter.cpp | 106 ++++++++++++++++++++++--- rpcs3/Emu/ARMv7/ARMv7Interpreter.h | 4 +- rpcs3/Emu/ARMv7/ARMv7Opcodes.h | 113 +++++++++++++++++++++++++-- 5 files changed, 213 insertions(+), 25 deletions(-) diff --git a/rpcs3/Emu/ARMv7/ARMv7DisAsm.cpp b/rpcs3/Emu/ARMv7/ARMv7DisAsm.cpp index ab4f5fcc11..ccb2582cad 100644 --- a/rpcs3/Emu/ARMv7/ARMv7DisAsm.cpp +++ b/rpcs3/Emu/ARMv7/ARMv7DisAsm.cpp @@ -11,6 +11,11 @@ void ARMv7DisAsm::NULL_OP(const u32 data, const ARMv7_encoding type) Write("Illegal opcode (null)"); } +void ARMv7DisAsm::HACK(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + void ARMv7DisAsm::ADC_IMM(const u32 data, const ARMv7_encoding type) { Write(__FUNCTION__); @@ -881,12 +886,6 @@ void ARMv7DisAsm::SVC(const u32 data, const ARMv7_encoding type) } -void ARMv7DisAsm::SWP_(const u32 data, const ARMv7_encoding type) -{ - Write(__FUNCTION__); -} - - void ARMv7DisAsm::SXTAB(const u32 data, const ARMv7_encoding type) { Write(__FUNCTION__); diff --git a/rpcs3/Emu/ARMv7/ARMv7DisAsm.h b/rpcs3/Emu/ARMv7/ARMv7DisAsm.h index 16f0a5df67..7eb712d24c 100644 --- a/rpcs3/Emu/ARMv7/ARMv7DisAsm.h +++ b/rpcs3/Emu/ARMv7/ARMv7DisAsm.h @@ -49,6 +49,8 @@ protected: virtual void NULL_OP(const u32 data, const ARMv7_encoding type); + virtual void HACK(const u32 data, const ARMv7_encoding type); + virtual void ADC_IMM(const u32 data, const ARMv7_encoding type); virtual void ADC_REG(const u32 data, const ARMv7_encoding type); virtual void ADC_RSR(const u32 data, const ARMv7_encoding type); @@ -265,8 +267,6 @@ protected: virtual void SVC(const u32 data, const ARMv7_encoding type); - virtual void SWP_(const u32 data, const ARMv7_encoding type); - virtual void SXTAB(const u32 data, const ARMv7_encoding type); virtual void SXTAB16(const u32 data, const ARMv7_encoding type); virtual void SXTAH(const u32 data, const ARMv7_encoding type); diff --git a/rpcs3/Emu/ARMv7/ARMv7Interpreter.cpp b/rpcs3/Emu/ARMv7/ARMv7Interpreter.cpp index f5cf8d64a6..2f60850f59 100644 --- a/rpcs3/Emu/ARMv7/ARMv7Interpreter.cpp +++ b/rpcs3/Emu/ARMv7/ARMv7Interpreter.cpp @@ -17,6 +17,33 @@ void ARMv7Interpreter::NULL_OP(const u32 data, const ARMv7_encoding type) Emu.Pause(); } +void ARMv7Interpreter::HACK(const u32 data, const ARMv7_encoding type) +{ + u32 cond = CPU.ITSTATE.advance(); + u32 code = 0; + + switch (type) + { + case T1: + { + code = data & 0xffff; + break; + } + case A1: + { + cond = data >> 28; + code = (data & 0xfff00) >> 4 | (data & 0xf); + break; + } + default: throw __FUNCTION__; + } + + if (ConditionPassed(cond)) + { + // + } +} + void ARMv7Interpreter::ADC_IMM(const u32 data, const ARMv7_encoding type) { switch (type) @@ -1689,11 +1716,80 @@ void ARMv7Interpreter::STMIB(const u32 data, const ARMv7_encoding type) void ARMv7Interpreter::STR_IMM(const u32 data, const ARMv7_encoding type) { + u32 cond = CPU.ITSTATE.advance(); + u32 t = 16; + u32 n = 13; + u32 imm32 = 0; + bool index = true; + bool add = true; + bool wback = false; + switch (type) { + case T1: + { + t = (data & 0x7); + n = (data & 0x38) >> 3; + imm32 = (data & 0x7c0) >> 4; + break; + } + case T2: + { + t = (data & 0x700) >> 8; + imm32 = (data & 0xff) << 2; + break; + } + case T3: + { + t = (data & 0xf000) >> 12; + n = (data & 0xf0000) >> 16; + imm32 = (data & 0xfff); + + if (n == 0xf) + { + throw "STR_IMM_T3 UNDEFINED"; + } + break; + } + case T4: + { + t = (data & 0xf000) >> 12; + n = (data & 0xf0000) >> 16; + imm32 = (data & 0xff); + index = (data & 0x400); + add = (data & 0x200); + wback = (data & 0x100); + + if (index && add && !wback) + { + throw "STRT"; + } + if (n == 13 && index && !add && wback && imm32 == 4) + { + throw "PUSH"; + } + if (n == 15 || (!index && !wback)) + { + throw "STR_IMM_T4 UNDEFINED"; + } + break; + } case A1: throw __FUNCTION__; default: throw __FUNCTION__; } + + if (ConditionPassed(cond)) + { + const u32 offset_addr = add ? CPU.read_gpr(n) + imm32 : CPU.read_gpr(n) - imm32; + const u32 addr = index ? offset_addr : CPU.read_gpr(n); + + vm::psv::write32(addr, CPU.read_gpr(t)); + + if (wback) + { + CPU.write_gpr(n, offset_addr); + } + } } void ARMv7Interpreter::STR_REG(const u32 data, const ARMv7_encoding type) @@ -1821,16 +1917,6 @@ void ARMv7Interpreter::SVC(const u32 data, const ARMv7_encoding type) } -void ARMv7Interpreter::SWP_(const u32 data, const ARMv7_encoding type) -{ - switch (type) - { - case A1: throw __FUNCTION__; - default: throw __FUNCTION__; - } -} - - void ARMv7Interpreter::SXTAB(const u32 data, const ARMv7_encoding type) { switch (type) diff --git a/rpcs3/Emu/ARMv7/ARMv7Interpreter.h b/rpcs3/Emu/ARMv7/ARMv7Interpreter.h index da9ea99af0..ebcb66b983 100644 --- a/rpcs3/Emu/ARMv7/ARMv7Interpreter.h +++ b/rpcs3/Emu/ARMv7/ARMv7Interpreter.h @@ -262,6 +262,8 @@ protected: virtual void NULL_OP(const u32 data, const ARMv7_encoding type); + virtual void HACK(const u32 data, const ARMv7_encoding type); + virtual void ADC_IMM(const u32 data, const ARMv7_encoding type); virtual void ADC_REG(const u32 data, const ARMv7_encoding type); virtual void ADC_RSR(const u32 data, const ARMv7_encoding type); @@ -478,8 +480,6 @@ protected: virtual void SVC(const u32 data, const ARMv7_encoding type); - virtual void SWP_(const u32 data, const ARMv7_encoding type); - virtual void SXTAB(const u32 data, const ARMv7_encoding type); virtual void SXTAB16(const u32 data, const ARMv7_encoding type); virtual void SXTAH(const u32 data, const ARMv7_encoding type); diff --git a/rpcs3/Emu/ARMv7/ARMv7Opcodes.h b/rpcs3/Emu/ARMv7/ARMv7Opcodes.h index d391b7fcd1..963e026ef5 100644 --- a/rpcs3/Emu/ARMv7/ARMv7Opcodes.h +++ b/rpcs3/Emu/ARMv7/ARMv7Opcodes.h @@ -49,6 +49,8 @@ public: virtual void NULL_OP(const u32 data, const ARMv7_encoding type) = 0; + virtual void HACK(const u32 data, const ARMv7_encoding type) = 0; + virtual void ADC_IMM(const u32 data, const ARMv7_encoding type) = 0; virtual void ADC_REG(const u32 data, const ARMv7_encoding type) = 0; virtual void ADC_RSR(const u32 data, const ARMv7_encoding type) = 0; @@ -265,8 +267,6 @@ public: virtual void SVC(const u32 data, const ARMv7_encoding type) = 0; - virtual void SWP_(const u32 data, const ARMv7_encoding type) = 0; - virtual void SXTAB(const u32 data, const ARMv7_encoding type) = 0; virtual void SXTAB16(const u32 data, const ARMv7_encoding type) = 0; virtual void SXTAH(const u32 data, const ARMv7_encoding type) = 0; @@ -318,7 +318,7 @@ public: virtual void UXTB16(const u32 data, const ARMv7_encoding type) = 0; virtual void UXTH(const u32 data, const ARMv7_encoding type) = 0; - // TODO: vector ops + // TODO: vector ops + something }; struct ARMv7_opcode_t @@ -340,6 +340,9 @@ static const ARMv7_opcode_t ARMv7_opcode_table[] = { ARMv7_OP2(0xffff, 0x0000, T1, NULL_OP), // ??? + ARMv7_OP4(0xffff, 0x0000, 0xf870, 0x0000, T1, HACK), // "Undefined" Thumb opcode + ARMv7_OP4(0x0ff0, 0x00f0, 0x0070, 0x0090, A1, HACK), // "Undefined" ARM opcode + ARMv7_OP4(0xfbe0, 0x8000, 0xf140, 0x0000, T1, ADC_IMM), ARMv7_OP4(0x0fe0, 0x0000, 0x02a0, 0x0000, A1, ADC_IMM), ARMv7_OP2(0xffc0, 0x4040, T1, ADC_REG), @@ -565,7 +568,8 @@ static const ARMv7_opcode_t ARMv7_opcode_table[] = ARMv7_OP4(0x0fe0, 0x0010, 0x0180, 0x0000, A1, ORR_REG), ARMv7_OP4(0x0fe0, 0x0090, 0x0180, 0x0010, A1, ORR_RSR), - // TODO (PKH...) + ARMv7_OP4(0xfff0, 0x8010, 0xeac0, 0x0000, T1, PKH), + ARMv7_OP4(0x0ff0, 0x0030, 0x0680, 0x0010, A1, PKH), ARMv7_OP2(0xfe00, 0xbc00, T1, POP), ARMv7_OP4(0xffff, 0x0000, 0xe8bd, 0x0000, T2, POP), @@ -581,6 +585,65 @@ static const ARMv7_opcode_t ARMv7_opcode_table[] = // TODO (Q*...) + ARMv7_OP4(0xfff0, 0xf0f0, 0xfa90, 0xf0a0, T1, RBIT), + ARMv7_OP4(0x0fff, 0x0ff0, 0x06ff, 0x0f30, A1, RBIT), + + ARMv7_OP2(0xffc0, 0xba00, T1, REV), + ARMv7_OP4(0xfff0, 0xf0f0, 0xfa90, 0xf080, T2, REV), + ARMv7_OP4(0x0fff, 0x0ff0, 0x06bf, 0x0f30, A1, REV), + ARMv7_OP2(0xffc0, 0xba40, T1, REV16), + ARMv7_OP4(0xfff0, 0xf0f0, 0xfa90, 0xf090, T2, REV16), + ARMv7_OP4(0x0fff, 0x0ff0, 0x06bf, 0x0fb0, A1, REV16), + ARMv7_OP2(0xffc0, 0xbac0, T1, REVSH), + ARMv7_OP4(0xfff0, 0xf0f0, 0xfa90, 0xf0b0, T2, REVSH), + ARMv7_OP4(0x0fff, 0x0ff0, 0x06ff, 0x0fb0, A1, REVSH), + + ARMv7_OP4(0xffef, 0x8030, 0xea4f, 0x0030, T1, ROR_IMM), + ARMv7_OP4(0x0fef, 0x0070, 0x01a0, 0x0060, A1, ROR_IMM), + ARMv7_OP2(0xffc0, 0x41c0, T1, ROR_REG), + ARMv7_OP4(0xffe0, 0xf0f0, 0xfa60, 0xf000, T2, ROR_REG), + ARMv7_OP4(0x0fef, 0x00f0, 0x01a0, 0x0070, A1, ROR_REG), + ARMv7_OP4(0xffef, 0xf0f0, 0xea4f, 0x0030, T1, RRX), + ARMv7_OP4(0x0fef, 0x0ff0, 0x01a0, 0x0060, A1, RRX), + + ARMv7_OP2(0xffc0, 0x4240, T1, RSB_IMM), + ARMv7_OP4(0xfbe0, 0x8000, 0xf1c0, 0x0000, T2, RSB_IMM), + ARMv7_OP4(0x0fe0, 0x0000, 0x0260, 0x0000, A1, RSB_IMM), + ARMv7_OP4(0xffe0, 0x8000, 0xebc0, 0x0000, T1, RSB_REG), + ARMv7_OP4(0x0fe0, 0x0010, 0x0060, 0x0000, A1, RSB_REG), + ARMv7_OP4(0x0fe0, 0x0090, 0x0060, 0x0010, A1, RSB_RSR), + + ARMv7_OP4(0x0fe0, 0x0000, 0x02e0, 0x0000, A1, RSC_IMM), + ARMv7_OP4(0x0fe0, 0x0010, 0x00e0, 0x0000, A1, RSC_REG), + ARMv7_OP4(0x0fe0, 0x0090, 0x00e0, 0x0010, A1, RSC_RSR), + + // TODO (SADD16, SADD8, SASX) + + ARMv7_OP4(0xfbe0, 0x8000, 0xf160, 0x0000, T1, SBC_IMM), + ARMv7_OP4(0x0fe0, 0x0000, 0x02c0, 0x0000, A1, SBC_IMM), + ARMv7_OP2(0xffc0, 0x4180, T1, SBC_REG), + ARMv7_OP4(0xffe0, 0x8000, 0xeb60, 0x0000, T2, SBC_REG), + ARMv7_OP4(0x0fe0, 0x0010, 0x00c0, 0x0000, A1, SBC_REG), + ARMv7_OP4(0x0fe0, 0x0090, 0x00c0, 0x0010, A1, SBC_RSR), + + ARMv7_OP4(0xfff0, 0x8020, 0xf340, 0x0000, T1, SBFX), + ARMv7_OP4(0x0fe0, 0x0070, 0x07a0, 0x0050, A1, SBFX), + + ARMv7_OP4(0xfff0, 0xf0f0, 0xfb90, 0xf0f0, T1, SDIV), // ??? + + ARMv7_OP4(0xfff0, 0xf0f0, 0xfaa0, 0xf080, T1, SEL), + ARMv7_OP4(0x0ff0, 0x0ff0, 0x0680, 0x0fb0, A1, SEL), + + // TODO (SH*, SM*, SS*) + + ARMv7_OP2(0xf800, 0xc000, T1, STM), + ARMv7_OP4(0xffd0, 0xa000, 0xe880, 0x0000, T2, STM), + ARMv7_OP4(0x0fd0, 0x0000, 0x0880, 0x0000, A1, STM), + ARMv7_OP4(0x0fd0, 0x0000, 0x0800, 0x0000, A1, STMDA), + ARMv7_OP4(0xffd0, 0xa000, 0xe900, 0x0000, T1, STMDB), + ARMv7_OP4(0x0fd0, 0x0000, 0x0900, 0x0000, A1, STMDB), + ARMv7_OP4(0x0fd0, 0x0000, 0x0980, 0x0000, A1, STMIB), + ARMv7_OP2(0xf800, 0x6000, T1, STR_IMM), ARMv7_OP2(0xf800, 0x9000, T2, STR_IMM), ARMv7_OP4(0xfff0, 0x0000, 0xf8c0, 0x0000, T3, STR_IMM), @@ -590,7 +653,25 @@ static const ARMv7_opcode_t ARMv7_opcode_table[] = ARMv7_OP4(0xfff0, 0x0fc0, 0xf840, 0x0000, T2, STR_REG), ARMv7_OP4(0x0e50, 0x0010, 0x0600, 0x0000, A1, STR_REG), - // + ARMv7_OP2(0xf800, 0x7000, T1, STRB_IMM), + ARMv7_OP4(0xfff0, 0x0000, 0xf880, 0x0000, T2, STRB_IMM), + ARMv7_OP4(0xfff0, 0x0800, 0xf800, 0x0800, T3, STRB_IMM), + ARMv7_OP4(0x0e50, 0x0000, 0x0440, 0x0000, A1, STRB_IMM), + ARMv7_OP2(0xfe00, 0x5400, T1, STRB_REG), + ARMv7_OP4(0xfff0, 0x0fc0, 0xf800, 0x0000, T2, STRB_REG), + ARMv7_OP4(0x0e50, 0x0010, 0x0640, 0x0000, A1, STRB_REG), + + ARMv7_OP4(0xfe50, 0x0000, 0xe840, 0x0000, T1, STRD_IMM), + ARMv7_OP4(0x0e50, 0x00f0, 0x0040, 0x00f0, A1, STRD_IMM), + ARMv7_OP4(0x0e50, 0x0ff0, 0x0000, 0x00f0, A1, STRD_REG), + + ARMv7_OP2(0xf800, 0x8000, T1, STRH_IMM), + ARMv7_OP4(0xfff0, 0x0000, 0xf8a0, 0x0000, T2, STRH_IMM), + ARMv7_OP4(0xfff0, 0x0800, 0xf820, 0x0800, T3, STRH_IMM), + ARMv7_OP4(0x0e50, 0x00f0, 0x0040, 0x00b0, A1, STRH_IMM), + ARMv7_OP2(0xfe00, 0x5200, T1, STRH_REG), + ARMv7_OP4(0xfff0, 0x0fc0, 0xf820, 0x0000, T2, STRH_REG), + ARMv7_OP4(0x0e50, 0x0ff0, 0x0000, 0x00b0, A1, STRH_REG), ARMv7_OP2(0xfe00, 0x1e00, T1, SUB_IMM), ARMv7_OP2(0xf800, 0x3800, T2, SUB_IMM), @@ -607,6 +688,28 @@ static const ARMv7_opcode_t ARMv7_opcode_table[] = ARMv7_OP4(0x0fef, 0x0000, 0x024d, 0x0000, A1, SUB_SPI), ARMv7_OP4(0xffef, 0x8000, 0xebad, 0x0000, T1, SUB_SPR), ARMv7_OP4(0x0fef, 0x0010, 0x004d, 0x0000, A1, SUB_SPR), + + ARMv7_OP2(0xff00, 0xdf00, T1, SVC), + ARMv7_OP4(0x0f00, 0x0000, 0x0f00, 0x0000, A1, SVC), + + // TODO (SX*) + + ARMv7_OP4(0xfff0, 0xffe0, 0xe8d0, 0xf000, T1, TB_), + + ARMv7_OP4(0xfbf0, 0x8f00, 0xf090, 0x0f00, T1, TEQ_IMM), + ARMv7_OP4(0x0ff0, 0xf000, 0x0330, 0x0000, A1, TEQ_IMM), + ARMv7_OP4(0xfff0, 0x8f00, 0xea90, 0x0f00, T1, TEQ_REG), + ARMv7_OP4(0x0ff0, 0xf010, 0x0130, 0x0000, A1, TEQ_REG), + ARMv7_OP4(0x0ff0, 0xf090, 0x0130, 0x0010, A1, TEQ_RSR), + + ARMv7_OP4(0xfbf0, 0x8f00, 0xf010, 0x0f00, T1, TST_IMM), + ARMv7_OP4(0x0ff0, 0xf000, 0x0310, 0x0000, A1, TST_IMM), + ARMv7_OP2(0xffc0, 0x4200, T1, TST_REG), + ARMv7_OP4(0xfff0, 0x8f00, 0xea10, 0x0f00, T2, TST_REG), + ARMv7_OP4(0x0ff0, 0xf010, 0x0110, 0x0000, A1, TST_REG), + ARMv7_OP4(0x0ff0, 0xf090, 0x0110, 0x0010, A1, TST_RSR), + + // TODO (U*, V*) }; #undef ARMv7_OP From 3bdfc6b4999658e1ecd26a80c20413a1963a0ee1 Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Sun, 2 Nov 2014 02:19:14 +0300 Subject: [PATCH 14/27] ARMv7: more opcodes, some changes in loader --- rpcs3/Emu/ARMv7/ARMv7Interpreter.cpp | 116 ++++++++- rpcs3/Emu/ARMv7/ARMv7Interpreter.h | 16 +- rpcs3/Emu/ARMv7/Modules/sceLibc.cpp | 41 +++ rpcs3/Emu/ARMv7/PSVFuncList.cpp | 45 ++++ rpcs3/Emu/ARMv7/PSVFuncList.h | 290 +++++++++++++++++++++ rpcs3/Emu/Memory/Memory.cpp | 12 + rpcs3/Emu/SysCalls/Modules/cellAtrac.cpp | 48 ++-- rpcs3/Emu/SysCalls/Modules/cellPngDec.cpp | 74 +++--- rpcs3/Emu/SysCalls/Modules/cellPngDec.h | 58 ++--- rpcs3/Emu/SysCalls/Modules/cellSpurs.cpp | 35 ++- rpcs3/Emu/SysCalls/Modules/cellSpursJq.cpp | 2 + rpcs3/Emu/SysCalls/Modules/cellSync.cpp | 2 + rpcs3/Emu/SysCalls/Modules/cellSync2.cpp | 2 + rpcs3/Emu/SysCalls/SC_FUNC.h | 2 +- rpcs3/Loader/ELF32.cpp | 78 ++++++ rpcs3/emucore.vcxproj | 3 + rpcs3/emucore.vcxproj.filters | 12 + 17 files changed, 725 insertions(+), 111 deletions(-) create mode 100644 rpcs3/Emu/ARMv7/Modules/sceLibc.cpp create mode 100644 rpcs3/Emu/ARMv7/PSVFuncList.cpp create mode 100644 rpcs3/Emu/ARMv7/PSVFuncList.h diff --git a/rpcs3/Emu/ARMv7/ARMv7Interpreter.cpp b/rpcs3/Emu/ARMv7/ARMv7Interpreter.cpp index 2f60850f59..b977d8006f 100644 --- a/rpcs3/Emu/ARMv7/ARMv7Interpreter.cpp +++ b/rpcs3/Emu/ARMv7/ARMv7Interpreter.cpp @@ -3,6 +3,7 @@ #include "Emu/Memory/Memory.h" #include "Emu/CPU/CPUDecoder.h" #include "ARMv7Thread.h" +#include "PSVFuncList.h" #include "ARMv7Interpreter.h" void ARMv7Interpreter::UNK(const u32 data) @@ -40,7 +41,7 @@ void ARMv7Interpreter::HACK(const u32 data, const ARMv7_encoding type) if (ConditionPassed(cond)) { - // + execute_psv_func_by_index(CPU, code); } } @@ -74,11 +75,42 @@ void ARMv7Interpreter::ADC_RSR(const u32 data, const ARMv7_encoding type) void ARMv7Interpreter::ADD_IMM(const u32 data, const ARMv7_encoding type) { + bool set_flags = !CPU.ITSTATE; + u32 cond = CPU.ITSTATE.advance(); + u32 d = 0; + u32 n = 0; + u32 imm32 = 0; + switch (type) { + case T1: + { + d = (data & 0x7); + n = (data & 0x38) >> 3; + imm32 = (data & 0x1c0) >> 6; + break; + } case A1: throw __FUNCTION__; default: throw __FUNCTION__; } + + if (ConditionPassed(cond)) + { + if (set_flags) + { + bool carry, overflow; + u32 res = AddWithCarry(CPU.read_gpr(n), imm32, false, carry, overflow); + CPU.write_gpr(d, res); + CPU.APSR.N = res >> 31; + CPU.APSR.Z = res == 0; + CPU.APSR.C = carry; + CPU.APSR.V = overflow; + } + else + { + CPU.write_gpr(d, CPU.read_gpr(n) + imm32); + } + } } void ARMv7Interpreter::ADD_REG(const u32 data, const ARMv7_encoding type) @@ -809,9 +841,8 @@ void ARMv7Interpreter::MLS(const u32 data, const ARMv7_encoding type) void ARMv7Interpreter::MOV_IMM(const u32 data, const ARMv7_encoding type) { - bool set_flags = CPU.ITSTATE; + bool set_flags = !CPU.ITSTATE; bool carry = CPU.APSR.C; - u32 cond = CPU.ITSTATE.advance(); u32 d = 0; u32 imm32 = 0; @@ -855,20 +886,72 @@ void ARMv7Interpreter::MOV_IMM(const u32 data, const ARMv7_encoding type) void ARMv7Interpreter::MOV_REG(const u32 data, const ARMv7_encoding type) { + u32 cond = CPU.ITSTATE.advance(); + u32 d = 0; + u32 m = 0; + bool set_flags = false; + switch (type) { + case T1: + { + d = (data & 0x80) >> 4 | (data & 0x7); + m = (data & 0x78) >> 3; + break; + } + case T2: + { + d = (data & 0x7); + m = (data & 0x38) >> 3; + set_flags = true; + break; + } + case T3: + { + d = (data & 0xf00) >> 8; + m = (data & 0xf); + set_flags = (data & 0x100000); + break; + } case A1: throw __FUNCTION__; default: throw __FUNCTION__; } + + if (ConditionPassed(cond)) + { + u32 res = CPU.read_gpr(m); + CPU.write_gpr(d, res); + if (set_flags) + { + CPU.APSR.N = res >> 31; + CPU.APSR.Z = res == 0; + //CPU.APSR.C = ? + } + } } void ARMv7Interpreter::MOVT(const u32 data, const ARMv7_encoding type) { + u32 cond = CPU.ITSTATE.advance(); + u32 d = 0; + u32 imm16 = 0; + switch (type) { + case T1: + { + d = (data & 0xf00) >> 8; + imm16 = (data & 0xf0000) >> 4 | (data & 0x4000000) >> 14 | (data & 0x7000) >> 4 | (data & 0xff); + break; + } case A1: throw __FUNCTION__; default: throw __FUNCTION__; } + + if (ConditionPassed(cond)) + { + CPU.write_gpr(d, (CPU.read_gpr(d) & 0xffff) | (imm16 << 16)); + } } @@ -1889,12 +1972,37 @@ void ARMv7Interpreter::SUB_RSR(const u32 data, const ARMv7_encoding type) void ARMv7Interpreter::SUB_SPI(const u32 data, const ARMv7_encoding type) { u32 cond = CPU.ITSTATE.advance(); + u32 d = 13; + u32 imm32 = 0; + bool set_flags = false; switch (type) { - case T1: if (ConditionPassed(cond)) CPU.SP -= (data & 0x7f) << 2; return; + case T1: + { + imm32 = (data & 0x7f) << 2; + break; + } default: throw __FUNCTION__; } + + if (ConditionPassed(cond)) + { + if (set_flags) + { + bool carry, overflow; + u32 res = AddWithCarry(CPU.SP, ~imm32, true, carry, overflow); + CPU.write_gpr(d, res); + CPU.APSR.N = res >> 31; + CPU.APSR.Z = res == 0; + CPU.APSR.C = carry; + CPU.APSR.V = overflow; + } + else + { + CPU.write_gpr(d, CPU.SP - imm32); + } + } } void ARMv7Interpreter::SUB_SPR(const u32 data, const ARMv7_encoding type) diff --git a/rpcs3/Emu/ARMv7/ARMv7Interpreter.h b/rpcs3/Emu/ARMv7/ARMv7Interpreter.h index ebcb66b983..bfe7539967 100644 --- a/rpcs3/Emu/ARMv7/ARMv7Interpreter.h +++ b/rpcs3/Emu/ARMv7/ARMv7Interpreter.h @@ -225,11 +225,17 @@ public: template T AddWithCarry(T x, T y, bool carry_in, bool& carry_out, bool& overflow) { - uint unsigned_sum = (uint)x + (uint)y + (uint)carry_in; - int signed_sum = (int)x + (int)y + (int)carry_in; - T result = unsigned_sum & ~(T(1) << (sizeof(T) - 1)); - carry_out = (uint)result != unsigned_sum; - overflow = (int)result != signed_sum; + const T sign_mask = (T)1 << (sizeof(T) - 1); + + T result = x + y; + carry_out = ((x & y) | ((x ^ y) & ~result)) & sign_mask; + overflow = (x ^ result) & (y ^ result) & sign_mask; + if (carry_in) + { + result += 1; + carry_out ^= (result == 0); + overflow ^= (result == sign_mask); + } return result; } diff --git a/rpcs3/Emu/ARMv7/Modules/sceLibc.cpp b/rpcs3/Emu/ARMv7/Modules/sceLibc.cpp new file mode 100644 index 0000000000..ac4bbaa532 --- /dev/null +++ b/rpcs3/Emu/ARMv7/Modules/sceLibc.cpp @@ -0,0 +1,41 @@ +#include "stdafx.h" +#include "Emu/ARMv7/PSVFuncList.h" + +extern psv_log_base sceLibc; + +namespace sce_libc_func +{ + void __cxa_atexit() + { + sceLibc.Todo(__FUNCTION__); + } + + void exit() + { + sceLibc.Todo(__FUNCTION__); + } + + void printf() + { + sceLibc.Todo(__FUNCTION__); + } + + void __cxa_set_dso_handle_main() + { + sceLibc.Todo(__FUNCTION__); + } +} + +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) + + REG_FUNC(0x33b83b70, __cxa_atexit); + REG_FUNC(0x826bbbaf, exit); + REG_FUNC(0x9a004680, printf); + REG_FUNC(0xbfe02b3a, __cxa_set_dso_handle_main); + + return std::move(*module); +}(); diff --git a/rpcs3/Emu/ARMv7/PSVFuncList.cpp b/rpcs3/Emu/ARMv7/PSVFuncList.cpp new file mode 100644 index 0000000000..168ea1cfce --- /dev/null +++ b/rpcs3/Emu/ARMv7/PSVFuncList.cpp @@ -0,0 +1,45 @@ +#include "stdafx.h" +#include "PSVFuncList.h" + +std::vector g_psv_func_list; + +void add_psv_func(psv_func& data) +{ + g_psv_func_list.push_back(data); +} + +psv_func* get_psv_func_by_nid(u32 nid) +{ + for (auto& f : g_psv_func_list) + { + if (f.nid == nid) + { + return &f; + } + } + + return nullptr; +} + +u32 get_psv_func_index(psv_func* func) +{ + u32 res = func - g_psv_func_list.data(); + + assert(res < g_psv_func_list.size()); + + return res; +} + +void execute_psv_func_by_index(ARMv7Thread& CPU, u32 index) +{ + assert(index < g_psv_func_list.size()); + + (*g_psv_func_list[index].func)(CPU); +} + +extern psv_log_base sceLibc; + +void list_known_psv_modules() +{ + sceLibc.Log(""); +} diff --git a/rpcs3/Emu/ARMv7/PSVFuncList.h b/rpcs3/Emu/ARMv7/PSVFuncList.h new file mode 100644 index 0000000000..b6356ebea8 --- /dev/null +++ b/rpcs3/Emu/ARMv7/PSVFuncList.h @@ -0,0 +1,290 @@ +#pragma once +#include "ARMv7Thread.h" +#include "Emu/SysCalls/LogBase.h" + +class psv_log_base : public LogBase +{ + std::string m_name; + +public: + psv_log_base(const std::string& name) + : m_name(name) + { + } + + virtual const std::string& GetName() const override + { + return m_name; + } + +}; + +class psv_func_caller +{ +public: + virtual void operator()(ARMv7Thread& CPU) = 0; + virtual ~psv_func_caller(){}; +}; + +namespace psv_func_detail +{ + enum bind_arg_type + { + ARG_GENERAL, + ARG_FLOAT, + ARG_VECTOR, + ARG_STACK, + }; + + template + struct bind_arg; + + template + struct bind_arg + { + static_assert(sizeof(T) <= 4, "Invalid function argument type for ARG_GENERAL"); + + static __forceinline T func(ARMv7Thread& CPU) + { + return (T&)CPU.GPR[g_count - 1]; + } + }; + + template + struct bind_arg + { + static_assert(f_count <= 0, "TODO: Unsupported argument type (float)"); + static_assert(sizeof(T) <= 8, "Invalid function argument type for ARG_FLOAT"); + + static __forceinline T func(ARMv7Thread& CPU) + { + } + }; + + template + struct bind_arg + { + static_assert(v_count <= 0, "TODO: Unsupported argument type (vector)"); + static_assert(sizeof(T) == 16, "Invalid function argument type for ARG_VECTOR"); + + static __forceinline T func(ARMv7Thread& CPU) + { + } + }; + + template + struct bind_arg + { + static_assert(f_count <= 4, "TODO: Unsupported stack argument type (general)"); + static_assert(f_count <= 0, "TODO: Unsupported stack argument type (float)"); + static_assert(v_count <= 0, "TODO: Unsupported stack argument type (vector)"); + static_assert(sizeof(T) <= 4, "Invalid function argument type for ARG_STACK"); + + static __forceinline T func(ARMv7Thread& CPU) + { + } + }; + + template + struct bind_result + { + static_assert(type != ARG_FLOAT, "TODO: Unsupported funcion result type (float)"); + static_assert(type != ARG_VECTOR, "TODO: Unsupported funcion result type (vector)"); + static_assert(type == ARG_GENERAL, "Wrong use of bind_result template"); + static_assert(sizeof(T) <= 4, "Invalid function result type for ARG_GENERAL"); + + static __forceinline void func(ARMv7Thread& CPU, T result) + { + (T&)CPU.GPR[0] = result; + } + }; + + //template + //struct bind_result + //{ + // static_assert(sizeof(T) <= 8, "Invalid function result type for ARG_FLOAT"); + + // static __forceinline void func(ARMv7Thread& CPU, T result) + // { + // } + //}; + + //template + //struct bind_result + //{ + // static_assert(sizeof(T) == 16, "Invalid function result type for ARG_VECTOR"); + + // static __forceinline void func(ARMv7Thread& CPU, const T result) + // { + // } + //}; + + template + struct call_impl + { + static __forceinline RT call(F f, Tuple && t) + { + return call_impl::call(f, std::forward(t)); + } + }; + + template + struct call_impl + { + static __forceinline RT call(F f, Tuple && t) + { + return f(std::get(std::forward(t))...); + } + }; + + template + static __forceinline RT call(F f, Tuple && t) + { + typedef typename std::decay::type ttype; + return psv_func_detail::call_impl::value, std::tuple_size::value>::call(f, std::forward(t)); + } + + template + static __forceinline std::tuple<> iterate(ARMv7Thread& CPU) + { + // terminator + return std::tuple<>(); + } + + template + static __forceinline std::tuple iterate(ARMv7Thread& CPU) + { + static_assert(!std::is_pointer::value, "Invalid function argument type (pointer)"); + static_assert(!std::is_reference::value, "Invalid function argument type (reference)"); + // TODO: check calculations + const bool is_float = std::is_floating_point::value; + const bool is_vector = std::is_same::value; + const bind_arg_type t = is_float + ? ((f_count >= 13) ? ARG_STACK : ARG_FLOAT) + : (is_vector ? ((v_count >= 12) ? ARG_STACK : ARG_VECTOR) : ((g_count >= 8) ? ARG_STACK : ARG_GENERAL)); + const int g = g_count + (is_float || is_vector ? 0 : 1); + const int f = f_count + (is_float ? 1 : 0); + const int v = v_count + (is_vector ? 1 : 0); + + return std::tuple_cat(std::tuple(bind_arg::func(CPU)), iterate(CPU)); + } + + template + class func_binder; + + template + class func_binder : public psv_func_caller + { + typedef void(*func_t)(T...); + const func_t m_call; + + public: + func_binder(func_t call) + : psv_func_caller() + , m_call(call) + { + } + + virtual void operator()(ARMv7Thread& CPU) + { + call(m_call, iterate<0, 0, 0, T...>(CPU)); + } + }; + + template + class func_binder : public psv_func_caller + { + typedef void(*func_t)(ARMv7Thread&, T...); + const func_t m_call; + + public: + func_binder(func_t call) + : psv_func_caller() + , m_call(call) + { + } + + virtual void operator()(ARMv7Thread& CPU) + { + call(m_call, std::tuple_cat(std::tuple(CPU), iterate<0, 0, 0, T...>(CPU))); + } + }; + + template + class func_binder : public psv_func_caller + { + typedef RT(*func_t)(T...); + const func_t m_call; + + public: + func_binder(func_t call) + : psv_func_caller() + , m_call(call) + { + } + + virtual void operator()(ARMv7Thread& CPU) + { + static_assert(!std::is_pointer::value, "Invalid function result type (pointer)"); + static_assert(!std::is_reference::value, "Invalid function result type (reference)"); + const bool is_float = std::is_floating_point::value; + const bool is_vector = std::is_same::value; + const bind_arg_type t = is_float ? ARG_FLOAT : (is_vector ? ARG_VECTOR : ARG_GENERAL); + + bind_result::func(CPU, call(m_call, iterate<0, 0, 0, T...>(CPU))); + } + }; + + template + class func_binder : public psv_func_caller + { + typedef RT(*func_t)(ARMv7Thread&, T...); + const func_t m_call; + + public: + func_binder(func_t call) + : psv_func_caller() + , m_call(call) + { + } + + virtual void operator()(ARMv7Thread& CPU) + { + static_assert(!std::is_pointer::value, "Invalid function result type (pointer)"); + static_assert(!std::is_reference::value, "Invalid function result type (reference)"); + const bool is_float = std::is_floating_point::value; + const bool is_vector = std::is_same::value; + const bind_arg_type t = is_float ? ARG_FLOAT : (is_vector ? ARG_VECTOR : ARG_GENERAL); + + bind_result::func(CPU, call(m_call, std::tuple_cat(std::tuple(CPU), iterate<0, 0, 0, T...>(CPU)))); + } + }; +} + +struct psv_func +{ + const u32 nid; + psv_func_caller* const func; + psv_log_base* const module; +}; + +void add_psv_func(psv_func& data); + +template +void reg_psv_func(u32 nid, psv_log_base* module, RT(*func)(T...)) +{ + psv_func f = + { + nid, + new psv_func_detail::func_binder(func), + module + }; + + add_psv_func(f); +} + +psv_func* get_psv_func_by_nid(u32 nid); +u32 get_psv_func_index(psv_func* func); + +void execute_psv_func_by_index(ARMv7Thread& CPU, u32 index); +void list_known_psv_modules(); diff --git a/rpcs3/Emu/Memory/Memory.cpp b/rpcs3/Emu/Memory/Memory.cpp index 1cc432d4cd..59c6c5feb3 100644 --- a/rpcs3/Emu/Memory/Memory.cpp +++ b/rpcs3/Emu/Memory/Memory.cpp @@ -412,6 +412,12 @@ void DynamicMemoryBlockBase::Delete() bool DynamicMemoryBlockBase::AllocFixed(u64 addr, u32 size) { + if (!MemoryBlock::GetStartAddr()) + { + LOG_ERROR(MEMORY, "DynamicMemoryBlockBase::AllocFixed(addr=0x%llx, size=0x%x): memory block not initialized", addr, size); + return false; + } + size = PAGE_4K(size + (addr & 4095)); // align size addr &= ~4095; // align start address @@ -441,6 +447,12 @@ void DynamicMemoryBlockBase::AppendMem(u64 addr, u32 size) /* private */ u64 DynamicMemoryBlockBase::AllocAlign(u32 size, u32 align) { + if (!MemoryBlock::GetStartAddr()) + { + LOG_ERROR(MEMORY, "DynamicMemoryBlockBase::AllocAlign(size=0x%x, align=0x%x): memory block not initialized", size, align); + return 0; + } + size = PAGE_4K(size); u32 exsize; diff --git a/rpcs3/Emu/SysCalls/Modules/cellAtrac.cpp b/rpcs3/Emu/SysCalls/Modules/cellAtrac.cpp index 57442cdd91..5ee26e36d0 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellAtrac.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellAtrac.cpp @@ -13,7 +13,7 @@ u32 libatrac3plus; u32 libatrac3plus_rtoc; #endif -s32 cellAtracSetDataAndGetMemSize(vm::ptr pHandle, u32 pucBufferAddr, u32 uiReadByte, u32 uiBufferByte, vm::ptr puiWorkMemByte) +s64 cellAtracSetDataAndGetMemSize(vm::ptr pHandle, u32 pucBufferAddr, u32 uiReadByte, u32 uiBufferByte, vm::ptr puiWorkMemByte) { cellAtrac->Warning("cellAtracSetDataAndGetMemSize(pHandle=0x%x, pucBufferAddr=0x%x, uiReadByte=0x%x, uiBufferByte=0x%x, puiWorkMemByte_addr=0x%x)", pHandle.addr(), pucBufferAddr, uiReadByte, uiBufferByte, puiWorkMemByte.addr()); @@ -25,7 +25,7 @@ s32 cellAtracSetDataAndGetMemSize(vm::ptr pHandle, u32 pucBuffe return CELL_OK; } -s32 cellAtracCreateDecoder(vm::ptr pHandle, u32 pucWorkMem_addr, u32 uiPpuThreadPriority, u32 uiSpuThreadPriority) +s64 cellAtracCreateDecoder(vm::ptr pHandle, u32 pucWorkMem_addr, u32 uiPpuThreadPriority, u32 uiSpuThreadPriority) { cellAtrac->Warning("cellAtracCreateDecoder(pHandle=0x%x, pucWorkMem_addr=0x%x, uiPpuThreadPriority=%d, uiSpuThreadPriority=%d)", pHandle.addr(), pucWorkMem_addr, uiPpuThreadPriority, uiSpuThreadPriority); @@ -37,7 +37,7 @@ s32 cellAtracCreateDecoder(vm::ptr pHandle, u32 pucWorkMem_addr return CELL_OK; } -s32 cellAtracCreateDecoderExt(vm::ptr pHandle, u32 pucWorkMem_addr, u32 uiPpuThreadPriority, vm::ptr pExtRes) +s64 cellAtracCreateDecoderExt(vm::ptr pHandle, u32 pucWorkMem_addr, u32 uiPpuThreadPriority, vm::ptr pExtRes) { cellAtrac->Warning("cellAtracCreateDecoderExt(pHandle=0x%x, pucWorkMem_addr=0x%x, uiPpuThreadPriority=%d, pExtRes_addr=0x%x)", pHandle.addr(), pucWorkMem_addr, uiPpuThreadPriority, pExtRes.addr()); @@ -49,7 +49,7 @@ s32 cellAtracCreateDecoderExt(vm::ptr pHandle, u32 pucWorkMem_a return CELL_OK; } -s32 cellAtracDeleteDecoder(vm::ptr pHandle) +s64 cellAtracDeleteDecoder(vm::ptr pHandle) { cellAtrac->Warning("cellAtracDeleteDecoder(pHandle=0x%x)", pHandle.addr()); #ifdef PRX_DEBUG @@ -59,7 +59,7 @@ s32 cellAtracDeleteDecoder(vm::ptr pHandle) return CELL_OK; } -s32 cellAtracDecode(vm::ptr pHandle, u32 pfOutAddr, vm::ptr puiSamples, vm::ptr puiFinishflag, vm::ptr piRemainFrame) +s64 cellAtracDecode(vm::ptr pHandle, u32 pfOutAddr, vm::ptr puiSamples, vm::ptr puiFinishflag, vm::ptr piRemainFrame) { cellAtrac->Warning("cellAtracDecode(pHandle=0x%x, pfOutAddr=0x%x, puiSamples_addr=0x%x, puiFinishFlag_addr=0x%x, piRemainFrame_addr=0x%x)", pHandle.addr(), pfOutAddr, puiSamples.addr(), puiFinishflag.addr(), piRemainFrame.addr()); @@ -73,7 +73,7 @@ s32 cellAtracDecode(vm::ptr pHandle, u32 pfOutAddr, vm::ptr pHandle, vm::ptr ppucWritePointer, vm::ptr puiWritableByte, vm::ptr puiReadPosition) +s64 cellAtracGetStreamDataInfo(vm::ptr pHandle, vm::ptr ppucWritePointer, vm::ptr puiWritableByte, vm::ptr puiReadPosition) { cellAtrac->Warning("cellAtracGetStreamDataInfo(pHandle=0x%x, ppucWritePointer_addr=0x%x, puiWritableByte_addr=0x%x, puiReadPosition_addr=0x%x)", pHandle.addr(), ppucWritePointer.addr(), puiWritableByte.addr(), puiReadPosition.addr()); @@ -87,7 +87,7 @@ s32 cellAtracGetStreamDataInfo(vm::ptr pHandle, vm::ptr pp return CELL_OK; } -s32 cellAtracAddStreamData(vm::ptr pHandle, u32 uiAddByte) +s64 cellAtracAddStreamData(vm::ptr pHandle, u32 uiAddByte) { cellAtrac->Warning("cellAtracAddStreamData(pHandle=0x%x, uiAddByte=0x%x)", pHandle.addr(), uiAddByte); #ifdef PRX_DEBUG @@ -97,7 +97,7 @@ s32 cellAtracAddStreamData(vm::ptr pHandle, u32 uiAddByte) return CELL_OK; } -s32 cellAtracGetRemainFrame(vm::ptr pHandle, vm::ptr piRemainFrame) +s64 cellAtracGetRemainFrame(vm::ptr pHandle, vm::ptr piRemainFrame) { cellAtrac->Warning("cellAtracGetRemainFrame(pHandle=0x%x, piRemainFrame_addr=0x%x)", pHandle.addr(), piRemainFrame.addr()); #ifdef PRX_DEBUG @@ -108,7 +108,7 @@ s32 cellAtracGetRemainFrame(vm::ptr pHandle, vm::ptr piRem return CELL_OK; } -s32 cellAtracGetVacantSize(vm::ptr pHandle, vm::ptr puiVacantSize) +s64 cellAtracGetVacantSize(vm::ptr pHandle, vm::ptr puiVacantSize) { cellAtrac->Warning("cellAtracGetVacantSize(pHandle=0x%x, puiVacantSize_addr=0x%x)", pHandle.addr(), puiVacantSize.addr()); #ifdef PRX_DEBUG @@ -119,7 +119,7 @@ s32 cellAtracGetVacantSize(vm::ptr pHandle, vm::ptr puiVac return CELL_OK; } -s32 cellAtracIsSecondBufferNeeded(vm::ptr pHandle) +s64 cellAtracIsSecondBufferNeeded(vm::ptr pHandle) { cellAtrac->Warning("cellAtracIsSecondBufferNeeded(pHandle=0x%x)", pHandle.addr()); #ifdef PRX_DEBUG @@ -129,7 +129,7 @@ s32 cellAtracIsSecondBufferNeeded(vm::ptr pHandle) return CELL_OK; } -s32 cellAtracGetSecondBufferInfo(vm::ptr pHandle, vm::ptr puiReadPosition, vm::ptr puiDataByte) +s64 cellAtracGetSecondBufferInfo(vm::ptr pHandle, vm::ptr puiReadPosition, vm::ptr puiDataByte) { cellAtrac->Warning("cellAtracGetSecondBufferInfo(pHandle=0x%x, puiReadPosition_addr=0x%x, puiDataByte_addr=0x%x)", pHandle.addr(), puiReadPosition.addr(), puiDataByte.addr()); @@ -142,7 +142,7 @@ s32 cellAtracGetSecondBufferInfo(vm::ptr pHandle, vm::ptr return CELL_OK; } -s32 cellAtracSetSecondBuffer(vm::ptr pHandle, u32 pucSecondBufferAddr, u32 uiSecondBufferByte) +s64 cellAtracSetSecondBuffer(vm::ptr pHandle, u32 pucSecondBufferAddr, u32 uiSecondBufferByte) { cellAtrac->Warning("cellAtracSetSecondBuffer(pHandle=0x%x, pucSecondBufferAddr=0x%x, uiSecondBufferByte=0x%x)", pHandle.addr(), pucSecondBufferAddr, uiSecondBufferByte); @@ -153,7 +153,7 @@ s32 cellAtracSetSecondBuffer(vm::ptr pHandle, u32 pucSecondBuff return CELL_OK; } -s32 cellAtracGetChannel(vm::ptr pHandle, vm::ptr puiChannel) +s64 cellAtracGetChannel(vm::ptr pHandle, vm::ptr puiChannel) { cellAtrac->Warning("cellAtracGetChannel(pHandle=0x%x, puiChannel_addr=0x%x)", pHandle.addr(), puiChannel.addr()); #ifdef PRX_DEBUG @@ -164,7 +164,7 @@ s32 cellAtracGetChannel(vm::ptr pHandle, vm::ptr puiChanne return CELL_OK; } -s32 cellAtracGetMaxSample(vm::ptr pHandle, vm::ptr puiMaxSample) +s64 cellAtracGetMaxSample(vm::ptr pHandle, vm::ptr puiMaxSample) { cellAtrac->Warning("cellAtracGetMaxSample(pHandle=0x%x, puiMaxSample_addr=0x%x)", pHandle.addr(), puiMaxSample.addr()); #ifdef PRX_DEBUG @@ -175,7 +175,7 @@ s32 cellAtracGetMaxSample(vm::ptr pHandle, vm::ptr puiMaxS return CELL_OK; } -s32 cellAtracGetNextSample(vm::ptr pHandle, vm::ptr puiNextSample) +s64 cellAtracGetNextSample(vm::ptr pHandle, vm::ptr puiNextSample) { cellAtrac->Warning("cellAtracGetNextSample(pHandle=0x%x, puiNextSample_addr=0x%x)", pHandle.addr(), puiNextSample.addr()); #ifdef PRX_DEBUG @@ -186,7 +186,7 @@ s32 cellAtracGetNextSample(vm::ptr pHandle, vm::ptr puiNex return CELL_OK; } -s32 cellAtracGetSoundInfo(vm::ptr pHandle, vm::ptr piEndSample, vm::ptr piLoopStartSample, vm::ptr piLoopEndSample) +s64 cellAtracGetSoundInfo(vm::ptr pHandle, vm::ptr piEndSample, vm::ptr piLoopStartSample, vm::ptr piLoopEndSample) { cellAtrac->Warning("cellAtracGetSoundInfo(pHandle=0x%x, piEndSample_addr=0x%x, piLoopStartSample_addr=0x%x, piLoopEndSample_addr=0x%x)", pHandle.addr(), piEndSample.addr(), piLoopStartSample.addr(), piLoopEndSample.addr()); @@ -200,7 +200,7 @@ s32 cellAtracGetSoundInfo(vm::ptr pHandle, vm::ptr piEndSa return CELL_OK; } -s32 cellAtracGetNextDecodePosition(vm::ptr pHandle, vm::ptr puiSamplePosition) +s64 cellAtracGetNextDecodePosition(vm::ptr pHandle, vm::ptr puiSamplePosition) { cellAtrac->Warning("cellAtracGetNextDecodePosition(pHandle=0x%x, puiSamplePosition_addr=0x%x)", pHandle.addr(), puiSamplePosition.addr()); @@ -212,7 +212,7 @@ s32 cellAtracGetNextDecodePosition(vm::ptr pHandle, vm::ptr pHandle, vm::ptr puiBitrate) +s64 cellAtracGetBitrate(vm::ptr pHandle, vm::ptr puiBitrate) { cellAtrac->Warning("cellAtracGetBitrate(pHandle=0x%x, puiBitrate_addr=0x%x)", pHandle.addr(), puiBitrate.addr()); @@ -224,7 +224,7 @@ s32 cellAtracGetBitrate(vm::ptr pHandle, vm::ptr puiBitrat return CELL_OK; } -s32 cellAtracGetLoopInfo(vm::ptr pHandle, vm::ptr piLoopNum, vm::ptr puiLoopStatus) +s64 cellAtracGetLoopInfo(vm::ptr pHandle, vm::ptr piLoopNum, vm::ptr puiLoopStatus) { cellAtrac->Warning("cellAtracGetLoopInfo(pHandle=0x%x, piLoopNum_addr=0x%x, puiLoopStatus_addr=0x%x)", pHandle.addr(), piLoopNum.addr(), puiLoopStatus.addr()); @@ -237,7 +237,7 @@ s32 cellAtracGetLoopInfo(vm::ptr pHandle, vm::ptr piLoopNu return CELL_OK; } -s32 cellAtracSetLoopNum(vm::ptr pHandle, int iLoopNum) +s64 cellAtracSetLoopNum(vm::ptr pHandle, int iLoopNum) { cellAtrac->Warning("cellAtracSetLoopNum(pHandle=0x%x, iLoopNum=0x%x)", pHandle.addr(), iLoopNum); #ifdef PRX_DEBUG @@ -247,7 +247,7 @@ s32 cellAtracSetLoopNum(vm::ptr pHandle, int iLoopNum) return CELL_OK; } -s32 cellAtracGetBufferInfoForResetting(vm::ptr pHandle, u32 uiSample, vm::ptr pBufferInfo) +s64 cellAtracGetBufferInfoForResetting(vm::ptr pHandle, u32 uiSample, vm::ptr pBufferInfo) { cellAtrac->Warning("cellAtracGetBufferInfoForResetting(pHandle=0x%x, uiSample=0x%x, pBufferInfo_addr=0x%x)", pHandle.addr(), uiSample, pBufferInfo.addr()); @@ -262,7 +262,7 @@ s32 cellAtracGetBufferInfoForResetting(vm::ptr pHandle, u32 uiS return CELL_OK; } -s32 cellAtracResetPlayPosition(vm::ptr pHandle, u32 uiSample, u32 uiWriteByte) +s64 cellAtracResetPlayPosition(vm::ptr pHandle, u32 uiSample, u32 uiWriteByte) { cellAtrac->Warning("cellAtracResetPlayPosition(pHandle=0x%x, uiSample=0x%x, uiWriteByte=0x%x)", pHandle.addr(), uiSample, uiWriteByte); @@ -273,7 +273,7 @@ s32 cellAtracResetPlayPosition(vm::ptr pHandle, u32 uiSample, u return CELL_OK; } -s32 cellAtracGetInternalErrorInfo(vm::ptr pHandle, vm::ptr piResult) +s64 cellAtracGetInternalErrorInfo(vm::ptr pHandle, vm::ptr piResult) { cellAtrac->Warning("cellAtracGetInternalErrorInfo(pHandle=0x%x, piResult_addr=0x%x)", pHandle.addr(), piResult.addr()); @@ -323,6 +323,8 @@ void cellAtrac_init(Module *pxThis) #ifdef PRX_DEBUG CallAfter([]() { + if (!Memory.MainMem.GetStartAddr()) return; + libatrac3plus = (u32)Memory.MainMem.AllocAlign(sizeof(libatrac3plus_data), 0x100000); memcpy(vm::get_ptr(libatrac3plus), libatrac3plus_data, sizeof(libatrac3plus_data)); libatrac3plus_rtoc = libatrac3plus + 0xBED0; diff --git a/rpcs3/Emu/SysCalls/Modules/cellPngDec.cpp b/rpcs3/Emu/SysCalls/Modules/cellPngDec.cpp index fbace88771..05e88cd71e 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellPngDec.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellPngDec.cpp @@ -16,7 +16,7 @@ u32 libpngdec; u32 libpngdec_rtoc; #endif -s32 pngDecCreate( +s64 pngDecCreate( vm::ptr mainHandle, vm::ptr param, vm::ptr ext = vm::ptr::make(0)) @@ -45,7 +45,7 @@ s32 pngDecCreate( return CELL_OK; } -s32 pngDecDestroy(CellPngDecMainHandle dec) +s64 pngDecDestroy(CellPngDecMainHandle dec) { if (!Memory.Free(dec.addr())) { @@ -55,7 +55,7 @@ s32 pngDecDestroy(CellPngDecMainHandle dec) return CELL_OK; } -s32 pngDecOpen( +s64 pngDecOpen( CellPngDecMainHandle dec, vm::ptr subHandle, vm::ptr src, @@ -115,7 +115,7 @@ s32 pngDecOpen( return CELL_OK; } -s32 pngDecClose(CellPngDecSubHandle stream) +s64 pngDecClose(CellPngDecSubHandle stream) { cellFsClose(stream->fd); if (!Memory.Free(stream.addr())) @@ -126,7 +126,7 @@ s32 pngDecClose(CellPngDecSubHandle stream) return CELL_OK; } -s32 pngReadHeader( +s64 pngReadHeader( CellPngDecSubHandle stream, vm::ptr info, vm::ptr extInfo = vm::ptr::make(0)) @@ -189,7 +189,7 @@ s32 pngReadHeader( return CELL_OK; } -s32 pngDecSetParameter( +s64 pngDecSetParameter( CellPngDecSubHandle stream, vm::ptr inParam, vm::ptr outParam, @@ -230,7 +230,7 @@ s32 pngDecSetParameter( return CELL_OK; } -s32 pngDecodeData( +s64 pngDecodeData( CellPngDecSubHandle stream, vm::ptr data, vm::ptr dataCtrlParam, @@ -359,7 +359,7 @@ s32 pngDecodeData( return CELL_OK; } -s32 cellPngDecCreate(vm::ptr mainHandle, vm::ptr threadInParam, vm::ptr threadOutParam) +s64 cellPngDecCreate(vm::ptr mainHandle, vm::ptr threadInParam, vm::ptr threadOutParam) { #ifdef PRX_DEBUG cellPngDec->Warning("%s()", __FUNCTION__); @@ -379,7 +379,7 @@ s32 cellPngDecCreate(vm::ptr mainHandle, vm::ptr mainHandle, vm::ptr threadInParam, vm::ptr threadOutParam, @@ -405,7 +405,7 @@ s32 cellPngDecExtCreate( #endif } -s32 cellPngDecDestroy(CellPngDecMainHandle mainHandle) +s64 cellPngDecDestroy(CellPngDecMainHandle mainHandle) { #ifdef PRX_DEBUG cellPngDec->Warning("%s()", __FUNCTION__); @@ -418,7 +418,7 @@ s32 cellPngDecDestroy(CellPngDecMainHandle mainHandle) #endif } -s32 cellPngDecOpen( +s64 cellPngDecOpen( CellPngDecMainHandle mainHandle, vm::ptr subHandle, vm::ptr src, @@ -436,7 +436,7 @@ s32 cellPngDecOpen( #endif } -s32 cellPngDecExtOpen( +s64 cellPngDecExtOpen( CellPngDecMainHandle mainHandle, vm::ptr subHandle, vm::ptr src, @@ -456,7 +456,7 @@ s32 cellPngDecExtOpen( #endif } -s32 cellPngDecClose(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle) +s64 cellPngDecClose(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle) { #ifdef PRX_DEBUG cellPngDec->Warning("%s()", __FUNCTION__); @@ -468,7 +468,7 @@ s32 cellPngDecClose(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHand #endif } -s32 cellPngDecReadHeader(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr info) +s64 cellPngDecReadHeader(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr info) { #ifdef PRX_DEBUG cellPngDec->Warning("%s()", __FUNCTION__); @@ -481,7 +481,7 @@ s32 cellPngDecReadHeader(CellPngDecMainHandle mainHandle, CellPngDecSubHandle su #endif } -s32 cellPngDecExtReadHeader( +s64 cellPngDecExtReadHeader( CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr info, @@ -498,7 +498,7 @@ s32 cellPngDecExtReadHeader( #endif } -s32 cellPngDecSetParameter( +s64 cellPngDecSetParameter( CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr inParam, @@ -515,7 +515,7 @@ s32 cellPngDecSetParameter( #endif } -s32 cellPngDecExtSetParameter( +s64 cellPngDecExtSetParameter( CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr inParam, @@ -534,7 +534,7 @@ s32 cellPngDecExtSetParameter( #endif } -s32 cellPngDecDecodeData( +s64 cellPngDecDecodeData( CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr data, @@ -552,7 +552,7 @@ s32 cellPngDecDecodeData( #endif } -s32 cellPngDecExtDecodeData( +s64 cellPngDecExtDecodeData( CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr data, @@ -572,7 +572,7 @@ s32 cellPngDecExtDecodeData( #endif } -s32 cellPngDecGetUnknownChunks( +s64 cellPngDecGetUnknownChunks( CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr> unknownChunk, @@ -587,7 +587,7 @@ s32 cellPngDecGetUnknownChunks( #endif } -s32 cellPngDecGetpCAL(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr pcal) +s64 cellPngDecGetpCAL(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr pcal) { #ifdef PRX_DEBUG cellPngDec->Warning("%s()", __FUNCTION__); @@ -598,7 +598,7 @@ s32 cellPngDecGetpCAL(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHa #endif } -s32 cellPngDecGetcHRM(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr chrm) +s64 cellPngDecGetcHRM(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr chrm) { #ifdef PRX_DEBUG cellPngDec->Warning("%s()", __FUNCTION__); @@ -609,7 +609,7 @@ s32 cellPngDecGetcHRM(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHa #endif } -s32 cellPngDecGetsCAL(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr scal) +s64 cellPngDecGetsCAL(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr scal) { #ifdef PRX_DEBUG cellPngDec->Warning("%s()", __FUNCTION__); @@ -620,7 +620,7 @@ s32 cellPngDecGetsCAL(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHa #endif } -s32 cellPngDecGetpHYs(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr phys) +s64 cellPngDecGetpHYs(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr phys) { #ifdef PRX_DEBUG cellPngDec->Warning("%s()", __FUNCTION__); @@ -631,7 +631,7 @@ s32 cellPngDecGetpHYs(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHa #endif } -s32 cellPngDecGetoFFs(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr offs) +s64 cellPngDecGetoFFs(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr offs) { #ifdef PRX_DEBUG cellPngDec->Warning("%s()", __FUNCTION__); @@ -642,7 +642,7 @@ s32 cellPngDecGetoFFs(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHa #endif } -s32 cellPngDecGetsPLT(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr splt) +s64 cellPngDecGetsPLT(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr splt) { #ifdef PRX_DEBUG cellPngDec->Warning("%s()", __FUNCTION__); @@ -653,7 +653,7 @@ s32 cellPngDecGetsPLT(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHa #endif } -s32 cellPngDecGetbKGD(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr bkgd) +s64 cellPngDecGetbKGD(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr bkgd) { #ifdef PRX_DEBUG cellPngDec->Warning("%s()", __FUNCTION__); @@ -664,7 +664,7 @@ s32 cellPngDecGetbKGD(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHa #endif } -s32 cellPngDecGettIME(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr time) +s64 cellPngDecGettIME(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr time) { #ifdef PRX_DEBUG cellPngDec->Warning("%s()", __FUNCTION__); @@ -675,7 +675,7 @@ s32 cellPngDecGettIME(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHa #endif } -s32 cellPngDecGethIST(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr hist) +s64 cellPngDecGethIST(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr hist) { #ifdef PRX_DEBUG cellPngDec->Warning("%s()", __FUNCTION__); @@ -686,7 +686,7 @@ s32 cellPngDecGethIST(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHa #endif } -s32 cellPngDecGettRNS(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr trns) +s64 cellPngDecGettRNS(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr trns) { #ifdef PRX_DEBUG cellPngDec->Warning("%s()", __FUNCTION__); @@ -697,7 +697,7 @@ s32 cellPngDecGettRNS(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHa #endif } -s32 cellPngDecGetsBIT(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr sbit) +s64 cellPngDecGetsBIT(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr sbit) { #ifdef PRX_DEBUG cellPngDec->Warning("%s()", __FUNCTION__); @@ -708,7 +708,7 @@ s32 cellPngDecGetsBIT(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHa #endif } -s32 cellPngDecGetiCCP(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr iccp) +s64 cellPngDecGetiCCP(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr iccp) { #ifdef PRX_DEBUG cellPngDec->Warning("%s()", __FUNCTION__); @@ -719,7 +719,7 @@ s32 cellPngDecGetiCCP(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHa #endif } -s32 cellPngDecGetsRGB(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr srgb) +s64 cellPngDecGetsRGB(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr srgb) { #ifdef PRX_DEBUG cellPngDec->Warning("%s()", __FUNCTION__); @@ -730,7 +730,7 @@ s32 cellPngDecGetsRGB(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHa #endif } -s32 cellPngDecGetgAMA(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr gama) +s64 cellPngDecGetgAMA(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr gama) { #ifdef PRX_DEBUG cellPngDec->Warning("%s()", __FUNCTION__); @@ -741,7 +741,7 @@ s32 cellPngDecGetgAMA(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHa #endif } -s32 cellPngDecGetPLTE(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr plte) +s64 cellPngDecGetPLTE(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr plte) { #ifdef PRX_DEBUG cellPngDec->Warning("%s()", __FUNCTION__); @@ -752,7 +752,7 @@ s32 cellPngDecGetPLTE(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHa #endif } -s32 cellPngDecGetTextChunk( +s64 cellPngDecGetTextChunk( CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr textInfoNum, @@ -804,6 +804,8 @@ void cellPngDec_init(Module *pxThis) #ifdef PRX_DEBUG CallAfter([]() { + if (!Memory.MainMem.GetStartAddr()) return; + libpngdec = (u32)Memory.MainMem.AllocAlign(sizeof(libpngdec_data), 0x100000); memcpy(vm::get_ptr(libpngdec), libpngdec_data, sizeof(libpngdec_data)); libpngdec_rtoc = libpngdec + 0x49710; diff --git a/rpcs3/Emu/SysCalls/Modules/cellPngDec.h b/rpcs3/Emu/SysCalls/Modules/cellPngDec.h index 6bb2d021a4..e0a5473584 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellPngDec.h +++ b/rpcs3/Emu/SysCalls/Modules/cellPngDec.h @@ -183,77 +183,77 @@ struct CellPngDecDataOutInfo }; // Functions -s32 cellPngDecCreate(vm::ptr mainHandle, vm::ptr threadInParam, vm::ptr threadOutParam); +s64 cellPngDecCreate(vm::ptr mainHandle, vm::ptr threadInParam, vm::ptr threadOutParam); -s32 cellPngDecExtCreate( +s64 cellPngDecExtCreate( vm::ptr mainHandle, vm::ptr threadInParam, vm::ptr threadOutParam, vm::ptr extThreadInParam, vm::ptr extThreadOutParam); -s32 cellPngDecOpen( +s64 cellPngDecOpen( CellPngDecMainHandle mainHandle, vm::ptr subHandle, vm::ptr src, vm::ptr openInfo); -s32 cellPngDecReadHeader(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr info); +s64 cellPngDecReadHeader(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr info); -s32 cellPngDecSetParameter( +s64 cellPngDecSetParameter( CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr inParam, vm::ptr outParam); -s32 cellPngDecDecodeData( +s64 cellPngDecDecodeData( CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr data, vm::ptr dataCtrlParam, vm::ptr dataOutInfo); -s32 cellPngDecClose(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle); +s64 cellPngDecClose(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle); -s32 cellPngDecDestroy(CellPngDecMainHandle mainHandle); +s64 cellPngDecDestroy(CellPngDecMainHandle mainHandle); -s32 cellPngDecGetTextChunk( +s64 cellPngDecGetTextChunk( CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr textInfoNum, vm::ptr> textInfo); -s32 cellPngDecGetPLTE(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr plte); +s64 cellPngDecGetPLTE(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr plte); -s32 cellPngDecGetgAMA(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr gama); +s64 cellPngDecGetgAMA(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr gama); -s32 cellPngDecGetsRGB(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr srgb); +s64 cellPngDecGetsRGB(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr srgb); -s32 cellPngDecGetiCCP(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr iccp); +s64 cellPngDecGetiCCP(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr iccp); -s32 cellPngDecGetsBIT(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr sbit); +s64 cellPngDecGetsBIT(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr sbit); -s32 cellPngDecGettRNS(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr trns); +s64 cellPngDecGettRNS(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr trns); -s32 cellPngDecGethIST(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr hist); +s64 cellPngDecGethIST(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr hist); -s32 cellPngDecGettIME(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr time); +s64 cellPngDecGettIME(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr time); -s32 cellPngDecGetbKGD(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr bkgd); +s64 cellPngDecGetbKGD(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr bkgd); -s32 cellPngDecGetsPLT(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr splt); +s64 cellPngDecGetsPLT(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr splt); -s32 cellPngDecGetoFFs(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr offs); +s64 cellPngDecGetoFFs(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr offs); -s32 cellPngDecGetpHYs(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr phys); +s64 cellPngDecGetpHYs(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr phys); -s32 cellPngDecGetsCAL(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr scal); +s64 cellPngDecGetsCAL(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr scal); -s32 cellPngDecGetcHRM(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr chrm); +s64 cellPngDecGetcHRM(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr chrm); -s32 cellPngDecGetpCAL(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr pcal); +s64 cellPngDecGetpCAL(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr pcal); -s32 cellPngDecGetUnknownChunks( +s64 cellPngDecGetUnknownChunks( CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr> unknownChunk, @@ -349,7 +349,7 @@ struct CellPngDecCbCtrlDisp }; // Functions -s32 cellPngDecExtOpen( +s64 cellPngDecExtOpen( CellPngDecMainHandle mainHandle, vm::ptr subHandle, vm::ptr src, @@ -357,13 +357,13 @@ s32 cellPngDecExtOpen( vm::ptr cbCtrlStrm, vm::ptr opnParam); -s32 cellPngDecExtReadHeader( +s64 cellPngDecExtReadHeader( CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr info, vm::ptr extInfo); -s32 cellPngDecExtSetParameter( +s64 cellPngDecExtSetParameter( CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr inParam, @@ -371,7 +371,7 @@ s32 cellPngDecExtSetParameter( vm::ptr extInParam, vm::ptr extOutParam); -s32 cellPngDecExtDecodeData( +s64 cellPngDecExtDecodeData( CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr data, diff --git a/rpcs3/Emu/SysCalls/Modules/cellSpurs.cpp b/rpcs3/Emu/SysCalls/Modules/cellSpurs.cpp index ae7565535c..9a293f5476 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellSpurs.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellSpurs.cpp @@ -557,9 +557,9 @@ s64 spursInit( { if (spurs->m.wklReadyCount[i].read_relaxed() || spurs->m.wklSet1.read_relaxed() & (0x8000u >> i) || - spurs->m.wklFlag.flag.read_relaxed() == 0 && + (spurs->m.wklFlag.flag.read_relaxed() == 0 && spurs->m.flagRecv.read_relaxed() == (u8)i - ) + )) { do_break = true; break; @@ -575,9 +575,9 @@ s64 spursInit( { if (spurs->m.wklReadyCount[i + 0x10].read_relaxed() || spurs->m.wklSet2.read_relaxed() & (0x8000u >> i) || - spurs->m.wklFlag.flag.read_relaxed() == 0 && + (spurs->m.wklFlag.flag.read_relaxed() == 0 && spurs->m.flagRecv.read_relaxed() == (u8)i + 0x10 - ) + )) { do_break = true; break; @@ -953,11 +953,26 @@ s64 cellSpursAttributeEnableSystemWorkload(vm::ptr attr, vm: s64 cellSpursFinalize(vm::ptr spurs) { - cellSpurs->Todo("cellSpursFinalize(spurs_addr=0x%x)", spurs.addr()); -#ifdef PRX_DEBUG + cellSpurs->Warning("cellSpursFinalize(spurs_addr=0x%x)", spurs.addr()); +#ifdef PRX_DEBUG_XXX return GetCurrentPPUThread().FastCall2(libsre + 0x8568, libsre_rtoc); #endif + if (!spurs) + { + return CELL_SPURS_CORE_ERROR_NULL_POINTER; + } + if (spurs.addr() % 128) + { + return CELL_SPURS_CORE_ERROR_ALIGN; + } + if (spurs->m.xD66.read_relaxed()) + { + return CELL_SPURS_CORE_ERROR_STAT; + } + + + return CELL_OK; } @@ -1360,13 +1375,7 @@ s32 spursAddWorkload( spurs->m.wklSet2._and_not({ be_t::make(0x8000 >> index) }); // clear bit in wklFlag2 } - spurs->m.flagRecv.atomic_op([wnum](u8& FR) - { - if (FR == wnum) - { - FR = 0xff; - } - }); + spurs->m.flagRecv.compare_and_swap(wnum, 0xff); u32 res_wkl; CellSpurs::_sub_str3& wkl = wnum <= 15 ? spurs->m.wklG1[wnum] : spurs->m.wklG2[wnum & 0xf]; diff --git a/rpcs3/Emu/SysCalls/Modules/cellSpursJq.cpp b/rpcs3/Emu/SysCalls/Modules/cellSpursJq.cpp index ed4c73b9be..c1ad643060 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellSpursJq.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellSpursJq.cpp @@ -766,6 +766,8 @@ void cellSpursJq_init(Module *pxThis) #ifdef PRX_DEBUG CallAfter([]() { + if (!Memory.MainMem.GetStartAddr()) return; + libspurs_jq = (u32)Memory.MainMem.AllocAlign(sizeof(libspurs_jq_data), 0x100000); memcpy(vm::get_ptr(libspurs_jq), libspurs_jq_data, sizeof(libspurs_jq_data)); libspurs_jq_rtoc = libspurs_jq + 0x17E80; diff --git a/rpcs3/Emu/SysCalls/Modules/cellSync.cpp b/rpcs3/Emu/SysCalls/Modules/cellSync.cpp index 32cb8b42b4..e77004872a 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellSync.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellSync.cpp @@ -1989,6 +1989,8 @@ void cellSync_init(Module *pxThis) #ifdef PRX_DEBUG CallAfter([]() { + if (!Memory.MainMem.GetStartAddr()) return; + libsre = (u32)Memory.MainMem.AllocAlign(sizeof(libsre_data), 0x100000); memcpy(vm::get_ptr(libsre), libsre_data, sizeof(libsre_data)); libsre_rtoc = libsre + 0x399B0; diff --git a/rpcs3/Emu/SysCalls/Modules/cellSync2.cpp b/rpcs3/Emu/SysCalls/Modules/cellSync2.cpp index 7359814b89..fb39449614 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellSync2.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellSync2.cpp @@ -458,6 +458,8 @@ void cellSync2_init(Module *pxThis) #ifdef PRX_DEBUG CallAfter([]() { + if (!Memory.MainMem.GetStartAddr()) return; + libsync2 = (u32)Memory.MainMem.AllocAlign(sizeof(libsync2_data), 0x100000); memcpy(vm::get_ptr(libsync2), libsync2_data, sizeof(libsync2_data)); libsync2_rtoc = libsync2 + 0xF280; diff --git a/rpcs3/Emu/SysCalls/SC_FUNC.h b/rpcs3/Emu/SysCalls/SC_FUNC.h index 28c4ef0582..111c4333b2 100644 --- a/rpcs3/Emu/SysCalls/SC_FUNC.h +++ b/rpcs3/Emu/SysCalls/SC_FUNC.h @@ -249,4 +249,4 @@ template func_caller* bind_func(RT(*call)(T...)) { return new detail::func_binder(call); -} \ No newline at end of file +} diff --git a/rpcs3/Loader/ELF32.cpp b/rpcs3/Loader/ELF32.cpp index 430ae52f32..d7765e5e32 100644 --- a/rpcs3/Loader/ELF32.cpp +++ b/rpcs3/Loader/ELF32.cpp @@ -3,8 +3,11 @@ #include "Utilities/rFile.h" #include "Emu/FS/vfsStream.h" #include "Emu/Memory/Memory.h" +#include "Emu/ARMv7/PSVFuncList.h" #include "ELF32.h" +#define LOADER_DEBUG + void Elf32_Ehdr::Show() { #ifdef LOADER_DEBUG @@ -502,6 +505,8 @@ bool ELF32Loader::LoadPhdrData(u64 _offset) bool ELF32Loader::LoadShdrData(u64 offset) { + u32 fnid_addr = 0; + for(u32 i=0; i::make(fnid_addr); + auto fstub = vm::psv::ptr::make(shdr.sh_addr); + + for (u32 j = 0; j < shdr.sh_size / 4; j++) + { + u32 nid = fnid[j]; + u32 addr = fstub[j]; + + if (auto func = get_psv_func_by_nid(nid)) + { + LOG_NOTICE(LOADER, "Imported function 0x%x (addr=0x%x)", nid, addr); + + // writing Thumb code (temporarily, because it should be ARM) + vm::psv::write16(addr + 0, 0xf870); // HACK (special instruction that calls HLE function + vm::psv::write16(addr + 2, (u16)get_psv_func_index(func)); + vm::psv::write16(addr + 4, 0x4770); // BX LR + vm::psv::write16(addr + 6, 0); // null + } + else + { + LOG_ERROR(LOADER, "Unimplemented function 0x%x (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 + vm::psv::write16(addr + 2, 0x0000); + vm::psv::write16(addr + 4, 0x4770); // BX LR + vm::psv::write16(addr + 6, 0); // null + } + } + } + else if (machine == MACHINE_ARM && !strcmp(shdr_name_arr[i].c_str(), ".sceRefs.rodata")) + { + // basically unknown struct + + struct reloc_info + { + u32 code; // 0xff + u32 data; // address that will be written + u32 code1; // 0x2f + u32 addr1; // address of movw r12,# instruction to be replaced + u32 code2; // 0x30 + u32 addr2; // address of movt r12,# instruction to be replaced + u32 code3; // 0 + }; + + auto rel = vm::psv::ptr::make(shdr.sh_addr); + + for (u32 j = 0; j < shdr.sh_size / sizeof(reloc_info); j++) + { + if (rel[j].code == 0xff && rel[j].code1 == 0x2f && rel[j].code2 == 0x30 && rel[j].code3 == 0) + { + const u32 data = rel[j].data; + vm::psv::write16(rel[j].addr1 + 0, 0xf240 | (data & 0x800) >> 1 | (data & 0xf000) >> 12); // MOVW + vm::psv::write16(rel[j].addr1 + 2, 0x0c00 | (data & 0x700) << 4 | (data & 0xff)); + vm::psv::write16(rel[j].addr2 + 0, 0xf2c0 | (data & 0x8000000) >> 17 | (data & 0xf0000000) >> 28); // MOVT + vm::psv::write16(rel[j].addr2 + 2, 0x0c00 | (data & 0x7000000) >> 12 | (data & 0xff0000) >> 16); + } + else + { + LOG_ERROR(LOADER, "sceRefs: unknown code found (code=0x%x, code1=0x%x, code2=0x%x, code3=0x%x)", rel[j].code, rel[j].code1, rel[j].code2, rel[j].code3); + } + } + } } //TODO diff --git a/rpcs3/emucore.vcxproj b/rpcs3/emucore.vcxproj index 158775bfe8..bef91f680b 100644 --- a/rpcs3/emucore.vcxproj +++ b/rpcs3/emucore.vcxproj @@ -57,6 +57,8 @@ + + @@ -264,6 +266,7 @@ + diff --git a/rpcs3/emucore.vcxproj.filters b/rpcs3/emucore.vcxproj.filters index e82a2cae4a..0b23ec7b36 100644 --- a/rpcs3/emucore.vcxproj.filters +++ b/rpcs3/emucore.vcxproj.filters @@ -75,6 +75,9 @@ {ead7494f-a872-4b4d-a864-1a61c3b6012f} + + {1d9e6fc4-9a79-4329-a8b5-081e24822aaa} + @@ -638,6 +641,12 @@ Emu\ARMv7 + + Emu\ARMv7 + + + Emu\ARMv7\Modules + @@ -1249,5 +1258,8 @@ Emu\Cell + + Emu\ARMv7 + \ No newline at end of file From 61e6d8af96e6d1979b9f32b95fcc6b719d69bc50 Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Sun, 2 Nov 2014 02:45:07 +0300 Subject: [PATCH 15/27] Compilation fix --- rpcs3/Emu/ARMv7/ARMv7Interpreter.cpp | 2 +- rpcs3/Emu/ARMv7/Modules/sceLibc.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/ARMv7/ARMv7Interpreter.cpp b/rpcs3/Emu/ARMv7/ARMv7Interpreter.cpp index b977d8006f..0ecf629c45 100644 --- a/rpcs3/Emu/ARMv7/ARMv7Interpreter.cpp +++ b/rpcs3/Emu/ARMv7/ARMv7Interpreter.cpp @@ -369,7 +369,7 @@ void ARMv7Interpreter::BLX(const u32 data, const ARMv7_encoding type) case T1: { target = CPU.read_gpr((data >> 3) & 0xf); - newLR = ((CPU.PC + 2) - 2) | 1; // ??? + newLR = (CPU.PC + 2) | 1; // ??? break; } case T2: diff --git a/rpcs3/Emu/ARMv7/Modules/sceLibc.cpp b/rpcs3/Emu/ARMv7/Modules/sceLibc.cpp index ac4bbaa532..1bab6cfd4b 100644 --- a/rpcs3/Emu/ARMv7/Modules/sceLibc.cpp +++ b/rpcs3/Emu/ARMv7/Modules/sceLibc.cpp @@ -26,7 +26,7 @@ namespace sce_libc_func } } -psv_log_base sceLibc = []() -> psv_log_base& +psv_log_base sceLibc = []() { psv_log_base* module = new psv_log_base("sceLibc"); From ddbd590bef419fd0957c7ce48ddbdea05f0e0662 Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Sun, 2 Nov 2014 03:28:53 +0300 Subject: [PATCH 16/27] Small fix --- rpcs3/Emu/ARMv7/Modules/sceLibc.cpp | 293 +++++++++++++++++++++++++++- rpcs3/Emu/ARMv7/PSVFuncList.cpp | 2 +- rpcs3/Emu/ARMv7/PSVFuncList.h | 4 +- 3 files changed, 294 insertions(+), 5 deletions(-) diff --git a/rpcs3/Emu/ARMv7/Modules/sceLibc.cpp b/rpcs3/Emu/ARMv7/Modules/sceLibc.cpp index 1bab6cfd4b..2f1f25617d 100644 --- a/rpcs3/Emu/ARMv7/Modules/sceLibc.cpp +++ b/rpcs3/Emu/ARMv7/Modules/sceLibc.cpp @@ -1,7 +1,7 @@ #include "stdafx.h" #include "Emu/ARMv7/PSVFuncList.h" -extern psv_log_base sceLibc; +extern psv_log_base& sceLibc; namespace sce_libc_func { @@ -26,7 +26,7 @@ namespace sce_libc_func } } -psv_log_base sceLibc = []() +psv_log_base& sceLibc = []() { psv_log_base* module = new psv_log_base("sceLibc"); @@ -37,5 +37,294 @@ psv_log_base sceLibc = []() REG_FUNC(0x9a004680, printf); REG_FUNC(0xbfe02b3a, __cxa_set_dso_handle_main); + //REG_FUNC(0xE4531F85, _Assert); + //REG_FUNC(0xE71C5CDE, _Stoul); + //REG_FUNC(0x7A5CA6A3, _Stoulx); + //REG_FUNC(0x6794B3C6, _Stoull); + //REG_FUNC(0xD00F68FD, _Stoullx); + //REG_FUNC(0xBF94193B, _Stod); + //REG_FUNC(0x6798AA28, _Stodx); + //REG_FUNC(0x784D8D95, _Stof); + //REG_FUNC(0x99A49A62, _Stofx); + //REG_FUNC(0x5AE9FFD8, _Stold); + //REG_FUNC(0x448A3CBE, _Stoldx); + //REG_FUNC(0x6B9E23FE, _Stoll); + //REG_FUNC(0x0D9E3B1C, _Stollx); + //REG_FUNC(0x52DDCDAF, _Stolx); + //REG_FUNC(0x76904D60, _Wctomb); + //REG_FUNC(0x5E56EA4E, _Mbtowc); + //REG_FUNC(0xDEC462AB, _FCbuild); + //REG_FUNC(0x9E248B76, _sceLibcErrnoLoc); + //REG_FUNC(0xA2F50E9E, _Fltrounds); + //REG_FUNC(0x7CC1B964, isalnum); + //REG_FUNC(0x94A89A00, isalpha); + //REG_FUNC(0xF894ECCB, isblank); + //REG_FUNC(0x13F4A8C8, iscntrl); + //REG_FUNC(0xEB93BC93, isdigit); + //REG_FUNC(0xDFEEFB1A, isgraph); + //REG_FUNC(0x465B93F1, islower); + //REG_FUNC(0xB7F87C4D, isprint); + //REG_FUNC(0x82C1E3FD, ispunct); + //REG_FUNC(0x18F2A715, isspace); + //REG_FUNC(0xF2012814, isupper); + //REG_FUNC(0x3B561695, isxdigit); + //REG_FUNC(0x83F73C88, tolower); + //REG_FUNC(0x1218642B, toupper); + //REG_FUNC(0x1118B49F, imaxabs); + //REG_FUNC(0x5766B4A8, imaxdiv); + //REG_FUNC(0xB45FD61E, strtoimax); + //REG_FUNC(0xB318952F, strtoumax); + //REG_FUNC(0x3F2D104F, wcstoimax); + //REG_FUNC(0xB9E511B4, wcstoumax); + //REG_FUNC(0xCEF7C575, mspace_create); + //REG_FUNC(0x30CBBC66, mspace_destroy); + //REG_FUNC(0xE080B96E, mspace_malloc); + //REG_FUNC(0x3CDFD2A3, mspace_free); + //REG_FUNC(0x30470BBA, mspace_calloc); + //REG_FUNC(0x52F780DD, mspace_memalign); + //REG_FUNC(0x4633134A, mspace_realloc); + //REG_FUNC(0x915DA59E, mspace_reallocalign); + //REG_FUNC(0x7AD7A737, mspace_malloc_usable_size); + //REG_FUNC(0x8D2A14C4, mspace_malloc_stats); + //REG_FUNC(0x2FF5D5BB, mspace_malloc_stats_fast); + //REG_FUNC(0xF355F381, mspace_is_heap_empty); + //REG_FUNC(0x50B326CE, setjmp); + //REG_FUNC(0x2D81C8C8, longjmp); + //REG_FUNC(0x72BA4468, clearerr); + //REG_FUNC(0xEC97321C, fclose); + //REG_FUNC(0xB2F318FE, fdopen); + //REG_FUNC(0xBF96AD71, feof); + //REG_FUNC(0xB724BFC1, ferror); + //REG_FUNC(0x5AAD2996, fflush); + //REG_FUNC(0x672C58E0, fgetc); + //REG_FUNC(0x3CDA3118, fgetpos); + //REG_FUNC(0xBA14322F, fgets); + //REG_FUNC(0xFEC1502E, fileno); + //REG_FUNC(0xFFFBE239, fopen); + //REG_FUNC(0xE0C79764, fprintf); + //REG_FUNC(0x7E6A6108, fputc); + //REG_FUNC(0xC8FF13E5, fputs); + //REG_FUNC(0xB31C73A9, fread); + //REG_FUNC(0x715C4395, freopen); + //REG_FUNC(0x505601C6, fscanf); + //REG_FUNC(0xC3A7CDE1, fseek); + //REG_FUNC(0xDC1BDBD7, fsetpos); + //REG_FUNC(0x41C2AF95, ftell); + //REG_FUNC(0x8BCDCC4E, fwrite); + //REG_FUNC(0x4BD5212E, getc); + //REG_FUNC(0x4790BF1E, getchar); + //REG_FUNC(0xF97B8CA3, gets); + //REG_FUNC(0x4696E7BE, perror); + //REG_FUNC(0x995708A6, putc); + //REG_FUNC(0x7CDAC89C, putchar); + //REG_FUNC(0x59C3E171, puts); + //REG_FUNC(0x40293B75, remove); + //REG_FUNC(0x6FE983A3, rename); + //REG_FUNC(0x6CA5BAB9, rewind); + //REG_FUNC(0x9CB9D899, scanf); + //REG_FUNC(0x395490DA, setbuf); + //REG_FUNC(0x2CA980A0, setvbuf); + //REG_FUNC(0xA1BFF606, snprintf); + //REG_FUNC(0x7449B359, sprintf); + //REG_FUNC(0xEC585241, sscanf); + //REG_FUNC(0x2BCB3F01, ungetc); + //REG_FUNC(0xF7915685, vfprintf); + //REG_FUNC(0xF137771A, vfscanf); + //REG_FUNC(0xE7B5E23E, vprintf); + //REG_FUNC(0x0E9BD318, vscanf); + //REG_FUNC(0xFE83F2E4, vsnprintf); + //REG_FUNC(0x802FDDF9, vsprintf); + //REG_FUNC(0xA9889307, vsscanf); + //REG_FUNC(0x20FE0FFF, abort); + //REG_FUNC(0x8E5A06C5, abs); + //REG_FUNC(0xD500DE27, atof); + //REG_FUNC(0x21493BE7, atoi); + //REG_FUNC(0xA1DBEE9F, atol); + //REG_FUNC(0x875994F3, atoll); + //REG_FUNC(0xD1BC28E7, bsearch); + //REG_FUNC(0xE9F823C0, div); + //REG_FUNC(0xB53B345B, _Exit); + //REG_FUNC(0xBCEA304B, labs); + //REG_FUNC(0x9D2D17CD, llabs); + //REG_FUNC(0xD63330DA, ldiv); + //REG_FUNC(0x3F887699, lldiv); + //REG_FUNC(0x3E347849, mblen); + //REG_FUNC(0x2F75CF9B, mbstowcs); + //REG_FUNC(0xD791A952, mbtowc); + //REG_FUNC(0xA7CBE4A6, qsort); + //REG_FUNC(0x6CA88B08, strtod); + //REG_FUNC(0x6CB8540E, strtof); + //REG_FUNC(0x181827ED, strtol); + //REG_FUNC(0x48C684B2, strtold); + //REG_FUNC(0x39B7E681, strtoll); + //REG_FUNC(0xF34AE312, strtoul); + //REG_FUNC(0xE0E12333, strtoull); + //REG_FUNC(0x9A8F7FC0, wcstombs); + //REG_FUNC(0x6489B5E4, wctomb); + //REG_FUNC(0xC0883865, rand); + //REG_FUNC(0x3AAD41B0, srand); + //REG_FUNC(0x962097AA, rand_r); + //REG_FUNC(0x775A0CB2, malloc); + //REG_FUNC(0xE7EC3D0B, calloc); + //REG_FUNC(0x006B54BA, realloc); + //REG_FUNC(0x5B9BB802, free); + //REG_FUNC(0xA9363E6B, memalign); + //REG_FUNC(0x608AC135, reallocalign); + //REG_FUNC(0x57A729DB, malloc_stats); + //REG_FUNC(0xB3D29DE1, malloc_stats_fast); + //REG_FUNC(0x54A54EB1, malloc_usable_size); + //REG_FUNC(0x2F3E5B16, memchr); + //REG_FUNC(0x7747F6D7, memcmp); + //REG_FUNC(0x7205BFDB, memcpy); + //REG_FUNC(0xAF5C218D, memmove); + //REG_FUNC(0x6DC1F0D8, memset); + //REG_FUNC(0x1434FA46, strcat); + //REG_FUNC(0xB9336E16, strchr); + //REG_FUNC(0x1B58FA3B, strcmp); + //REG_FUNC(0x46AE2311, strcoll); + //REG_FUNC(0x85B924B7, strcpy); + //REG_FUNC(0x0E29D27A, strcspn); + //REG_FUNC(0x1E9D6335, strerror); + //REG_FUNC(0x8AECC873, strlen); + //REG_FUNC(0xFBA69BC2, strncat); + //REG_FUNC(0xE4299DCB, strncmp); + //REG_FUNC(0x9F87712D, strncpy); + //REG_FUNC(0x68C307B6, strpbrk); + //REG_FUNC(0xCEFDD143, strrchr); + //REG_FUNC(0x4203B663, strspn); + //REG_FUNC(0x0D5200CB, strstr); + //REG_FUNC(0x0289B8B3, strtok); + //REG_FUNC(0x4D023DE9, strxfrm); + //REG_FUNC(0xEB31926D, strtok_r); + //REG_FUNC(0xFF6F77C7, strdup); + //REG_FUNC(0x184C4B07, strcasecmp); + //REG_FUNC(0xAF1CA2F1, strncasecmp); + //REG_FUNC(0xC94AE948, asctime); + //REG_FUNC(0xC082CA03, clock); + //REG_FUNC(0x1EA1CA8D, ctime); + //REG_FUNC(0x33AD70A0, difftime); + //REG_FUNC(0xF283CFE3, gmtime); + //REG_FUNC(0xF4A2E0BF, localtime); + //REG_FUNC(0xD1A2DFC3, mktime); + //REG_FUNC(0xEEB76FED, strftime); + //REG_FUNC(0xDAE8D60F, time); + //REG_FUNC(0xEFB3BC61, btowc); + //REG_FUNC(0x1D1DA5AD, _Btowc); + //REG_FUNC(0x89541CA5, fgetwc); + //REG_FUNC(0x982AFA4D, fgetws); + //REG_FUNC(0xA597CDC8, fputwc); + //REG_FUNC(0xB755927C, fputws); + //REG_FUNC(0xA77327D2, fwide); + //REG_FUNC(0xE52278E8, fwprintf); + //REG_FUNC(0x7BFC75C6, fwscanf); + //REG_FUNC(0x23E0F442, getwc); + //REG_FUNC(0x55DB4E32, getwchar); + //REG_FUNC(0x1927CAE8, mbrlen); + //REG_FUNC(0x910664C3, mbrtowc); + //REG_FUNC(0x961D12F8, mbsinit); + //REG_FUNC(0x9C14D58E, mbsrtowcs); + //REG_FUNC(0x247C71A6, putwc); + //REG_FUNC(0x3E04AB1C, putwchar); + //REG_FUNC(0x1B581BEB, swprintf); + //REG_FUNC(0xE1D2AE42, swscanf); + //REG_FUNC(0x39334D9C, ungetwc); + //REG_FUNC(0x36BF1E06, vfwprintf); + //REG_FUNC(0x37A563BE, vfwscanf); + //REG_FUNC(0x572DAB57, vswprintf); + //REG_FUNC(0x9451EE20, vswscanf); + //REG_FUNC(0x0A451B11, vwprintf); + //REG_FUNC(0xAD0C43DC, vwscanf); + //REG_FUNC(0xD9FF289D, wcrtomb); + //REG_FUNC(0x2F990FF9, wcscat); + //REG_FUNC(0xC1587971, wcschr); + //REG_FUNC(0xF42128B9, wcscmp); + //REG_FUNC(0x8EC70609, wcscoll); + //REG_FUNC(0x8AAADD56, wcscpy); + //REG_FUNC(0x25F7E46A, wcscspn); + //REG_FUNC(0x74136BC1, wcsftime); + //REG_FUNC(0xA778A14B, wcslen); + //REG_FUNC(0x196AB9F2, wcsncat); + //REG_FUNC(0xAAA6AAA2, wcsncmp); + //REG_FUNC(0x62E9B2D5, wcsncpy); + //REG_FUNC(0x07F229DB, wcspbrk); + //REG_FUNC(0xDF806521, wcsrchr); + //REG_FUNC(0xD8889FC8, wcsrtombs); + //REG_FUNC(0x5F5AA692, wcsspn); + //REG_FUNC(0x5BE328EE, wcsstr); + //REG_FUNC(0x35D7F1B1, wcstod); + //REG_FUNC(0x322243A8, _WStod); + //REG_FUNC(0x64123137, wcstof); + //REG_FUNC(0x340AF0F7, _WStof); + //REG_FUNC(0xA17C24A3, wcstok); + //REG_FUNC(0xFBEB657E, wcstol); + //REG_FUNC(0x2D7C3A7A, wcstold); + //REG_FUNC(0x1EDA8F09, _WStold); + //REG_FUNC(0x6EEFB7D7, wcstoll); + //REG_FUNC(0xACF13D54, wcstoul); + //REG_FUNC(0x87C94271, _WStoul); + //REG_FUNC(0xCBFF8200, wcstoull); + //REG_FUNC(0xF6069AFD, wcsxfrm); + //REG_FUNC(0x704321CC, wctob); + //REG_FUNC(0x2F0C81A6, _Wctob); + //REG_FUNC(0x7A08BE70, wmemchr); + //REG_FUNC(0x9864C99F, wmemcmp); + //REG_FUNC(0xD9F9DDCD, wmemcpy); + //REG_FUNC(0x53F7EB4B, wmemmove); + //REG_FUNC(0x4D04A480, wmemset); + //REG_FUNC(0xBF2F5FCE, wprintf); + //REG_FUNC(0xADC32204, wscanf); + //REG_FUNC(0x7E811AF2, iswalnum); + //REG_FUNC(0xC5ECB7B6, iswalpha); + //REG_FUNC(0xC8FC4BBE, iswblank); + //REG_FUNC(0xC30AE3C7, iswcntrl); + //REG_FUNC(0x9E348712, iswctype); + //REG_FUNC(0xC37DB2C2, iswdigit); + //REG_FUNC(0x70632234, iswgraph); + //REG_FUNC(0x40F84B7D, iswlower); + //REG_FUNC(0xF52F9241, iswprint); + //REG_FUNC(0x3922B91A, iswpunct); + //REG_FUNC(0x2BDA4905, iswspace); + //REG_FUNC(0x9939E1AD, iswupper); + //REG_FUNC(0x82FCEFA4, iswxdigit); + //REG_FUNC(0x09C38DE4, towlower); + //REG_FUNC(0xCF77D465, towctrans); + //REG_FUNC(0xCACE34B9, towupper); + //REG_FUNC(0xE8270951, wctrans); + //REG_FUNC(0xA967B88D, wctype); + //REG_FUNC(0x9D885076, _Towctrans); + //REG_FUNC(0xE980110A, _Iswctype); + //REG_FUNC(0xEDC939E1, __aeabi_atexit); + //REG_FUNC(0xB538BF48, __cxa_finalize); + //REG_FUNC(0xD0310E31, __cxa_guard_acquire); + //REG_FUNC(0x4ED1056F, __cxa_guard_release); + //REG_FUNC(0xD18E461D, __cxa_guard_abort); + //REG_FUNC(0x64DA2C47, _Unlocksyslock); + //REG_FUNC(0x7DBC0575, _Locksyslock); + //REG_FUNC(0x5044FC32, _Lockfilelock); + //REG_FUNC(0xFD5DD98C, _Unlockfilelock); + //REG_FUNC(0x1EFFBAC2, __set_exidx_main); + //REG_FUNC(0x855FC605, _Files); + //REG_FUNC(0x66B7406C, _Stdin); + //REG_FUNC(0x5D8C1282, _Stdout); + //REG_FUNC(0xDDF9BB09, _Stderr); + //REG_FUNC(0x3CE6109D, _Ctype); + //REG_FUNC(0x36878958, _Touptab); + //REG_FUNC(0xD662E07C, _Tolotab); + //REG_FUNC(0xE5620A03, _Flt); + //REG_FUNC(0x338FE545, _Dbl); + //REG_FUNC(0x94CE931C, _Ldbl); + //REG_FUNC(0xF708906E, _Denorm); + //REG_FUNC(0x01B05132, _FDenorm); + //REG_FUNC(0x2C8DBEB7, _LDenorm); + //REG_FUNC(0x710B5F33, _Inf); + //REG_FUNC(0x8A0F308C, _FInf); + //REG_FUNC(0x5289BBC0, _LInf); + //REG_FUNC(0x116F3DA9, _Nan); + //REG_FUNC(0x415162DD, _FNan); + //REG_FUNC(0x036D0F07, _LNan); + //REG_FUNC(0x677CDE35, _Snan); + //REG_FUNC(0x7D35108B, _FSnan); + //REG_FUNC(0x48AEEF2A, _LSnan); + return std::move(*module); }(); diff --git a/rpcs3/Emu/ARMv7/PSVFuncList.cpp b/rpcs3/Emu/ARMv7/PSVFuncList.cpp index 168ea1cfce..4041d23c00 100644 --- a/rpcs3/Emu/ARMv7/PSVFuncList.cpp +++ b/rpcs3/Emu/ARMv7/PSVFuncList.cpp @@ -37,7 +37,7 @@ void execute_psv_func_by_index(ARMv7Thread& CPU, u32 index) (*g_psv_func_list[index].func)(CPU); } -extern psv_log_base sceLibc; +extern psv_log_base& sceLibc; void list_known_psv_modules() { diff --git a/rpcs3/Emu/ARMv7/PSVFuncList.h b/rpcs3/Emu/ARMv7/PSVFuncList.h index b6356ebea8..99b691dee0 100644 --- a/rpcs3/Emu/ARMv7/PSVFuncList.h +++ b/rpcs3/Emu/ARMv7/PSVFuncList.h @@ -160,8 +160,8 @@ namespace psv_func_detail const bool is_float = std::is_floating_point::value; const bool is_vector = std::is_same::value; const bind_arg_type t = is_float - ? ((f_count >= 13) ? ARG_STACK : ARG_FLOAT) - : (is_vector ? ((v_count >= 12) ? ARG_STACK : ARG_VECTOR) : ((g_count >= 8) ? ARG_STACK : ARG_GENERAL)); + ? ((f_count >= 4) ? ARG_STACK : ARG_FLOAT) + : (is_vector ? ((v_count >= 4) ? ARG_STACK : ARG_VECTOR) : ((g_count >= 4) ? ARG_STACK : ARG_GENERAL)); const int g = g_count + (is_float || is_vector ? 0 : 1); const int f = f_count + (is_float ? 1 : 0); const int v = v_count + (is_vector ? 1 : 0); From 31c71b4a4863b4cbd27cc2b95b2a5e2db7ff8e95 Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Sun, 2 Nov 2014 04:18:02 +0300 Subject: [PATCH 17/27] Compilation fix --- rpcs3/Emu/ARMv7/Modules/sceLibc.cpp | 4 ++-- rpcs3/Emu/ARMv7/PSVFuncList.cpp | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/rpcs3/Emu/ARMv7/Modules/sceLibc.cpp b/rpcs3/Emu/ARMv7/Modules/sceLibc.cpp index 2f1f25617d..c02a2b5f1f 100644 --- a/rpcs3/Emu/ARMv7/Modules/sceLibc.cpp +++ b/rpcs3/Emu/ARMv7/Modules/sceLibc.cpp @@ -26,7 +26,7 @@ namespace sce_libc_func } } -psv_log_base& sceLibc = []() +psv_log_base& sceLibc = []() -> psv_log_base& { psv_log_base* module = new psv_log_base("sceLibc"); @@ -326,5 +326,5 @@ psv_log_base& sceLibc = []() //REG_FUNC(0x7D35108B, _FSnan); //REG_FUNC(0x48AEEF2A, _LSnan); - return std::move(*module); + return *module; }(); diff --git a/rpcs3/Emu/ARMv7/PSVFuncList.cpp b/rpcs3/Emu/ARMv7/PSVFuncList.cpp index 4041d23c00..5d80b173a7 100644 --- a/rpcs3/Emu/ARMv7/PSVFuncList.cpp +++ b/rpcs3/Emu/ARMv7/PSVFuncList.cpp @@ -23,11 +23,11 @@ psv_func* get_psv_func_by_nid(u32 nid) u32 get_psv_func_index(psv_func* func) { - u32 res = func - g_psv_func_list.data(); + auto res = func - g_psv_func_list.data(); - assert(res < g_psv_func_list.size()); + assert((size_t)res < g_psv_func_list.size()); - return res; + return (u32)res; } void execute_psv_func_by_index(ARMv7Thread& CPU, u32 index) From df72f5e37cd199729343765ef0db5b54b52f6335 Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Sun, 2 Nov 2014 18:50:20 +0300 Subject: [PATCH 18/27] ARMv7: CMP_REG, LDR_IMM, LDR_LIT, STR_REG, SUB_REG sceLibc: exit and printf drafts This actually allows to display hello world. --- Utilities/Log.h | 5 +- rpcs3/Emu/ARMv7/ARMv7Interpreter.cpp | 240 +++++++++++++++++++++++++-- rpcs3/Emu/ARMv7/ARMv7Interpreter.h | 29 +++- rpcs3/Emu/ARMv7/ARMv7Thread.h | 2 +- rpcs3/Emu/ARMv7/Modules/sceLibc.cpp | 18 +- rpcs3/Loader/ELF32.cpp | 2 +- 6 files changed, 268 insertions(+), 28 deletions(-) diff --git a/Utilities/Log.h b/Utilities/Log.h index 8dbeb71e07..46fc604f5a 100644 --- a/Utilities/Log.h +++ b/Utilities/Log.h @@ -24,6 +24,7 @@ namespace Log HLE, PPU, SPU, + ARMv7, TTY, }; @@ -35,7 +36,7 @@ namespace Log }; //well I'd love make_array() but alas manually counting is not the end of the world - static const std::array gTypeNameTable = { { + static const std::array gTypeNameTable = { { { GENERAL, "G: " }, { LOADER, "LDR: " }, { MEMORY, "MEM: " }, @@ -43,6 +44,7 @@ namespace Log { HLE, "HLE: " }, { PPU, "PPU: " }, { SPU, "SPU: " }, + { ARMv7, "ARM: " }, { TTY, "TTY: " } } }; @@ -121,6 +123,7 @@ static struct { inline operator Log::LogType() { return Log::LogType::RSX; } } R static struct { inline operator Log::LogType() { return Log::LogType::HLE; } } HLE; static struct { inline operator Log::LogType() { return Log::LogType::PPU; } } PPU; static struct { inline operator Log::LogType() { return Log::LogType::SPU; } } SPU; +static struct { inline operator Log::LogType() { return Log::LogType::ARMv7; } } ARMv7; static struct { inline operator Log::LogType() { return Log::LogType::TTY; } } TTY; inline void log_message(Log::LogType type, Log::LogSeverity sev, const char* text) diff --git a/rpcs3/Emu/ARMv7/ARMv7Interpreter.cpp b/rpcs3/Emu/ARMv7/ARMv7Interpreter.cpp index 0ecf629c45..62a4838c27 100644 --- a/rpcs3/Emu/ARMv7/ARMv7Interpreter.cpp +++ b/rpcs3/Emu/ARMv7/ARMv7Interpreter.cpp @@ -210,7 +210,7 @@ void ARMv7Interpreter::ASR_REG(const u32 data, const ARMv7_encoding type) void ARMv7Interpreter::B(const u32 data, const ARMv7_encoding type) { u32 cond = CPU.ITSTATE.advance(); - u32 jump = 0; // jump = instr_size + imm32 + u32 jump = 0; // jump = instr_size + imm32 ??? switch (type) { @@ -222,12 +222,12 @@ void ARMv7Interpreter::B(const u32 data, const ARMv7_encoding type) throw "SVC"; } - jump = 2 + sign<9, u32>((data & 0xff) << 1); + jump = 4 + sign<9, u32>((data & 0xff) << 1); break; } case T2: { - jump = 2 + sign<12, u32>((data & 0x7ff) << 1); + jump = 4 + sign<12, u32>((data & 0x7ff) << 1); break; } case T3: @@ -235,7 +235,7 @@ void ARMv7Interpreter::B(const u32 data, const ARMv7_encoding type) cond = (data >> 6) & 0xf; if (cond >= 0xe) { - throw "Related encodings"; + throw "B_T3: Related encodings"; } u32 s = (data >> 26) & 0x1; @@ -254,7 +254,7 @@ void ARMv7Interpreter::B(const u32 data, const ARMv7_encoding type) } case A1: { - cond = (data >> 28) & 0xf; + cond = data >> 28; jump = 1 + 4 + sign<26, u32>((data & 0xffffff) << 2); break; } @@ -457,7 +457,7 @@ void ARMv7Interpreter::CB_Z(const u32 data, const ARMv7_encoding type) default: throw __FUNCTION__; } - if ((CPU.read_gpr(data & 0x7) == 0) ^ (data & 0x800)) + if ((CPU.read_gpr(data & 0x7) == 0) ^ ((data & 0x800) != 0)) { CPU.SetBranch(CPU.PC + 2 + ((data & 0xf8) >> 2) + ((data & 0x200) >> 3)); } @@ -513,11 +513,47 @@ void ARMv7Interpreter::CMP_IMM(const u32 data, const ARMv7_encoding type) void ARMv7Interpreter::CMP_REG(const u32 data, const ARMv7_encoding type) { + u32 cond = CPU.ITSTATE.advance(); + u32 n = 0; + u32 m = 0; + auto shift_t = SRType_LSL; + u32 shift_n = 0; + switch (type) { + case T1: + { + n = (data & 0x7); + m = (data & 0x38) >> 3; + break; + } + case T2: + { + n = (data & 0x80) >> 4 | (data & 0x7); + m = (data & 0x78) >> 3; + break; + } + case T3: + { + n = (data & 0xf0000) >> 16; + m = (data & 0xf); + shift_t = DecodeImmShift((data & 0x30) >> 4, (data & 0x7000) >> 10 | (data & 0xc0) >> 6, &shift_n); + break; + } case A1: throw __FUNCTION__; default: throw __FUNCTION__; } + + if (ConditionPassed(cond)) + { + bool carry, overflow; + const u32 shifted = Shift(CPU.read_gpr(m), shift_t, shift_n, true); + const u32 res = AddWithCarry(CPU.read_gpr(n), ~shifted, true, carry, overflow); + CPU.APSR.N = res >> 31; + CPU.APSR.Z = res == 0; + CPU.APSR.C = carry; + CPU.APSR.V = overflow; + } } void ARMv7Interpreter::CMP_RSR(const u32 data, const ARMv7_encoding type) @@ -566,7 +602,7 @@ void ARMv7Interpreter::IT(const u32 data, const ARMv7_encoding type) { if ((data & 0xf) == 0) { - throw "Related encodings"; + throw "IT_T1: Related encodings"; } CPU.ITSTATE.IT = data & 0xff; @@ -616,11 +652,83 @@ void ARMv7Interpreter::LDMIB(const u32 data, const ARMv7_encoding type) void ARMv7Interpreter::LDR_IMM(const u32 data, const ARMv7_encoding type) { + u32 cond = CPU.ITSTATE.advance(); + u32 t = 0; + u32 n = 13; + u32 imm32 = 0; + bool index = true; + bool add = true; + bool wback = false; + switch (type) { - case A1: throw __FUNCTION__; + case T1: + { + t = (data & 0x7); + n = (data & 0x38) >> 3; + imm32 = (data & 0x7c0) >> 4; + break; + } + case T2: + { + t = (data & 0x700) >> 8; + imm32 = (data & 0xff) << 2; + break; + } + case T3: + { + t = (data & 0xf000) >> 12; + n = (data & 0xf0000) >> 16; + imm32 = (data & 0xfff); + + if (n == 15) + { + throw "LDR (literal)"; + } + break; + } + case T4: + { + t = (data & 0xf000) >> 12; + n = (data & 0xf0000) >> 16; + imm32 = (data & 0xff); + index = (data & 0x400); + add = (data & 0x200); + wback = (data & 0x100); + + if (n == 15) + { + throw "LDR (literal)"; + } + if (index && add && !wback) + { + throw "LDRT"; + } + if (n == 13 && !index && add && wback && imm32 == 4) + { + throw "POP"; + } + if (!index && !wback) + { + throw "LDR_IMM_T4: undefined"; + } + break; + } default: throw __FUNCTION__; } + + if (ConditionPassed(cond)) + { + const u32 offset_addr = add ? CPU.read_gpr(n) + imm32 : CPU.read_gpr(n) - imm32; + const u32 addr = index ? offset_addr : CPU.read_gpr(n); + + if (wback) + { + CPU.write_gpr(n, offset_addr); + } + + CPU.write_gpr(t, vm::psv::read32(addr)); + } } void ARMv7Interpreter::LDR_LIT(const u32 data, const ARMv7_encoding type) @@ -855,13 +963,13 @@ void ARMv7Interpreter::MOV_IMM(const u32 data, const ARMv7_encoding type) imm32 = sign<8, u32>(data & 0xff); break; } - //case T2: - //{ - // set_flags = data & 0x100000; - // d = (data >> 8) & 0xf; - // imm32 = ThumbExpandImm_C((data & 0x4000000) >> 15 | (data & 0x7000) >> 4 | (data & 0xff), carry); - // break; - //} + case T2: + { + set_flags = data & 0x100000; + d = (data >> 8) & 0xf; + imm32 = ThumbExpandImm_C((data & 0x4000000) >> 15 | (data & 0x7000) >> 4 | (data & 0xff), carry, carry); + break; + } case T3: { set_flags = false; @@ -1115,7 +1223,7 @@ void ARMv7Interpreter::POP(const u32 data, const ARMv7_encoding type) { case T1: { - reg_list = ((data & 0x100) << 6) | (data & 0xff); + reg_list = ((data & 0x100) << 7) | (data & 0xff); break; } case T2: @@ -1830,7 +1938,7 @@ void ARMv7Interpreter::STR_IMM(const u32 data, const ARMv7_encoding type) if (n == 0xf) { - throw "STR_IMM_T3 UNDEFINED"; + throw "STR_IMM_T3: undefined"; } break; } @@ -1853,7 +1961,7 @@ void ARMv7Interpreter::STR_IMM(const u32 data, const ARMv7_encoding type) } if (n == 15 || (!index && !wback)) { - throw "STR_IMM_T4 UNDEFINED"; + throw "STR_IMM_T4: undefined"; } break; } @@ -1877,11 +1985,55 @@ void ARMv7Interpreter::STR_IMM(const u32 data, const ARMv7_encoding type) void ARMv7Interpreter::STR_REG(const u32 data, const ARMv7_encoding type) { + u32 cond = CPU.ITSTATE.advance(); + u32 t = 0; + u32 n = 0; + u32 m = 0; + bool index = true; + bool add = true; + bool wback = false; + auto shift_t = SRType_LSL; + u32 shift_n = 0; + switch (type) { + case T1: + { + t = (data & 0x7); + n = (data & 0x38) >> 3; + m = (data & 0x1c0) >> 6; + break; + } + case T2: + { + t = (data & 0xf000) >> 12; + n = (data & 0xf0000) >> 16; + m = (data & 0xf); + shift_n = (data & 0x30) >> 4; + + if (n == 15) + { + throw "STR_REG_T2: undefined"; + } + break; + } case A1: throw __FUNCTION__; default: throw __FUNCTION__; } + + if (ConditionPassed(cond)) + { + const u32 offset = Shift(CPU.read_gpr(m), shift_t, shift_n, CPU.APSR.C); + const u32 offset_addr = add ? CPU.read_gpr(n) + offset : CPU.read_gpr(n) - offset; + const u32 addr = index ? offset_addr : CPU.read_gpr(n); + + vm::psv::write32(addr, CPU.read_gpr(t)); + + if (wback) + { + CPU.write_gpr(n, offset_addr); + } + } } @@ -1953,11 +2105,63 @@ void ARMv7Interpreter::SUB_IMM(const u32 data, const ARMv7_encoding type) void ARMv7Interpreter::SUB_REG(const u32 data, const ARMv7_encoding type) { + bool set_flags = !CPU.ITSTATE; + u32 cond = CPU.ITSTATE.advance(); + u32 d = 0; + u32 n = 0; + u32 m = 0; + auto shift_t = SRType_LSL; + u32 shift_n = 0; + switch (type) { + case T1: + { + d = (data & 0x7); + n = (data & 0x38) >> 3; + m = (data & 0x1c0) >> 6; + break; + } + case T2: + { + d = (data & 0xf00) >> 8; + n = (data & 0xf0000) >> 16; + m = (data & 0xf); + set_flags = (data & 0x100000); + shift_t = DecodeImmShift((data & 0x30) >> 4, (data & 0x7000) >> 10 | (data & 0xc0) >> 6, &shift_n); + + if (d == 15 && set_flags) + { + throw "CMP (register)"; + } + if (n == 13) + { + throw "SUB (SP minus register)"; + } + break; + } case A1: throw __FUNCTION__; default: throw __FUNCTION__; } + + if (ConditionPassed(cond)) + { + u32 shifted = Shift(CPU.read_gpr(m), shift_t, shift_n, CPU.APSR.C); + if (set_flags) + { + bool carry, overflow; + u32 res = AddWithCarry(CPU.read_gpr(n), ~shifted, true, carry, overflow); + CPU.write_gpr(d, res); + CPU.APSR.N = res >> 31; + CPU.APSR.Z = res == 0; + CPU.APSR.C = carry; + CPU.APSR.V = overflow; + } + else + { + CPU.write_gpr(d, CPU.read_gpr(n) - shifted); + } + } } void ARMv7Interpreter::SUB_RSR(const u32 data, const ARMv7_encoding type) diff --git a/rpcs3/Emu/ARMv7/ARMv7Interpreter.h b/rpcs3/Emu/ARMv7/ARMv7Interpreter.h index bfe7539967..da1b437c61 100644 --- a/rpcs3/Emu/ARMv7/ARMv7Interpreter.h +++ b/rpcs3/Emu/ARMv7/ARMv7Interpreter.h @@ -10,7 +10,7 @@ public: { } - enum SRType + enum SRType : u32 { SRType_None, SRType_LSL, @@ -93,7 +93,7 @@ public: return len - 1 - HighestSetBit(x, len); } - SRType DecodeImmShift(u8 type, u8 imm5, uint* shift_n) + SRType DecodeImmShift(u32 type, u32 imm5, u32* shift_n) { SRType shift_t = SRType_None; @@ -217,7 +217,7 @@ public: return value; } - template T Shift(T value, SRType type, uint amount, bool carry_in) + template T Shift(T value, SRType type, u32 amount, bool carry_in) { bool carry_out; return Shift_C(value, type, amount, carry_in, carry_out); @@ -239,6 +239,29 @@ public: return result; } + u32 ThumbExpandImm_C(u32 imm12, bool carry_in, bool& carry_out) + { + if ((imm12 & 0xc00) >> 10) + { + u32 unrotated_value = (imm12 & 0x7f) | 0x80; + + return ROR_C(unrotated_value, (imm12 & 0xf80) >> 7, carry_out); + } + else + { + carry_out = carry_in; + + u32 imm8 = imm12 & 0xff; + switch ((imm12 & 0x300) >> 8) + { + case 0: return imm8; + case 1: return imm8 << 16 | imm8; + case 2: return imm8 << 24 | imm8 << 8; + default: return imm8 << 24 | imm8 << 16 | imm8 << 8 | imm8; + } + } + } + bool ConditionPassed(u32 cond) const { bool result = false; diff --git a/rpcs3/Emu/ARMv7/ARMv7Thread.h b/rpcs3/Emu/ARMv7/ARMv7Thread.h index 0ef26562ff..4e1dd7d20b 100644 --- a/rpcs3/Emu/ARMv7/ARMv7Thread.h +++ b/rpcs3/Emu/ARMv7/ARMv7Thread.h @@ -103,7 +103,7 @@ public: } else { - SetBranch(value); + SetBranch(value & ~1); } } diff --git a/rpcs3/Emu/ARMv7/Modules/sceLibc.cpp b/rpcs3/Emu/ARMv7/Modules/sceLibc.cpp index c02a2b5f1f..ac702a3e58 100644 --- a/rpcs3/Emu/ARMv7/Modules/sceLibc.cpp +++ b/rpcs3/Emu/ARMv7/Modules/sceLibc.cpp @@ -1,4 +1,6 @@ #include "stdafx.h" +#include "Emu/System.h" +#include "Emu/Memory/Memory.h" #include "Emu/ARMv7/PSVFuncList.h" extern psv_log_base& sceLibc; @@ -12,17 +14,25 @@ namespace sce_libc_func void exit() { - sceLibc.Todo(__FUNCTION__); + sceLibc.Error("exit()"); + Emu.Pause(); + sceLibc.Success("Process finished"); + CallAfter([]() + { + Emu.Stop(); + }); } - void printf() + void printf(vm::psv::ptr fmt) { - sceLibc.Todo(__FUNCTION__); + sceLibc.Error("printf(fmt_addr=0x%x)", fmt.addr()); + + LOG_NOTICE(TTY, "%s", fmt.get_ptr()); } void __cxa_set_dso_handle_main() { - sceLibc.Todo(__FUNCTION__); + sceLibc.Error("__cxa_set_dso_handle_main()"); } } diff --git a/rpcs3/Loader/ELF32.cpp b/rpcs3/Loader/ELF32.cpp index d7765e5e32..b4c7d110cf 100644 --- a/rpcs3/Loader/ELF32.cpp +++ b/rpcs3/Loader/ELF32.cpp @@ -6,7 +6,7 @@ #include "Emu/ARMv7/PSVFuncList.h" #include "ELF32.h" -#define LOADER_DEBUG +//#define LOADER_DEBUG void Elf32_Ehdr::Show() { From 43382a0ac649958dfec234363b1448299b7703bd Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Mon, 3 Nov 2014 14:35:50 +0300 Subject: [PATCH 19/27] Something is wrong with entry points... --- rpcs3/Emu/System.cpp | 20 +++++++++++++++++--- rpcs3/Loader/ELF32.cpp | 8 ++++++-- rpcs3/Loader/ELF32.h | 2 +- 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/rpcs3/Emu/System.cpp b/rpcs3/Emu/System.cpp index ce48b9edc5..e6c3ff9e3f 100644 --- a/rpcs3/Emu/System.cpp +++ b/rpcs3/Emu/System.cpp @@ -383,10 +383,24 @@ void Emulator::Load() } break; - default: - thread.SetEntry(l.GetEntry()); + case MACHINE_ARM: + { + u32 entry = l.GetEntry(); + + auto code = vm::psv::ptr::make(entry & ~3); + + // evil way to find entry point in .sceModuleInfo.rodata + while (code[0] != 0xffffffffu) + { + entry = code[0] + 0x81000000; + code++; + } + + thread.SetEntry(entry & ~1); thread.Run(); - break; + + break; + } } m_status = Ready; diff --git a/rpcs3/Loader/ELF32.cpp b/rpcs3/Loader/ELF32.cpp index b4c7d110cf..995a913ce9 100644 --- a/rpcs3/Loader/ELF32.cpp +++ b/rpcs3/Loader/ELF32.cpp @@ -352,7 +352,7 @@ bool ELF32Loader::LoadPhdrInfo() for(size_t i=0; i= entry && entry < phdr_arr[i].p_paddr + phdr_arr[i].p_memsz) + if(phdr_arr[i].p_offset >= entry && entry < phdr_arr[i].p_offset + phdr_arr[i].p_memsz) { entry += phdr_arr[i].p_vaddr; LOG_WARNING(LOADER, "virtual entry = 0x%x", entry); @@ -360,6 +360,10 @@ bool ELF32Loader::LoadPhdrInfo() } } } + else if (machine == MACHINE_ARM) + { + entry += 0x81000000; + } return true; } @@ -601,7 +605,7 @@ bool ELF32Loader::LoadShdrData(u64 offset) } else { - LOG_ERROR(LOADER, "sceRefs: unknown code found (code=0x%x, code1=0x%x, code2=0x%x, code3=0x%x)", rel[j].code, rel[j].code1, rel[j].code2, rel[j].code3); + LOG_NOTICE(LOADER, "sceRefs: unknown code found (code=0x%x, code1=0x%x, code2=0x%x, code3=0x%x)", rel[j].code, rel[j].code1, rel[j].code2, rel[j].code3); } } } diff --git a/rpcs3/Loader/ELF32.h b/rpcs3/Loader/ELF32.h index 9e1a8a5948..1d573824d3 100644 --- a/rpcs3/Loader/ELF32.h +++ b/rpcs3/Loader/ELF32.h @@ -15,7 +15,7 @@ struct Elf32_Ehdr u16 e_type; u16 e_machine; u32 e_version; - u16 e_entry; + u32 e_entry; u32 e_phoff; u32 e_shoff; u32 e_flags; From c5858de567521a2f28d1090b726f264272bbe3bb Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Tue, 4 Nov 2014 03:51:26 +0300 Subject: [PATCH 20/27] sceLibstdcxx draft --- rpcs3/Emu/ARMv7/Modules/sceLibc.cpp | 2 +- rpcs3/Emu/ARMv7/Modules/sceLibstdcxx.cpp | 1922 ++++++++++++++++++++++ rpcs3/Emu/ARMv7/PSVFuncList.cpp | 2 + rpcs3/emucore.vcxproj | 1 + rpcs3/emucore.vcxproj.filters | 3 + 5 files changed, 1929 insertions(+), 1 deletion(-) create mode 100644 rpcs3/Emu/ARMv7/Modules/sceLibstdcxx.cpp diff --git a/rpcs3/Emu/ARMv7/Modules/sceLibc.cpp b/rpcs3/Emu/ARMv7/Modules/sceLibc.cpp index ac702a3e58..2abe89f32b 100644 --- a/rpcs3/Emu/ARMv7/Modules/sceLibc.cpp +++ b/rpcs3/Emu/ARMv7/Modules/sceLibc.cpp @@ -40,7 +40,7 @@ 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) +#define REG_FUNC(nid, name) reg_psv_func(nid, module, &sce_libc_func::name) REG_FUNC(0x33b83b70, __cxa_atexit); REG_FUNC(0x826bbbaf, exit); diff --git a/rpcs3/Emu/ARMv7/Modules/sceLibstdcxx.cpp b/rpcs3/Emu/ARMv7/Modules/sceLibstdcxx.cpp new file mode 100644 index 0000000000..4dd98b24c4 --- /dev/null +++ b/rpcs3/Emu/ARMv7/Modules/sceLibstdcxx.cpp @@ -0,0 +1,1922 @@ +#include "stdafx.h" +#include "Emu/System.h" +#include "Emu/Memory/Memory.h" +#include "Emu/ARMv7/PSVFuncList.h" + +extern psv_log_base& sceLibstdcxx; + +namespace sce_libstdcxx_func +{ + void __aeabi_unwind_cpp_pr0() + { + sceLibstdcxx.Todo(__FUNCTION__); + } +} + +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) + + REG_FUNC(0x173E7421, __aeabi_unwind_cpp_pr0); + + //REG_FUNC(0x52B0C625, std::bad_typeid::what() const); + //REG_FUNC(0x64D7D074, std::bad_typeid::_Doraise() const); + //REG_FUNC(0x15FB88E2, std::logic_error::what() const); + //REG_FUNC(0x492D1209, std::logic_error::_Doraise() const); + //REG_FUNC(0xDBDFF9D0, std::range_error::_Doraise() const); + //REG_FUNC(0xE8D59AB5, std::_String_base::_Xlen() const); + //REG_FUNC(0x473DC636, std::_String_base::_Xran() const); + //REG_FUNC(0x481ECB76, std::domain_error::_Doraise() const); + //REG_FUNC(0xB03E909C, std::length_error::_Doraise() const); + //REG_FUNC(0x38CF41AC, std::out_of_range::_Doraise() const); + //REG_FUNC(0x55AE5502, std::_codecvt_base::do_encoding() const); + //REG_FUNC(0x5522293F, std::_codecvt_base::do_max_length() const); + //REG_FUNC(0xCF5643A9, std::_codecvt_base::do_always_noconv() const); + //REG_FUNC(0x51FCD56B, std::bad_exception::what() const); + //REG_FUNC(0x109E54C9, std::bad_exception::_Doraise() const); + //REG_FUNC(0xAE85C2EE, std::runtime_error::what() const); + //REG_FUNC(0x1D878503, std::runtime_error::_Doraise() const); + //REG_FUNC(0xEED101C6, std::overflow_error::_Doraise() const); + //REG_FUNC(0xB1AE6F9E, std::underflow_error::_Doraise() const); + //REG_FUNC(0x16F56E8D, std::invalid_argument::_Doraise() const); + //REG_FUNC(0x6C568D20, std::_ctype::do_tolower(char*, char const*) const); + //REG_FUNC(0xC334DE66, std::_ctype::do_tolower(char) const); + //REG_FUNC(0x2DD808E, std::_ctype::do_toupper(char*, char const*) const); + //REG_FUNC(0xF6AF33EA, std::_ctype::do_toupper(char) const); + //REG_FUNC(0x1B81D726, std::_ctype::do_widen(char const*, char const*, char*) const); + //REG_FUNC(0x6471CC01, std::_ctype::do_widen(char) const); + //REG_FUNC(0x9CFA56E5, std::_ctype::do_narrow(char const*, char const*, char, char*) const); + //REG_FUNC(0x718669AB, std::_ctype::do_narrow(char, char) const); + //REG_FUNC(0x759F105D, std::_ctype::do_scan_is(short, wchar_t const*, wchar_t const*) const); + //REG_FUNC(0x56443F, std::_ctype::do_tolower(wchar_t*, wchar_t const*) const); + //REG_FUNC(0x33E9ECDD, std::_ctype::do_tolower(wchar_t) const); + //REG_FUNC(0x1256E6A5, std::_ctype::do_toupper(wchar_t*, wchar_t const*) const); + //REG_FUNC(0x64072C2E, std::_ctype::do_toupper(wchar_t) const); + //REG_FUNC(0x339766BF, std::_ctype::do_scan_not(short, wchar_t const*, wchar_t const*) const); + //REG_FUNC(0xDA4E1651, std::_ctype::do_is(wchar_t const*, wchar_t const*, short*) const); + //REG_FUNC(0x5A06C0E8, std::_ctype::do_is(short, wchar_t) const); + //REG_FUNC(0x609036C7, std::_ctype::do_widen(char const*, char const*, wchar_t*) const); + //REG_FUNC(0xA2896AA8, std::_ctype::do_widen(char) const); + //REG_FUNC(0x631687B9, std::_ctype::do_narrow(wchar_t const*, wchar_t const*, char, char*) const); + //REG_FUNC(0xB4D8D2F0, std::_ctype::do_narrow(wchar_t, char) const); + //REG_FUNC(0xD9070137, std::_codecvt::do_unshift(std::_Mbstatet&, char*, char*, char*&) const); + //REG_FUNC(0xABA0412F, std::_codecvt::do_in(std::_Mbstatet&, char const*, char const*, char const*&, char*, char*, char*&) const); + //REG_FUNC(0x51052F04, std::_codecvt::do_out(std::_Mbstatet&, char const*, char const*, char const*&, char*, char*, char*&) const); + //REG_FUNC(0x39F062BE, std::_codecvt::do_length(std::_Mbstatet const&, char const*, char const*, unsigned int) const); + //REG_FUNC(0xF07CC89F, std::_codecvt::do_unshift(std::_Mbstatet&, char*, char*, char*&) const); + //REG_FUNC(0xF3A2E837, std::_codecvt::do_encoding() const); + //REG_FUNC(0x1F133D1E, std::_codecvt::do_max_length() const); + //REG_FUNC(0x27716D17, std::_codecvt::do_always_noconv() const); + //REG_FUNC(0x1C1AFE42, std::_codecvt::do_in(std::_Mbstatet&, char const*, char const*, char const*&, wchar_t*, wchar_t*, wchar_t*&) const); + //REG_FUNC(0xCBDE5500, std::_codecvt::do_out(std::_Mbstatet&, wchar_t const*, wchar_t const*, wchar_t const*&, char*, char*, char*&) const); + //REG_FUNC(0xF4D38990, std::_codecvt::do_length(std::_Mbstatet const&, char const*, char const*, unsigned int) const); + //REG_FUNC(0x46A9143F, std::bad_cast::what() const); + //REG_FUNC(0x8D129D3F, std::bad_cast::_Doraise() const); + //REG_FUNC(0xF877F51E, std::ios_base::failure::_Doraise() const); + //REG_FUNC(0x664750EE, std::bad_alloc::what() const); + //REG_FUNC(0xBA89FBE7, std::bad_alloc::_Doraise() const); + //REG_FUNC(0xC133E331, std::exception::what() const); + //REG_FUNC(0x656BE32, std::exception::_Raise() const); + //REG_FUNC(0x47A5CDA2, std::exception::_Doraise() const); + //REG_FUNC(0xBAE38DF9, std::type_info::name() const); + //REG_FUNC(0x1F260F10, std::type_info::before(std::type_info const&) const); + //REG_FUNC(0xDB15F0FC, std::type_info::operator==(std::type_info const&) const); + //REG_FUNC(0x9994F9FE, std::type_info::operator!=(std::type_info const&) const); + //REG_FUNC(0x2DA9FCEC, std::basic_iostream >::~basic_iostream()); + //REG_FUNC(0x6C2D3707, std::basic_iostream >::~basic_iostream()); + //REG_FUNC(0x9BA8786E, std::basic_istream >::~basic_istream()); + //REG_FUNC(0xD089A7C9, std::basic_istream >::~basic_istream()); + //REG_FUNC(0x3EE0611A, std::basic_ostream >::basic_ostream(std::basic_streambuf >*, bool)); + //REG_FUNC(0x6489E51D, std::basic_ostream >::~basic_ostream()); + //REG_FUNC(0xEF21C386, std::basic_ostream >::~basic_ostream()); + //REG_FUNC(0x10D794D4, std::string::_Grow(unsigned int, bool)); + //REG_FUNC(0x846D0286, std::string::assign(std::string const&, unsigned int, unsigned int)); + //REG_FUNC(0x2AF7786D, std::basic_string, std::allocator >::basic_string(char const*)); + //REG_FUNC(0x92F661CF, std::basic_string, std::allocator >::basic_string(std::string const&)); + //REG_FUNC(0xECC3B9C2, std::bad_typeid::bad_typeid(std::bad_typeid const&)); + //REG_FUNC(0x9F4CD196, std::bad_typeid::bad_typeid()); + //REG_FUNC(0x7AE1631B, std::bad_typeid::bad_typeid(std::bad_typeid const&)); + //REG_FUNC(0x33377802, std::bad_typeid::bad_typeid()); + //REG_FUNC(0x2CE020C7, std::bad_typeid::~bad_typeid()); + //REG_FUNC(0x625460B9, std::bad_typeid::~bad_typeid()); + //REG_FUNC(0xB4F5C5A7, std::bad_typeid::~bad_typeid()); + //REG_FUNC(0x55AAD6A6, std::bad_typeid::operator=(std::bad_typeid const&)); + //REG_FUNC(0x9CF31703, std::istrstream::~istrstream()); + //REG_FUNC(0x71D13A36, std::istrstream::~istrstream()); + //REG_FUNC(0xAF5DF8C3, std::istrstream::~istrstream()); + //REG_FUNC(0xC1E7C7A, std::ostrstream::ostrstream(char*, int, std::_Iosb::_Openmode)); + //REG_FUNC(0xC09B290, std::ostrstream::ostrstream(char*, int, std::_Iosb::_Openmode)); + //REG_FUNC(0x4B8BA644, std::ostrstream::~ostrstream()); + //REG_FUNC(0xE463FB3, std::ostrstream::~ostrstream()); + //REG_FUNC(0xA0A34FEF, std::ostrstream::~ostrstream()); + //REG_FUNC(0xC9F632FF, std::logic_error::logic_error(std::logic_error const&)); + //REG_FUNC(0xE6356C5C, std::logic_error::logic_error(std::string const&)); + //REG_FUNC(0x6322FEB0, std::logic_error::~logic_error()); + //REG_FUNC(0x35ED9C5A, std::logic_error::~logic_error()); + //REG_FUNC(0x1FFC4420, std::logic_error::~logic_error()); + //REG_FUNC(0x6F6E3A52, std::range_error::range_error(std::range_error const&)); + //REG_FUNC(0xFD97D28A, std::range_error::~range_error()); + //REG_FUNC(0x1C86405F, std::range_error::~range_error()); + //REG_FUNC(0xEF754EBD, std::range_error::~range_error()); + //REG_FUNC(0x7D5412EF, std::domain_error::domain_error(std::domain_error const&)); + //REG_FUNC(0x803A7D3E, std::domain_error::~domain_error()); + //REG_FUNC(0xA6BCA2AD, std::domain_error::~domain_error()); + //REG_FUNC(0x36F9D2A, std::domain_error::~domain_error()); + //REG_FUNC(0x5F3428AD, std::length_error::length_error(std::length_error const&)); + //REG_FUNC(0xF6FB801D, std::length_error::length_error(std::string const&)); + //REG_FUNC(0xF83AA7DA, std::length_error::~length_error()); + //REG_FUNC(0xA873D7F9, std::length_error::~length_error()); + //REG_FUNC(0xBB12C75, std::length_error::~length_error()); + //REG_FUNC(0x299AA587, std::out_of_range::out_of_range(std::out_of_range const&)); + //REG_FUNC(0xC8BA5522, std::out_of_range::out_of_range(std::string const&)); + //REG_FUNC(0xA8C470A4, std::out_of_range::~out_of_range()); + //REG_FUNC(0x5FAE79BF, std::out_of_range::~out_of_range()); + //REG_FUNC(0x7908CBAB, std::out_of_range::~out_of_range()); + //REG_FUNC(0xDCCE6368, std::strstreambuf::_Init(int, char*, char*, int)); + //REG_FUNC(0xD85AE271, std::strstreambuf::_Tidy()); + //REG_FUNC(0xD189E6CC, std::strstreambuf::freeze(bool)); + //REG_FUNC(0xFA6BDF33, std::strstreambuf::seekoff(long, std::_Iosb::_Seekdir, std::_Iosb::_Openmode)); + //REG_FUNC(0x97A9813A, std::strstreambuf::seekpos(std::fpos, std::_Iosb::_Openmode)); + //REG_FUNC(0xED2539E2, std::strstreambuf::overflow(int)); + //REG_FUNC(0xC725F896, std::strstreambuf::pbackfail(int)); + //REG_FUNC(0xA9F4FABF, std::strstreambuf::underflow()); + //REG_FUNC(0x1C887DDE, std::strstreambuf::~strstreambuf()); + //REG_FUNC(0x29E1E930, std::strstreambuf::~strstreambuf()); + //REG_FUNC(0xA140889, std::strstreambuf::~strstreambuf()); + //REG_FUNC(0xA8FE6FC4, std::_codecvt_base::~_codecvt_base()); + //REG_FUNC(0xB0E47AE4, std::_codecvt_base::~_codecvt_base()); + //REG_FUNC(0xB7EE9CC2, std::bad_exception::bad_exception(std::bad_exception const&)); + //REG_FUNC(0xD719280E, std::bad_exception::bad_exception()); + //REG_FUNC(0x37D2017F, std::bad_exception::bad_exception(std::bad_exception const&)); + //REG_FUNC(0x3DE54D83, std::bad_exception::bad_exception()); + //REG_FUNC(0xC7880D1A, std::bad_exception::~bad_exception()); + //REG_FUNC(0x486B59CE, std::bad_exception::~bad_exception()); + //REG_FUNC(0xD04E0BAB, std::bad_exception::~bad_exception()); + //REG_FUNC(0x792097AA, std::bad_exception::operator=(std::bad_exception const&)); + //REG_FUNC(0xCC369863, std::basic_filebuf >::sync()); + //REG_FUNC(0xC8BAB41E, std::basic_filebuf >::_Lock()); + //REG_FUNC(0xD5F03A74, std::basic_filebuf >::uflow()); + //REG_FUNC(0x413E813E, std::basic_filebuf >::setbuf(char*, int)); + //REG_FUNC(0x9D193B65, std::basic_filebuf >::_Unlock()); + //REG_FUNC(0x52E47FB5, std::basic_filebuf >::seekoff(long, std::_Iosb::_Seekdir, std::_Iosb::_Openmode)); + //REG_FUNC(0xE119B37, std::basic_filebuf >::seekpos(std::fpos, std::_Iosb::_Openmode)); + //REG_FUNC(0x616754BC, std::basic_filebuf >::overflow(int)); + //REG_FUNC(0xCD5BD2E1, std::basic_filebuf >::_Endwrite()); + //REG_FUNC(0xFC1C7F3A, std::basic_filebuf >::pbackfail(int)); + //REG_FUNC(0x31693B42, std::basic_filebuf >::underflow()); + //REG_FUNC(0xC2F03DFD, std::basic_filebuf >::~basic_filebuf()); + //REG_FUNC(0x54A77A0D, std::basic_filebuf >::~basic_filebuf()); + //REG_FUNC(0x253888BD, std::basic_filebuf >::sync()); + //REG_FUNC(0x4EC524DC, std::basic_filebuf >::_Lock()); + //REG_FUNC(0xE777348C, std::basic_filebuf >::uflow()); + //REG_FUNC(0x1E1E8BBF, std::basic_filebuf >::setbuf(wchar_t*, int)); + //REG_FUNC(0x281D0191, std::basic_filebuf >::_Unlock()); + //REG_FUNC(0x9C87B03F, std::basic_filebuf >::seekoff(long, std::_Iosb::_Seekdir, std::_Iosb::_Openmode)); + //REG_FUNC(0x8021D69B, std::basic_filebuf >::seekpos(std::fpos, std::_Iosb::_Openmode)); + //REG_FUNC(0xD8127E0A, std::basic_filebuf >::overflow(unsigned int)); + //REG_FUNC(0x99FDEB76, std::basic_filebuf >::_Endwrite()); + //REG_FUNC(0x950786D7, std::basic_filebuf >::pbackfail(unsigned int)); + //REG_FUNC(0x572A65D3, std::basic_filebuf >::underflow()); + //REG_FUNC(0x96D09EA4, std::basic_filebuf >::~basic_filebuf()); + //REG_FUNC(0xD434F085, std::basic_filebuf >::~basic_filebuf()); + //REG_FUNC(0xFFFA683E, std::basic_istream >::~basic_istream()); + //REG_FUNC(0xB58839C5, std::basic_istream >::~basic_istream()); + //REG_FUNC(0x9BF8855B, std::basic_ostream >::basic_ostream(std::basic_streambuf >*, bool)); + //REG_FUNC(0xD74F56E, std::basic_ostream >::~basic_ostream()); + //REG_FUNC(0x9B831B60, std::basic_ostream >::~basic_ostream()); + //REG_FUNC(0x396337CE, std::runtime_error::runtime_error(std::runtime_error const&)); + //REG_FUNC(0xDAD26367, std::runtime_error::~runtime_error()); + //REG_FUNC(0x7F1FDAEA, std::runtime_error::~runtime_error()); + //REG_FUNC(0xECC19AEB, std::runtime_error::~runtime_error()); + //REG_FUNC(0xE67F3768, std::overflow_error::overflow_error(std::overflow_error const&)); + //REG_FUNC(0xF7C46A5D, std::overflow_error::~overflow_error()); + //REG_FUNC(0x5C666F7E, std::overflow_error::~overflow_error()); + //REG_FUNC(0x4E45F680, std::overflow_error::~overflow_error()); + //REG_FUNC(0x626515E3, std::basic_streambuf >::sync()); + //REG_FUNC(0x2E55F15A, std::basic_streambuf >::_Lock()); + //REG_FUNC(0xF8535AB, std::basic_streambuf >::uflow()); + //REG_FUNC(0xD7933D06, std::basic_streambuf >::setbuf(char*, int)); + //REG_FUNC(0xB8BCCC8D, std::basic_streambuf >::xsgetn(char*, int)); + //REG_FUNC(0x43E5D0F1, std::basic_streambuf >::xsputn(char const*, int)); + //REG_FUNC(0x149B193A, std::basic_streambuf >::_Unlock()); + //REG_FUNC(0x600998EC, std::basic_streambuf >::seekoff(long, std::_Iosb::_Seekdir, std::_Iosb::_Openmode)); + //REG_FUNC(0x1DEFFD6, std::basic_streambuf >::seekpos(std::fpos, std::_Iosb::_Openmode)); + //REG_FUNC(0xF5F44352, std::basic_streambuf >::overflow(int)); + //REG_FUNC(0xCA79344F, std::basic_streambuf >::pbackfail(int)); + //REG_FUNC(0x441788B1, std::basic_streambuf >::showmanyc()); + //REG_FUNC(0x797DAE94, std::basic_streambuf >::underflow()); + //REG_FUNC(0x74AD52E, std::basic_streambuf >::~basic_streambuf()); + //REG_FUNC(0xE449E2BF, std::basic_streambuf >::~basic_streambuf()); + //REG_FUNC(0x9FAA0AA, std::basic_streambuf >::sync()); + //REG_FUNC(0xA596C88C, std::basic_streambuf >::_Lock()); + //REG_FUNC(0x373C2CD8, std::basic_streambuf >::uflow()); + //REG_FUNC(0x3F363796, std::basic_streambuf >::setbuf(wchar_t*, int)); + //REG_FUNC(0xABE96E40, std::basic_streambuf >::xsgetn(wchar_t*, int)); + //REG_FUNC(0x506D0DAE, std::basic_streambuf >::xsputn(wchar_t const*, int)); + //REG_FUNC(0xBD378207, std::basic_streambuf >::_Unlock()); + //REG_FUNC(0x924BD940, std::basic_streambuf >::seekoff(long, std::_Iosb::_Seekdir, std::_Iosb::_Openmode)); + //REG_FUNC(0x2CD1C1AF, std::basic_streambuf >::seekpos(std::fpos, std::_Iosb::_Openmode)); + //REG_FUNC(0xB0DD9881, std::basic_streambuf >::overflow(unsigned int)); + //REG_FUNC(0xDD04652F, std::basic_streambuf >::pbackfail(unsigned int)); + //REG_FUNC(0x9DCBD6A5, std::basic_streambuf >::showmanyc()); + //REG_FUNC(0xC3892DE5, std::basic_streambuf >::underflow()); + //REG_FUNC(0x8DFACE66, std::basic_streambuf >::~basic_streambuf()); + //REG_FUNC(0x868E865C, std::basic_streambuf >::~basic_streambuf()); + //REG_FUNC(0x9A59BC50, std::underflow_error::underflow_error(std::underflow_error const&)); + //REG_FUNC(0x47A589A4, std::underflow_error::~underflow_error()); + //REG_FUNC(0xCED74DE7, std::underflow_error::~underflow_error()); + //REG_FUNC(0xA76F038A, std::underflow_error::~underflow_error()); + //REG_FUNC(0x6332FA62, std::invalid_argument::invalid_argument(std::invalid_argument const&)); + //REG_FUNC(0x188D86CF, std::invalid_argument::~invalid_argument()); + //REG_FUNC(0x9982A4FC, std::invalid_argument::~invalid_argument()); + //REG_FUNC(0x1AB2B1AC, std::invalid_argument::~invalid_argument()); + //REG_FUNC(0xF9FAB558, std::_Mutex::_Lock()); + //REG_FUNC(0x402C9F8, std::_Mutex::_Unlock()); + //REG_FUNC(0x9DA92617, std::_Mutex::_Mutex(std::_Uninitialized)); + //REG_FUNC(0xA4F99AE7, std::_Mutex::_Mutex()); + //REG_FUNC(0x7B5A6B7F, std::_Mutex::_Mutex(std::_Uninitialized)); + //REG_FUNC(0x5C5CD6B9, std::_Mutex::_Mutex()); + //REG_FUNC(0x9B37CAD9, std::_Mutex::~_Mutex()); + //REG_FUNC(0x3E6A67FE, std::_Mutex::~_Mutex()); + //REG_FUNC(0xABB11CF9, std::_Winit::_Winit()); + //REG_FUNC(0x90DD73C3, std::_Winit::_Winit()); + //REG_FUNC(0x579C349B, std::_Winit::~_Winit()); + //REG_FUNC(0x3794ED15, std::_Winit::~_Winit()); + //REG_FUNC(0x24DA6258, std::_ctype::~_ctype()); + //REG_FUNC(0xF9C92C6A, std::_ctype::~_ctype()); + //REG_FUNC(0x554E4742, std::_ctype::~_ctype()); + //REG_FUNC(0xD4AEA4D3, std::_ctype::~_ctype()); + //REG_FUNC(0x5A7D89F0, std::_codecvt::~_codecvt()); + //REG_FUNC(0xB613F281, std::_codecvt::~_codecvt()); + //REG_FUNC(0x1E11185A, std::_codecvt::~_codecvt()); + //REG_FUNC(0x14125DF4, std::_codecvt::~_codecvt()); + //REG_FUNC(0xD2A4428D, std::bad_cast::bad_cast(std::bad_cast const&)); + //REG_FUNC(0x7922CC7C, std::bad_cast::bad_cast()); + //REG_FUNC(0x6DC64647, std::bad_cast::bad_cast(std::bad_cast const&)); + //REG_FUNC(0x596BA786, std::bad_cast::bad_cast()); + //REG_FUNC(0x5416699C, std::bad_cast::~bad_cast()); + //REG_FUNC(0x1D09710D, std::bad_cast::~bad_cast()); + //REG_FUNC(0x3C6B52E7, std::bad_cast::~bad_cast()); + //REG_FUNC(0x95966020, std::bad_cast::operator=(std::bad_cast const&)); + //REG_FUNC(0xF81D3B86, std::ios_base::register_callback(void (*)(std::ios_base::event, std::ios_base&, int), int)); + //REG_FUNC(0x5E60B2B3, std::ios_base::Init::Init()); + //REG_FUNC(0x5ED60DEE, std::ios_base::Init::Init()); + //REG_FUNC(0x65D88619, std::ios_base::Init::~Init()); + //REG_FUNC(0x3483E01D, std::ios_base::Init::~Init()); + //REG_FUNC(0x78CB190E, std::ios_base::_Init()); + //REG_FUNC(0x23B8BEE, std::ios_base::_Tidy()); + //REG_FUNC(0xC9DE8208, std::ios_base::clear(std::_Iosb::_Iostate, bool)); + //REG_FUNC(0xAA9171FB, std::ios_base::_Addstd()); + //REG_FUNC(0xFC58778, std::ios_base::copyfmt(std::ios_base const&)); + //REG_FUNC(0x2DF76755, std::ios_base::failure::failure(std::ios_base::failure const&)); + //REG_FUNC(0x94048F7, std::ios_base::failure::failure(std::string const&)); + //REG_FUNC(0x20AAAB95, std::ios_base::failure::~failure()); + //REG_FUNC(0x31D0197A, std::ios_base::failure::~failure()); + //REG_FUNC(0x7736E940, std::ios_base::_Callfns(std::ios_base::event)); + //REG_FUNC(0xE8C4640A, std::ios_base::_Findarr(int)); + //REG_FUNC(0xB8CFFB8D, std::ios_base::~ios_base()); + //REG_FUNC(0x40EA90D5, std::ios_base::~ios_base()); + //REG_FUNC(0xDCE89E71, std::ios_base::~ios_base()); + //REG_FUNC(0xE15EEC2A, std::bad_alloc::bad_alloc(std::bad_alloc const&)); + //REG_FUNC(0xEC3804D2, std::bad_alloc::bad_alloc()); + //REG_FUNC(0x6AF75467, std::bad_alloc::bad_alloc(std::bad_alloc const&)); + //REG_FUNC(0x57096162, std::bad_alloc::bad_alloc()); + //REG_FUNC(0xB2DAA408, std::bad_alloc::~bad_alloc()); + //REG_FUNC(0x7AEE736, std::bad_alloc::~bad_alloc()); + //REG_FUNC(0xA9E9B7B7, std::bad_alloc::~bad_alloc()); + //REG_FUNC(0x7853E8E5, std::bad_alloc::operator=(std::bad_alloc const&)); + //REG_FUNC(0xF78468EB, std::basic_ios >::~basic_ios()); + //REG_FUNC(0x3150182, std::basic_ios >::~basic_ios()); + //REG_FUNC(0x9654168A, std::basic_ios >::~basic_ios()); + //REG_FUNC(0x8FFB8524, std::basic_ios >::~basic_ios()); + //REG_FUNC(0x7AF1BB16, std::exception::_Set_raise_handler(void (*)(std::exception const&))); + //REG_FUNC(0x8C5A4417, std::exception::exception(std::exception const&)); + //REG_FUNC(0xFC169D71, std::exception::exception()); + //REG_FUNC(0x59758E74, std::exception::exception(std::exception const&)); + //REG_FUNC(0xE08376, std::exception::exception()); + //REG_FUNC(0x82EEA67E, std::exception::~exception()); + //REG_FUNC(0x30405D88, std::exception::~exception()); + //REG_FUNC(0xAF7A7081, std::exception::~exception()); + //REG_FUNC(0x6CE63118, std::exception::operator=(std::exception const&)); + //REG_FUNC(0x911F5A80, std::strstream::strstream(char*, int, std::_Iosb::_Openmode)); + //REG_FUNC(0x27166DDA, std::strstream::strstream(char*, int, std::_Iosb::_Openmode)); + //REG_FUNC(0xC4099868, std::strstream::~strstream()); + //REG_FUNC(0x98BD8AE1, std::strstream::~strstream()); + //REG_FUNC(0x7D8DFE43, std::strstream::~strstream()); + //REG_FUNC(0x8D4B1A13, std::type_info::~type_info()); + //REG_FUNC(0xBD786240, std::type_info::~type_info()); + //REG_FUNC(0xC04303, std::type_info::~type_info()); + //REG_FUNC(0x9983D8B9, std::unexpected()); + //REG_FUNC(0x385D19B2, std::setiosflags(std::_Iosb::_Fmtflags)); + //REG_FUNC(0xD8A78A61, std::setprecision(int)); + //REG_FUNC(0x994DDF94, std::resetiosflags(std::_Iosb::_Fmtflags)); + //REG_FUNC(0x13BAEE11, std::set_terminate(void (*)())); + //REG_FUNC(0x644CBAA2, std::_Debug_message(char const*, char const*)); + //REG_FUNC(0x9B2F0CA6, std::set_unexpected(void (*)())); + //REG_FUNC(0xC107B555, std::set_new_handler(void (*)())); + //REG_FUNC(0x11CEB00, std::uncaught_exception()); + //REG_FUNC(0x36282336, std::__gen_dummy_typeinfos()); + //REG_FUNC(0x3622003F, std::setw(int)); + //REG_FUNC(0x6CAFA8EF, std::_Throw(std::exception const&)); + //REG_FUNC(0xFD276300, std::_Fiopen(char const*, std::_Iosb::_Openmode, int)); + //REG_FUNC(0x1419E1DF, std::_Fiopen(wchar_t const*, std::_Iosb::_Openmode, int)); + //REG_FUNC(0x39587D21, std::setbase(int)); + //REG_FUNC(0x978EC4DC, std::terminate()); + //REG_FUNC(0x4A804953, non-virtual thunk to std::basic_iostream >::~basic_iostream()); + //REG_FUNC(0xABFBB0B4, non-virtual thunk to std::basic_iostream >::~basic_iostream()); + //REG_FUNC(0x6577F8FA, non-virtual thunk to std::strstream::~strstream()); + //REG_FUNC(0x77812119, non-virtual thunk to std::strstream::~strstream()); + //REG_FUNC(0xE4BD5E6A, virtual thunk to std::basic_iostream >::~basic_iostream()); + //REG_FUNC(0x1081224F, virtual thunk to std::basic_iostream >::~basic_iostream()); + //REG_FUNC(0x7CC8951D, virtual thunk to std::basic_istream >::~basic_istream()); + //REG_FUNC(0xC46CA5C9, virtual thunk to std::basic_istream >::~basic_istream()); + //REG_FUNC(0x699E7717, virtual thunk to std::basic_ostream >::~basic_ostream()); + //REG_FUNC(0x41DBA7E0, virtual thunk to std::basic_ostream >::~basic_ostream()); + //REG_FUNC(0x6FC84131, virtual thunk to std::istrstream::~istrstream()); + //REG_FUNC(0x7B4D8616, virtual thunk to std::istrstream::~istrstream()); + //REG_FUNC(0xD82D58BA, virtual thunk to std::ostrstream::~ostrstream()); + //REG_FUNC(0x5D4F7F7B, virtual thunk to std::ostrstream::~ostrstream()); + //REG_FUNC(0x10E7966F, virtual thunk to std::basic_istream >::~basic_istream()); + //REG_FUNC(0xC3718A8D, virtual thunk to std::basic_istream >::~basic_istream()); + //REG_FUNC(0x159261D1, virtual thunk to std::basic_ostream >::~basic_ostream()); + //REG_FUNC(0xB54EC1E5, virtual thunk to std::basic_ostream >::~basic_ostream()); + //REG_FUNC(0x2FB87ED7, virtual thunk to std::strstream::~strstream()); + //REG_FUNC(0xECEDE119, virtual thunk to std::strstream::~strstream()); + //REG_FUNC(0x91B0DC47, operator delete[](void*)); + //REG_FUNC(0xA7241F09, operator delete[](void*, std::nothrow_t const&)); + //REG_FUNC(0x3688FFDA, operator delete[](void*, void*)); + //REG_FUNC(0x72293931, operator delete(void*)); + //REG_FUNC(0x87EF85FF, operator delete(void*, std::nothrow_t const&)); + //REG_FUNC(0x1EB89099, operator delete(void*, void*)); + //REG_FUNC(0xE7FB2BF4, operator new[](unsigned int)); + //REG_FUNC(0x31C62481, operator new[](unsigned int, std::nothrow_t const&)); + //REG_FUNC(0xF99ED5AC, operator new(unsigned int)); + //REG_FUNC(0xAE71DC3, operator new(unsigned int, std::nothrow_t const&)); + //REG_FUNC(0x1818C323, _SNC_get_global_vars); + //REG_FUNC(0x2CFA1F15, _SNC_get_tlocal_vars); + //REG_FUNC(0x7742D916, _Unwind_Backtrace); + //REG_FUNC(0x32748B78, _Unwind_Complete); + //REG_FUNC(0xF6EA5CDE, _Unwind_DeleteException); + //REG_FUNC(0xCCD903C4, _Unwind_RaiseException); + //REG_FUNC(0x13D5D5A1, _Unwind_Resume); + //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); + //REG_FUNC(0x4E4CC399, __cxa_call_terminate); + //REG_FUNC(0x7C1A0217, __cxa_call_unexpected); + //REG_FUNC(0xF7BF277C, __cxa_current_exception_type); + //REG_FUNC(0x3438F773, __cxa_end_catch); + //REG_FUNC(0xD7C1E113, __cxa_end_cleanup); + //REG_FUNC(0x1FFD5FFF, __cxa_free_exception); + //REG_FUNC(0xBFFC0ED7, __cxa_get_exception_ptr); + //REG_FUNC(0x96656BBA, __cxa_get_globals); + //REG_FUNC(0x21D6C279, __cxa_rethrow); + //REG_FUNC(0xF87E6098, __cxa_throw); + //REG_FUNC(0x30D908F2, __cxa_type_match); + //REG_FUNC(0xAE42C1D5, __snc_personality_v0); + //REG_FUNC(0xDD200A6F, __cxxabiv1::__enum_type_info::~__enum_type_info()); + //REG_FUNC(0x436D61AD, __cxxabiv1::__enum_type_info::~__enum_type_info()); + //REG_FUNC(0x34854DA4, __cxxabiv1::__enum_type_info::~__enum_type_info()); + //REG_FUNC(0x9D5EDD21, __cxxabiv1::__array_type_info::~__array_type_info()); + //REG_FUNC(0xD6375908, __cxxabiv1::__array_type_info::~__array_type_info()); + //REG_FUNC(0xFDC450D4, __cxxabiv1::__array_type_info::~__array_type_info()); + //REG_FUNC(0x5CCFD0C0, __cxxabiv1::__class_type_info::~__class_type_info()); + //REG_FUNC(0xFBBFFF15, __cxxabiv1::__class_type_info::~__class_type_info()); + //REG_FUNC(0xA92DD3D2, __cxxabiv1::__class_type_info::~__class_type_info()); + //REG_FUNC(0x6C14868D, __cxxabiv1::__pbase_type_info::~__pbase_type_info()); + //REG_FUNC(0xC1869E57, __cxxabiv1::__pbase_type_info::~__pbase_type_info()); + //REG_FUNC(0x2DF92DB7, __cxxabiv1::__pbase_type_info::~__pbase_type_info()); + //REG_FUNC(0xA9654DFD, __cxxabiv1::__pointer_type_info::~__pointer_type_info()); + //REG_FUNC(0x703A2C05, __cxxabiv1::__pointer_type_info::~__pointer_type_info()); + //REG_FUNC(0x509AAD21, __cxxabiv1::__pointer_type_info::~__pointer_type_info()); + //REG_FUNC(0xB7DFB274, __cxxabiv1::__function_type_info::~__function_type_info()); + //REG_FUNC(0x19EA26FF, __cxxabiv1::__function_type_info::~__function_type_info()); + //REG_FUNC(0xF882187E, __cxxabiv1::__function_type_info::~__function_type_info()); + //REG_FUNC(0xE67722C3, __cxxabiv1::__si_class_type_info::~__si_class_type_info()); + //REG_FUNC(0xA7E25E3E, __cxxabiv1::__si_class_type_info::~__si_class_type_info()); + //REG_FUNC(0xACD6D901, __cxxabiv1::__si_class_type_info::~__si_class_type_info()); + //REG_FUNC(0x986F12C7, __cxxabiv1::__vmi_class_type_info::~__vmi_class_type_info()); + //REG_FUNC(0x4B5BC979, __cxxabiv1::__vmi_class_type_info::~__vmi_class_type_info()); + //REG_FUNC(0xA7B9AB93, __cxxabiv1::__vmi_class_type_info::~__vmi_class_type_info()); + //REG_FUNC(0x7436C981, __cxxabiv1::__fundamental_type_info::~__fundamental_type_info()); + //REG_FUNC(0x4EFBF43A, __cxxabiv1::__fundamental_type_info::~__fundamental_type_info()); + //REG_FUNC(0xF49AA0D3, __cxxabiv1::__fundamental_type_info::~__fundamental_type_info()); + //REG_FUNC(0x6199ACC9, __cxxabiv1::__pointer_to_member_type_info::~__pointer_to_member_type_info()); + //REG_FUNC(0xDD076510, __cxxabiv1::__pointer_to_member_type_info::~__pointer_to_member_type_info()); + //REG_FUNC(0xD4C11B17, __cxxabiv1::__pointer_to_member_type_info::~__pointer_to_member_type_info()); + //REG_FUNC(0xBF90A45A, _PJP_CPP_Copyright); + //REG_FUNC(0x3B6D9752, std::basic_string, std::allocator >::npos); + //REG_FUNC(0xA3498140, std::string::npos); + //REG_FUNC(0x5273EA3, std::_Num_int_base::is_bounded); + //REG_FUNC(0x8A0994F8, std::_Num_int_base::is_integer); + //REG_FUNC(0x401F1224, std::_Num_int_base::is_specialized); + //REG_FUNC(0xA65FE916, std::_Num_int_base::radix); + //REG_FUNC(0xF2AA872E, std::_Num_int_base::is_exact); + //REG_FUNC(0x8FE5A4F, std::_Num_int_base::is_modulo); + //REG_FUNC(0x7D4C55EC, std::numeric_limits::digits); + //REG_FUNC(0xA4E5BF5E, std::numeric_limits::digits10); + //REG_FUNC(0xD9938B84, std::numeric_limits::is_signed); + //REG_FUNC(0x56198D65, std::numeric_limits::digits); + //REG_FUNC(0xF52E5F76, std::numeric_limits::digits10); + //REG_FUNC(0x81B82E0E, std::numeric_limits::is_modulo); + //REG_FUNC(0x9E6D2025, std::numeric_limits::is_signed); + //REG_FUNC(0x810ED593, std::numeric_limits::digits); + //REG_FUNC(0xAC1A819, std::numeric_limits::digits10); + //REG_FUNC(0x660E14E1, std::numeric_limits::is_signed); + //REG_FUNC(0x3EEB3B23, std::numeric_limits::max_exponent); + //REG_FUNC(0x13B634BE, std::numeric_limits::min_exponent); + //REG_FUNC(0xDB4218A0, std::numeric_limits::max_exponent10); + //REG_FUNC(0x770B1CAC, std::numeric_limits::min_exponent10); + //REG_FUNC(0xD175A556, std::numeric_limits::digits); + //REG_FUNC(0xA5349445, std::numeric_limits::digits10); + //REG_FUNC(0x2F59E7FF, std::numeric_limits::max_exponent); + //REG_FUNC(0xC9C10644, std::numeric_limits::min_exponent); + //REG_FUNC(0xC80072AC, std::numeric_limits::max_exponent10); + //REG_FUNC(0xCA8B1B9E, std::numeric_limits::min_exponent10); + //REG_FUNC(0x7E9AFD39, std::numeric_limits::digits); + //REG_FUNC(0x6122F9BF, std::numeric_limits::digits10); + //REG_FUNC(0xA83B5FE2, std::numeric_limits::max_exponent); + //REG_FUNC(0x9347B146, std::numeric_limits::min_exponent); + //REG_FUNC(0x371BCFA6, std::numeric_limits::max_exponent10); + //REG_FUNC(0x6E6746EB, std::numeric_limits::min_exponent10); + //REG_FUNC(0xB102353D, std::numeric_limits::digits); + //REG_FUNC(0x781201BB, std::numeric_limits::digits10); + //REG_FUNC(0x26D618B8, std::numeric_limits::digits); + //REG_FUNC(0x8D593267, std::numeric_limits::digits10); + //REG_FUNC(0x96B86E89, std::numeric_limits::is_signed); + //REG_FUNC(0x9CDAA1F0, std::numeric_limits::digits); + //REG_FUNC(0xE8EB3133, std::numeric_limits::digits10); + //REG_FUNC(0x3AB38CDA, std::numeric_limits::is_signed); + //REG_FUNC(0xEEB7B642, std::numeric_limits::digits); + //REG_FUNC(0xBCDE68B3, std::numeric_limits::digits10); + //REG_FUNC(0xDA8EFB0, std::numeric_limits::is_signed); + //REG_FUNC(0x65DAD8D6, std::numeric_limits::digits); + //REG_FUNC(0xFB52BC0A, std::numeric_limits::digits10); + //REG_FUNC(0x63544FC, std::numeric_limits::is_signed); + //REG_FUNC(0x441D097A, std::numeric_limits::digits); + //REG_FUNC(0xB56F1B07, std::numeric_limits::digits10); + //REG_FUNC(0xA9799886, std::numeric_limits::is_signed); + //REG_FUNC(0x45C6A036, std::numeric_limits::digits); + //REG_FUNC(0xCDE02D9C, std::numeric_limits::digits10); + //REG_FUNC(0xB13AEAC3, std::numeric_limits::is_signed); + //REG_FUNC(0xBD813100, std::numeric_limits::digits); + //REG_FUNC(0x242C5313, std::numeric_limits::digits10); + //REG_FUNC(0x175A29B4, std::numeric_limits::is_signed); + //REG_FUNC(0x7E91BCD7, std::numeric_limits::digits); + //REG_FUNC(0x6B1CB79E, std::numeric_limits::digits10); + //REG_FUNC(0x9181475F, std::numeric_limits::is_signed); + //REG_FUNC(0x22F8FF46, std::numeric_limits::digits); + //REG_FUNC(0xF6E69A0D, std::numeric_limits::digits10); + //REG_FUNC(0xD01E5E34, std::numeric_limits::is_signed); + //REG_FUNC(0x4AB058B0, std::numeric_limits::digits); + //REG_FUNC(0x85F2F2D2, std::numeric_limits::digits10); + //REG_FUNC(0xDEDE9061, std::numeric_limits::is_signed); + //REG_FUNC(0x1CBE5DCB, std::_Num_float_base::has_denorm); + //REG_FUNC(0x616E0E6F, std::_Num_float_base::is_bounded); + //REG_FUNC(0xDFDE8E2C, std::_Num_float_base::is_integer); + //REG_FUNC(0x59668916, std::_Num_float_base::round_style); + //REG_FUNC(0x2FA7A240, std::_Num_float_base::has_infinity); + //REG_FUNC(0x4E98DCA0, std::_Num_float_base::has_quiet_NaN); + //REG_FUNC(0x87EB5304, std::_Num_float_base::is_specialized); + //REG_FUNC(0x1B36956D, std::_Num_float_base::has_denorm_loss); + //REG_FUNC(0xD3E2D87B, std::_Num_float_base::tinyness_before); + //REG_FUNC(0xBCEB9093, std::_Num_float_base::has_signaling_NaN); + //REG_FUNC(0x132F3288, std::_Num_float_base::radix); + //REG_FUNC(0xF8060433, std::_Num_float_base::traps); + //REG_FUNC(0x3C4A2891, std::_Num_float_base::is_exact); + //REG_FUNC(0xA3F55094, std::_Num_float_base::is_iec559); + //REG_FUNC(0xC8CB7207, std::_Num_float_base::is_modulo); + //REG_FUNC(0x1242E399, std::_Num_float_base::is_signed); + //REG_FUNC(0x762C3159, std::fpos::_Stz); + //REG_FUNC(0xFED4A09B, std::_Iosb::_Noreplace); + //REG_FUNC(0xE615A657, std::_Iosb::in); + //REG_FUNC(0x759FD02E, std::_Iosb::app); + //REG_FUNC(0x6F410A00, std::_Iosb::ate); + //REG_FUNC(0xD2A42D0C, std::_Iosb::beg); + //REG_FUNC(0x9B45C3B, std::_Iosb::cur); + //REG_FUNC(0x121A8952, std::_Iosb::dec); + //REG_FUNC(0x7CC027CD, std::_Iosb::end); + //REG_FUNC(0x6E2FF90B, std::_Iosb::hex); + //REG_FUNC(0xB4A55C29, std::_Iosb::oct); + //REG_FUNC(0x2CB2DC70, std::_Iosb::out); + //REG_FUNC(0x78E34A9, std::_Iosb::trunc); + //REG_FUNC(0xB5EFA1B3, std::_Iosb::badbit); + //REG_FUNC(0x5312A538, std::_Iosb::binary); + //REG_FUNC(0xD9D32526, std::_Iosb::skipws); + //REG_FUNC(0xAE6CA555, std::_Iosb::failbit); + //REG_FUNC(0x139E2D21, std::_Iosb::goodbit); + //REG_FUNC(0x7021DFF0, std::_Iosb::unitbuf); + //REG_FUNC(0x2AD61AAD, std::_Iosb::_Nocreate); + //REG_FUNC(0x60B16E4E, std::_Iosb::basefield); + //REG_FUNC(0x8137F8D7, std::_Winit::_Init_cnt); + //REG_FUNC(0x554B7625, std::ios_base::Init::_Init_cnt); + //REG_FUNC(0x57CF916C, std::ios_base::_Sync); + //REG_FUNC(0xF2D3416A, std::ios_base::_Index); + //REG_FUNC(0x3D219F98, std::_Num_base::has_denorm); + //REG_FUNC(0xD93E4A6C, std::_Num_base::is_bounded); + //REG_FUNC(0xB65169EF, std::_Num_base::is_integer); + //REG_FUNC(0x13B38354, std::_Num_base::round_style); + //REG_FUNC(0xB11D20E2, std::_Num_base::has_infinity); + //REG_FUNC(0x3E169F74, std::_Num_base::max_exponent); + //REG_FUNC(0xD7C041E0, std::_Num_base::min_exponent); + //REG_FUNC(0x2DA0D59, std::_Num_base::has_quiet_NaN); + //REG_FUNC(0xBE06BD79, std::_Num_base::is_specialized); + //REG_FUNC(0xEBBC4DDD, std::_Num_base::max_exponent10); + //REG_FUNC(0xFFCF7FC, std::_Num_base::min_exponent10); + //REG_FUNC(0xB317DDDF, std::_Num_base::has_denorm_loss); + //REG_FUNC(0x245D399E, std::_Num_base::tinyness_before); + //REG_FUNC(0xBD5F0B8A, std::_Num_base::has_signaling_NaN); + //REG_FUNC(0xE23BAE9E, std::_Num_base::radix); + //REG_FUNC(0x9237A154, std::_Num_base::traps); + //REG_FUNC(0xE8421A12, std::_Num_base::digits); + //REG_FUNC(0x80698934, std::_Num_base::digits10); + //REG_FUNC(0xB338C222, std::_Num_base::is_exact); + //REG_FUNC(0x1F5A7860, std::_Num_base::is_iec559); + //REG_FUNC(0x840107AA, std::_Num_base::is_modulo); + //REG_FUNC(0xABD7AE16, std::_Num_base::is_signed); + //REG_FUNC(0x4A1AB5B4, std::_Raise_handler); + //REG_FUNC(0x725EAC50, std::__dummy_typeinfo); + //REG_FUNC(0x768F2944, std::cin); + //REG_FUNC(0xD9478DCF, std::_Fpz); + //REG_FUNC(0x14B35A37, std::cerr); + //REG_FUNC(0xD361A52A, std::clog); + //REG_FUNC(0xB3867BB4, std::cout); + //REG_FUNC(0x8054BC8E, std::wcin); + //REG_FUNC(0x8B2001F7, std::wcerr); + //REG_FUNC(0x8E04C18C, std::wclog); + //REG_FUNC(0x4F726424, std::wcout); + //REG_FUNC(0x9C449444, std::_BADOFF); + //REG_FUNC(0xBFEF56B5, std::nothrow); + //REG_FUNC(0xDC18EF42, typeinfo for __simd64_int8_t); + //REG_FUNC(0x2207D305, typeinfo for __simd128_int8_t); + //REG_FUNC(0x869FEDA9, typeinfo for __simd64_int16_t); + //REG_FUNC(0x7CEF3DB5, typeinfo for __simd64_int32_t); + //REG_FUNC(0xFE09AD25, typeinfo for __simd64_poly8_t); + //REG_FUNC(0x14A3598E, typeinfo for __simd64_uint8_t); + //REG_FUNC(0xF4B098DD, typeinfo for __simd128_int16_t); + //REG_FUNC(0xAABF056C, typeinfo for __simd128_int32_t); + //REG_FUNC(0x305068B1, typeinfo for __simd128_poly8_t); + //REG_FUNC(0x74813D4D, typeinfo for __simd128_uint8_t); + //REG_FUNC(0xE118AB78, typeinfo for __simd64_poly16_t); + //REG_FUNC(0x67E05799, typeinfo for __simd64_uint16_t); + //REG_FUNC(0x1617E8CB, typeinfo for __simd64_uint32_t); + //REG_FUNC(0x2FACB1EF, typeinfo for __simd128_poly16_t); + //REG_FUNC(0xC089FED3, typeinfo for __simd128_uint16_t); + //REG_FUNC(0xFC00EC48, typeinfo for __simd128_uint32_t); + //REG_FUNC(0x237AF69B, typeinfo for __simd64_float16_t); + //REG_FUNC(0xF7FDBBED, typeinfo for __simd64_float32_t); + //REG_FUNC(0x525557F3, typeinfo for __simd128_float16_t); + //REG_FUNC(0xA4018B84, typeinfo for __simd128_float32_t); + //REG_FUNC(0xA1FE4058, typeinfo for half); + //REG_FUNC(0x5351829B, typeinfo for std::ios_base::failure); + //REG_FUNC(0xAC6C8F, typeinfo for __simd64_int8_t*); + //REG_FUNC(0xD5B056B8, typeinfo for __simd128_int8_t*); + //REG_FUNC(0x13975DAE, typeinfo for __simd64_int16_t*); + //REG_FUNC(0x963C04E3, typeinfo for __simd64_int32_t*); + //REG_FUNC(0x9F43A559, typeinfo for __simd64_poly8_t*); + //REG_FUNC(0xD8079FA9, typeinfo for __simd64_uint8_t*); + //REG_FUNC(0xEF53FE1F, typeinfo for __simd128_int16_t*); + //REG_FUNC(0xA5094302, typeinfo for __simd128_int32_t*); + //REG_FUNC(0x9CAF5E5A, typeinfo for __simd128_poly8_t*); + //REG_FUNC(0x264B0978, typeinfo for __simd128_uint8_t*); + //REG_FUNC(0x214A0488, typeinfo for __simd64_poly16_t*); + //REG_FUNC(0xA96D02B1, typeinfo for __simd64_uint16_t*); + //REG_FUNC(0xEE862280, typeinfo for __simd64_uint32_t*); + //REG_FUNC(0xB5CEC4FF, typeinfo for __simd128_poly16_t*); + //REG_FUNC(0x46124E82, typeinfo for __simd128_uint16_t*); + //REG_FUNC(0x7E6CC17, typeinfo for __simd128_uint32_t*); + //REG_FUNC(0x588EBCAD, typeinfo for __simd64_float16_t*); + //REG_FUNC(0xDFCB2417, typeinfo for __simd64_float32_t*); + //REG_FUNC(0x9502D3C0, typeinfo for __simd128_float16_t*); + //REG_FUNC(0xFB84796C, typeinfo for __simd128_float32_t*); + //REG_FUNC(0xA43ABF14, typeinfo for half*); + //REG_FUNC(0x37A74E46, typeinfo for __simd64_int8_t const*); + //REG_FUNC(0x60D7D920, typeinfo for __simd128_int8_t const*); + //REG_FUNC(0x52A04C47, typeinfo for __simd64_int16_t const*); + //REG_FUNC(0xBB64CCF1, typeinfo for __simd64_int32_t const*); + //REG_FUNC(0x7C9D0C33, typeinfo for __simd64_poly8_t const*); + //REG_FUNC(0x21A57A1, typeinfo for __simd64_uint8_t const*); + //REG_FUNC(0x21E3DD1, typeinfo for __simd128_int16_t const*); + //REG_FUNC(0xFF8DDBE7, typeinfo for __simd128_int32_t const*); + //REG_FUNC(0xB30AB3B5, typeinfo for __simd128_poly8_t const*); + //REG_FUNC(0xC8721E86, typeinfo for __simd128_uint8_t const*); + //REG_FUNC(0x610983B7, typeinfo for __simd64_poly16_t const*); + //REG_FUNC(0x486A3970, typeinfo for __simd64_uint16_t const*); + //REG_FUNC(0x9577D4FD, typeinfo for __simd64_uint32_t const*); + //REG_FUNC(0x192861D3, typeinfo for __simd128_poly16_t const*); + //REG_FUNC(0x9C721F27, typeinfo for __simd128_uint16_t const*); + //REG_FUNC(0xC0A37F8F, typeinfo for __simd128_uint32_t const*); + //REG_FUNC(0xF2FCDEFC, typeinfo for __simd64_float16_t const*); + //REG_FUNC(0x2D2B93F7, typeinfo for __simd64_float32_t const*); + //REG_FUNC(0x6B7DA1FD, typeinfo for __simd128_float16_t const*); + //REG_FUNC(0x15CA84E1, typeinfo for __simd128_float32_t const*); + //REG_FUNC(0x6195F016, typeinfo for half const*); + //REG_FUNC(0x2059F4C0, typeinfo for long long __vector const*); + //REG_FUNC(0xFCC4EE61, typeinfo for unsigned long long __vector const*); + //REG_FUNC(0x63E0CE97, typeinfo for signed char const*); + //REG_FUNC(0x47A13017, typeinfo for bool const*); + //REG_FUNC(0x8C375D81, typeinfo for char const*); + //REG_FUNC(0x841645BA, typeinfo for double const*); + //REG_FUNC(0x179015C1, typeinfo for long double const*); + //REG_FUNC(0xF7F85635, typeinfo for float const*); + //REG_FUNC(0x54CF62A4, typeinfo for unsigned char const*); + //REG_FUNC(0x33DAF949, typeinfo for int const*); + //REG_FUNC(0x703C1962, typeinfo for unsigned int const*); + //REG_FUNC(0xF353DAF3, typeinfo for long const*); + //REG_FUNC(0x67092852, typeinfo for unsigned long const*); + //REG_FUNC(0xDAAEEAD0, typeinfo for short const*); + //REG_FUNC(0x39790E0A, typeinfo for unsigned short const*); + //REG_FUNC(0xEE47C447, typeinfo for void const*); + //REG_FUNC(0xECDB6B05, typeinfo for wchar_t const*); + //REG_FUNC(0xC20CF55C, typeinfo for long long const*); + //REG_FUNC(0xA0F5E8F5, typeinfo for unsigned long long const*); + //REG_FUNC(0xA6C2A25C, typeinfo for long long __vector*); + //REG_FUNC(0x81B51915, typeinfo for unsigned long long __vector*); + //REG_FUNC(0xA7CB4EAA, typeinfo for signed char*); + //REG_FUNC(0x87B0FB6, typeinfo for bool*); + //REG_FUNC(0xE4D24E14, typeinfo for char*); + //REG_FUNC(0x6825FFE6, typeinfo for double*); + //REG_FUNC(0x926B9A3A, typeinfo for long double*); + //REG_FUNC(0x24072F3E, typeinfo for float*); + //REG_FUNC(0x8B5247B, typeinfo for unsigned char*); + //REG_FUNC(0x15C21CC8, typeinfo for int*); + //REG_FUNC(0xD234CF18, typeinfo for unsigned int*); + //REG_FUNC(0x50E25810, typeinfo for long*); + //REG_FUNC(0x9D0DBB1A, typeinfo for unsigned long*); + //REG_FUNC(0xDCB7CD94, typeinfo for short*); + //REG_FUNC(0x7FC4B19D, typeinfo for unsigned short*); + //REG_FUNC(0x4722F2AE, typeinfo for void*); + //REG_FUNC(0x2208C899, typeinfo for wchar_t*); + //REG_FUNC(0xE64F5994, typeinfo for long long*); + //REG_FUNC(0xC1C20AC0, typeinfo for unsigned long long*); + //REG_FUNC(0xD7A9284F, typeinfo for std::iostream); + //REG_FUNC(0xE302D51A, typeinfo for std::istream); + //REG_FUNC(0xF9426257, typeinfo for std::ostream); + //REG_FUNC(0x7242603B, typeinfo for std::bad_typeid); + //REG_FUNC(0x67B82DEF, typeinfo for std::istrstream); + //REG_FUNC(0x9F17589B, typeinfo for std::ostrstream); + //REG_FUNC(0xE0E3C75A, typeinfo for std::_ctype_base); + //REG_FUNC(0x87457513, typeinfo for std::logic_error); + //REG_FUNC(0x2B71045A, typeinfo for std::range_error); + //REG_FUNC(0x9A72EBFE, typeinfo for std::domain_error); + //REG_FUNC(0x15E6C91C, typeinfo for std::length_error); + //REG_FUNC(0xBAC29E4D, typeinfo for std::out_of_range); + //REG_FUNC(0x8257DFA2, typeinfo for std::strstreambuf); + //REG_FUNC(0x34455CAF, typeinfo for std::_codecvt_base); + //REG_FUNC(0xF4A5A537, typeinfo for std::bad_exception); + //REG_FUNC(0x33C19D3B, typeinfo for std::basic_filebuf >); + //REG_FUNC(0x83DB8917, typeinfo for std::basic_filebuf >); + //REG_FUNC(0x1582929A, typeinfo for std::basic_istream >); + //REG_FUNC(0xF4062B77, typeinfo for std::basic_ostream >); + //REG_FUNC(0x2451AF0A, typeinfo for std::runtime_error); + //REG_FUNC(0x3EE22853, typeinfo for std::overflow_error); + //REG_FUNC(0x758B452B, typeinfo for std::basic_streambuf >); + //REG_FUNC(0x52B5EC73, typeinfo for std::basic_streambuf >); + //REG_FUNC(0xCD0A98ED, typeinfo for std::underflow_error); + //REG_FUNC(0xA128D5A0, typeinfo for std::invalid_argument); + //REG_FUNC(0xE2AB6BF9, typeinfo for std::_Iosb); + //REG_FUNC(0x3FD78B17, typeinfo for std::_ctype); + //REG_FUNC(0xA8CD5D05, typeinfo for std::_ctype); + //REG_FUNC(0xAFB2B7FB, typeinfo for std::_codecvt); + //REG_FUNC(0xCA25D9BE, typeinfo for std::_codecvt); + //REG_FUNC(0xA7CA7C93, typeinfo for std::bad_cast); + //REG_FUNC(0xB93721C7, typeinfo for std::ios_base); + //REG_FUNC(0x35E135A0, typeinfo for std::bad_alloc); + //REG_FUNC(0x7BA61382, typeinfo for std::basic_ios >); + //REG_FUNC(0x905B8B0, typeinfo for std::basic_ios >); + //REG_FUNC(0x1E8C6100, typeinfo for std::exception); + //REG_FUNC(0x1CC15F54, typeinfo for std::strstream); + //REG_FUNC(0x8A026EAD, typeinfo for std::type_info); + //REG_FUNC(0xE128260C, typeinfo for long long __vector); + //REG_FUNC(0x44C2FA39, typeinfo for unsigned long long __vector); + //REG_FUNC(0x4F416B30, typeinfo for signed char); + //REG_FUNC(0x3081D959, typeinfo for bool); + //REG_FUNC(0x942D2342, typeinfo for char); + //REG_FUNC(0x685BA1E8, typeinfo for double); + //REG_FUNC(0xFCE46A43, typeinfo for long double); + //REG_FUNC(0x64AEB8AF, typeinfo for float); + //REG_FUNC(0x606676D4, typeinfo for unsigned char); + //REG_FUNC(0xA58E84A3, typeinfo for int); + //REG_FUNC(0x9B0CBEC0, typeinfo for unsigned int); + //REG_FUNC(0xD589E8AE, typeinfo for long); + //REG_FUNC(0xD39774A5, typeinfo for unsigned long); + //REG_FUNC(0xDC2C85B0, typeinfo for short); + //REG_FUNC(0xEA3FB57B, typeinfo for unsigned short); + //REG_FUNC(0x76C6BDCE, typeinfo for void); + //REG_FUNC(0x8BFC9260, typeinfo for wchar_t); + //REG_FUNC(0x90B0194C, typeinfo for long long); + //REG_FUNC(0x16DACFBF, typeinfo for unsigned long long); + //REG_FUNC(0x720678AD, typeinfo name for __simd64_int8_t); + //REG_FUNC(0x5B9F1D83, typeinfo name for __simd128_int8_t); + //REG_FUNC(0x953ECE43, typeinfo name for __simd64_int16_t); + //REG_FUNC(0xCE27612E, typeinfo name for __simd64_int32_t); + //REG_FUNC(0x72BC6CD9, typeinfo name for __simd64_poly8_t); + //REG_FUNC(0xCD2802B5, typeinfo name for __simd64_uint8_t); + //REG_FUNC(0xC3FA8530, typeinfo name for __simd128_int16_t); + //REG_FUNC(0x67A63A08, typeinfo name for __simd128_int32_t); + //REG_FUNC(0x6B26EFF8, typeinfo name for __simd128_poly8_t); + //REG_FUNC(0x8C4C69F, typeinfo name for __simd128_uint8_t); + //REG_FUNC(0x40BC2E0E, typeinfo name for __simd64_poly16_t); + //REG_FUNC(0x8D1AE4A7, typeinfo name for __simd64_uint16_t); + //REG_FUNC(0xC4096952, typeinfo name for __simd64_uint32_t); + //REG_FUNC(0x16D366F1, typeinfo name for __simd128_poly16_t); + //REG_FUNC(0x45552A1, typeinfo name for __simd128_uint16_t); + //REG_FUNC(0x7DBF4FFF, typeinfo name for __simd128_uint32_t); + //REG_FUNC(0xED26DE1, typeinfo name for __simd64_float16_t); + //REG_FUNC(0xAB0D789A, typeinfo name for __simd64_float32_t); + //REG_FUNC(0x3200DDB, typeinfo name for __simd128_float16_t); + //REG_FUNC(0xD54CBD7C, typeinfo name for __simd128_float32_t); + //REG_FUNC(0xA8E6842E, typeinfo name for half); + //REG_FUNC(0x5246E71E, typeinfo name for std::ios_base::failure); + //REG_FUNC(0xF98AAA03, typeinfo name for __simd64_int8_t*); + //REG_FUNC(0xAF5AA646, typeinfo name for __simd128_int8_t*); + //REG_FUNC(0x73874089, typeinfo name for __simd64_int16_t*); + //REG_FUNC(0xAD912141, typeinfo name for __simd64_int32_t*); + //REG_FUNC(0x67D1351B, typeinfo name for __simd64_poly8_t*); + //REG_FUNC(0x9FDDB92F, typeinfo name for __simd64_uint8_t*); + //REG_FUNC(0xA9B31841, typeinfo name for __simd128_int16_t*); + //REG_FUNC(0x244C742C, typeinfo name for __simd128_int32_t*); + //REG_FUNC(0x31AFE1A0, typeinfo name for __simd128_poly8_t*); + //REG_FUNC(0x5CF817B0, typeinfo name for __simd128_uint8_t*); + //REG_FUNC(0xB524B325, typeinfo name for __simd64_poly16_t*); + //REG_FUNC(0x51A1F225, typeinfo name for __simd64_uint16_t*); + //REG_FUNC(0x9C3431DD, typeinfo name for __simd64_uint32_t*); + //REG_FUNC(0x937A4F2F, typeinfo name for __simd128_poly16_t*); + //REG_FUNC(0x33549DB5, typeinfo name for __simd128_uint16_t*); + //REG_FUNC(0xFC19AC06, typeinfo name for __simd128_uint32_t*); + //REG_FUNC(0xD9A43D3A, typeinfo name for __simd64_float16_t*); + //REG_FUNC(0xFAB5D659, typeinfo name for __simd64_float32_t*); + //REG_FUNC(0x7E694471, typeinfo name for __simd128_float16_t*); + //REG_FUNC(0xA9AF9CE8, typeinfo name for __simd128_float32_t*); + //REG_FUNC(0xDAE584EC, typeinfo name for half*); + //REG_FUNC(0x2B017F22, typeinfo name for __simd64_int8_t const*); + //REG_FUNC(0x4A7149C9, typeinfo name for __simd128_int8_t const*); + //REG_FUNC(0xAC116166, typeinfo name for __simd64_int16_t const*); + //REG_FUNC(0x6A472A63, typeinfo name for __simd64_int32_t const*); + //REG_FUNC(0xC356ACF6, typeinfo name for __simd64_poly8_t const*); + //REG_FUNC(0x878C75F4, typeinfo name for __simd64_uint8_t const*); + //REG_FUNC(0x68B777E3, typeinfo name for __simd128_int16_t const*); + //REG_FUNC(0x61188BD, typeinfo name for __simd128_int32_t const*); + //REG_FUNC(0xC7733F13, typeinfo name for __simd128_poly8_t const*); + //REG_FUNC(0x3D8A69EC, typeinfo name for __simd128_uint8_t const*); + //REG_FUNC(0xCC081D58, typeinfo name for __simd64_poly16_t const*); + //REG_FUNC(0xEB50ABA7, typeinfo name for __simd64_uint16_t const*); + //REG_FUNC(0x25EC8CE5, typeinfo name for __simd64_uint32_t const*); + //REG_FUNC(0x5C61F109, typeinfo name for __simd128_poly16_t const*); + //REG_FUNC(0x9B085E3F, typeinfo name for __simd128_uint16_t const*); + //REG_FUNC(0x721902EF, typeinfo name for __simd128_uint32_t const*); + //REG_FUNC(0x1C618B7E, typeinfo name for __simd64_float16_t const*); + //REG_FUNC(0x89B6EDD3, typeinfo name for __simd64_float32_t const*); + //REG_FUNC(0x9BC380FF, typeinfo name for __simd128_float16_t const*); + //REG_FUNC(0xC951A9C5, typeinfo name for __simd128_float32_t const*); + //REG_FUNC(0x2796C952, typeinfo name for half const*); + //REG_FUNC(0xC33238AA, typeinfo name for long long __vector const*); + //REG_FUNC(0x208CEEA8, typeinfo name for unsigned long long __vector const*); + //REG_FUNC(0xBAD19257, typeinfo name for signed char const*); + //REG_FUNC(0x6CB2F5A4, typeinfo name for bool const*); + //REG_FUNC(0xE242CC59, typeinfo name for char const*); + //REG_FUNC(0xA0C8CCE9, typeinfo name for double const*); + //REG_FUNC(0x5C69903D, typeinfo name for long double const*); + //REG_FUNC(0xDBF8E0D1, typeinfo name for float const*); + //REG_FUNC(0x1BC277F5, typeinfo name for unsigned char const*); + //REG_FUNC(0xF09F6E45, typeinfo name for int const*); + //REG_FUNC(0x5C6D9EDD, typeinfo name for unsigned int const*); + //REG_FUNC(0x12416EBE, typeinfo name for long const*); + //REG_FUNC(0x199F6347, typeinfo name for unsigned long const*); + //REG_FUNC(0xA1D68767, typeinfo name for short const*); + //REG_FUNC(0xE6498BCD, typeinfo name for unsigned short const*); + //REG_FUNC(0xF0FF237E, typeinfo name for void const*); + //REG_FUNC(0xD255293A, typeinfo name for wchar_t const*); + //REG_FUNC(0x2EADF5EC, typeinfo name for long long const*); + //REG_FUNC(0xEC3461AB, typeinfo name for unsigned long long const*); + //REG_FUNC(0xB3EDCB7F, typeinfo name for long long __vector*); + //REG_FUNC(0x6D11C7D6, typeinfo name for unsigned long long __vector*); + //REG_FUNC(0xC5AC688C, typeinfo name for signed char*); + //REG_FUNC(0xE4EB3C43, typeinfo name for bool*); + //REG_FUNC(0xAEF69715, typeinfo name for char*); + //REG_FUNC(0x6F81469F, typeinfo name for double*); + //REG_FUNC(0xFD38BF3B, typeinfo name for long double*); + //REG_FUNC(0xFCB96733, typeinfo name for float*); + //REG_FUNC(0x5BFE19AB, typeinfo name for unsigned char*); + //REG_FUNC(0x187E3B47, typeinfo name for int*); + //REG_FUNC(0x2F4A5390, typeinfo name for unsigned int*); + //REG_FUNC(0x651D020E, typeinfo name for long*); + //REG_FUNC(0x6E4D412D, typeinfo name for unsigned long*); + //REG_FUNC(0x982D9703, typeinfo name for short*); + //REG_FUNC(0xE2A0B0A8, typeinfo name for unsigned short*); + //REG_FUNC(0xF7B6B02A, typeinfo name for void*); + //REG_FUNC(0xF1C9A755, typeinfo name for wchar_t*); + //REG_FUNC(0x968B212, typeinfo name for long long*); + //REG_FUNC(0x9787CAD, typeinfo name for unsigned long long*); + //REG_FUNC(0xF86F5756, typeinfo name for std::iostream); + //REG_FUNC(0x999300E0, typeinfo name for std::istream); + //REG_FUNC(0x591C25A3, typeinfo name for std::ostream); + //REG_FUNC(0xFC9D21B, typeinfo name for std::bad_typeid); + //REG_FUNC(0x867D109E, typeinfo name for std::istrstream); + //REG_FUNC(0x88BFC745, typeinfo name for std::ostrstream); + //REG_FUNC(0xB315CE7A, typeinfo name for std::_ctype_base); + //REG_FUNC(0xA65DACDF, typeinfo name for std::logic_error); + //REG_FUNC(0x1B8E7108, typeinfo name for std::range_error); + //REG_FUNC(0xBE23707A, typeinfo name for std::domain_error); + //REG_FUNC(0x9E317CE1, typeinfo name for std::length_error); + //REG_FUNC(0xD8DAD98D, typeinfo name for std::out_of_range); + //REG_FUNC(0x1C929309, typeinfo name for std::strstreambuf); + //REG_FUNC(0xE17E4D6, typeinfo name for std::_codecvt_base); + //REG_FUNC(0x918FE198, typeinfo name for std::bad_exception); + //REG_FUNC(0x227B4568, typeinfo name for std::basic_filebuf >); + //REG_FUNC(0xD34BAF59, typeinfo name for std::basic_filebuf >); + //REG_FUNC(0x4381D6B0, typeinfo name for std::basic_istream >); + //REG_FUNC(0x8D487027, typeinfo name for std::basic_ostream >); + //REG_FUNC(0xCAA9B21D, typeinfo name for std::runtime_error); + //REG_FUNC(0xA21B1185, typeinfo name for std::overflow_error); + //REG_FUNC(0x4A1A1314, typeinfo name for std::basic_streambuf >); + //REG_FUNC(0x26C1C38F, typeinfo name for std::basic_streambuf >); + //REG_FUNC(0x140AE4BB, typeinfo name for std::underflow_error); + //REG_FUNC(0xC3CD5E06, typeinfo name for std::invalid_argument); + //REG_FUNC(0xB07DF922, typeinfo name for std::_Iosb); + //REG_FUNC(0xED549839, typeinfo name for std::_ctype); + //REG_FUNC(0x89304937, typeinfo name for std::_ctype); + //REG_FUNC(0x17AAF611, typeinfo name for std::_codecvt); + //REG_FUNC(0xB4C66A72, typeinfo name for std::_codecvt); + //REG_FUNC(0x4C50F26D, typeinfo name for std::bad_cast); + //REG_FUNC(0xA263F3D5, typeinfo name for std::ios_base); + //REG_FUNC(0x8DA9C17C, typeinfo name for std::_numpunct); + //REG_FUNC(0xC4F9C216, typeinfo name for std::_numpunct); + //REG_FUNC(0xDF0FFCD2, typeinfo name for std::bad_alloc); + //REG_FUNC(0xB37BE412, typeinfo name for std::basic_ios >); + //REG_FUNC(0xCA50ACCA, typeinfo name for std::basic_ios >); + //REG_FUNC(0x45FD9715, typeinfo name for std::exception); + //REG_FUNC(0xE5C789D4, typeinfo name for std::strstream); + //REG_FUNC(0x2856DCD6, typeinfo name for std::type_info); + //REG_FUNC(0x75A1CED4, typeinfo name for long long __vector); + //REG_FUNC(0x508FF61E, typeinfo name for unsigned long long __vector); + //REG_FUNC(0x8E6A51A, typeinfo name for signed char); + //REG_FUNC(0x491DB7D3, typeinfo name for bool); + //REG_FUNC(0xD657B5A0, typeinfo name for char); + //REG_FUNC(0x322C7CB5, typeinfo name for double); + //REG_FUNC(0x596C02C7, typeinfo name for long double); + //REG_FUNC(0x2434A5DD, typeinfo name for float); + //REG_FUNC(0x890DE9E8, typeinfo name for unsigned char); + //REG_FUNC(0x4B9F21DF, typeinfo name for int); + //REG_FUNC(0x4C2D1984, typeinfo name for unsigned int); + //REG_FUNC(0x46E67574, typeinfo name for long); + //REG_FUNC(0xEE238074, typeinfo name for unsigned long); + //REG_FUNC(0x8C9CDB9C, typeinfo name for short); + //REG_FUNC(0xED2E996A, typeinfo name for unsigned short); + //REG_FUNC(0xD4744378, typeinfo name for void); + //REG_FUNC(0x2C50C827, typeinfo name for wchar_t); + //REG_FUNC(0x9574359B, typeinfo name for long long); + //REG_FUNC(0x402717E4, typeinfo name for unsigned long long); + //REG_FUNC(0x51B29810, VTT for std::iostream); + //REG_FUNC(0x52128B13, VTT for std::istream); + //REG_FUNC(0x3C508708, VTT for std::ostream); + //REG_FUNC(0x87753F6, VTT for std::istrstream); + //REG_FUNC(0xE3D7CB30, VTT for std::ostrstream); + //REG_FUNC(0xBC326B50, VTT for std::basic_istream >); + //REG_FUNC(0x16E32018, VTT for std::basic_ostream >); + //REG_FUNC(0xC91F7671, VTT for std::strstream); + //REG_FUNC(0x648213CC, vtable for std::ios_base::failure); + //REG_FUNC(0x796EA5C0, vtable for std::iostream); + //REG_FUNC(0xC5D326CB, _ZTVSd__St9strstream); + //REG_FUNC(0xB02CB03C, vtable for std::istream); + //REG_FUNC(0xF4400A94, _ZTVSiSd__St9strstream); + //REG_FUNC(0xF2A1132D, _ZTVSi__Sd); + //REG_FUNC(0xDFF04427, _ZTVSi__St10istrstream); + //REG_FUNC(0xD430E6D2, vtable for std::ostream); + //REG_FUNC(0x3CAA5F50, _ZTVSoSd__St9strstream); + //REG_FUNC(0x6D6BCA93, _ZTVSo__Sd); + //REG_FUNC(0xBA833AE3, _ZTVSo__Sd__St9strstream); + //REG_FUNC(0x65069CB5, _ZTVSo__St10ostrstream); + //REG_FUNC(0x76BDD7CC, vtable for std::bad_typeid); + //REG_FUNC(0xFBACB296, vtable for std::istrstream); + //REG_FUNC(0xA81AD21D, vtable for std::ostrstream); + //REG_FUNC(0x82A84E5E, vtable for std::logic_error); + //REG_FUNC(0x1D583475, vtable for std::range_error); + //REG_FUNC(0x80C77E16, vtable for std::domain_error); + //REG_FUNC(0x64ADA35, vtable for std::length_error); + //REG_FUNC(0xDDAE7CBE, vtable for std::out_of_range); + //REG_FUNC(0x11B2781A, vtable for std::strstreambuf); + //REG_FUNC(0x75D16BD0, vtable for std::_codecvt_base); + //REG_FUNC(0x4AA9C954, vtable for std::bad_exception); + //REG_FUNC(0xC3233C50, vtable for std::basic_filebuf >); + //REG_FUNC(0xF269A8EB, vtable for std::basic_filebuf >); + //REG_FUNC(0xB952752B, vtable for std::basic_istream >); + //REG_FUNC(0x48F3405B, vtable for std::basic_ostream >); + //REG_FUNC(0x53F02A18, vtable for std::runtime_error); + //REG_FUNC(0x177FCCDC, vtable for std::overflow_error); + //REG_FUNC(0x5548FF7, vtable for std::basic_streambuf >); + //REG_FUNC(0xE8A9F32E, vtable for std::basic_streambuf >); + //REG_FUNC(0x515AE097, vtable for std::underflow_error); + //REG_FUNC(0x23EEDAF0, vtable for std::invalid_argument); + //REG_FUNC(0x214E1395, vtable for std::_ctype); + //REG_FUNC(0x798E7C29, vtable for std::_ctype); + //REG_FUNC(0x9B3E5D29, vtable for std::_codecvt); + //REG_FUNC(0x95405266, vtable for std::_codecvt); + //REG_FUNC(0xAA09FD32, vtable for std::bad_cast); + //REG_FUNC(0xD58C5F52, vtable for std::ios_base); + //REG_FUNC(0xA27EFBA3, vtable for std::bad_alloc); + //REG_FUNC(0x147996ED, vtable for std::basic_ios >); + //REG_FUNC(0xDE4AFE9, _ZTVSt9basic_iosIcSt11char_traitsIcEE__Sd__St9strstream); + //REG_FUNC(0x87D18300, _ZTVSt9basic_iosIcSt11char_traitsIcEE__SiSd__St9strstream); + //REG_FUNC(0x3D6A38D3, _ZTVSt9basic_iosIcSt11char_traitsIcEE__Si__Sd); + //REG_FUNC(0xA8E795AF, _ZTVSt9basic_iosIcSt11char_traitsIcEE__Si__St10istrstream); + //REG_FUNC(0xB7CD4C0E, _ZTVSt9basic_iosIcSt11char_traitsIcEE__SoSd__St9strstream); + //REG_FUNC(0x21FDA8D0, _ZTVSt9basic_iosIcSt11char_traitsIcEE__So__Sd); + //REG_FUNC(0xA8AAEABA, _ZTVSt9basic_iosIcSt11char_traitsIcEE__So__St10ostrstream); + //REG_FUNC(0xCC03F184, vtable for std::basic_ios >); + //REG_FUNC(0xBC97F7D6, vtable for std::exception); + //REG_FUNC(0xFD21E1F1, vtable for std::strstream); + //REG_FUNC(0x8E9879A7, vtable for std::type_info); + //REG_FUNC(0xE63750C1, std::basic_filebuf >::_Init(std::_Dnk_filet*, std::basic_filebuf >::_Initfl)::_Stinit); + //REG_FUNC(0x1D4E29BC, std::basic_filebuf >::_Init(std::_Dnk_filet*, std::basic_filebuf >::_Initfl)::_Stinit); + //REG_FUNC(0x8A37475, typeinfo for __cxxabiv1::__enum_type_info); + //REG_FUNC(0x66CC7DBB, typeinfo for __cxxabiv1::__array_type_info); + //REG_FUNC(0x81C44513, typeinfo for __cxxabiv1::__class_type_info); + //REG_FUNC(0xC35024DA, typeinfo for __cxxabiv1::__pbase_type_info); + //REG_FUNC(0x835E9E78, typeinfo for __cxxabiv1::__pointer_type_info); + //REG_FUNC(0x62941235, typeinfo for __cxxabiv1::__function_type_info); + //REG_FUNC(0x461E17F0, typeinfo for __cxxabiv1::__si_class_type_info); + //REG_FUNC(0xB80BFF06, typeinfo for __cxxabiv1::__vmi_class_type_info); + //REG_FUNC(0x7373F517, typeinfo for __cxxabiv1::__fundamental_type_info); + //REG_FUNC(0xDF23E7B5, typeinfo for __cxxabiv1::__pointer_to_member_type_info); + //REG_FUNC(0x74F19FF2, typeinfo name for __cxxabiv1::__enum_type_info); + //REG_FUNC(0x9BF7C72D, typeinfo name for __cxxabiv1::__array_type_info); + //REG_FUNC(0xCB5063F1, typeinfo name for __cxxabiv1::__class_type_info); + //REG_FUNC(0x4F5C24A6, typeinfo name for __cxxabiv1::__pbase_type_info); + //REG_FUNC(0x832019EE, typeinfo name for __cxxabiv1::__pointer_type_info); + //REG_FUNC(0xFB8956D8, typeinfo name for __cxxabiv1::__function_type_info); + //REG_FUNC(0xEAC164EC, typeinfo name for __cxxabiv1::__si_class_type_info); + //REG_FUNC(0x4106109E, typeinfo name for __cxxabiv1::__vmi_class_type_info); + //REG_FUNC(0x1FD93E3A, typeinfo name for __cxxabiv1::__fundamental_type_info); + //REG_FUNC(0xB64B4F55, typeinfo name for __cxxabiv1::__pointer_to_member_type_info); + //REG_FUNC(0x4937B673, vtable for __cxxabiv1::__enum_type_info); + //REG_FUNC(0x9383FBD6, vtable for __cxxabiv1::__array_type_info); + //REG_FUNC(0xF79AE8E1, vtable for __cxxabiv1::__class_type_info); + //REG_FUNC(0xFEAD4BDA, vtable for __cxxabiv1::__pbase_type_info); + //REG_FUNC(0xAA57484D, vtable for __cxxabiv1::__pointer_type_info); + //REG_FUNC(0x897B54E3, vtable for __cxxabiv1::__function_type_info); + //REG_FUNC(0x6BC74629, vtable for __cxxabiv1::__si_class_type_info); + //REG_FUNC(0x7321E731, vtable for __cxxabiv1::__vmi_class_type_info); + //REG_FUNC(0x33836375, vtable for __cxxabiv1::__fundamental_type_info); + //REG_FUNC(0x94664DEB, vtable for __cxxabiv1::__pointer_to_member_type_info); + + return *module; +}(); + +/* +// original names + +REG_FUNC(0x173E7421, __aeabi_unwind_cpp_pr0); +REG_FUNC(0x52B0C625, _ZNKSt10bad_typeid4whatEv); +REG_FUNC(0x64D7D074, _ZNKSt10bad_typeid8_DoraiseEv); +REG_FUNC(0x15FB88E2, _ZNKSt11logic_error4whatEv); +REG_FUNC(0x492D1209, _ZNKSt11logic_error8_DoraiseEv); +REG_FUNC(0xDBDFF9D0, _ZNKSt11range_error8_DoraiseEv); +REG_FUNC(0xE8D59AB5, _ZNKSt12_String_base5_XlenEv); +REG_FUNC(0x473DC636, _ZNKSt12_String_base5_XranEv); +REG_FUNC(0x481ECB76, _ZNKSt12domain_error8_DoraiseEv); +REG_FUNC(0xB03E909C, _ZNKSt12length_error8_DoraiseEv); +REG_FUNC(0x38CF41AC, _ZNKSt12out_of_range8_DoraiseEv); +REG_FUNC(0x55AE5502, _ZNKSt13_codecvt_base11do_encodingEv); +REG_FUNC(0x5522293F, _ZNKSt13_codecvt_base13do_max_lengthEv); +REG_FUNC(0xCF5643A9, _ZNKSt13_codecvt_base16do_always_noconvEv); +REG_FUNC(0x51FCD56B, _ZNKSt13bad_exception4whatEv); +REG_FUNC(0x109E54C9, _ZNKSt13bad_exception8_DoraiseEv); +REG_FUNC(0xAE85C2EE, _ZNKSt13runtime_error4whatEv); +REG_FUNC(0x1D878503, _ZNKSt13runtime_error8_DoraiseEv); +REG_FUNC(0xEED101C6, _ZNKSt14overflow_error8_DoraiseEv); +REG_FUNC(0xB1AE6F9E, _ZNKSt15underflow_error8_DoraiseEv); +REG_FUNC(0x16F56E8D, _ZNKSt16invalid_argument8_DoraiseEv); +REG_FUNC(0x6C568D20, _ZNKSt6_ctypeIcE10do_tolowerEPcPKc); +REG_FUNC(0xC334DE66, _ZNKSt6_ctypeIcE10do_tolowerEc); +REG_FUNC(0x2DD808E, _ZNKSt6_ctypeIcE10do_toupperEPcPKc); +REG_FUNC(0xF6AF33EA, _ZNKSt6_ctypeIcE10do_toupperEc); +REG_FUNC(0x1B81D726, _ZNKSt6_ctypeIcE8do_widenEPKcS2_Pc); +REG_FUNC(0x6471CC01, _ZNKSt6_ctypeIcE8do_widenEc); +REG_FUNC(0x9CFA56E5, _ZNKSt6_ctypeIcE9do_narrowEPKcS2_cPc); +REG_FUNC(0x718669AB, _ZNKSt6_ctypeIcE9do_narrowEcc); +REG_FUNC(0x759F105D, _ZNKSt6_ctypeIwE10do_scan_isEsPKwS2_); +REG_FUNC(0x56443F, _ZNKSt6_ctypeIwE10do_tolowerEPwPKw); +REG_FUNC(0x33E9ECDD, _ZNKSt6_ctypeIwE10do_tolowerEw); +REG_FUNC(0x1256E6A5, _ZNKSt6_ctypeIwE10do_toupperEPwPKw); +REG_FUNC(0x64072C2E, _ZNKSt6_ctypeIwE10do_toupperEw); +REG_FUNC(0x339766BF, _ZNKSt6_ctypeIwE11do_scan_notEsPKwS2_); +REG_FUNC(0xDA4E1651, _ZNKSt6_ctypeIwE5do_isEPKwS2_Ps); +REG_FUNC(0x5A06C0E8, _ZNKSt6_ctypeIwE5do_isEsw); +REG_FUNC(0x609036C7, _ZNKSt6_ctypeIwE8do_widenEPKcS2_Pw); +REG_FUNC(0xA2896AA8, _ZNKSt6_ctypeIwE8do_widenEc); +REG_FUNC(0x631687B9, _ZNKSt6_ctypeIwE9do_narrowEPKwS2_cPc); +REG_FUNC(0xB4D8D2F0, _ZNKSt6_ctypeIwE9do_narrowEwc); +REG_FUNC(0xD9070137, _ZNKSt8_codecvtIccSt9_MbstatetE10do_unshiftERS0_PcS3_RS3_); +REG_FUNC(0xABA0412F, _ZNKSt8_codecvtIccSt9_MbstatetE5do_inERS0_PKcS4_RS4_PcS6_RS6_); +REG_FUNC(0x51052F04, _ZNKSt8_codecvtIccSt9_MbstatetE6do_outERS0_PKcS4_RS4_PcS6_RS6_); +REG_FUNC(0x39F062BE, _ZNKSt8_codecvtIccSt9_MbstatetE9do_lengthERKS0_PKcS5_j); +REG_FUNC(0xF07CC89F, _ZNKSt8_codecvtIwcSt9_MbstatetE10do_unshiftERS0_PcS3_RS3_); +REG_FUNC(0xF3A2E837, _ZNKSt8_codecvtIwcSt9_MbstatetE11do_encodingEv); +REG_FUNC(0x1F133D1E, _ZNKSt8_codecvtIwcSt9_MbstatetE13do_max_lengthEv); +REG_FUNC(0x27716D17, _ZNKSt8_codecvtIwcSt9_MbstatetE16do_always_noconvEv); +REG_FUNC(0x1C1AFE42, _ZNKSt8_codecvtIwcSt9_MbstatetE5do_inERS0_PKcS4_RS4_PwS6_RS6_); +REG_FUNC(0xCBDE5500, _ZNKSt8_codecvtIwcSt9_MbstatetE6do_outERS0_PKwS4_RS4_PcS6_RS6_); +REG_FUNC(0xF4D38990, _ZNKSt8_codecvtIwcSt9_MbstatetE9do_lengthERKS0_PKcS5_j); +REG_FUNC(0x46A9143F, _ZNKSt8bad_cast4whatEv); +REG_FUNC(0x8D129D3F, _ZNKSt8bad_cast8_DoraiseEv); +REG_FUNC(0xF877F51E, _ZNKSt8ios_base7failure8_DoraiseEv); +REG_FUNC(0x664750EE, _ZNKSt9bad_alloc4whatEv); +REG_FUNC(0xBA89FBE7, _ZNKSt9bad_alloc8_DoraiseEv); +REG_FUNC(0xC133E331, _ZNKSt9exception4whatEv); +REG_FUNC(0x656BE32, _ZNKSt9exception6_RaiseEv); +REG_FUNC(0x47A5CDA2, _ZNKSt9exception8_DoraiseEv); +REG_FUNC(0xBAE38DF9, _ZNKSt9type_info4nameEv); +REG_FUNC(0x1F260F10, _ZNKSt9type_info6beforeERKS_); +REG_FUNC(0xDB15F0FC, _ZNKSt9type_infoeqERKS_); +REG_FUNC(0x9994F9FE, _ZNKSt9type_infoneERKS_); +REG_FUNC(0x2DA9FCEC, _ZNSdD0Ev); +REG_FUNC(0x6C2D3707, _ZNSdD1Ev); +REG_FUNC(0x9BA8786E, _ZNSiD0Ev); +REG_FUNC(0xD089A7C9, _ZNSiD1Ev); +REG_FUNC(0x3EE0611A, _ZNSoC1EPSt15basic_streambufIcSt11char_traitsIcEEb); +REG_FUNC(0x6489E51D, _ZNSoD0Ev); +REG_FUNC(0xEF21C386, _ZNSoD1Ev); +REG_FUNC(0x10D794D4, _ZNSs5_GrowEjb); +REG_FUNC(0x846D0286, _ZNSs6assignERKSsjj); +REG_FUNC(0x2AF7786D, _ZNSsC1EPKc); +REG_FUNC(0x92F661CF, _ZNSsC1ERKSs); +REG_FUNC(0xECC3B9C2, _ZNSt10bad_typeidC1ERKS_); +REG_FUNC(0x9F4CD196, _ZNSt10bad_typeidC1Ev); +REG_FUNC(0x7AE1631B, _ZNSt10bad_typeidC2ERKS_); +REG_FUNC(0x33377802, _ZNSt10bad_typeidC2Ev); +REG_FUNC(0x2CE020C7, _ZNSt10bad_typeidD0Ev); +REG_FUNC(0x625460B9, _ZNSt10bad_typeidD1Ev); +REG_FUNC(0xB4F5C5A7, _ZNSt10bad_typeidD2Ev); +REG_FUNC(0x55AAD6A6, _ZNSt10bad_typeidaSERKS_); +REG_FUNC(0x9CF31703, _ZNSt10istrstreamD0Ev); +REG_FUNC(0x71D13A36, _ZNSt10istrstreamD1Ev); +REG_FUNC(0xAF5DF8C3, _ZNSt10istrstreamD2Ev); +REG_FUNC(0xC1E7C7A, _ZNSt10ostrstreamC1EPciNSt5_IosbIiE9_OpenmodeE); +REG_FUNC(0xC09B290, _ZNSt10ostrstreamC2EPciNSt5_IosbIiE9_OpenmodeE); +REG_FUNC(0x4B8BA644, _ZNSt10ostrstreamD0Ev); +REG_FUNC(0xE463FB3, _ZNSt10ostrstreamD1Ev); +REG_FUNC(0xA0A34FEF, _ZNSt10ostrstreamD2Ev); +REG_FUNC(0xC9F632FF, _ZNSt11logic_errorC1ERKS_); +REG_FUNC(0xE6356C5C, _ZNSt11logic_errorC2ERKSs); +REG_FUNC(0x6322FEB0, _ZNSt11logic_errorD0Ev); +REG_FUNC(0x35ED9C5A, _ZNSt11logic_errorD1Ev); +REG_FUNC(0x1FFC4420, _ZNSt11logic_errorD2Ev); +REG_FUNC(0x6F6E3A52, _ZNSt11range_errorC1ERKS_); +REG_FUNC(0xFD97D28A, _ZNSt11range_errorD0Ev); +REG_FUNC(0x1C86405F, _ZNSt11range_errorD1Ev); +REG_FUNC(0xEF754EBD, _ZNSt11range_errorD2Ev); +REG_FUNC(0x7D5412EF, _ZNSt12domain_errorC1ERKS_); +REG_FUNC(0x803A7D3E, _ZNSt12domain_errorD0Ev); +REG_FUNC(0xA6BCA2AD, _ZNSt12domain_errorD1Ev); +REG_FUNC(0x36F9D2A, _ZNSt12domain_errorD2Ev); +REG_FUNC(0x5F3428AD, _ZNSt12length_errorC1ERKS_); +REG_FUNC(0xF6FB801D, _ZNSt12length_errorC1ERKSs); +REG_FUNC(0xF83AA7DA, _ZNSt12length_errorD0Ev); +REG_FUNC(0xA873D7F9, _ZNSt12length_errorD1Ev); +REG_FUNC(0xBB12C75, _ZNSt12length_errorD2Ev); +REG_FUNC(0x299AA587, _ZNSt12out_of_rangeC1ERKS_); +REG_FUNC(0xC8BA5522, _ZNSt12out_of_rangeC1ERKSs); +REG_FUNC(0xA8C470A4, _ZNSt12out_of_rangeD0Ev); +REG_FUNC(0x5FAE79BF, _ZNSt12out_of_rangeD1Ev); +REG_FUNC(0x7908CBAB, _ZNSt12out_of_rangeD2Ev); +REG_FUNC(0xDCCE6368, _ZNSt12strstreambuf5_InitEiPcS0_i); +REG_FUNC(0xD85AE271, _ZNSt12strstreambuf5_TidyEv); +REG_FUNC(0xD189E6CC, _ZNSt12strstreambuf6freezeEb); +REG_FUNC(0xFA6BDF33, _ZNSt12strstreambuf7seekoffElNSt5_IosbIiE8_SeekdirENS1_9_OpenmodeE); +REG_FUNC(0x97A9813A, _ZNSt12strstreambuf7seekposESt4fposISt9_MbstatetENSt5_IosbIiE9_OpenmodeE); +REG_FUNC(0xED2539E2, _ZNSt12strstreambuf8overflowEi); +REG_FUNC(0xC725F896, _ZNSt12strstreambuf9pbackfailEi); +REG_FUNC(0xA9F4FABF, _ZNSt12strstreambuf9underflowEv); +REG_FUNC(0x1C887DDE, _ZNSt12strstreambufD0Ev); +REG_FUNC(0x29E1E930, _ZNSt12strstreambufD1Ev); +REG_FUNC(0xA140889, _ZNSt12strstreambufD2Ev); +REG_FUNC(0xA8FE6FC4, _ZNSt13_codecvt_baseD0Ev); +REG_FUNC(0xB0E47AE4, _ZNSt13_codecvt_baseD1Ev); +REG_FUNC(0xB7EE9CC2, _ZNSt13bad_exceptionC1ERKS_); +REG_FUNC(0xD719280E, _ZNSt13bad_exceptionC1Ev); +REG_FUNC(0x37D2017F, _ZNSt13bad_exceptionC2ERKS_); +REG_FUNC(0x3DE54D83, _ZNSt13bad_exceptionC2Ev); +REG_FUNC(0xC7880D1A, _ZNSt13bad_exceptionD0Ev); +REG_FUNC(0x486B59CE, _ZNSt13bad_exceptionD1Ev); +REG_FUNC(0xD04E0BAB, _ZNSt13bad_exceptionD2Ev); +REG_FUNC(0x792097AA, _ZNSt13bad_exceptionaSERKS_); +REG_FUNC(0xCC369863, _ZNSt13basic_filebufIcSt11char_traitsIcEE4syncEv); +REG_FUNC(0xC8BAB41E, _ZNSt13basic_filebufIcSt11char_traitsIcEE5_LockEv); +REG_FUNC(0xD5F03A74, _ZNSt13basic_filebufIcSt11char_traitsIcEE5uflowEv); +REG_FUNC(0x413E813E, _ZNSt13basic_filebufIcSt11char_traitsIcEE6setbufEPci); +REG_FUNC(0x9D193B65, _ZNSt13basic_filebufIcSt11char_traitsIcEE7_UnlockEv); +REG_FUNC(0x52E47FB5, _ZNSt13basic_filebufIcSt11char_traitsIcEE7seekoffElNSt5_IosbIiE8_SeekdirENS4_9_OpenmodeE); +REG_FUNC(0xE119B37, _ZNSt13basic_filebufIcSt11char_traitsIcEE7seekposESt4fposISt9_MbstatetENSt5_IosbIiE9_OpenmodeE); +REG_FUNC(0x616754BC, _ZNSt13basic_filebufIcSt11char_traitsIcEE8overflowEi); +REG_FUNC(0xCD5BD2E1, _ZNSt13basic_filebufIcSt11char_traitsIcEE9_EndwriteEv); +REG_FUNC(0xFC1C7F3A, _ZNSt13basic_filebufIcSt11char_traitsIcEE9pbackfailEi); +REG_FUNC(0x31693B42, _ZNSt13basic_filebufIcSt11char_traitsIcEE9underflowEv); +REG_FUNC(0xC2F03DFD, _ZNSt13basic_filebufIcSt11char_traitsIcEED0Ev); +REG_FUNC(0x54A77A0D, _ZNSt13basic_filebufIcSt11char_traitsIcEED1Ev); +REG_FUNC(0x253888BD, _ZNSt13basic_filebufIwSt11char_traitsIwEE4syncEv); +REG_FUNC(0x4EC524DC, _ZNSt13basic_filebufIwSt11char_traitsIwEE5_LockEv); +REG_FUNC(0xE777348C, _ZNSt13basic_filebufIwSt11char_traitsIwEE5uflowEv); +REG_FUNC(0x1E1E8BBF, _ZNSt13basic_filebufIwSt11char_traitsIwEE6setbufEPwi); +REG_FUNC(0x281D0191, _ZNSt13basic_filebufIwSt11char_traitsIwEE7_UnlockEv); +REG_FUNC(0x9C87B03F, _ZNSt13basic_filebufIwSt11char_traitsIwEE7seekoffElNSt5_IosbIiE8_SeekdirENS4_9_OpenmodeE); +REG_FUNC(0x8021D69B, _ZNSt13basic_filebufIwSt11char_traitsIwEE7seekposESt4fposISt9_MbstatetENSt5_IosbIiE9_OpenmodeE); +REG_FUNC(0xD8127E0A, _ZNSt13basic_filebufIwSt11char_traitsIwEE8overflowEj); +REG_FUNC(0x99FDEB76, _ZNSt13basic_filebufIwSt11char_traitsIwEE9_EndwriteEv); +REG_FUNC(0x950786D7, _ZNSt13basic_filebufIwSt11char_traitsIwEE9pbackfailEj); +REG_FUNC(0x572A65D3, _ZNSt13basic_filebufIwSt11char_traitsIwEE9underflowEv); +REG_FUNC(0x96D09EA4, _ZNSt13basic_filebufIwSt11char_traitsIwEED0Ev); +REG_FUNC(0xD434F085, _ZNSt13basic_filebufIwSt11char_traitsIwEED1Ev); +REG_FUNC(0xFFFA683E, _ZNSt13basic_istreamIwSt11char_traitsIwEED0Ev); +REG_FUNC(0xB58839C5, _ZNSt13basic_istreamIwSt11char_traitsIwEED1Ev); +REG_FUNC(0x9BF8855B, _ZNSt13basic_ostreamIwSt11char_traitsIwEEC1EPSt15basic_streambufIwS1_Eb); +REG_FUNC(0xD74F56E, _ZNSt13basic_ostreamIwSt11char_traitsIwEED0Ev); +REG_FUNC(0x9B831B60, _ZNSt13basic_ostreamIwSt11char_traitsIwEED1Ev); +REG_FUNC(0x396337CE, _ZNSt13runtime_errorC1ERKS_); +REG_FUNC(0xDAD26367, _ZNSt13runtime_errorD0Ev); +REG_FUNC(0x7F1FDAEA, _ZNSt13runtime_errorD1Ev); +REG_FUNC(0xECC19AEB, _ZNSt13runtime_errorD2Ev); +REG_FUNC(0xE67F3768, _ZNSt14overflow_errorC1ERKS_); +REG_FUNC(0xF7C46A5D, _ZNSt14overflow_errorD0Ev); +REG_FUNC(0x5C666F7E, _ZNSt14overflow_errorD1Ev); +REG_FUNC(0x4E45F680, _ZNSt14overflow_errorD2Ev); +REG_FUNC(0x626515E3, _ZNSt15basic_streambufIcSt11char_traitsIcEE4syncEv); +REG_FUNC(0x2E55F15A, _ZNSt15basic_streambufIcSt11char_traitsIcEE5_LockEv); +REG_FUNC(0xF8535AB, _ZNSt15basic_streambufIcSt11char_traitsIcEE5uflowEv); +REG_FUNC(0xD7933D06, _ZNSt15basic_streambufIcSt11char_traitsIcEE6setbufEPci); +REG_FUNC(0xB8BCCC8D, _ZNSt15basic_streambufIcSt11char_traitsIcEE6xsgetnEPci); +REG_FUNC(0x43E5D0F1, _ZNSt15basic_streambufIcSt11char_traitsIcEE6xsputnEPKci); +REG_FUNC(0x149B193A, _ZNSt15basic_streambufIcSt11char_traitsIcEE7_UnlockEv); +REG_FUNC(0x600998EC, _ZNSt15basic_streambufIcSt11char_traitsIcEE7seekoffElNSt5_IosbIiE8_SeekdirENS4_9_OpenmodeE); +REG_FUNC(0x1DEFFD6, _ZNSt15basic_streambufIcSt11char_traitsIcEE7seekposESt4fposISt9_MbstatetENSt5_IosbIiE9_OpenmodeE); +REG_FUNC(0xF5F44352, _ZNSt15basic_streambufIcSt11char_traitsIcEE8overflowEi); +REG_FUNC(0xCA79344F, _ZNSt15basic_streambufIcSt11char_traitsIcEE9pbackfailEi); +REG_FUNC(0x441788B1, _ZNSt15basic_streambufIcSt11char_traitsIcEE9showmanycEv); +REG_FUNC(0x797DAE94, _ZNSt15basic_streambufIcSt11char_traitsIcEE9underflowEv); +REG_FUNC(0x74AD52E, _ZNSt15basic_streambufIcSt11char_traitsIcEED0Ev); +REG_FUNC(0xE449E2BF, _ZNSt15basic_streambufIcSt11char_traitsIcEED1Ev); +REG_FUNC(0x9FAA0AA, _ZNSt15basic_streambufIwSt11char_traitsIwEE4syncEv); +REG_FUNC(0xA596C88C, _ZNSt15basic_streambufIwSt11char_traitsIwEE5_LockEv); +REG_FUNC(0x373C2CD8, _ZNSt15basic_streambufIwSt11char_traitsIwEE5uflowEv); +REG_FUNC(0x3F363796, _ZNSt15basic_streambufIwSt11char_traitsIwEE6setbufEPwi); +REG_FUNC(0xABE96E40, _ZNSt15basic_streambufIwSt11char_traitsIwEE6xsgetnEPwi); +REG_FUNC(0x506D0DAE, _ZNSt15basic_streambufIwSt11char_traitsIwEE6xsputnEPKwi); +REG_FUNC(0xBD378207, _ZNSt15basic_streambufIwSt11char_traitsIwEE7_UnlockEv); +REG_FUNC(0x924BD940, _ZNSt15basic_streambufIwSt11char_traitsIwEE7seekoffElNSt5_IosbIiE8_SeekdirENS4_9_OpenmodeE); +REG_FUNC(0x2CD1C1AF, _ZNSt15basic_streambufIwSt11char_traitsIwEE7seekposESt4fposISt9_MbstatetENSt5_IosbIiE9_OpenmodeE); +REG_FUNC(0xB0DD9881, _ZNSt15basic_streambufIwSt11char_traitsIwEE8overflowEj); +REG_FUNC(0xDD04652F, _ZNSt15basic_streambufIwSt11char_traitsIwEE9pbackfailEj); +REG_FUNC(0x9DCBD6A5, _ZNSt15basic_streambufIwSt11char_traitsIwEE9showmanycEv); +REG_FUNC(0xC3892DE5, _ZNSt15basic_streambufIwSt11char_traitsIwEE9underflowEv); +REG_FUNC(0x8DFACE66, _ZNSt15basic_streambufIwSt11char_traitsIwEED0Ev); +REG_FUNC(0x868E865C, _ZNSt15basic_streambufIwSt11char_traitsIwEED1Ev); +REG_FUNC(0x9A59BC50, _ZNSt15underflow_errorC1ERKS_); +REG_FUNC(0x47A589A4, _ZNSt15underflow_errorD0Ev); +REG_FUNC(0xCED74DE7, _ZNSt15underflow_errorD1Ev); +REG_FUNC(0xA76F038A, _ZNSt15underflow_errorD2Ev); +REG_FUNC(0x6332FA62, _ZNSt16invalid_argumentC1ERKS_); +REG_FUNC(0x188D86CF, _ZNSt16invalid_argumentD0Ev); +REG_FUNC(0x9982A4FC, _ZNSt16invalid_argumentD1Ev); +REG_FUNC(0x1AB2B1AC, _ZNSt16invalid_argumentD2Ev); +REG_FUNC(0xF9FAB558, _ZNSt6_Mutex5_LockEv); +REG_FUNC(0x402C9F8, _ZNSt6_Mutex7_UnlockEv); +REG_FUNC(0x9DA92617, _ZNSt6_MutexC1ESt14_Uninitialized); +REG_FUNC(0xA4F99AE7, _ZNSt6_MutexC1Ev); +REG_FUNC(0x7B5A6B7F, _ZNSt6_MutexC2ESt14_Uninitialized); +REG_FUNC(0x5C5CD6B9, _ZNSt6_MutexC2Ev); +REG_FUNC(0x9B37CAD9, _ZNSt6_MutexD1Ev); +REG_FUNC(0x3E6A67FE, _ZNSt6_MutexD2Ev); +REG_FUNC(0xABB11CF9, _ZNSt6_WinitC1Ev); +REG_FUNC(0x90DD73C3, _ZNSt6_WinitC2Ev); +REG_FUNC(0x579C349B, _ZNSt6_WinitD1Ev); +REG_FUNC(0x3794ED15, _ZNSt6_WinitD2Ev); +REG_FUNC(0x24DA6258, _ZNSt6_ctypeIcED0Ev); +REG_FUNC(0xF9C92C6A, _ZNSt6_ctypeIcED1Ev); +REG_FUNC(0x554E4742, _ZNSt6_ctypeIwED0Ev); +REG_FUNC(0xD4AEA4D3, _ZNSt6_ctypeIwED1Ev); +REG_FUNC(0x5A7D89F0, _ZNSt8_codecvtIccSt9_MbstatetED0Ev); +REG_FUNC(0xB613F281, _ZNSt8_codecvtIccSt9_MbstatetED1Ev); +REG_FUNC(0x1E11185A, _ZNSt8_codecvtIwcSt9_MbstatetED0Ev); +REG_FUNC(0x14125DF4, _ZNSt8_codecvtIwcSt9_MbstatetED1Ev); +REG_FUNC(0xD2A4428D, _ZNSt8bad_castC1ERKS_); +REG_FUNC(0x7922CC7C, _ZNSt8bad_castC1Ev); +REG_FUNC(0x6DC64647, _ZNSt8bad_castC2ERKS_); +REG_FUNC(0x596BA786, _ZNSt8bad_castC2Ev); +REG_FUNC(0x5416699C, _ZNSt8bad_castD0Ev); +REG_FUNC(0x1D09710D, _ZNSt8bad_castD1Ev); +REG_FUNC(0x3C6B52E7, _ZNSt8bad_castD2Ev); +REG_FUNC(0x95966020, _ZNSt8bad_castaSERKS_); +REG_FUNC(0xF81D3B86, _ZNSt8ios_base17register_callbackEPFvNS_5eventERS_iEi); +REG_FUNC(0x5E60B2B3, _ZNSt8ios_base4InitC1Ev); +REG_FUNC(0x5ED60DEE, _ZNSt8ios_base4InitC2Ev); +REG_FUNC(0x65D88619, _ZNSt8ios_base4InitD1Ev); +REG_FUNC(0x3483E01D, _ZNSt8ios_base4InitD2Ev); +REG_FUNC(0x78CB190E, _ZNSt8ios_base5_InitEv); +REG_FUNC(0x23B8BEE, _ZNSt8ios_base5_TidyEv); +REG_FUNC(0xC9DE8208, _ZNSt8ios_base5clearENSt5_IosbIiE8_IostateEb); +REG_FUNC(0xAA9171FB, _ZNSt8ios_base7_AddstdEv); +REG_FUNC(0xFC58778, _ZNSt8ios_base7copyfmtERKS_); +REG_FUNC(0x2DF76755, _ZNSt8ios_base7failureC1ERKS0_); +REG_FUNC(0x94048F7, _ZNSt8ios_base7failureC1ERKSs); +REG_FUNC(0x20AAAB95, _ZNSt8ios_base7failureD0Ev); +REG_FUNC(0x31D0197A, _ZNSt8ios_base7failureD1Ev); +REG_FUNC(0x7736E940, _ZNSt8ios_base8_CallfnsENS_5eventE); +REG_FUNC(0xE8C4640A, _ZNSt8ios_base8_FindarrEi); +REG_FUNC(0xB8CFFB8D, _ZNSt8ios_baseD0Ev); +REG_FUNC(0x40EA90D5, _ZNSt8ios_baseD1Ev); +REG_FUNC(0xDCE89E71, _ZNSt8ios_baseD2Ev); +REG_FUNC(0xE15EEC2A, _ZNSt9bad_allocC1ERKS_); +REG_FUNC(0xEC3804D2, _ZNSt9bad_allocC1Ev); +REG_FUNC(0x6AF75467, _ZNSt9bad_allocC2ERKS_); +REG_FUNC(0x57096162, _ZNSt9bad_allocC2Ev); +REG_FUNC(0xB2DAA408, _ZNSt9bad_allocD0Ev); +REG_FUNC(0x7AEE736, _ZNSt9bad_allocD1Ev); +REG_FUNC(0xA9E9B7B7, _ZNSt9bad_allocD2Ev); +REG_FUNC(0x7853E8E5, _ZNSt9bad_allocaSERKS_); +REG_FUNC(0xF78468EB, _ZNSt9basic_iosIcSt11char_traitsIcEED0Ev); +REG_FUNC(0x3150182, _ZNSt9basic_iosIcSt11char_traitsIcEED1Ev); +REG_FUNC(0x9654168A, _ZNSt9basic_iosIwSt11char_traitsIwEED0Ev); +REG_FUNC(0x8FFB8524, _ZNSt9basic_iosIwSt11char_traitsIwEED1Ev); +REG_FUNC(0x7AF1BB16, _ZNSt9exception18_Set_raise_handlerEPFvRKS_E); +REG_FUNC(0x8C5A4417, _ZNSt9exceptionC1ERKS_); +REG_FUNC(0xFC169D71, _ZNSt9exceptionC1Ev); +REG_FUNC(0x59758E74, _ZNSt9exceptionC2ERKS_); +REG_FUNC(0xE08376, _ZNSt9exceptionC2Ev); +REG_FUNC(0x82EEA67E, _ZNSt9exceptionD0Ev); +REG_FUNC(0x30405D88, _ZNSt9exceptionD1Ev); +REG_FUNC(0xAF7A7081, _ZNSt9exceptionD2Ev); +REG_FUNC(0x6CE63118, _ZNSt9exceptionaSERKS_); +REG_FUNC(0x911F5A80, _ZNSt9strstreamC1EPciNSt5_IosbIiE9_OpenmodeE); +REG_FUNC(0x27166DDA, _ZNSt9strstreamC2EPciNSt5_IosbIiE9_OpenmodeE); +REG_FUNC(0xC4099868, _ZNSt9strstreamD0Ev); +REG_FUNC(0x98BD8AE1, _ZNSt9strstreamD1Ev); +REG_FUNC(0x7D8DFE43, _ZNSt9strstreamD2Ev); +REG_FUNC(0x8D4B1A13, _ZNSt9type_infoD0Ev); +REG_FUNC(0xBD786240, _ZNSt9type_infoD1Ev); +REG_FUNC(0xC04303, _ZNSt9type_infoD2Ev); +REG_FUNC(0x9983D8B9, _ZSt10unexpectedv); +REG_FUNC(0x385D19B2, _ZSt11setiosflagsNSt5_IosbIiE9_FmtflagsE); +REG_FUNC(0xD8A78A61, _ZSt12setprecisioni); +REG_FUNC(0x994DDF94, _ZSt13resetiosflagsNSt5_IosbIiE9_FmtflagsE); +REG_FUNC(0x13BAEE11, _ZSt13set_terminatePFvvE); +REG_FUNC(0x644CBAA2, _ZSt14_Debug_messagePKcS0_); +REG_FUNC(0x9B2F0CA6, _ZSt14set_unexpectedPFvvE); +REG_FUNC(0xC107B555, _ZSt15set_new_handlerPFvvE); +REG_FUNC(0x11CEB00, _ZSt18uncaught_exceptionv); +REG_FUNC(0x36282336, _ZSt21__gen_dummy_typeinfosv); +REG_FUNC(0x3622003F, _ZSt4setwi); +REG_FUNC(0x6CAFA8EF, _ZSt6_ThrowRKSt9exception); +REG_FUNC(0xFD276300, _ZSt7_FiopenPKcNSt5_IosbIiE9_OpenmodeEi); +REG_FUNC(0x1419E1DF, _ZSt7_FiopenPKwNSt5_IosbIiE9_OpenmodeEi); +REG_FUNC(0x39587D21, _ZSt7setbasei); +REG_FUNC(0x978EC4DC, _ZSt9terminatev); +REG_FUNC(0x4A804953, _ZThn8_NSdD0Ev); +REG_FUNC(0xABFBB0B4, _ZThn8_NSdD1Ev); +REG_FUNC(0x6577F8FA, _ZThn8_NSt9strstreamD0Ev); +REG_FUNC(0x77812119, _ZThn8_NSt9strstreamD1Ev); +REG_FUNC(0xE4BD5E6A, _ZTv0_n12_NSdD0Ev); +REG_FUNC(0x1081224F, _ZTv0_n12_NSdD1Ev); +REG_FUNC(0x7CC8951D, _ZTv0_n12_NSiD0Ev); +REG_FUNC(0xC46CA5C9, _ZTv0_n12_NSiD1Ev); +REG_FUNC(0x699E7717, _ZTv0_n12_NSoD0Ev); +REG_FUNC(0x41DBA7E0, _ZTv0_n12_NSoD1Ev); +REG_FUNC(0x6FC84131, _ZTv0_n12_NSt10istrstreamD0Ev); +REG_FUNC(0x7B4D8616, _ZTv0_n12_NSt10istrstreamD1Ev); +REG_FUNC(0xD82D58BA, _ZTv0_n12_NSt10ostrstreamD0Ev); +REG_FUNC(0x5D4F7F7B, _ZTv0_n12_NSt10ostrstreamD1Ev); +REG_FUNC(0x10E7966F, _ZTv0_n12_NSt13basic_istreamIwSt11char_traitsIwEED0Ev); +REG_FUNC(0xC3718A8D, _ZTv0_n12_NSt13basic_istreamIwSt11char_traitsIwEED1Ev); +REG_FUNC(0x159261D1, _ZTv0_n12_NSt13basic_ostreamIwSt11char_traitsIwEED0Ev); +REG_FUNC(0xB54EC1E5, _ZTv0_n12_NSt13basic_ostreamIwSt11char_traitsIwEED1Ev); +REG_FUNC(0x2FB87ED7, _ZTv0_n12_NSt9strstreamD0Ev); +REG_FUNC(0xECEDE119, _ZTv0_n12_NSt9strstreamD1Ev); +REG_FUNC(0x91B0DC47, _ZdaPv); +REG_FUNC(0xA7241F09, _ZdaPvRKSt9nothrow_t); +REG_FUNC(0x3688FFDA, _ZdaPvS_); +REG_FUNC(0x72293931, _ZdlPv); +REG_FUNC(0x87EF85FF, _ZdlPvRKSt9nothrow_t); +REG_FUNC(0x1EB89099, _ZdlPvS_); +REG_FUNC(0xE7FB2BF4, _Znaj); +REG_FUNC(0x31C62481, _ZnajRKSt9nothrow_t); +REG_FUNC(0xF99ED5AC, _Znwj); +REG_FUNC(0xAE71DC3, _ZnwjRKSt9nothrow_t); +REG_FUNC(0x1818C323, _SNC_get_global_vars); +REG_FUNC(0x2CFA1F15, _SNC_get_tlocal_vars); +REG_FUNC(0x7742D916, _Unwind_Backtrace); +REG_FUNC(0x32748B78, _Unwind_Complete); +REG_FUNC(0xF6EA5CDE, _Unwind_DeleteException); +REG_FUNC(0xCCD903C4, _Unwind_RaiseException); +REG_FUNC(0x13D5D5A1, _Unwind_Resume); +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); +REG_FUNC(0x4E4CC399, __cxa_call_terminate); +REG_FUNC(0x7C1A0217, __cxa_call_unexpected); +REG_FUNC(0xF7BF277C, __cxa_current_exception_type); +REG_FUNC(0x3438F773, __cxa_end_catch); +REG_FUNC(0xD7C1E113, __cxa_end_cleanup); +REG_FUNC(0x1FFD5FFF, __cxa_free_exception); +REG_FUNC(0xBFFC0ED7, __cxa_get_exception_ptr); +REG_FUNC(0x96656BBA, __cxa_get_globals); +REG_FUNC(0x21D6C279, __cxa_rethrow); +REG_FUNC(0xF87E6098, __cxa_throw); +REG_FUNC(0x30D908F2, __cxa_type_match); +REG_FUNC(0xAE42C1D5, __snc_personality_v0); +REG_FUNC(0xDD200A6F, _ZN10__cxxabiv116__enum_type_infoD0Ev); +REG_FUNC(0x436D61AD, _ZN10__cxxabiv116__enum_type_infoD1Ev); +REG_FUNC(0x34854DA4, _ZN10__cxxabiv116__enum_type_infoD2Ev); +REG_FUNC(0x9D5EDD21, _ZN10__cxxabiv117__array_type_infoD0Ev); +REG_FUNC(0xD6375908, _ZN10__cxxabiv117__array_type_infoD1Ev); +REG_FUNC(0xFDC450D4, _ZN10__cxxabiv117__array_type_infoD2Ev); +REG_FUNC(0x5CCFD0C0, _ZN10__cxxabiv117__class_type_infoD0Ev); +REG_FUNC(0xFBBFFF15, _ZN10__cxxabiv117__class_type_infoD1Ev); +REG_FUNC(0xA92DD3D2, _ZN10__cxxabiv117__class_type_infoD2Ev); +REG_FUNC(0x6C14868D, _ZN10__cxxabiv117__pbase_type_infoD0Ev); +REG_FUNC(0xC1869E57, _ZN10__cxxabiv117__pbase_type_infoD1Ev); +REG_FUNC(0x2DF92DB7, _ZN10__cxxabiv117__pbase_type_infoD2Ev); +REG_FUNC(0xA9654DFD, _ZN10__cxxabiv119__pointer_type_infoD0Ev); +REG_FUNC(0x703A2C05, _ZN10__cxxabiv119__pointer_type_infoD1Ev); +REG_FUNC(0x509AAD21, _ZN10__cxxabiv119__pointer_type_infoD2Ev); +REG_FUNC(0xB7DFB274, _ZN10__cxxabiv120__function_type_infoD0Ev); +REG_FUNC(0x19EA26FF, _ZN10__cxxabiv120__function_type_infoD1Ev); +REG_FUNC(0xF882187E, _ZN10__cxxabiv120__function_type_infoD2Ev); +REG_FUNC(0xE67722C3, _ZN10__cxxabiv120__si_class_type_infoD0Ev); +REG_FUNC(0xA7E25E3E, _ZN10__cxxabiv120__si_class_type_infoD1Ev); +REG_FUNC(0xACD6D901, _ZN10__cxxabiv120__si_class_type_infoD2Ev); +REG_FUNC(0x986F12C7, _ZN10__cxxabiv121__vmi_class_type_infoD0Ev); +REG_FUNC(0x4B5BC979, _ZN10__cxxabiv121__vmi_class_type_infoD1Ev); +REG_FUNC(0xA7B9AB93, _ZN10__cxxabiv121__vmi_class_type_infoD2Ev); +REG_FUNC(0x7436C981, _ZN10__cxxabiv123__fundamental_type_infoD0Ev); +REG_FUNC(0x4EFBF43A, _ZN10__cxxabiv123__fundamental_type_infoD1Ev); +REG_FUNC(0xF49AA0D3, _ZN10__cxxabiv123__fundamental_type_infoD2Ev); +REG_FUNC(0x6199ACC9, _ZN10__cxxabiv129__pointer_to_member_type_infoD0Ev); +REG_FUNC(0xDD076510, _ZN10__cxxabiv129__pointer_to_member_type_infoD1Ev); +REG_FUNC(0xD4C11B17, _ZN10__cxxabiv129__pointer_to_member_type_infoD2Ev); +REG_FUNC(0xBF90A45A, _PJP_CPP_Copyright); +REG_FUNC(0x3B6D9752, _ZNSbIwSt11char_traitsIwESaIwEE4nposE); +REG_FUNC(0xA3498140, _ZNSs4nposE); +REG_FUNC(0x5273EA3, _ZNSt13_Num_int_base10is_boundedE); +REG_FUNC(0x8A0994F8, _ZNSt13_Num_int_base10is_integerE); +REG_FUNC(0x401F1224, _ZNSt13_Num_int_base14is_specializedE); +REG_FUNC(0xA65FE916, _ZNSt13_Num_int_base5radixE); +REG_FUNC(0xF2AA872E, _ZNSt13_Num_int_base8is_exactE); +REG_FUNC(0x8FE5A4F, _ZNSt13_Num_int_base9is_moduloE); +REG_FUNC(0x7D4C55EC, _ZNSt14numeric_limitsIaE6digitsE); +REG_FUNC(0xA4E5BF5E, _ZNSt14numeric_limitsIaE8digits10E); +REG_FUNC(0xD9938B84, _ZNSt14numeric_limitsIaE9is_signedE); +REG_FUNC(0x56198D65, _ZNSt14numeric_limitsIbE6digitsE); +REG_FUNC(0xF52E5F76, _ZNSt14numeric_limitsIbE8digits10E); +REG_FUNC(0x81B82E0E, _ZNSt14numeric_limitsIbE9is_moduloE); +REG_FUNC(0x9E6D2025, _ZNSt14numeric_limitsIbE9is_signedE); +REG_FUNC(0x810ED593, _ZNSt14numeric_limitsIcE6digitsE); +REG_FUNC(0xAC1A819, _ZNSt14numeric_limitsIcE8digits10E); +REG_FUNC(0x660E14E1, _ZNSt14numeric_limitsIcE9is_signedE); +REG_FUNC(0x3EEB3B23, _ZNSt14numeric_limitsIdE12max_exponentE); +REG_FUNC(0x13B634BE, _ZNSt14numeric_limitsIdE12min_exponentE); +REG_FUNC(0xDB4218A0, _ZNSt14numeric_limitsIdE14max_exponent10E); +REG_FUNC(0x770B1CAC, _ZNSt14numeric_limitsIdE14min_exponent10E); +REG_FUNC(0xD175A556, _ZNSt14numeric_limitsIdE6digitsE); +REG_FUNC(0xA5349445, _ZNSt14numeric_limitsIdE8digits10E); +REG_FUNC(0x2F59E7FF, _ZNSt14numeric_limitsIeE12max_exponentE); +REG_FUNC(0xC9C10644, _ZNSt14numeric_limitsIeE12min_exponentE); +REG_FUNC(0xC80072AC, _ZNSt14numeric_limitsIeE14max_exponent10E); +REG_FUNC(0xCA8B1B9E, _ZNSt14numeric_limitsIeE14min_exponent10E); +REG_FUNC(0x7E9AFD39, _ZNSt14numeric_limitsIeE6digitsE); +REG_FUNC(0x6122F9BF, _ZNSt14numeric_limitsIeE8digits10E); +REG_FUNC(0xA83B5FE2, _ZNSt14numeric_limitsIfE12max_exponentE); +REG_FUNC(0x9347B146, _ZNSt14numeric_limitsIfE12min_exponentE); +REG_FUNC(0x371BCFA6, _ZNSt14numeric_limitsIfE14max_exponent10E); +REG_FUNC(0x6E6746EB, _ZNSt14numeric_limitsIfE14min_exponent10E); +REG_FUNC(0xB102353D, _ZNSt14numeric_limitsIfE6digitsE); +REG_FUNC(0x781201BB, _ZNSt14numeric_limitsIfE8digits10E); +REG_FUNC(0x26D618B8, _ZNSt14numeric_limitsIhE6digitsE); +REG_FUNC(0x8D593267, _ZNSt14numeric_limitsIhE8digits10E); +REG_FUNC(0x96B86E89, _ZNSt14numeric_limitsIhE9is_signedE); +REG_FUNC(0x9CDAA1F0, _ZNSt14numeric_limitsIiE6digitsE); +REG_FUNC(0xE8EB3133, _ZNSt14numeric_limitsIiE8digits10E); +REG_FUNC(0x3AB38CDA, _ZNSt14numeric_limitsIiE9is_signedE); +REG_FUNC(0xEEB7B642, _ZNSt14numeric_limitsIjE6digitsE); +REG_FUNC(0xBCDE68B3, _ZNSt14numeric_limitsIjE8digits10E); +REG_FUNC(0xDA8EFB0, _ZNSt14numeric_limitsIjE9is_signedE); +REG_FUNC(0x65DAD8D6, _ZNSt14numeric_limitsIlE6digitsE); +REG_FUNC(0xFB52BC0A, _ZNSt14numeric_limitsIlE8digits10E); +REG_FUNC(0x63544FC, _ZNSt14numeric_limitsIlE9is_signedE); +REG_FUNC(0x441D097A, _ZNSt14numeric_limitsImE6digitsE); +REG_FUNC(0xB56F1B07, _ZNSt14numeric_limitsImE8digits10E); +REG_FUNC(0xA9799886, _ZNSt14numeric_limitsImE9is_signedE); +REG_FUNC(0x45C6A036, _ZNSt14numeric_limitsIsE6digitsE); +REG_FUNC(0xCDE02D9C, _ZNSt14numeric_limitsIsE8digits10E); +REG_FUNC(0xB13AEAC3, _ZNSt14numeric_limitsIsE9is_signedE); +REG_FUNC(0xBD813100, _ZNSt14numeric_limitsItE6digitsE); +REG_FUNC(0x242C5313, _ZNSt14numeric_limitsItE8digits10E); +REG_FUNC(0x175A29B4, _ZNSt14numeric_limitsItE9is_signedE); +REG_FUNC(0x7E91BCD7, _ZNSt14numeric_limitsIwE6digitsE); +REG_FUNC(0x6B1CB79E, _ZNSt14numeric_limitsIwE8digits10E); +REG_FUNC(0x9181475F, _ZNSt14numeric_limitsIwE9is_signedE); +REG_FUNC(0x22F8FF46, _ZNSt14numeric_limitsIxE6digitsE); +REG_FUNC(0xF6E69A0D, _ZNSt14numeric_limitsIxE8digits10E); +REG_FUNC(0xD01E5E34, _ZNSt14numeric_limitsIxE9is_signedE); +REG_FUNC(0x4AB058B0, _ZNSt14numeric_limitsIyE6digitsE); +REG_FUNC(0x85F2F2D2, _ZNSt14numeric_limitsIyE8digits10E); +REG_FUNC(0xDEDE9061, _ZNSt14numeric_limitsIyE9is_signedE); +REG_FUNC(0x1CBE5DCB, _ZNSt15_Num_float_base10has_denormE); +REG_FUNC(0x616E0E6F, _ZNSt15_Num_float_base10is_boundedE); +REG_FUNC(0xDFDE8E2C, _ZNSt15_Num_float_base10is_integerE); +REG_FUNC(0x59668916, _ZNSt15_Num_float_base11round_styleE); +REG_FUNC(0x2FA7A240, _ZNSt15_Num_float_base12has_infinityE); +REG_FUNC(0x4E98DCA0, _ZNSt15_Num_float_base13has_quiet_NaNE); +REG_FUNC(0x87EB5304, _ZNSt15_Num_float_base14is_specializedE); +REG_FUNC(0x1B36956D, _ZNSt15_Num_float_base15has_denorm_lossE); +REG_FUNC(0xD3E2D87B, _ZNSt15_Num_float_base15tinyness_beforeE); +REG_FUNC(0xBCEB9093, _ZNSt15_Num_float_base17has_signaling_NaNE); +REG_FUNC(0x132F3288, _ZNSt15_Num_float_base5radixE); +REG_FUNC(0xF8060433, _ZNSt15_Num_float_base5trapsE); +REG_FUNC(0x3C4A2891, _ZNSt15_Num_float_base8is_exactE); +REG_FUNC(0xA3F55094, _ZNSt15_Num_float_base9is_iec559E); +REG_FUNC(0xC8CB7207, _ZNSt15_Num_float_base9is_moduloE); +REG_FUNC(0x1242E399, _ZNSt15_Num_float_base9is_signedE); +REG_FUNC(0x762C3159, _ZNSt4fposISt9_MbstatetE4_StzE); +REG_FUNC(0xFED4A09B, _ZNSt5_IosbIiE10_NoreplaceE); +REG_FUNC(0xE615A657, _ZNSt5_IosbIiE2inE); +REG_FUNC(0x759FD02E, _ZNSt5_IosbIiE3appE); +REG_FUNC(0x6F410A00, _ZNSt5_IosbIiE3ateE); +REG_FUNC(0xD2A42D0C, _ZNSt5_IosbIiE3begE); +REG_FUNC(0x9B45C3B, _ZNSt5_IosbIiE3curE); +REG_FUNC(0x121A8952, _ZNSt5_IosbIiE3decE); +REG_FUNC(0x7CC027CD, _ZNSt5_IosbIiE3endE); +REG_FUNC(0x6E2FF90B, _ZNSt5_IosbIiE3hexE); +REG_FUNC(0xB4A55C29, _ZNSt5_IosbIiE3octE); +REG_FUNC(0x2CB2DC70, _ZNSt5_IosbIiE3outE); +REG_FUNC(0x78E34A9, _ZNSt5_IosbIiE5truncE); +REG_FUNC(0xB5EFA1B3, _ZNSt5_IosbIiE6badbitE); +REG_FUNC(0x5312A538, _ZNSt5_IosbIiE6binaryE); +REG_FUNC(0xD9D32526, _ZNSt5_IosbIiE6skipwsE); +REG_FUNC(0xAE6CA555, _ZNSt5_IosbIiE7failbitE); +REG_FUNC(0x139E2D21, _ZNSt5_IosbIiE7goodbitE); +REG_FUNC(0x7021DFF0, _ZNSt5_IosbIiE7unitbufE); +REG_FUNC(0x2AD61AAD, _ZNSt5_IosbIiE9_NocreateE); +REG_FUNC(0x60B16E4E, _ZNSt5_IosbIiE9basefieldE); +REG_FUNC(0x8137F8D7, _ZNSt6_Winit9_Init_cntE); +REG_FUNC(0x554B7625, _ZNSt8ios_base4Init9_Init_cntE); +REG_FUNC(0x57CF916C, _ZNSt8ios_base5_SyncE); +REG_FUNC(0xF2D3416A, _ZNSt8ios_base6_IndexE); +REG_FUNC(0x3D219F98, _ZNSt9_Num_base10has_denormE); +REG_FUNC(0xD93E4A6C, _ZNSt9_Num_base10is_boundedE); +REG_FUNC(0xB65169EF, _ZNSt9_Num_base10is_integerE); +REG_FUNC(0x13B38354, _ZNSt9_Num_base11round_styleE); +REG_FUNC(0xB11D20E2, _ZNSt9_Num_base12has_infinityE); +REG_FUNC(0x3E169F74, _ZNSt9_Num_base12max_exponentE); +REG_FUNC(0xD7C041E0, _ZNSt9_Num_base12min_exponentE); +REG_FUNC(0x2DA0D59, _ZNSt9_Num_base13has_quiet_NaNE); +REG_FUNC(0xBE06BD79, _ZNSt9_Num_base14is_specializedE); +REG_FUNC(0xEBBC4DDD, _ZNSt9_Num_base14max_exponent10E); +REG_FUNC(0xFFCF7FC, _ZNSt9_Num_base14min_exponent10E); +REG_FUNC(0xB317DDDF, _ZNSt9_Num_base15has_denorm_lossE); +REG_FUNC(0x245D399E, _ZNSt9_Num_base15tinyness_beforeE); +REG_FUNC(0xBD5F0B8A, _ZNSt9_Num_base17has_signaling_NaNE); +REG_FUNC(0xE23BAE9E, _ZNSt9_Num_base5radixE); +REG_FUNC(0x9237A154, _ZNSt9_Num_base5trapsE); +REG_FUNC(0xE8421A12, _ZNSt9_Num_base6digitsE); +REG_FUNC(0x80698934, _ZNSt9_Num_base8digits10E); +REG_FUNC(0xB338C222, _ZNSt9_Num_base8is_exactE); +REG_FUNC(0x1F5A7860, _ZNSt9_Num_base9is_iec559E); +REG_FUNC(0x840107AA, _ZNSt9_Num_base9is_moduloE); +REG_FUNC(0xABD7AE16, _ZNSt9_Num_base9is_signedE); +REG_FUNC(0x4A1AB5B4, _ZSt14_Raise_handler); +REG_FUNC(0x725EAC50, _ZSt16__dummy_typeinfo); +REG_FUNC(0x768F2944, _ZSt3cin); +REG_FUNC(0xD9478DCF, _ZSt4_Fpz); +REG_FUNC(0x14B35A37, _ZSt4cerr); +REG_FUNC(0xD361A52A, _ZSt4clog); +REG_FUNC(0xB3867BB4, _ZSt4cout); +REG_FUNC(0x8054BC8E, _ZSt4wcin); +REG_FUNC(0x8B2001F7, _ZSt5wcerr); +REG_FUNC(0x8E04C18C, _ZSt5wclog); +REG_FUNC(0x4F726424, _ZSt5wcout); +REG_FUNC(0x9C449444, _ZSt7_BADOFF); +REG_FUNC(0xBFEF56B5, _ZSt7nothrow); +REG_FUNC(0xDC18EF42, _ZTI15__simd64_int8_t); +REG_FUNC(0x2207D305, _ZTI16__simd128_int8_t); +REG_FUNC(0x869FEDA9, _ZTI16__simd64_int16_t); +REG_FUNC(0x7CEF3DB5, _ZTI16__simd64_int32_t); +REG_FUNC(0xFE09AD25, _ZTI16__simd64_poly8_t); +REG_FUNC(0x14A3598E, _ZTI16__simd64_uint8_t); +REG_FUNC(0xF4B098DD, _ZTI17__simd128_int16_t); +REG_FUNC(0xAABF056C, _ZTI17__simd128_int32_t); +REG_FUNC(0x305068B1, _ZTI17__simd128_poly8_t); +REG_FUNC(0x74813D4D, _ZTI17__simd128_uint8_t); +REG_FUNC(0xE118AB78, _ZTI17__simd64_poly16_t); +REG_FUNC(0x67E05799, _ZTI17__simd64_uint16_t); +REG_FUNC(0x1617E8CB, _ZTI17__simd64_uint32_t); +REG_FUNC(0x2FACB1EF, _ZTI18__simd128_poly16_t); +REG_FUNC(0xC089FED3, _ZTI18__simd128_uint16_t); +REG_FUNC(0xFC00EC48, _ZTI18__simd128_uint32_t); +REG_FUNC(0x237AF69B, _ZTI18__simd64_float16_t); +REG_FUNC(0xF7FDBBED, _ZTI18__simd64_float32_t); +REG_FUNC(0x525557F3, _ZTI19__simd128_float16_t); +REG_FUNC(0xA4018B84, _ZTI19__simd128_float32_t); +REG_FUNC(0xA1FE4058, _ZTIDh); +REG_FUNC(0x5351829B, _ZTINSt8ios_base7failureE); +REG_FUNC(0xAC6C8F, _ZTIP15__simd64_int8_t); +REG_FUNC(0xD5B056B8, _ZTIP16__simd128_int8_t); +REG_FUNC(0x13975DAE, _ZTIP16__simd64_int16_t); +REG_FUNC(0x963C04E3, _ZTIP16__simd64_int32_t); +REG_FUNC(0x9F43A559, _ZTIP16__simd64_poly8_t); +REG_FUNC(0xD8079FA9, _ZTIP16__simd64_uint8_t); +REG_FUNC(0xEF53FE1F, _ZTIP17__simd128_int16_t); +REG_FUNC(0xA5094302, _ZTIP17__simd128_int32_t); +REG_FUNC(0x9CAF5E5A, _ZTIP17__simd128_poly8_t); +REG_FUNC(0x264B0978, _ZTIP17__simd128_uint8_t); +REG_FUNC(0x214A0488, _ZTIP17__simd64_poly16_t); +REG_FUNC(0xA96D02B1, _ZTIP17__simd64_uint16_t); +REG_FUNC(0xEE862280, _ZTIP17__simd64_uint32_t); +REG_FUNC(0xB5CEC4FF, _ZTIP18__simd128_poly16_t); +REG_FUNC(0x46124E82, _ZTIP18__simd128_uint16_t); +REG_FUNC(0x7E6CC17, _ZTIP18__simd128_uint32_t); +REG_FUNC(0x588EBCAD, _ZTIP18__simd64_float16_t); +REG_FUNC(0xDFCB2417, _ZTIP18__simd64_float32_t); +REG_FUNC(0x9502D3C0, _ZTIP19__simd128_float16_t); +REG_FUNC(0xFB84796C, _ZTIP19__simd128_float32_t); +REG_FUNC(0xA43ABF14, _ZTIPDh); +REG_FUNC(0x37A74E46, _ZTIPK15__simd64_int8_t); +REG_FUNC(0x60D7D920, _ZTIPK16__simd128_int8_t); +REG_FUNC(0x52A04C47, _ZTIPK16__simd64_int16_t); +REG_FUNC(0xBB64CCF1, _ZTIPK16__simd64_int32_t); +REG_FUNC(0x7C9D0C33, _ZTIPK16__simd64_poly8_t); +REG_FUNC(0x21A57A1, _ZTIPK16__simd64_uint8_t); +REG_FUNC(0x21E3DD1, _ZTIPK17__simd128_int16_t); +REG_FUNC(0xFF8DDBE7, _ZTIPK17__simd128_int32_t); +REG_FUNC(0xB30AB3B5, _ZTIPK17__simd128_poly8_t); +REG_FUNC(0xC8721E86, _ZTIPK17__simd128_uint8_t); +REG_FUNC(0x610983B7, _ZTIPK17__simd64_poly16_t); +REG_FUNC(0x486A3970, _ZTIPK17__simd64_uint16_t); +REG_FUNC(0x9577D4FD, _ZTIPK17__simd64_uint32_t); +REG_FUNC(0x192861D3, _ZTIPK18__simd128_poly16_t); +REG_FUNC(0x9C721F27, _ZTIPK18__simd128_uint16_t); +REG_FUNC(0xC0A37F8F, _ZTIPK18__simd128_uint32_t); +REG_FUNC(0xF2FCDEFC, _ZTIPK18__simd64_float16_t); +REG_FUNC(0x2D2B93F7, _ZTIPK18__simd64_float32_t); +REG_FUNC(0x6B7DA1FD, _ZTIPK19__simd128_float16_t); +REG_FUNC(0x15CA84E1, _ZTIPK19__simd128_float32_t); +REG_FUNC(0x6195F016, _ZTIPKDh); +REG_FUNC(0x2059F4C0, _ZTIPKU8__vectorx); +REG_FUNC(0xFCC4EE61, _ZTIPKU8__vectory); +REG_FUNC(0x63E0CE97, _ZTIPKa); +REG_FUNC(0x47A13017, _ZTIPKb); +REG_FUNC(0x8C375D81, _ZTIPKc); +REG_FUNC(0x841645BA, _ZTIPKd); +REG_FUNC(0x179015C1, _ZTIPKe); +REG_FUNC(0xF7F85635, _ZTIPKf); +REG_FUNC(0x54CF62A4, _ZTIPKh); +REG_FUNC(0x33DAF949, _ZTIPKi); +REG_FUNC(0x703C1962, _ZTIPKj); +REG_FUNC(0xF353DAF3, _ZTIPKl); +REG_FUNC(0x67092852, _ZTIPKm); +REG_FUNC(0xDAAEEAD0, _ZTIPKs); +REG_FUNC(0x39790E0A, _ZTIPKt); +REG_FUNC(0xEE47C447, _ZTIPKv); +REG_FUNC(0xECDB6B05, _ZTIPKw); +REG_FUNC(0xC20CF55C, _ZTIPKx); +REG_FUNC(0xA0F5E8F5, _ZTIPKy); +REG_FUNC(0xA6C2A25C, _ZTIPU8__vectorx); +REG_FUNC(0x81B51915, _ZTIPU8__vectory); +REG_FUNC(0xA7CB4EAA, _ZTIPa); +REG_FUNC(0x87B0FB6, _ZTIPb); +REG_FUNC(0xE4D24E14, _ZTIPc); +REG_FUNC(0x6825FFE6, _ZTIPd); +REG_FUNC(0x926B9A3A, _ZTIPe); +REG_FUNC(0x24072F3E, _ZTIPf); +REG_FUNC(0x8B5247B, _ZTIPh); +REG_FUNC(0x15C21CC8, _ZTIPi); +REG_FUNC(0xD234CF18, _ZTIPj); +REG_FUNC(0x50E25810, _ZTIPl); +REG_FUNC(0x9D0DBB1A, _ZTIPm); +REG_FUNC(0xDCB7CD94, _ZTIPs); +REG_FUNC(0x7FC4B19D, _ZTIPt); +REG_FUNC(0x4722F2AE, _ZTIPv); +REG_FUNC(0x2208C899, _ZTIPw); +REG_FUNC(0xE64F5994, _ZTIPx); +REG_FUNC(0xC1C20AC0, _ZTIPy); +REG_FUNC(0xD7A9284F, _ZTISd); +REG_FUNC(0xE302D51A, _ZTISi); +REG_FUNC(0xF9426257, _ZTISo); +REG_FUNC(0x7242603B, _ZTISt10bad_typeid); +REG_FUNC(0x67B82DEF, _ZTISt10istrstream); +REG_FUNC(0x9F17589B, _ZTISt10ostrstream); +REG_FUNC(0xE0E3C75A, _ZTISt11_ctype_base); +REG_FUNC(0x87457513, _ZTISt11logic_error); +REG_FUNC(0x2B71045A, _ZTISt11range_error); +REG_FUNC(0x9A72EBFE, _ZTISt12domain_error); +REG_FUNC(0x15E6C91C, _ZTISt12length_error); +REG_FUNC(0xBAC29E4D, _ZTISt12out_of_range); +REG_FUNC(0x8257DFA2, _ZTISt12strstreambuf); +REG_FUNC(0x34455CAF, _ZTISt13_codecvt_base); +REG_FUNC(0xF4A5A537, _ZTISt13bad_exception); +REG_FUNC(0x33C19D3B, _ZTISt13basic_filebufIcSt11char_traitsIcEE); +REG_FUNC(0x83DB8917, _ZTISt13basic_filebufIwSt11char_traitsIwEE); +REG_FUNC(0x1582929A, _ZTISt13basic_istreamIwSt11char_traitsIwEE); +REG_FUNC(0xF4062B77, _ZTISt13basic_ostreamIwSt11char_traitsIwEE); +REG_FUNC(0x2451AF0A, _ZTISt13runtime_error); +REG_FUNC(0x3EE22853, _ZTISt14overflow_error); +REG_FUNC(0x758B452B, _ZTISt15basic_streambufIcSt11char_traitsIcEE); +REG_FUNC(0x52B5EC73, _ZTISt15basic_streambufIwSt11char_traitsIwEE); +REG_FUNC(0xCD0A98ED, _ZTISt15underflow_error); +REG_FUNC(0xA128D5A0, _ZTISt16invalid_argument); +REG_FUNC(0xE2AB6BF9, _ZTISt5_IosbIiE); +REG_FUNC(0x3FD78B17, _ZTISt6_ctypeIcE); +REG_FUNC(0xA8CD5D05, _ZTISt6_ctypeIwE); +REG_FUNC(0xAFB2B7FB, _ZTISt8_codecvtIccSt9_MbstatetE); +REG_FUNC(0xCA25D9BE, _ZTISt8_codecvtIwcSt9_MbstatetE); +REG_FUNC(0xA7CA7C93, _ZTISt8bad_cast); +REG_FUNC(0xB93721C7, _ZTISt8ios_base); +REG_FUNC(0x35E135A0, _ZTISt9bad_alloc); +REG_FUNC(0x7BA61382, _ZTISt9basic_iosIcSt11char_traitsIcEE); +REG_FUNC(0x905B8B0, _ZTISt9basic_iosIwSt11char_traitsIwEE); +REG_FUNC(0x1E8C6100, _ZTISt9exception); +REG_FUNC(0x1CC15F54, _ZTISt9strstream); +REG_FUNC(0x8A026EAD, _ZTISt9type_info); +REG_FUNC(0xE128260C, _ZTIU8__vectorx); +REG_FUNC(0x44C2FA39, _ZTIU8__vectory); +REG_FUNC(0x4F416B30, _ZTIa); +REG_FUNC(0x3081D959, _ZTIb); +REG_FUNC(0x942D2342, _ZTIc); +REG_FUNC(0x685BA1E8, _ZTId); +REG_FUNC(0xFCE46A43, _ZTIe); +REG_FUNC(0x64AEB8AF, _ZTIf); +REG_FUNC(0x606676D4, _ZTIh); +REG_FUNC(0xA58E84A3, _ZTIi); +REG_FUNC(0x9B0CBEC0, _ZTIj); +REG_FUNC(0xD589E8AE, _ZTIl); +REG_FUNC(0xD39774A5, _ZTIm); +REG_FUNC(0xDC2C85B0, _ZTIs); +REG_FUNC(0xEA3FB57B, _ZTIt); +REG_FUNC(0x76C6BDCE, _ZTIv); +REG_FUNC(0x8BFC9260, _ZTIw); +REG_FUNC(0x90B0194C, _ZTIx); +REG_FUNC(0x16DACFBF, _ZTIy); +REG_FUNC(0x720678AD, _ZTS15__simd64_int8_t); +REG_FUNC(0x5B9F1D83, _ZTS16__simd128_int8_t); +REG_FUNC(0x953ECE43, _ZTS16__simd64_int16_t); +REG_FUNC(0xCE27612E, _ZTS16__simd64_int32_t); +REG_FUNC(0x72BC6CD9, _ZTS16__simd64_poly8_t); +REG_FUNC(0xCD2802B5, _ZTS16__simd64_uint8_t); +REG_FUNC(0xC3FA8530, _ZTS17__simd128_int16_t); +REG_FUNC(0x67A63A08, _ZTS17__simd128_int32_t); +REG_FUNC(0x6B26EFF8, _ZTS17__simd128_poly8_t); +REG_FUNC(0x8C4C69F, _ZTS17__simd128_uint8_t); +REG_FUNC(0x40BC2E0E, _ZTS17__simd64_poly16_t); +REG_FUNC(0x8D1AE4A7, _ZTS17__simd64_uint16_t); +REG_FUNC(0xC4096952, _ZTS17__simd64_uint32_t); +REG_FUNC(0x16D366F1, _ZTS18__simd128_poly16_t); +REG_FUNC(0x45552A1, _ZTS18__simd128_uint16_t); +REG_FUNC(0x7DBF4FFF, _ZTS18__simd128_uint32_t); +REG_FUNC(0xED26DE1, _ZTS18__simd64_float16_t); +REG_FUNC(0xAB0D789A, _ZTS18__simd64_float32_t); +REG_FUNC(0x3200DDB, _ZTS19__simd128_float16_t); +REG_FUNC(0xD54CBD7C, _ZTS19__simd128_float32_t); +REG_FUNC(0xA8E6842E, _ZTSDh); +REG_FUNC(0x5246E71E, _ZTSNSt8ios_base7failureE); +REG_FUNC(0xF98AAA03, _ZTSP15__simd64_int8_t); +REG_FUNC(0xAF5AA646, _ZTSP16__simd128_int8_t); +REG_FUNC(0x73874089, _ZTSP16__simd64_int16_t); +REG_FUNC(0xAD912141, _ZTSP16__simd64_int32_t); +REG_FUNC(0x67D1351B, _ZTSP16__simd64_poly8_t); +REG_FUNC(0x9FDDB92F, _ZTSP16__simd64_uint8_t); +REG_FUNC(0xA9B31841, _ZTSP17__simd128_int16_t); +REG_FUNC(0x244C742C, _ZTSP17__simd128_int32_t); +REG_FUNC(0x31AFE1A0, _ZTSP17__simd128_poly8_t); +REG_FUNC(0x5CF817B0, _ZTSP17__simd128_uint8_t); +REG_FUNC(0xB524B325, _ZTSP17__simd64_poly16_t); +REG_FUNC(0x51A1F225, _ZTSP17__simd64_uint16_t); +REG_FUNC(0x9C3431DD, _ZTSP17__simd64_uint32_t); +REG_FUNC(0x937A4F2F, _ZTSP18__simd128_poly16_t); +REG_FUNC(0x33549DB5, _ZTSP18__simd128_uint16_t); +REG_FUNC(0xFC19AC06, _ZTSP18__simd128_uint32_t); +REG_FUNC(0xD9A43D3A, _ZTSP18__simd64_float16_t); +REG_FUNC(0xFAB5D659, _ZTSP18__simd64_float32_t); +REG_FUNC(0x7E694471, _ZTSP19__simd128_float16_t); +REG_FUNC(0xA9AF9CE8, _ZTSP19__simd128_float32_t); +REG_FUNC(0xDAE584EC, _ZTSPDh); +REG_FUNC(0x2B017F22, _ZTSPK15__simd64_int8_t); +REG_FUNC(0x4A7149C9, _ZTSPK16__simd128_int8_t); +REG_FUNC(0xAC116166, _ZTSPK16__simd64_int16_t); +REG_FUNC(0x6A472A63, _ZTSPK16__simd64_int32_t); +REG_FUNC(0xC356ACF6, _ZTSPK16__simd64_poly8_t); +REG_FUNC(0x878C75F4, _ZTSPK16__simd64_uint8_t); +REG_FUNC(0x68B777E3, _ZTSPK17__simd128_int16_t); +REG_FUNC(0x61188BD, _ZTSPK17__simd128_int32_t); +REG_FUNC(0xC7733F13, _ZTSPK17__simd128_poly8_t); +REG_FUNC(0x3D8A69EC, _ZTSPK17__simd128_uint8_t); +REG_FUNC(0xCC081D58, _ZTSPK17__simd64_poly16_t); +REG_FUNC(0xEB50ABA7, _ZTSPK17__simd64_uint16_t); +REG_FUNC(0x25EC8CE5, _ZTSPK17__simd64_uint32_t); +REG_FUNC(0x5C61F109, _ZTSPK18__simd128_poly16_t); +REG_FUNC(0x9B085E3F, _ZTSPK18__simd128_uint16_t); +REG_FUNC(0x721902EF, _ZTSPK18__simd128_uint32_t); +REG_FUNC(0x1C618B7E, _ZTSPK18__simd64_float16_t); +REG_FUNC(0x89B6EDD3, _ZTSPK18__simd64_float32_t); +REG_FUNC(0x9BC380FF, _ZTSPK19__simd128_float16_t); +REG_FUNC(0xC951A9C5, _ZTSPK19__simd128_float32_t); +REG_FUNC(0x2796C952, _ZTSPKDh); +REG_FUNC(0xC33238AA, _ZTSPKU8__vectorx); +REG_FUNC(0x208CEEA8, _ZTSPKU8__vectory); +REG_FUNC(0xBAD19257, _ZTSPKa); +REG_FUNC(0x6CB2F5A4, _ZTSPKb); +REG_FUNC(0xE242CC59, _ZTSPKc); +REG_FUNC(0xA0C8CCE9, _ZTSPKd); +REG_FUNC(0x5C69903D, _ZTSPKe); +REG_FUNC(0xDBF8E0D1, _ZTSPKf); +REG_FUNC(0x1BC277F5, _ZTSPKh); +REG_FUNC(0xF09F6E45, _ZTSPKi); +REG_FUNC(0x5C6D9EDD, _ZTSPKj); +REG_FUNC(0x12416EBE, _ZTSPKl); +REG_FUNC(0x199F6347, _ZTSPKm); +REG_FUNC(0xA1D68767, _ZTSPKs); +REG_FUNC(0xE6498BCD, _ZTSPKt); +REG_FUNC(0xF0FF237E, _ZTSPKv); +REG_FUNC(0xD255293A, _ZTSPKw); +REG_FUNC(0x2EADF5EC, _ZTSPKx); +REG_FUNC(0xEC3461AB, _ZTSPKy); +REG_FUNC(0xB3EDCB7F, _ZTSPU8__vectorx); +REG_FUNC(0x6D11C7D6, _ZTSPU8__vectory); +REG_FUNC(0xC5AC688C, _ZTSPa); +REG_FUNC(0xE4EB3C43, _ZTSPb); +REG_FUNC(0xAEF69715, _ZTSPc); +REG_FUNC(0x6F81469F, _ZTSPd); +REG_FUNC(0xFD38BF3B, _ZTSPe); +REG_FUNC(0xFCB96733, _ZTSPf); +REG_FUNC(0x5BFE19AB, _ZTSPh); +REG_FUNC(0x187E3B47, _ZTSPi); +REG_FUNC(0x2F4A5390, _ZTSPj); +REG_FUNC(0x651D020E, _ZTSPl); +REG_FUNC(0x6E4D412D, _ZTSPm); +REG_FUNC(0x982D9703, _ZTSPs); +REG_FUNC(0xE2A0B0A8, _ZTSPt); +REG_FUNC(0xF7B6B02A, _ZTSPv); +REG_FUNC(0xF1C9A755, _ZTSPw); +REG_FUNC(0x968B212, _ZTSPx); +REG_FUNC(0x9787CAD, _ZTSPy); +REG_FUNC(0xF86F5756, _ZTSSd); +REG_FUNC(0x999300E0, _ZTSSi); +REG_FUNC(0x591C25A3, _ZTSSo); +REG_FUNC(0xFC9D21B, _ZTSSt10bad_typeid); +REG_FUNC(0x867D109E, _ZTSSt10istrstream); +REG_FUNC(0x88BFC745, _ZTSSt10ostrstream); +REG_FUNC(0xB315CE7A, _ZTSSt11_ctype_base); +REG_FUNC(0xA65DACDF, _ZTSSt11logic_error); +REG_FUNC(0x1B8E7108, _ZTSSt11range_error); +REG_FUNC(0xBE23707A, _ZTSSt12domain_error); +REG_FUNC(0x9E317CE1, _ZTSSt12length_error); +REG_FUNC(0xD8DAD98D, _ZTSSt12out_of_range); +REG_FUNC(0x1C929309, _ZTSSt12strstreambuf); +REG_FUNC(0xE17E4D6, _ZTSSt13_codecvt_base); +REG_FUNC(0x918FE198, _ZTSSt13bad_exception); +REG_FUNC(0x227B4568, _ZTSSt13basic_filebufIcSt11char_traitsIcEE); +REG_FUNC(0xD34BAF59, _ZTSSt13basic_filebufIwSt11char_traitsIwEE); +REG_FUNC(0x4381D6B0, _ZTSSt13basic_istreamIwSt11char_traitsIwEE); +REG_FUNC(0x8D487027, _ZTSSt13basic_ostreamIwSt11char_traitsIwEE); +REG_FUNC(0xCAA9B21D, _ZTSSt13runtime_error); +REG_FUNC(0xA21B1185, _ZTSSt14overflow_error); +REG_FUNC(0x4A1A1314, _ZTSSt15basic_streambufIcSt11char_traitsIcEE); +REG_FUNC(0x26C1C38F, _ZTSSt15basic_streambufIwSt11char_traitsIwEE); +REG_FUNC(0x140AE4BB, _ZTSSt15underflow_error); +REG_FUNC(0xC3CD5E06, _ZTSSt16invalid_argument); +REG_FUNC(0xB07DF922, _ZTSSt5_IosbIiE); +REG_FUNC(0xED549839, _ZTSSt6_ctypeIcE); +REG_FUNC(0x89304937, _ZTSSt6_ctypeIwE); +REG_FUNC(0x17AAF611, _ZTSSt8_codecvtIccSt9_MbstatetE); +REG_FUNC(0xB4C66A72, _ZTSSt8_codecvtIwcSt9_MbstatetE); +REG_FUNC(0x4C50F26D, _ZTSSt8bad_cast); +REG_FUNC(0xA263F3D5, _ZTSSt8ios_base); +REG_FUNC(0x8DA9C17C, _ZTSSt9_numpunctIcE); +REG_FUNC(0xC4F9C216, _ZTSSt9_numpunctIwE); +REG_FUNC(0xDF0FFCD2, _ZTSSt9bad_alloc); +REG_FUNC(0xB37BE412, _ZTSSt9basic_iosIcSt11char_traitsIcEE); +REG_FUNC(0xCA50ACCA, _ZTSSt9basic_iosIwSt11char_traitsIwEE); +REG_FUNC(0x45FD9715, _ZTSSt9exception); +REG_FUNC(0xE5C789D4, _ZTSSt9strstream); +REG_FUNC(0x2856DCD6, _ZTSSt9type_info); +REG_FUNC(0x75A1CED4, _ZTSU8__vectorx); +REG_FUNC(0x508FF61E, _ZTSU8__vectory); +REG_FUNC(0x8E6A51A, _ZTSa); +REG_FUNC(0x491DB7D3, _ZTSb); +REG_FUNC(0xD657B5A0, _ZTSc); +REG_FUNC(0x322C7CB5, _ZTSd); +REG_FUNC(0x596C02C7, _ZTSe); +REG_FUNC(0x2434A5DD, _ZTSf); +REG_FUNC(0x890DE9E8, _ZTSh); +REG_FUNC(0x4B9F21DF, _ZTSi); +REG_FUNC(0x4C2D1984, _ZTSj); +REG_FUNC(0x46E67574, _ZTSl); +REG_FUNC(0xEE238074, _ZTSm); +REG_FUNC(0x8C9CDB9C, _ZTSs); +REG_FUNC(0xED2E996A, _ZTSt); +REG_FUNC(0xD4744378, _ZTSv); +REG_FUNC(0x2C50C827, _ZTSw); +REG_FUNC(0x9574359B, _ZTSx); +REG_FUNC(0x402717E4, _ZTSy); +REG_FUNC(0x51B29810, _ZTTSd); +REG_FUNC(0x52128B13, _ZTTSi); +REG_FUNC(0x3C508708, _ZTTSo); +REG_FUNC(0x87753F6, _ZTTSt10istrstream); +REG_FUNC(0xE3D7CB30, _ZTTSt10ostrstream); +REG_FUNC(0xBC326B50, _ZTTSt13basic_istreamIwSt11char_traitsIwEE); +REG_FUNC(0x16E32018, _ZTTSt13basic_ostreamIwSt11char_traitsIwEE); +REG_FUNC(0xC91F7671, _ZTTSt9strstream); +REG_FUNC(0x648213CC, _ZTVNSt8ios_base7failureE); +REG_FUNC(0x796EA5C0, _ZTVSd); +REG_FUNC(0xC5D326CB, _ZTVSd__St9strstream); +REG_FUNC(0xB02CB03C, _ZTVSi); +REG_FUNC(0xF4400A94, _ZTVSiSd__St9strstream); +REG_FUNC(0xF2A1132D, _ZTVSi__Sd); +REG_FUNC(0xDFF04427, _ZTVSi__St10istrstream); +REG_FUNC(0xD430E6D2, _ZTVSo); +REG_FUNC(0x3CAA5F50, _ZTVSoSd__St9strstream); +REG_FUNC(0x6D6BCA93, _ZTVSo__Sd); +REG_FUNC(0xBA833AE3, _ZTVSo__Sd__St9strstream); +REG_FUNC(0x65069CB5, _ZTVSo__St10ostrstream); +REG_FUNC(0x76BDD7CC, _ZTVSt10bad_typeid); +REG_FUNC(0xFBACB296, _ZTVSt10istrstream); +REG_FUNC(0xA81AD21D, _ZTVSt10ostrstream); +REG_FUNC(0x82A84E5E, _ZTVSt11logic_error); +REG_FUNC(0x1D583475, _ZTVSt11range_error); +REG_FUNC(0x80C77E16, _ZTVSt12domain_error); +REG_FUNC(0x64ADA35, _ZTVSt12length_error); +REG_FUNC(0xDDAE7CBE, _ZTVSt12out_of_range); +REG_FUNC(0x11B2781A, _ZTVSt12strstreambuf); +REG_FUNC(0x75D16BD0, _ZTVSt13_codecvt_base); +REG_FUNC(0x4AA9C954, _ZTVSt13bad_exception); +REG_FUNC(0xC3233C50, _ZTVSt13basic_filebufIcSt11char_traitsIcEE); +REG_FUNC(0xF269A8EB, _ZTVSt13basic_filebufIwSt11char_traitsIwEE); +REG_FUNC(0xB952752B, _ZTVSt13basic_istreamIwSt11char_traitsIwEE); +REG_FUNC(0x48F3405B, _ZTVSt13basic_ostreamIwSt11char_traitsIwEE); +REG_FUNC(0x53F02A18, _ZTVSt13runtime_error); +REG_FUNC(0x177FCCDC, _ZTVSt14overflow_error); +REG_FUNC(0x5548FF7, _ZTVSt15basic_streambufIcSt11char_traitsIcEE); +REG_FUNC(0xE8A9F32E, _ZTVSt15basic_streambufIwSt11char_traitsIwEE); +REG_FUNC(0x515AE097, _ZTVSt15underflow_error); +REG_FUNC(0x23EEDAF0, _ZTVSt16invalid_argument); +REG_FUNC(0x214E1395, _ZTVSt6_ctypeIcE); +REG_FUNC(0x798E7C29, _ZTVSt6_ctypeIwE); +REG_FUNC(0x9B3E5D29, _ZTVSt8_codecvtIccSt9_MbstatetE); +REG_FUNC(0x95405266, _ZTVSt8_codecvtIwcSt9_MbstatetE); +REG_FUNC(0xAA09FD32, _ZTVSt8bad_cast); +REG_FUNC(0xD58C5F52, _ZTVSt8ios_base); +REG_FUNC(0xA27EFBA3, _ZTVSt9bad_alloc); +REG_FUNC(0x147996ED, _ZTVSt9basic_iosIcSt11char_traitsIcEE); +REG_FUNC(0xDE4AFE9, _ZTVSt9basic_iosIcSt11char_traitsIcEE__Sd__St9strstream); +REG_FUNC(0x87D18300, _ZTVSt9basic_iosIcSt11char_traitsIcEE__SiSd__St9strstream); +REG_FUNC(0x3D6A38D3, _ZTVSt9basic_iosIcSt11char_traitsIcEE__Si__Sd); +REG_FUNC(0xA8E795AF, _ZTVSt9basic_iosIcSt11char_traitsIcEE__Si__St10istrstream); +REG_FUNC(0xB7CD4C0E, _ZTVSt9basic_iosIcSt11char_traitsIcEE__SoSd__St9strstream); +REG_FUNC(0x21FDA8D0, _ZTVSt9basic_iosIcSt11char_traitsIcEE__So__Sd); +REG_FUNC(0xA8AAEABA, _ZTVSt9basic_iosIcSt11char_traitsIcEE__So__St10ostrstream); +REG_FUNC(0xCC03F184, _ZTVSt9basic_iosIwSt11char_traitsIwEE); +REG_FUNC(0xBC97F7D6, _ZTVSt9exception); +REG_FUNC(0xFD21E1F1, _ZTVSt9strstream); +REG_FUNC(0x8E9879A7, _ZTVSt9type_info); +REG_FUNC(0xE63750C1, _ZZNSt13basic_filebufIcSt11char_traitsIcEE5_InitEPSt10_Dnk_filetNS2_7_InitflEE7_Stinit); +REG_FUNC(0x1D4E29BC, _ZZNSt13basic_filebufIwSt11char_traitsIwEE5_InitEPSt10_Dnk_filetNS2_7_InitflEE7_Stinit); +REG_FUNC(0x8A37475, _ZTIN10__cxxabiv116__enum_type_infoE); +REG_FUNC(0x66CC7DBB, _ZTIN10__cxxabiv117__array_type_infoE); +REG_FUNC(0x81C44513, _ZTIN10__cxxabiv117__class_type_infoE); +REG_FUNC(0xC35024DA, _ZTIN10__cxxabiv117__pbase_type_infoE); +REG_FUNC(0x835E9E78, _ZTIN10__cxxabiv119__pointer_type_infoE); +REG_FUNC(0x62941235, _ZTIN10__cxxabiv120__function_type_infoE); +REG_FUNC(0x461E17F0, _ZTIN10__cxxabiv120__si_class_type_infoE); +REG_FUNC(0xB80BFF06, _ZTIN10__cxxabiv121__vmi_class_type_infoE); +REG_FUNC(0x7373F517, _ZTIN10__cxxabiv123__fundamental_type_infoE); +REG_FUNC(0xDF23E7B5, _ZTIN10__cxxabiv129__pointer_to_member_type_infoE); +REG_FUNC(0x74F19FF2, _ZTSN10__cxxabiv116__enum_type_infoE); +REG_FUNC(0x9BF7C72D, _ZTSN10__cxxabiv117__array_type_infoE); +REG_FUNC(0xCB5063F1, _ZTSN10__cxxabiv117__class_type_infoE); +REG_FUNC(0x4F5C24A6, _ZTSN10__cxxabiv117__pbase_type_infoE); +REG_FUNC(0x832019EE, _ZTSN10__cxxabiv119__pointer_type_infoE); +REG_FUNC(0xFB8956D8, _ZTSN10__cxxabiv120__function_type_infoE); +REG_FUNC(0xEAC164EC, _ZTSN10__cxxabiv120__si_class_type_infoE); +REG_FUNC(0x4106109E, _ZTSN10__cxxabiv121__vmi_class_type_infoE); +REG_FUNC(0x1FD93E3A, _ZTSN10__cxxabiv123__fundamental_type_infoE); +REG_FUNC(0xB64B4F55, _ZTSN10__cxxabiv129__pointer_to_member_type_infoE); +REG_FUNC(0x4937B673, _ZTVN10__cxxabiv116__enum_type_infoE); +REG_FUNC(0x9383FBD6, _ZTVN10__cxxabiv117__array_type_infoE); +REG_FUNC(0xF79AE8E1, _ZTVN10__cxxabiv117__class_type_infoE); +REG_FUNC(0xFEAD4BDA, _ZTVN10__cxxabiv117__pbase_type_infoE); +REG_FUNC(0xAA57484D, _ZTVN10__cxxabiv119__pointer_type_infoE); +REG_FUNC(0x897B54E3, _ZTVN10__cxxabiv120__function_type_infoE); +REG_FUNC(0x6BC74629, _ZTVN10__cxxabiv120__si_class_type_infoE); +REG_FUNC(0x7321E731, _ZTVN10__cxxabiv121__vmi_class_type_infoE); +REG_FUNC(0x33836375, _ZTVN10__cxxabiv123__fundamental_type_infoE); +REG_FUNC(0x94664DEB, _ZTVN10__cxxabiv129__pointer_to_member_type_infoE); +*/ diff --git a/rpcs3/Emu/ARMv7/PSVFuncList.cpp b/rpcs3/Emu/ARMv7/PSVFuncList.cpp index 5d80b173a7..beb8379bb8 100644 --- a/rpcs3/Emu/ARMv7/PSVFuncList.cpp +++ b/rpcs3/Emu/ARMv7/PSVFuncList.cpp @@ -38,8 +38,10 @@ void execute_psv_func_by_index(ARMv7Thread& CPU, u32 index) } extern psv_log_base& sceLibc; +extern psv_log_base& sceLibstdcxx; void list_known_psv_modules() { sceLibc.Log(""); + sceLibstdcxx.Log(""); } diff --git a/rpcs3/emucore.vcxproj b/rpcs3/emucore.vcxproj index bef91f680b..6ae5e233f5 100644 --- a/rpcs3/emucore.vcxproj +++ b/rpcs3/emucore.vcxproj @@ -58,6 +58,7 @@ + diff --git a/rpcs3/emucore.vcxproj.filters b/rpcs3/emucore.vcxproj.filters index 0b23ec7b36..3ce4681b32 100644 --- a/rpcs3/emucore.vcxproj.filters +++ b/rpcs3/emucore.vcxproj.filters @@ -647,6 +647,9 @@ Emu\ARMv7\Modules + + Emu\ARMv7\Modules + From 7a2cd15173a580df3e8061ae722e14c640db04c7 Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Wed, 5 Nov 2014 19:07:34 +0300 Subject: [PATCH 21/27] 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 + From 1749b95b57e0749c8592870ac01eed870a34cbd1 Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Wed, 5 Nov 2014 21:53:54 +0300 Subject: [PATCH 22/27] sceRefs reading algorithm modified --- rpcs3/Loader/ELF32.cpp | 53 ++++++++++++++++++++++++------------------ 1 file changed, 30 insertions(+), 23 deletions(-) diff --git a/rpcs3/Loader/ELF32.cpp b/rpcs3/Loader/ELF32.cpp index 2ec76cf384..973a045334 100644 --- a/rpcs3/Loader/ELF32.cpp +++ b/rpcs3/Loader/ELF32.cpp @@ -578,34 +578,41 @@ bool ELF32Loader::LoadShdrData(u64 offset) } else if (machine == MACHINE_ARM && !strcmp(shdr_name_arr[i].c_str(), ".sceRefs.rodata")) { - // basically unknown struct + auto code = vm::psv::ptr::make(shdr.sh_addr); + u32 data = 0; - struct reloc_info + for (; code.addr() < shdr.sh_addr + shdr.sh_size; code++) { - u32 code; // 0xff - u32 data; // address that will be written - u32 code1; // 0x2f - u32 addr1; // address of movw r12,# instruction to be replaced - u32 code2; // 0x30 - u32 addr2; // address of movt r12,# instruction to be replaced - u32 code3; // 0 - }; - - auto rel = vm::psv::ptr::make(shdr.sh_addr); - - for (u32 j = 0; j < shdr.sh_size / sizeof(reloc_info); j++) - { - if (rel[j].code == 0xff && rel[j].code1 == 0x2f && rel[j].code2 == 0x30 && rel[j].code3 == 0) + switch (*code) { - const u32 data = rel[j].data; - vm::psv::write16(rel[j].addr1 + 0, 0xf240 | (data & 0x800) >> 1 | (data & 0xf000) >> 12); // MOVW - vm::psv::write16(rel[j].addr1 + 2, 0x0c00 | (data & 0x700) << 4 | (data & 0xff)); - vm::psv::write16(rel[j].addr2 + 0, 0xf2c0 | (data & 0x8000000) >> 17 | (data & 0xf0000000) >> 28); // MOVT - vm::psv::write16(rel[j].addr2 + 2, 0x0c00 | (data & 0x7000000) >> 12 | (data & 0xff0000) >> 16); + case 0x000000ff: + { + // save address for future use + data = *++code; + break; } - else + case 0x0000002f: { - LOG_NOTICE(LOADER, "sceRefs: unknown code found (code=0x%x, code1=0x%x, code2=0x%x, code3=0x%x)", rel[j].code, rel[j].code1, rel[j].code2, rel[j].code3); + // movw r12,# instruction will be replaced + const u32 addr = *++code; + vm::psv::write16(addr + 0, 0xf240 | (data & 0x800) >> 1 | (data & 0xf000) >> 12); // MOVW + vm::psv::write16(addr + 2, 0x0c00 | (data & 0x700) << 4 | (data & 0xff)); + break; + } + case 0x00000030: + { + // movt r12,# instruction will be replaced + const u32 addr = *++code; + vm::psv::write16(addr + 0, 0xf2c0 | (data & 0x8000000) >> 17 | (data & 0xf0000000) >> 28); // MOVT + vm::psv::write16(addr + 2, 0x0c00 | (data & 0x7000000) >> 12 | (data & 0xff0000) >> 16); + break; + } + case 0x00000000: + { + // probably, no operation + break; + } + default: LOG_NOTICE(LOADER, "sceRefs: unknown code found (0x%08x)", *code); } } } From 7172154da7aa00c59db530d7f8d38bfed3f07f50 Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Thu, 6 Nov 2014 03:22:48 +0300 Subject: [PATCH 23/27] ARMv7: CMP_IMM, SUB_IMM, null HLE function --- rpcs3/Emu/ARMv7/ARMv7Interpreter.cpp | 129 +++++++++++++++++++++++++-- rpcs3/Emu/ARMv7/ARMv7Interpreter.h | 6 ++ rpcs3/Emu/ARMv7/ARMv7Opcodes.h | 12 +-- rpcs3/Emu/ARMv7/PSVFuncList.cpp | 23 ++++- rpcs3/Loader/ELF32.cpp | 12 +-- 5 files changed, 164 insertions(+), 18 deletions(-) diff --git a/rpcs3/Emu/ARMv7/ARMv7Interpreter.cpp b/rpcs3/Emu/ARMv7/ARMv7Interpreter.cpp index 62a4838c27..0e4f3a55e8 100644 --- a/rpcs3/Emu/ARMv7/ARMv7Interpreter.cpp +++ b/rpcs3/Emu/ARMv7/ARMv7Interpreter.cpp @@ -99,7 +99,7 @@ void ARMv7Interpreter::ADD_IMM(const u32 data, const ARMv7_encoding type) if (set_flags) { bool carry, overflow; - u32 res = AddWithCarry(CPU.read_gpr(n), imm32, false, carry, overflow); + const u32 res = AddWithCarry(CPU.read_gpr(n), imm32, false, carry, overflow); CPU.write_gpr(d, res); CPU.APSR.N = res >> 31; CPU.APSR.Z = res == 0; @@ -504,11 +504,37 @@ void ARMv7Interpreter::CMN_RSR(const u32 data, const ARMv7_encoding type) void ARMv7Interpreter::CMP_IMM(const u32 data, const ARMv7_encoding type) { + u32 cond = CPU.ITSTATE.advance(); + u32 n = 0; + u32 imm32 = 0; + switch (type) { + case T1: + { + n = (data & 0x700) >> 8; + imm32 = (data & 0xff); + break; + } + case T2: + { + n = (data & 0xf0000) >> 16; + imm32 = ThumbExpandImm((data & 0x4000000) >> 15 | (data & 0x7000) >> 4 | (data & 0xff)); + break; + } case A1: throw __FUNCTION__; default: throw __FUNCTION__; } + + if (ConditionPassed(cond)) + { + bool carry, overflow; + const u32 res = AddWithCarry(CPU.read_gpr(n), ~imm32, true, carry, overflow); + CPU.APSR.N = res >> 31; + CPU.APSR.Z = res == 0; + CPU.APSR.C = carry; + CPU.APSR.V = overflow; + } } void ARMv7Interpreter::CMP_REG(const u32 data, const ARMv7_encoding type) @@ -1027,7 +1053,7 @@ void ARMv7Interpreter::MOV_REG(const u32 data, const ARMv7_encoding type) if (ConditionPassed(cond)) { - u32 res = CPU.read_gpr(m); + const u32 res = CPU.read_gpr(m); CPU.write_gpr(d, res); if (set_flags) { @@ -2096,11 +2122,82 @@ void ARMv7Interpreter::STRH_REG(const u32 data, const ARMv7_encoding type) void ARMv7Interpreter::SUB_IMM(const u32 data, const ARMv7_encoding type) { + bool set_flags = !CPU.ITSTATE; + u32 cond = CPU.ITSTATE.advance(); + u32 d = 0; + u32 n = 0; + u32 imm32 = 0; + switch (type) { + case T1: + { + d = (data & 0x7); + n = (data & 0x38) >> 3; + imm32 = (data & 0x1c) >> 6; + break; + } + case T2: + { + d = n = (data & 0x700) >> 8; + imm32 = (data & 0xff); + break; + } + case T3: + { + d = (data & 0xf00) >> 8; + n = (data & 0xf0000) >> 16; + set_flags = (data & 0x100000); + imm32 = ThumbExpandImm((data & 0x4000000) >> 15 | (data & 0x7000) >> 4 | (data & 0xff)); + + if (d == 15 && set_flags) + { + throw "CMP (immediate)"; + } + if (n == 13) + { + throw "SUB (SP minus immediate)"; + } + break; + } + case T4: + { + d = (data & 0xf00) >> 8; + n = (data & 0xf0000) >> 16; + set_flags = false; + imm32 = (data & 0x4000000) >> 15 | (data & 0x7000) >> 4 | (data & 0xff); + + if (d == 15) + { + throw "ADR"; + } + if (n == 13) + { + throw "SUB (SP minus immediate)"; + } + break; + } case A1: throw __FUNCTION__; default: throw __FUNCTION__; } + + if (ConditionPassed(cond)) + { + if (set_flags) + { + bool carry, overflow; + const u32 res = AddWithCarry(CPU.read_gpr(n), ~imm32, true, carry, overflow); + CPU.write_gpr(d, res); + CPU.APSR.N = res >> 31; + CPU.APSR.Z = res == 0; + CPU.APSR.C = carry; + CPU.APSR.V = overflow; + } + else + { + CPU.write_gpr(d, CPU.read_gpr(n) - imm32); + } + } } void ARMv7Interpreter::SUB_REG(const u32 data, const ARMv7_encoding type) @@ -2146,11 +2243,11 @@ void ARMv7Interpreter::SUB_REG(const u32 data, const ARMv7_encoding type) if (ConditionPassed(cond)) { - u32 shifted = Shift(CPU.read_gpr(m), shift_t, shift_n, CPU.APSR.C); + const u32 shifted = Shift(CPU.read_gpr(m), shift_t, shift_n, CPU.APSR.C); if (set_flags) { bool carry, overflow; - u32 res = AddWithCarry(CPU.read_gpr(n), ~shifted, true, carry, overflow); + const u32 res = AddWithCarry(CPU.read_gpr(n), ~shifted, true, carry, overflow); CPU.write_gpr(d, res); CPU.APSR.N = res >> 31; CPU.APSR.Z = res == 0; @@ -2177,8 +2274,8 @@ void ARMv7Interpreter::SUB_SPI(const u32 data, const ARMv7_encoding type) { u32 cond = CPU.ITSTATE.advance(); u32 d = 13; - u32 imm32 = 0; bool set_flags = false; + u32 imm32 = 0; switch (type) { @@ -2187,6 +2284,26 @@ void ARMv7Interpreter::SUB_SPI(const u32 data, const ARMv7_encoding type) imm32 = (data & 0x7f) << 2; break; } + case T2: + { + d = (data & 0xf00) >> 8; + set_flags = (data & 0x100000); + imm32 = ThumbExpandImm((data & 0x4000000) >> 15 | (data & 0x7000) >> 4 | (data & 0xff)); + + if (d == 15 && set_flags) + { + throw "CMP (immediate)"; + } + break; + } + case T3: + { + d = (data & 0xf00) >> 8; + set_flags = false; + imm32 = (data & 0x4000000) >> 15 | (data & 0x7000) >> 4 | (data & 0xff); + break; + } + case A1: throw __FUNCTION__; default: throw __FUNCTION__; } @@ -2195,7 +2312,7 @@ void ARMv7Interpreter::SUB_SPI(const u32 data, const ARMv7_encoding type) if (set_flags) { bool carry, overflow; - u32 res = AddWithCarry(CPU.SP, ~imm32, true, carry, overflow); + const u32 res = AddWithCarry(CPU.SP, ~imm32, true, carry, overflow); CPU.write_gpr(d, res); CPU.APSR.N = res >> 31; CPU.APSR.Z = res == 0; diff --git a/rpcs3/Emu/ARMv7/ARMv7Interpreter.h b/rpcs3/Emu/ARMv7/ARMv7Interpreter.h index da1b437c61..e9678fe245 100644 --- a/rpcs3/Emu/ARMv7/ARMv7Interpreter.h +++ b/rpcs3/Emu/ARMv7/ARMv7Interpreter.h @@ -262,6 +262,12 @@ public: } } + u32 ThumbExpandImm(u32 imm12) + { + bool carry = CPU.APSR.C; + return ThumbExpandImm_C(imm12, carry, carry); + } + bool ConditionPassed(u32 cond) const { bool result = false; diff --git a/rpcs3/Emu/ARMv7/ARMv7Opcodes.h b/rpcs3/Emu/ARMv7/ARMv7Opcodes.h index 963e026ef5..fb46013f1b 100644 --- a/rpcs3/Emu/ARMv7/ARMv7Opcodes.h +++ b/rpcs3/Emu/ARMv7/ARMv7Opcodes.h @@ -673,6 +673,12 @@ static const ARMv7_opcode_t ARMv7_opcode_table[] = ARMv7_OP4(0xfff0, 0x0fc0, 0xf820, 0x0000, T2, STRH_REG), ARMv7_OP4(0x0e50, 0x0ff0, 0x0000, 0x00b0, A1, STRH_REG), + ARMv7_OP2(0xff80, 0xb080, T1, SUB_SPI), + ARMv7_OP4(0xfbef, 0x8000, 0xf1ad, 0x0000, T2, SUB_SPI), + ARMv7_OP4(0xfbff, 0x8000, 0xf2ad, 0x0000, T3, SUB_SPI), + ARMv7_OP4(0x0fef, 0x0000, 0x024d, 0x0000, A1, SUB_SPI), + ARMv7_OP4(0xffef, 0x8000, 0xebad, 0x0000, T1, SUB_SPR), + ARMv7_OP4(0x0fef, 0x0010, 0x004d, 0x0000, A1, SUB_SPR), ARMv7_OP2(0xfe00, 0x1e00, T1, SUB_IMM), ARMv7_OP2(0xf800, 0x3800, T2, SUB_IMM), ARMv7_OP4(0xfbe0, 0x8000, 0xf1a0, 0x0000, T3, SUB_IMM), @@ -682,12 +688,6 @@ static const ARMv7_opcode_t ARMv7_opcode_table[] = ARMv7_OP4(0xffe0, 0x8000, 0xeba0, 0x0000, T2, SUB_REG), ARMv7_OP4(0x0fe0, 0x0010, 0x0040, 0x0000, A1, SUB_REG), ARMv7_OP4(0x0fe0, 0x0090, 0x0040, 0x0010, A1, SUB_RSR), - ARMv7_OP2(0xff80, 0xb080, T1, SUB_SPI), - ARMv7_OP4(0xfbef, 0x8000, 0xf1ad, 0x0000, T2, SUB_SPI), - ARMv7_OP4(0xfbff, 0x8000, 0xf2ad, 0x0000, T3, SUB_SPI), - ARMv7_OP4(0x0fef, 0x0000, 0x024d, 0x0000, A1, SUB_SPI), - ARMv7_OP4(0xffef, 0x8000, 0xebad, 0x0000, T1, SUB_SPR), - ARMv7_OP4(0x0fef, 0x0010, 0x004d, 0x0000, A1, SUB_SPR), ARMv7_OP2(0xff00, 0xdf00, T1, SVC), ARMv7_OP4(0x0f00, 0x0000, 0x0f00, 0x0000, A1, SVC), diff --git a/rpcs3/Emu/ARMv7/PSVFuncList.cpp b/rpcs3/Emu/ARMv7/PSVFuncList.cpp index cdf34ab487..1bd1fea494 100644 --- a/rpcs3/Emu/ARMv7/PSVFuncList.cpp +++ b/rpcs3/Emu/ARMv7/PSVFuncList.cpp @@ -1,7 +1,28 @@ #include "stdafx.h" +#include "Emu/System.h" #include "PSVFuncList.h" -std::vector g_psv_func_list; +std::vector& g_psv_func_list = []() -> std::vector& +{ + auto v = new std::vector; + + psv_func f = + { + 0xdeadbeef, + "INVALID FUNCTION", + new psv_func_detail::func_binder([]() -> u32 + { + LOG_ERROR(HLE, "Unimplemented function found"); + Emu.Pause(); + + return 0xffffffffu; + }), + nullptr, + }; + v->push_back(f); + + return *v; +}(); void add_psv_func(psv_func& data) { diff --git a/rpcs3/Loader/ELF32.cpp b/rpcs3/Loader/ELF32.cpp index 973a045334..1d35143e01 100644 --- a/rpcs3/Loader/ELF32.cpp +++ b/rpcs3/Loader/ELF32.cpp @@ -556,10 +556,13 @@ bool ELF32Loader::LoadShdrData(u64 offset) if (auto func = get_psv_func_by_nid(nid)) { - func->module->Notice("Imported function %s (nid=0x%08x, addr=0x%x)", func->name, nid, addr); + if (func->module) + func->module->Notice("Imported function %s (nid=0x%08x, addr=0x%x)", func->name, nid, addr); + else + LOG_NOTICE(LOADER, "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 + vm::psv::write16(addr + 0, 0xf870); // HACK (special instruction that calls HLE function) vm::psv::write16(addr + 2, (u16)get_psv_func_index(func)); vm::psv::write16(addr + 4, 0x4770); // BX LR vm::psv::write16(addr + 6, 0); // null @@ -568,9 +571,8 @@ bool ELF32Loader::LoadShdrData(u64 offset) { 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 - vm::psv::write16(addr + 2, 0x0000); + vm::psv::write16(addr + 0, 0xf870); // HACK (special instruction that calls HLE function) + vm::psv::write16(addr + 2, 0x0000); // (zero index) vm::psv::write16(addr + 4, 0x4770); // BX LR vm::psv::write16(addr + 6, 0); // null } From af0ab4e8ad7266fa6123b3306a57d32f1fe92a48 Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Thu, 6 Nov 2014 03:57:34 +0300 Subject: [PATCH 24/27] Bugfix --- rpcs3/Emu/ARMv7/Modules/sceLibKernel.cpp | 10 ++++------ rpcs3/Emu/ARMv7/Modules/sceLibc.cpp | 10 ++++------ rpcs3/Emu/ARMv7/Modules/sceLibm.cpp | 10 ++++------ rpcs3/Emu/ARMv7/Modules/sceLibstdcxx.cpp | 10 ++++------ rpcs3/Emu/ARMv7/PSVFuncList.cpp | 16 ++++++++-------- 5 files changed, 24 insertions(+), 32 deletions(-) diff --git a/rpcs3/Emu/ARMv7/Modules/sceLibKernel.cpp b/rpcs3/Emu/ARMv7/Modules/sceLibKernel.cpp index d176f0012d..2d5fbc14b1 100644 --- a/rpcs3/Emu/ARMv7/Modules/sceLibKernel.cpp +++ b/rpcs3/Emu/ARMv7/Modules/sceLibKernel.cpp @@ -3,16 +3,14 @@ #include "Emu/Memory/Memory.h" #include "Emu/ARMv7/PSVFuncList.h" -extern psv_log_base& sceLibKernel; +extern psv_log_base sceLibKernel; -#define REG_FUNC(nid, name) reg_psv_func(nid, module, #name, &name) +#define REG_FUNC(nid, name) reg_psv_func(nid, &sceLibKernel, #name, &name) -psv_log_base& sceLibKernel = []() -> psv_log_base& +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); @@ -378,5 +376,5 @@ psv_log_base& sceLibKernel = []() -> psv_log_base& /* SceDebugLed */ //REG_FUNC(0x78E702D3, sceKernelSetGPO); - return *module; + return psv_log_base("sceLibKernel"); }(); diff --git a/rpcs3/Emu/ARMv7/Modules/sceLibc.cpp b/rpcs3/Emu/ARMv7/Modules/sceLibc.cpp index eac21b99b1..61970f01b1 100644 --- a/rpcs3/Emu/ARMv7/Modules/sceLibc.cpp +++ b/rpcs3/Emu/ARMv7/Modules/sceLibc.cpp @@ -3,7 +3,7 @@ #include "Emu/Memory/Memory.h" #include "Emu/ARMv7/PSVFuncList.h" -extern psv_log_base& sceLibc; +extern psv_log_base sceLibc; namespace sce_libc_func { @@ -38,12 +38,10 @@ namespace sce_libc_func } } -#define REG_FUNC(nid, name) reg_psv_func(nid, module, #name, &sce_libc_func::name) +#define REG_FUNC(nid, name) reg_psv_func(nid, &sceLibc, #name, &sce_libc_func::name) -psv_log_base& sceLibc = []() -> psv_log_base& +psv_log_base sceLibc = []() -> psv_log_base { - psv_log_base* module = new psv_log_base("SceLibc"); - REG_FUNC(0x33b83b70, __cxa_atexit); REG_FUNC(0x826bbbaf, exit); REG_FUNC(0x9a004680, printf); @@ -338,5 +336,5 @@ psv_log_base& sceLibc = []() -> psv_log_base& //REG_FUNC(0x7D35108B, _FSnan); //REG_FUNC(0x48AEEF2A, _LSnan); - return *module; + return psv_log_base("SceLibc"); }(); diff --git a/rpcs3/Emu/ARMv7/Modules/sceLibm.cpp b/rpcs3/Emu/ARMv7/Modules/sceLibm.cpp index 910f110f49..30fcde88cb 100644 --- a/rpcs3/Emu/ARMv7/Modules/sceLibm.cpp +++ b/rpcs3/Emu/ARMv7/Modules/sceLibm.cpp @@ -3,19 +3,17 @@ #include "Emu/Memory/Memory.h" #include "Emu/ARMv7/PSVFuncList.h" -extern psv_log_base& sceLibm; +extern psv_log_base sceLibm; namespace sce_libm_func { } -#define REG_FUNC(nid, name) reg_psv_func(nid, module, #name, &sce_libm_func::name) +#define REG_FUNC(nid, name) reg_psv_func(nid, &sceLibm, #name, &sce_libm_func::name) -psv_log_base& sceLibm = []() -> psv_log_base& +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); @@ -215,5 +213,5 @@ psv_log_base& sceLibm = []() -> psv_log_base& //REG_FUNC(0xC4F7E42C, _FDsign); //REG_FUNC(0x1DF73D2B, _LDsign); - return *module; + return psv_log_base("SceLibm"); }(); diff --git a/rpcs3/Emu/ARMv7/Modules/sceLibstdcxx.cpp b/rpcs3/Emu/ARMv7/Modules/sceLibstdcxx.cpp index a2ddd50388..e2b4fb7c8a 100644 --- a/rpcs3/Emu/ARMv7/Modules/sceLibstdcxx.cpp +++ b/rpcs3/Emu/ARMv7/Modules/sceLibstdcxx.cpp @@ -3,7 +3,7 @@ #include "Emu/Memory/Memory.h" #include "Emu/ARMv7/PSVFuncList.h" -extern psv_log_base& sceLibstdcxx; +extern psv_log_base sceLibstdcxx; namespace sce_libstdcxx_func { @@ -26,12 +26,10 @@ namespace sce_libstdcxx_func } } -#define REG_FUNC(nid, name) reg_psv_func(nid, module, #name, &sce_libstdcxx_func::name) +#define REG_FUNC(nid, name) reg_psv_func(nid, &sceLibstdcxx, #name, &sce_libstdcxx_func::name) -psv_log_base& sceLibstdcxx = []() -> psv_log_base& +psv_log_base sceLibstdcxx = []() -> psv_log_base { - 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); @@ -980,7 +978,7 @@ psv_log_base& sceLibstdcxx = []() -> psv_log_base& //REG_FUNC(0x33836375, vtable for __cxxabiv1::__fundamental_type_info); //REG_FUNC(0x94664DEB, vtable for __cxxabiv1::__pointer_to_member_type_info); - return *module; + return psv_log_base("SceLibstdcxx"); }(); /* diff --git a/rpcs3/Emu/ARMv7/PSVFuncList.cpp b/rpcs3/Emu/ARMv7/PSVFuncList.cpp index 1bd1fea494..bde15b0dc9 100644 --- a/rpcs3/Emu/ARMv7/PSVFuncList.cpp +++ b/rpcs3/Emu/ARMv7/PSVFuncList.cpp @@ -2,9 +2,9 @@ #include "Emu/System.h" #include "PSVFuncList.h" -std::vector& g_psv_func_list = []() -> std::vector& +std::vector g_psv_func_list = []() -> std::vector { - auto v = new std::vector; + std::vector v; psv_func f = { @@ -19,9 +19,9 @@ std::vector& g_psv_func_list = []() -> std::vector& }), nullptr, }; - v->push_back(f); + v.push_back(f); - return *v; + return v; }(); void add_psv_func(psv_func& data) @@ -58,10 +58,10 @@ void execute_psv_func_by_index(ARMv7Thread& CPU, u32 index) (*g_psv_func_list[index].func)(CPU); } -extern psv_log_base& sceLibc; -extern psv_log_base& sceLibm; -extern psv_log_base& sceLibstdcxx; -extern psv_log_base& sceLibKernel; +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() { From 8ad141de6fdaf1ee957af1579b123d67009e14ab Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Thu, 6 Nov 2014 18:29:14 +0300 Subject: [PATCH 25/27] sceLibc: memcpy, stack arguments --- rpcs3/Emu/ARMv7/ARMv7Thread.cpp | 4 +- rpcs3/Emu/ARMv7/ARMv7Thread.h | 4 +- rpcs3/Emu/ARMv7/Modules/sceLibKernel.cpp | 23 +++- rpcs3/Emu/ARMv7/Modules/sceLibc.cpp | 26 +++-- rpcs3/Emu/ARMv7/Modules/sceLibstdcxx.cpp | 8 +- rpcs3/Emu/ARMv7/PSVFuncList.h | 139 ++++++++++++++++++++++- 6 files changed, 187 insertions(+), 17 deletions(-) diff --git a/rpcs3/Emu/ARMv7/ARMv7Thread.cpp b/rpcs3/Emu/ARMv7/ARMv7Thread.cpp index ea8976b38e..732c2ad7fa 100644 --- a/rpcs3/Emu/ARMv7/ARMv7Thread.cpp +++ b/rpcs3/Emu/ARMv7/ARMv7Thread.cpp @@ -32,9 +32,9 @@ void ARMv7Thread::InitStack() } } -void ARMv7Thread::SetArg(const uint pos, const u64 arg) +u32 ARMv7Thread::GetStackArg(u32 pos) { - assert(0); + return vm::psv::read32(SP + sizeof(u32) * (pos - 5)); } std::string ARMv7Thread::RegsToString() diff --git a/rpcs3/Emu/ARMv7/ARMv7Thread.h b/rpcs3/Emu/ARMv7/ARMv7Thread.h index 4e1dd7d20b..d80d5c9669 100644 --- a/rpcs3/Emu/ARMv7/ARMv7Thread.h +++ b/rpcs3/Emu/ARMv7/ARMv7Thread.h @@ -122,7 +122,7 @@ public: public: virtual void InitRegs(); virtual void InitStack(); - virtual void SetArg(const uint pos, const u64 arg); + u32 GetStackArg(u32 pos); public: virtual std::string RegsToString(); @@ -137,4 +137,4 @@ protected: virtual void DoStop(); virtual void DoCode(); -}; \ No newline at end of file +}; diff --git a/rpcs3/Emu/ARMv7/Modules/sceLibKernel.cpp b/rpcs3/Emu/ARMv7/Modules/sceLibKernel.cpp index 2d5fbc14b1..4f161201e8 100644 --- a/rpcs3/Emu/ARMv7/Modules/sceLibKernel.cpp +++ b/rpcs3/Emu/ARMv7/Modules/sceLibKernel.cpp @@ -5,7 +5,28 @@ extern psv_log_base sceLibKernel; +typedef s32(*SceKernelThreadEntry)(u32 argSize, vm::psv::ptr pArgBlock); +struct SceKernelThreadOptParam +{ + u32 size; + u32 attr; +}; + +s32 sceKernelCreateThread( + vm::psv::ptr pName, + vm::psv::ptr entry, + s32 initPriority, + u32 stackSize, + u32 attr, + s32 cpuAffinityMask, + vm::psv::ptr pOptParam) +{ + sceLibKernel.Todo("sceKernelCreateThread(pName_addr=0x%x ('%s'), entry_addr=0x%x, initPriority=%d, stackSize=0x%x, attr=0x%x, cpuAffinityMask=0x%x, pOptParam_addr=0x%x)", + pName.addr(), pName.get_ptr(), entry.addr(), initPriority, stackSize, attr, cpuAffinityMask, pOptParam.addr()); + + return SCE_OK; +} #define REG_FUNC(nid, name) reg_psv_func(nid, &sceLibKernel, #name, &name) @@ -269,7 +290,7 @@ psv_log_base sceLibKernel = []() -> psv_log_base //REG_FUNC(0xADCA94E5, sceKernelWaitSignal); //REG_FUNC(0x24460BB3, sceKernelWaitSignalCB); //REG_FUNC(0x7BE9C4C8, sceKernelSendSignal); - //REG_FUNC(0xC5C11EE7, sceKernelCreateThread); + REG_FUNC(0xC5C11EE7, sceKernelCreateThread); //REG_FUNC(0x6C60AC61, sceIoOpen); //REG_FUNC(0xF5C6F098, sceIoClose); //REG_FUNC(0x713523E1, sceIoRead); diff --git a/rpcs3/Emu/ARMv7/Modules/sceLibc.cpp b/rpcs3/Emu/ARMv7/Modules/sceLibc.cpp index 61970f01b1..bf6646c7fa 100644 --- a/rpcs3/Emu/ARMv7/Modules/sceLibc.cpp +++ b/rpcs3/Emu/ARMv7/Modules/sceLibc.cpp @@ -36,18 +36,26 @@ namespace sce_libc_func { sceLibc.Error("__cxa_set_dso_handle_main()"); } + + void memcpy(vm::psv::ptr dst, vm::psv::ptr src, u32 size) + { + sceLibc.Error("memcpy(dst_addr=0x%x, src_addr=0x%x, size=0x%x)", dst.addr(), src.addr(), size); + + ::memcpy(dst.get_ptr(), src.get_ptr(), size); + } + + void _Assert() + { + sceLibc.Todo(__FUNCTION__); + Emu.Pause(); + } } #define REG_FUNC(nid, name) reg_psv_func(nid, &sceLibc, #name, &sce_libc_func::name) psv_log_base sceLibc = []() -> psv_log_base { - REG_FUNC(0x33b83b70, __cxa_atexit); - REG_FUNC(0x826bbbaf, exit); - REG_FUNC(0x9a004680, printf); - REG_FUNC(0xbfe02b3a, __cxa_set_dso_handle_main); - - //REG_FUNC(0xE4531F85, _Assert); + REG_FUNC(0xE4531F85, _Assert); //REG_FUNC(0xE71C5CDE, _Stoul); //REG_FUNC(0x7A5CA6A3, _Stoulx); //REG_FUNC(0x6794B3C6, _Stoull); @@ -125,6 +133,7 @@ psv_log_base sceLibc = []() -> psv_log_base //REG_FUNC(0x4790BF1E, getchar); //REG_FUNC(0xF97B8CA3, gets); //REG_FUNC(0x4696E7BE, perror); + REG_FUNC(0x9a004680, printf); //REG_FUNC(0x995708A6, putc); //REG_FUNC(0x7CDAC89C, putchar); //REG_FUNC(0x59C3E171, puts); @@ -153,6 +162,7 @@ psv_log_base sceLibc = []() -> psv_log_base //REG_FUNC(0x875994F3, atoll); //REG_FUNC(0xD1BC28E7, bsearch); //REG_FUNC(0xE9F823C0, div); + REG_FUNC(0x826bbbaf, exit); //REG_FUNC(0xB53B345B, _Exit); //REG_FUNC(0xBCEA304B, labs); //REG_FUNC(0x9D2D17CD, llabs); @@ -185,7 +195,7 @@ psv_log_base sceLibc = []() -> psv_log_base //REG_FUNC(0x54A54EB1, malloc_usable_size); //REG_FUNC(0x2F3E5B16, memchr); //REG_FUNC(0x7747F6D7, memcmp); - //REG_FUNC(0x7205BFDB, memcpy); + REG_FUNC(0x7205BFDB, memcpy); //REG_FUNC(0xAF5C218D, memmove); //REG_FUNC(0x6DC1F0D8, memset); //REG_FUNC(0x1434FA46, strcat); @@ -303,11 +313,13 @@ psv_log_base sceLibc = []() -> psv_log_base //REG_FUNC(0xA967B88D, wctype); //REG_FUNC(0x9D885076, _Towctrans); //REG_FUNC(0xE980110A, _Iswctype); + REG_FUNC(0x33b83b70, __cxa_atexit); //REG_FUNC(0xEDC939E1, __aeabi_atexit); //REG_FUNC(0xB538BF48, __cxa_finalize); //REG_FUNC(0xD0310E31, __cxa_guard_acquire); //REG_FUNC(0x4ED1056F, __cxa_guard_release); //REG_FUNC(0xD18E461D, __cxa_guard_abort); + REG_FUNC(0xbfe02b3a, __cxa_set_dso_handle_main); //REG_FUNC(0x64DA2C47, _Unlocksyslock); //REG_FUNC(0x7DBC0575, _Locksyslock); //REG_FUNC(0x5044FC32, _Lockfilelock); diff --git a/rpcs3/Emu/ARMv7/Modules/sceLibstdcxx.cpp b/rpcs3/Emu/ARMv7/Modules/sceLibstdcxx.cpp index e2b4fb7c8a..7813c8b8a5 100644 --- a/rpcs3/Emu/ARMv7/Modules/sceLibstdcxx.cpp +++ b/rpcs3/Emu/ARMv7/Modules/sceLibstdcxx.cpp @@ -30,10 +30,6 @@ namespace sce_libstdcxx_func psv_log_base sceLibstdcxx = []() -> psv_log_base { - 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); //REG_FUNC(0x15FB88E2, std::logic_error::what() const); @@ -377,6 +373,9 @@ 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(0x173E7421, __aeabi_unwind_cpp_pr0); + 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); @@ -1328,6 +1327,7 @@ REG_FUNC(0x13D5D5A1, _Unwind_Resume); REG_FUNC(0xE7889A5B, _Unwind_VRS_Get); REG_FUNC(0xF106D050, _Unwind_VRS_Pop); REG_FUNC(0x91CDA2F9, _Unwind_VRS_Set); +REG_FUNC(0x173E7421, __aeabi_unwind_cpp_pr0); REG_FUNC(0x3C78DDE3, __aeabi_unwind_cpp_pr1); REG_FUNC(0xF95BDD36, __aeabi_unwind_cpp_pr2); REG_FUNC(0x8C93EFDA, __cxa_allocate_exception); diff --git a/rpcs3/Emu/ARMv7/PSVFuncList.h b/rpcs3/Emu/ARMv7/PSVFuncList.h index 4b80b9d156..1b160f547a 100644 --- a/rpcs3/Emu/ARMv7/PSVFuncList.h +++ b/rpcs3/Emu/ARMv7/PSVFuncList.h @@ -19,6 +19,140 @@ public: }; +enum psv_error_codes +{ + SCE_OK = 0, + + SCE_ERROR_ERRNO_EPERM = 0x80010001, + SCE_ERROR_ERRNO_ENOENT = 0x80010002, + SCE_ERROR_ERRNO_ESRCH = 0x80010003, + SCE_ERROR_ERRNO_EINTR = 0x80010004, + SCE_ERROR_ERRNO_EIO = 0x80010005, + SCE_ERROR_ERRNO_ENXIO = 0x80010006, + SCE_ERROR_ERRNO_E2BIG = 0x80010007, + SCE_ERROR_ERRNO_ENOEXEC = 0x80010008, + SCE_ERROR_ERRNO_EBADF = 0x80010009, + SCE_ERROR_ERRNO_ECHILD = 0x8001000A, + SCE_ERROR_ERRNO_EAGAIN = 0x8001000B, + SCE_ERROR_ERRNO_ENOMEM = 0x8001000C, + SCE_ERROR_ERRNO_EACCES = 0x8001000D, + SCE_ERROR_ERRNO_EFAULT = 0x8001000E, + SCE_ERROR_ERRNO_ENOTBLK = 0x8001000F, + SCE_ERROR_ERRNO_EBUSY = 0x80010010, + SCE_ERROR_ERRNO_EEXIST = 0x80010011, + SCE_ERROR_ERRNO_EXDEV = 0x80010012, + SCE_ERROR_ERRNO_ENODEV = 0x80010013, + SCE_ERROR_ERRNO_ENOTDIR = 0x80010014, + SCE_ERROR_ERRNO_EISDIR = 0x80010015, + SCE_ERROR_ERRNO_EINVAL = 0x80010016, + SCE_ERROR_ERRNO_ENFILE = 0x80010017, + SCE_ERROR_ERRNO_EMFILE = 0x80010018, + SCE_ERROR_ERRNO_ENOTTY = 0x80010019, + SCE_ERROR_ERRNO_ETXTBSY = 0x8001001A, + SCE_ERROR_ERRNO_EFBIG = 0x8001001B, + SCE_ERROR_ERRNO_ENOSPC = 0x8001001C, + SCE_ERROR_ERRNO_ESPIPE = 0x8001001D, + SCE_ERROR_ERRNO_EROFS = 0x8001001E, + SCE_ERROR_ERRNO_EMLINK = 0x8001001F, + SCE_ERROR_ERRNO_EPIPE = 0x80010020, + SCE_ERROR_ERRNO_EDOM = 0x80010021, + SCE_ERROR_ERRNO_ERANGE = 0x80010022, + SCE_ERROR_ERRNO_ENOMSG = 0x80010023, + SCE_ERROR_ERRNO_EIDRM = 0x80010024, + SCE_ERROR_ERRNO_ECHRNG = 0x80010025, + SCE_ERROR_ERRNO_EL2NSYNC = 0x80010026, + SCE_ERROR_ERRNO_EL3HLT = 0x80010027, + SCE_ERROR_ERRNO_EL3RST = 0x80010028, + SCE_ERROR_ERRNO_ELNRNG = 0x80010029, + SCE_ERROR_ERRNO_EUNATCH = 0x8001002A, + SCE_ERROR_ERRNO_ENOCSI = 0x8001002B, + SCE_ERROR_ERRNO_EL2HLT = 0x8001002C, + SCE_ERROR_ERRNO_EDEADLK = 0x8001002D, + SCE_ERROR_ERRNO_ENOLCK = 0x8001002E, + SCE_ERROR_ERRNO_EFORMAT = 0x8001002F, + SCE_ERROR_ERRNO_EUNSUP = 0x80010030, + SCE_ERROR_ERRNO_EBADE = 0x80010032, + SCE_ERROR_ERRNO_EBADR = 0x80010033, + SCE_ERROR_ERRNO_EXFULL = 0x80010034, + SCE_ERROR_ERRNO_ENOANO = 0x80010035, + SCE_ERROR_ERRNO_EBADRQC = 0x80010036, + SCE_ERROR_ERRNO_EBADSLT = 0x80010037, + SCE_ERROR_ERRNO_EDEADLOCK = 0x80010038, + SCE_ERROR_ERRNO_EBFONT = 0x80010039, + SCE_ERROR_ERRNO_ENOSTR = 0x8001003C, + SCE_ERROR_ERRNO_ENODATA = 0x8001003D, + SCE_ERROR_ERRNO_ETIME = 0x8001003E, + SCE_ERROR_ERRNO_ENOSR = 0x8001003F, + SCE_ERROR_ERRNO_ENONET = 0x80010040, + SCE_ERROR_ERRNO_ENOPKG = 0x80010041, + SCE_ERROR_ERRNO_EREMOTE = 0x80010042, + SCE_ERROR_ERRNO_ENOLINK = 0x80010043, + SCE_ERROR_ERRNO_EADV = 0x80010044, + SCE_ERROR_ERRNO_ESRMNT = 0x80010045, + SCE_ERROR_ERRNO_ECOMM = 0x80010046, + SCE_ERROR_ERRNO_EPROTO = 0x80010047, + SCE_ERROR_ERRNO_EMULTIHOP = 0x8001004A, + SCE_ERROR_ERRNO_ELBIN = 0x8001004B, + SCE_ERROR_ERRNO_EDOTDOT = 0x8001004C, + SCE_ERROR_ERRNO_EBADMSG = 0x8001004D, + SCE_ERROR_ERRNO_EFTYPE = 0x8001004F, + SCE_ERROR_ERRNO_ENOTUNIQ = 0x80010050, + SCE_ERROR_ERRNO_EBADFD = 0x80010051, + SCE_ERROR_ERRNO_EREMCHG = 0x80010052, + SCE_ERROR_ERRNO_ELIBACC = 0x80010053, + SCE_ERROR_ERRNO_ELIBBAD = 0x80010054, + SCE_ERROR_ERRNO_ELIBSCN = 0x80010055, + SCE_ERROR_ERRNO_ELIBMAX = 0x80010056, + SCE_ERROR_ERRNO_ELIBEXEC = 0x80010057, + SCE_ERROR_ERRNO_ENOSYS = 0x80010058, + SCE_ERROR_ERRNO_ENMFILE = 0x80010059, + SCE_ERROR_ERRNO_ENOTEMPTY = 0x8001005A, + SCE_ERROR_ERRNO_ENAMETOOLONG = 0x8001005B, + SCE_ERROR_ERRNO_ELOOP = 0x8001005C, + SCE_ERROR_ERRNO_EOPNOTSUPP = 0x8001005F, + SCE_ERROR_ERRNO_EPFNOSUPPORT = 0x80010060, + SCE_ERROR_ERRNO_ECONNRESET = 0x80010068, + SCE_ERROR_ERRNO_ENOBUFS = 0x80010069, + SCE_ERROR_ERRNO_EAFNOSUPPORT = 0x8001006A, + SCE_ERROR_ERRNO_EPROTOTYPE = 0x8001006B, + SCE_ERROR_ERRNO_ENOTSOCK = 0x8001006C, + SCE_ERROR_ERRNO_ENOPROTOOPT = 0x8001006D, + SCE_ERROR_ERRNO_ESHUTDOWN = 0x8001006E, + SCE_ERROR_ERRNO_ECONNREFUSED = 0x8001006F, + SCE_ERROR_ERRNO_EADDRINUSE = 0x80010070, + SCE_ERROR_ERRNO_ECONNABORTED = 0x80010071, + SCE_ERROR_ERRNO_ENETUNREACH = 0x80010072, + SCE_ERROR_ERRNO_ENETDOWN = 0x80010073, + SCE_ERROR_ERRNO_ETIMEDOUT = 0x80010074, + SCE_ERROR_ERRNO_EHOSTDOWN = 0x80010075, + SCE_ERROR_ERRNO_EHOSTUNREACH = 0x80010076, + SCE_ERROR_ERRNO_EINPROGRESS = 0x80010077, + SCE_ERROR_ERRNO_EALREADY = 0x80010078, + SCE_ERROR_ERRNO_EDESTADDRREQ = 0x80010079, + SCE_ERROR_ERRNO_EMSGSIZE = 0x8001007A, + SCE_ERROR_ERRNO_EPROTONOSUPPORT = 0x8001007B, + SCE_ERROR_ERRNO_ESOCKTNOSUPPORT = 0x8001007C, + SCE_ERROR_ERRNO_EADDRNOTAVAIL = 0x8001007D, + SCE_ERROR_ERRNO_ENETRESET = 0x8001007E, + SCE_ERROR_ERRNO_EISCONN = 0x8001007F, + SCE_ERROR_ERRNO_ENOTCONN = 0x80010080, + SCE_ERROR_ERRNO_ETOOMANYREFS = 0x80010081, + SCE_ERROR_ERRNO_EPROCLIM = 0x80010082, + SCE_ERROR_ERRNO_EUSERS = 0x80010083, + SCE_ERROR_ERRNO_EDQUOT = 0x80010084, + SCE_ERROR_ERRNO_ESTALE = 0x80010085, + SCE_ERROR_ERRNO_ENOTSUP = 0x80010086, + SCE_ERROR_ERRNO_ENOMEDIUM = 0x80010087, + SCE_ERROR_ERRNO_ENOSHARE = 0x80010088, + SCE_ERROR_ERRNO_ECASECLASH = 0x80010089, + SCE_ERROR_ERRNO_EILSEQ = 0x8001008A, + SCE_ERROR_ERRNO_EOVERFLOW = 0x8001008B, + SCE_ERROR_ERRNO_ECANCELED = 0x8001008C, + SCE_ERROR_ERRNO_ENOTRECOVERABLE = 0x8001008D, + SCE_ERROR_ERRNO_EOWNERDEAD = 0x8001008E, + +}; + class psv_func_caller { public: @@ -58,6 +192,7 @@ namespace psv_func_detail static __forceinline T func(ARMv7Thread& CPU) { + return 0.0f; } }; @@ -69,19 +204,21 @@ namespace psv_func_detail static __forceinline T func(ARMv7Thread& CPU) { + return {}; } }; template struct bind_arg { - static_assert(f_count <= 4, "TODO: Unsupported stack argument type (general)"); static_assert(f_count <= 0, "TODO: Unsupported stack argument type (float)"); static_assert(v_count <= 0, "TODO: Unsupported stack argument type (vector)"); static_assert(sizeof(T) <= 4, "Invalid function argument type for ARG_STACK"); static __forceinline T func(ARMv7Thread& CPU) { + const u32 res = CPU.GetStackArg(g_count); + return (T&)res; } }; From 5ba772df93b4425babfc35a7587668e6671cd048 Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Thu, 6 Nov 2014 19:09:54 +0300 Subject: [PATCH 26/27] Some errors --- rpcs3/Emu/ARMv7/PSVFuncList.h | 245 ++++++++++++++++++++++++++++++++++ 1 file changed, 245 insertions(+) diff --git a/rpcs3/Emu/ARMv7/PSVFuncList.h b/rpcs3/Emu/ARMv7/PSVFuncList.h index 1b160f547a..1f47c27a35 100644 --- a/rpcs3/Emu/ARMv7/PSVFuncList.h +++ b/rpcs3/Emu/ARMv7/PSVFuncList.h @@ -151,6 +151,251 @@ enum psv_error_codes SCE_ERROR_ERRNO_ENOTRECOVERABLE = 0x8001008D, SCE_ERROR_ERRNO_EOWNERDEAD = 0x8001008E, + SCE_KERNEL_ERROR_ERROR = 0x80020001, + SCE_KERNEL_ERROR_NOT_IMPLEMENTED = 0x80020002, + SCE_KERNEL_ERROR_INVALID_ARGUMENT = 0x80020003, + SCE_KERNEL_ERROR_INVALID_ARGUMENT_SIZE = 0x80020004, + SCE_KERNEL_ERROR_INVALID_FLAGS = 0x80020005, + SCE_KERNEL_ERROR_ILLEGAL_SIZE = 0x80020006, + SCE_KERNEL_ERROR_ILLEGAL_ADDR = 0x80020007, + SCE_KERNEL_ERROR_UNSUP = 0x80020008, + SCE_KERNEL_ERROR_ILLEGAL_MODE = 0x80020009, + SCE_KERNEL_ERROR_ILLEGAL_ALIGNMENT = 0x8002000A, + SCE_KERNEL_ERROR_NOSYS = 0x8002000B, + SCE_KERNEL_ERROR_DEBUG_ERROR = 0x80021000, + SCE_KERNEL_ERROR_ILLEGAL_DIPSW_NUMBER = 0x80021001, + SCE_KERNEL_ERROR_CPU_ERROR = 0x80022000, + SCE_KERNEL_ERROR_MMU_ILLEGAL_L1_TYPE = 0x80022001, + SCE_KERNEL_ERROR_MMU_L2_INDEX_OVERFLOW = 0x80022002, + SCE_KERNEL_ERROR_MMU_L2_SIZE_OVERFLOW = 0x80022003, + SCE_KERNEL_ERROR_INVALID_CPU_AFFINITY = 0x80022004, + SCE_KERNEL_ERROR_INVALID_MEMORY_ACCESS = 0x80022005, + SCE_KERNEL_ERROR_INVALID_MEMORY_ACCESS_PERMISSION = 0x80022006, + SCE_KERNEL_ERROR_VA2PA_FAULT = 0x80022007, + SCE_KERNEL_ERROR_VA2PA_MAPPED = 0x80022008, + SCE_KERNEL_ERROR_VALIDATION_CHECK_FAILED = 0x80022009, + SCE_KERNEL_ERROR_SYSMEM_ERROR = 0x80024000, + SCE_KERNEL_ERROR_INVALID_PROCESS_CONTEXT = 0x80024001, + SCE_KERNEL_ERROR_UID_NAME_TOO_LONG = 0x80024002, + SCE_KERNEL_ERROR_VARANGE_IS_NOT_PHYSICAL_CONTINUOUS = 0x80024003, + SCE_KERNEL_ERROR_PHYADDR_ERROR = 0x80024100, + SCE_KERNEL_ERROR_NO_PHYADDR = 0x80024101, + SCE_KERNEL_ERROR_PHYADDR_USED = 0x80024102, + SCE_KERNEL_ERROR_PHYADDR_NOT_USED = 0x80024103, + SCE_KERNEL_ERROR_NO_IOADDR = 0x80024104, + SCE_KERNEL_ERROR_PHYMEM_ERROR = 0x80024300, + SCE_KERNEL_ERROR_ILLEGAL_PHYPAGE_STATUS = 0x80024301, + SCE_KERNEL_ERROR_NO_FREE_PHYSICAL_PAGE = 0x80024302, + SCE_KERNEL_ERROR_NO_FREE_PHYSICAL_PAGE_UNIT = 0x80024303, + SCE_KERNEL_ERROR_PHYMEMPART_NOT_EMPTY = 0x80024304, + SCE_KERNEL_ERROR_NO_PHYMEMPART_LPDDR2 = 0x80024305, + SCE_KERNEL_ERROR_NO_PHYMEMPART_CDRAM = 0x80024306, + SCE_KERNEL_ERROR_FIXEDHEAP_ERROR = 0x80024400, + SCE_KERNEL_ERROR_FIXEDHEAP_ILLEGAL_SIZE = 0x80024401, + SCE_KERNEL_ERROR_FIXEDHEAP_ILLEGAL_INDEX = 0x80024402, + SCE_KERNEL_ERROR_FIXEDHEAP_INDEX_OVERFLOW = 0x80024403, + SCE_KERNEL_ERROR_FIXEDHEAP_NO_CHUNK = 0x80024404, + SCE_KERNEL_ERROR_UID_ERROR = 0x80024500, + SCE_KERNEL_ERROR_INVALID_UID = 0x80024501, + SCE_KERNEL_ERROR_SYSMEM_UID_INVALID_ARGUMENT = 0x80024502, + SCE_KERNEL_ERROR_SYSMEM_INVALID_UID_RANGE = 0x80024503, + SCE_KERNEL_ERROR_SYSMEM_NO_VALID_UID = 0x80024504, + SCE_KERNEL_ERROR_SYSMEM_CANNOT_ALLOCATE_UIDENTRY = 0x80024505, + SCE_KERNEL_ERROR_NOT_PROCESS_UID = 0x80024506, + SCE_KERNEL_ERROR_NOT_KERNEL_UID = 0x80024507, + SCE_KERNEL_ERROR_INVALID_UID_CLASS = 0x80024508, + SCE_KERNEL_ERROR_INVALID_UID_SUBCLASS = 0x80024509, + SCE_KERNEL_ERROR_UID_CANNOT_FIND_BY_NAME = 0x8002450A, + SCE_KERNEL_ERROR_VIRPAGE_ERROR = 0x80024600, + SCE_KERNEL_ERROR_ILLEGAL_VIRPAGE_TYPE = 0x80024601, + SCE_KERNEL_ERROR_BLOCK_ERROR = 0x80024700, + SCE_KERNEL_ERROR_ILLEGAL_BLOCK_ID = 0x80024701, + SCE_KERNEL_ERROR_ILLEGAL_BLOCK_TYPE = 0x80024702, + SCE_KERNEL_ERROR_BLOCK_IN_USE = 0x80024703, + SCE_KERNEL_ERROR_PARTITION_ERROR = 0x80024800, + SCE_KERNEL_ERROR_ILLEGAL_PARTITION_ID = 0x80024801, + SCE_KERNEL_ERROR_ILLEGAL_PARTITION_INDEX = 0x80024802, + SCE_KERNEL_ERROR_NO_L2PAGETABLE = 0x80024803, + SCE_KERNEL_ERROR_HEAPLIB_ERROR = 0x80024900, + SCE_KERNEL_ERROR_ILLEGAL_HEAP_ID = 0x80024901, + SCE_KERNEL_ERROR_OUT_OF_RANG = 0x80024902, + SCE_KERNEL_ERROR_HEAPLIB_NOMEM = 0x80024903, + SCE_KERNEL_ERROR_SYSMEM_ADDRESS_SPACE_ERROR = 0x80024A00, + SCE_KERNEL_ERROR_INVALID_ADDRESS_SPACE_ID = 0x80024A01, + SCE_KERNEL_ERROR_INVALID_PARTITION_INDEX = 0x80024A02, + SCE_KERNEL_ERROR_ADDRESS_SPACE_CANNOT_FIND_PARTITION_BY_ADDR = 0x80024A03, + SCE_KERNEL_ERROR_SYSMEM_MEMBLOCK_ERROR = 0x80024B00, + SCE_KERNEL_ERROR_ILLEGAL_MEMBLOCK_TYPE = 0x80024B01, + SCE_KERNEL_ERROR_ILLEGAL_MEMBLOCK_REMAP_TYPE = 0x80024B02, + SCE_KERNEL_ERROR_NOT_PHY_CONT_MEMBLOCK = 0x80024B03, + SCE_KERNEL_ERROR_ILLEGAL_MEMBLOCK_CODE = 0x80024B04, + SCE_KERNEL_ERROR_ILLEGAL_MEMBLOCK_SIZE = 0x80024B05, + SCE_KERNEL_ERROR_ILLEGAL_USERMAP_SIZE = 0x80024B06, + SCE_KERNEL_ERROR_MEMBLOCK_TYPE_FOR_KERNEL_PROCESS = 0x80024B07, + SCE_KERNEL_ERROR_PROCESS_CANNOT_REMAP_MEMBLOCK = 0x80024B08, + SCE_KERNEL_ERROR_SYSMEM_PHYMEMLOW_ERROR = 0x80024C00, + SCE_KERNEL_ERROR_CANNOT_ALLOC_PHYMEMLOW = 0x80024C01, + SCE_KERNEL_ERROR_UNKNOWN_PHYMEMLOW_TYPE = 0x80024C02, + SCE_KERNEL_ERROR_SYSMEM_BITHEAP_ERROR = 0x80024D00, + SCE_KERNEL_ERROR_CANNOT_ALLOC_BITHEAP = 0x80024D01, + SCE_KERNEL_ERROR_LOADCORE_ERROR = 0x80025000, + SCE_KERNEL_ERROR_ILLEGAL_ELF_HEADER = 0x80025001, + SCE_KERNEL_ERROR_ILLEGAL_SELF_HEADER = 0x80025002, + SCE_KERNEL_ERROR_EXCPMGR_ERROR = 0x80027000, + SCE_KERNEL_ERROR_ILLEGAL_EXCPCODE = 0x80027001, + SCE_KERNEL_ERROR_ILLEGAL_EXCPHANDLER = 0x80027002, + SCE_KERNEL_ERROR_NOTFOUND_EXCPHANDLER = 0x80027003, + SCE_KERNEL_ERROR_CANNOT_RELEASE_EXCPHANDLER = 0x80027004, + SCE_KERNEL_ERROR_INTRMGR_ERROR = 0x80027100, + SCE_KERNEL_ERROR_ILLEGAL_CONTEXT = 0x80027101, + SCE_KERNEL_ERROR_ILLEGAL_INTRCODE = 0x80027102, + SCE_KERNEL_ERROR_ILLEGAL_INTRPARAM = 0x80027103, + SCE_KERNEL_ERROR_ILLEGAL_INTRPRIORITY = 0x80027104, + SCE_KERNEL_ERROR_ILLEGAL_TARGET_CPU = 0x80027105, + SCE_KERNEL_ERROR_ILLEGAL_INTRFILTER = 0x80027106, + SCE_KERNEL_ERROR_ILLEGAL_INTRTYPE = 0x80027107, + SCE_KERNEL_ERROR_ILLEGAL_HANDLER = 0x80027108, + SCE_KERNEL_ERROR_FOUND_HANDLER = 0x80027109, + SCE_KERNEL_ERROR_NOTFOUND_HANDLER = 0x8002710A, + SCE_KERNEL_ERROR_NO_MEMORY = 0x8002710B, + SCE_KERNEL_ERROR_DMACMGR_ERROR = 0x80027200, + SCE_KERNEL_ERROR_ALREADY_QUEUED = 0x80027201, + SCE_KERNEL_ERROR_NOT_QUEUED = 0x80027202, + SCE_KERNEL_ERROR_NOT_SETUP = 0x80027203, + SCE_KERNEL_ERROR_ON_TRANSFERRING = 0x80027204, + SCE_KERNEL_ERROR_NOT_INITIALIZED = 0x80027205, + SCE_KERNEL_ERROR_TRANSFERRED = 0x80027206, + SCE_KERNEL_ERROR_NOT_UNDER_CONTROL = 0x80027207, + SCE_KERNEL_ERROR_SYSTIMER_ERROR = 0x80027300, + SCE_KERNEL_ERROR_NO_FREE_TIMER = 0x80027301, + SCE_KERNEL_ERROR_TIMER_NOT_ALLOCATED = 0x80027302, + SCE_KERNEL_ERROR_TIMER_COUNTING = 0x80027303, + SCE_KERNEL_ERROR_TIMER_STOPPED = 0x80027304, + SCE_KERNEL_ERROR_THREADMGR_ERROR = 0x80028000, + SCE_KERNEL_ERROR_DORMANT = 0x80028001, + SCE_KERNEL_ERROR_NOT_DORMANT = 0x80028002, + SCE_KERNEL_ERROR_UNKNOWN_THID = 0x80028003, + SCE_KERNEL_ERROR_CAN_NOT_WAIT = 0x80028004, + SCE_KERNEL_ERROR_ILLEGAL_THID = 0x80028005, + SCE_KERNEL_ERROR_THREAD_TERMINATED = 0x80028006, + SCE_KERNEL_ERROR_DELETED = 0x80028007, + SCE_KERNEL_ERROR_WAIT_TIMEOUT = 0x80028008, + SCE_KERNEL_ERROR_NOTIFY_CALLBACK = 0x80028009, + SCE_KERNEL_ERROR_WAIT_DELETE = 0x8002800A, + SCE_KERNEL_ERROR_ILLEGAL_ATTR = 0x8002800B, + SCE_KERNEL_ERROR_EVF_MULTI = 0x8002800C, + SCE_KERNEL_ERROR_WAIT_CANCEL = 0x8002800D, + SCE_KERNEL_ERROR_EVF_COND = 0x8002800E, + SCE_KERNEL_ERROR_ILLEGAL_COUNT = 0x8002800F, + SCE_KERNEL_ERROR_ILLEGAL_PRIORITY = 0x80028010, + SCE_KERNEL_ERROR_MUTEX_RECURSIVE = 0x80028011, + SCE_KERNEL_ERROR_MUTEX_LOCK_OVF = 0x80028012, + SCE_KERNEL_ERROR_MUTEX_NOT_OWNED = 0x80028013, + SCE_KERNEL_ERROR_MUTEX_UNLOCK_UDF = 0x80028014, + SCE_KERNEL_ERROR_MUTEX_FAILED_TO_OWN = 0x80028015, + SCE_KERNEL_ERROR_FAST_MUTEX_RECURSIVE = 0x80028016, + SCE_KERNEL_ERROR_FAST_MUTEX_LOCK_OVF = 0x80028017, + SCE_KERNEL_ERROR_FAST_MUTEX_FAILED_TO_OWN = 0x80028018, + SCE_KERNEL_ERROR_FAST_MUTEX_NOT_OWNED = 0x80028019, + SCE_KERNEL_ERROR_FAST_MUTEX_OWNED = 0x8002801A, + SCE_KERNEL_ERROR_ALARM_CAN_NOT_CANCEL = 0x8002801B, + SCE_KERNEL_ERROR_INVALID_OBJECT_TYPE = 0x8002801C, + SCE_KERNEL_ERROR_KERNEL_TLS_FULL = 0x8002801D, + SCE_KERNEL_ERROR_ILLEGAL_KERNEL_TLS_INDEX = 0x8002801E, + SCE_KERNEL_ERROR_KERNEL_TLS_BUSY = 0x8002801F, + SCE_KERNEL_ERROR_DIFFERENT_UID_CLASS = 0x80028020, + SCE_KERNEL_ERROR_UNKNOWN_UID = 0x80028021, + SCE_KERNEL_ERROR_SEMA_ZERO = 0x80028022, + SCE_KERNEL_ERROR_SEMA_OVF = 0x80028023, + SCE_KERNEL_ERROR_PMON_NOT_THREAD_MODE = 0x80028024, + SCE_KERNEL_ERROR_PMON_NOT_CPU_MODE = 0x80028025, + SCE_KERNEL_ERROR_ALREADY_REGISTERED = 0x80028026, + SCE_KERNEL_ERROR_INVALID_THREAD_ID = 0x80028027, + SCE_KERNEL_ERROR_ALREADY_DEBUG_SUSPENDED = 0x80028028, + SCE_KERNEL_ERROR_NOT_DEBUG_SUSPENDED = 0x80028029, + SCE_KERNEL_ERROR_CAN_NOT_USE_VFP = 0x8002802A, + SCE_KERNEL_ERROR_RUNNING = 0x8002802B, + SCE_KERNEL_ERROR_EVENT_COND = 0x8002802C, + SCE_KERNEL_ERROR_MSG_PIPE_FULL = 0x8002802D, + SCE_KERNEL_ERROR_MSG_PIPE_EMPTY = 0x8002802E, + SCE_KERNEL_ERROR_ALREADY_SENT = 0x8002802F, + SCE_KERNEL_ERROR_CAN_NOT_SUSPEND = 0x80028030, + SCE_KERNEL_ERROR_FAST_MUTEX_ALREADY_INITIALIZED = 0x80028031, + SCE_KERNEL_ERROR_FAST_MUTEX_NOT_INITIALIZED = 0x80028032, + SCE_KERNEL_ERROR_THREAD_STOPPED = 0x80028033, + SCE_KERNEL_ERROR_THREAD_SUSPENDED = 0x80028034, + SCE_KERNEL_ERROR_NOT_SUSPENDED = 0x80028035, + SCE_KERNEL_ERROR_WAIT_DELETE_MUTEX = 0x80028036, + SCE_KERNEL_ERROR_WAIT_CANCEL_MUTEX = 0x80028037, + SCE_KERNEL_ERROR_WAIT_DELETE_COND = 0x80028038, + SCE_KERNEL_ERROR_WAIT_CANCEL_COND = 0x80028039, + SCE_KERNEL_ERROR_LW_MUTEX_NOT_OWNED = 0x8002803A, + SCE_KERNEL_ERROR_LW_MUTEX_LOCK_OVF = 0x8002803B, + SCE_KERNEL_ERROR_LW_MUTEX_UNLOCK_UDF = 0x8002803C, + SCE_KERNEL_ERROR_LW_MUTEX_RECURSIVE = 0x8002803D, + SCE_KERNEL_ERROR_LW_MUTEX_FAILED_TO_OWN = 0x8002803E, + SCE_KERNEL_ERROR_WAIT_DELETE_LW_MUTEX = 0x8002803F, + SCE_KERNEL_ERROR_ILLEGAL_STACK_SIZE = 0x80028040, + SCE_KERNEL_ERROR_RW_LOCK_RECURSIVE = 0x80028041, + SCE_KERNEL_ERROR_RW_LOCK_LOCK_OVF = 0x80028042, + SCE_KERNEL_ERROR_RW_LOCK_NOT_OWNED = 0x80028043, + SCE_KERNEL_ERROR_RW_LOCK_UNLOCK_UDF = 0x80028044, + SCE_KERNEL_ERROR_RW_LOCK_FAILED_TO_LOCK = 0x80028045, + SCE_KERNEL_ERROR_RW_LOCK_FAILED_TO_UNLOCK = 0x80028046, + + SCE_KERNEL_ERROR_PROCESSMGR_ERROR = 0x80029000, + SCE_KERNEL_ERROR_INVALID_PID = 0x80029001, + SCE_KERNEL_ERROR_INVALID_PROCESS_TYPE = 0x80029002, + SCE_KERNEL_ERROR_PLS_FULL = 0x80029003, + SCE_KERNEL_ERROR_INVALID_PROCESS_STATUS = 0x80029004, + SCE_KERNEL_ERROR_INVALID_BUDGET_ID = 0x80029005, + SCE_KERNEL_ERROR_INVALID_BUDGET_SIZE = 0x80029006, + SCE_KERNEL_ERROR_CP14_DISABLED = 0x80029007, + SCE_KERNEL_ERROR_EXCEEDED_MAX_PROCESSES = 0x80029008, + SCE_KERNEL_ERROR_PROCESS_REMAINING = 0x80029009, + SCE_KERNEL_ERROR_IOFILEMGR_ERROR = 0x8002A000, + SCE_KERNEL_ERROR_IO_NAME_TOO_LONG = 0x8002A001, + SCE_KERNEL_ERROR_IO_REG_DEV = 0x8002A002, + SCE_KERNEL_ERROR_IO_ALIAS_USED = 0x8002A003, + SCE_KERNEL_ERROR_IO_DEL_DEV = 0x8002A004, + SCE_KERNEL_ERROR_IO_WOULD_BLOCK = 0x8002A005, + SCE_KERNEL_ERROR_MODULEMGR_START_FAILED = 0x8002D000, + SCE_KERNEL_ERROR_MODULEMGR_STOP_FAIL = 0x8002D001, + SCE_KERNEL_ERROR_MODULEMGR_IN_USE = 0x8002D002, + SCE_KERNEL_ERROR_MODULEMGR_NO_LIB = 0x8002D003, + SCE_KERNEL_ERROR_MODULEMGR_SYSCALL_REG = 0x8002D004, + SCE_KERNEL_ERROR_MODULEMGR_NOMEM_LIB = 0x8002D005, + SCE_KERNEL_ERROR_MODULEMGR_NOMEM_STUB = 0x8002D006, + SCE_KERNEL_ERROR_MODULEMGR_NOMEM_SELF = 0x8002D007, + SCE_KERNEL_ERROR_MODULEMGR_NOMEM = 0x8002D008, + SCE_KERNEL_ERROR_MODULEMGR_INVALID_LIB = 0x8002D009, + SCE_KERNEL_ERROR_MODULEMGR_INVALID_STUB = 0x8002D00A, + SCE_KERNEL_ERROR_MODULEMGR_NO_FUNC_NID = 0x8002D00B, + SCE_KERNEL_ERROR_MODULEMGR_NO_VAR_NID = 0x8002D00C, + SCE_KERNEL_ERROR_MODULEMGR_INVALID_TYPE = 0x8002D00D, + SCE_KERNEL_ERROR_MODULEMGR_NO_MOD_ENTRY = 0x8002D00E, + SCE_KERNEL_ERROR_MODULEMGR_INVALID_PROC_PARAM = 0x8002D00F, + SCE_KERNEL_ERROR_MODULEMGR_NO_MODOBJ = 0x8002D010, + SCE_KERNEL_ERROR_MODULEMGR_NO_MOD = 0x8002D011, + SCE_KERNEL_ERROR_MODULEMGR_NO_PROCESS = 0x8002D012, + SCE_KERNEL_ERROR_MODULEMGR_OLD_LIB = 0x8002D013, + SCE_KERNEL_ERROR_MODULEMGR_STARTED = 0x8002D014, + SCE_KERNEL_ERROR_MODULEMGR_NOT_STARTED = 0x8002D015, + SCE_KERNEL_ERROR_MODULEMGR_NOT_STOPPED = 0x8002D016, + SCE_KERNEL_ERROR_MODULEMGR_INVALID_PROCESS_UID = 0x8002D017, + SCE_KERNEL_ERROR_MODULEMGR_CANNOT_EXPORT_LIB_TO_SHARED = 0x8002D018, + SCE_KERNEL_ERROR_MODULEMGR_INVALID_REL_INFO = 0x8002D019, + SCE_KERNEL_ERROR_MODULEMGR_INVALID_REF_INFO = 0x8002D01A, + SCE_KERNEL_ERROR_MODULEMGR_ELINK = 0x8002D01B, + SCE_KERNEL_ERROR_MODULEMGR_NOENT = 0x8002D01C, + SCE_KERNEL_ERROR_MODULEMGR_BUSY = 0x8002D01D, + SCE_KERNEL_ERROR_MODULEMGR_NOEXEC = 0x8002D01E, + SCE_KERNEL_ERROR_MODULEMGR_NAMETOOLONG = 0x8002D01F, + SCE_KERNEL_ERROR_LIBRARYDB_NOENT = 0x8002D080, + SCE_KERNEL_ERROR_LIBRARYDB_NO_LIB = 0x8002D081, + SCE_KERNEL_ERROR_LIBRARYDB_NO_MOD = 0x8002D082, + SCE_KERNEL_ERROR_AUTHFAIL = 0x8002F000, + SCE_KERNEL_ERROR_NO_AUTH = 0x8002F001, }; class psv_func_caller From 0503f08f6712e7810ac7f5cf657779c4977af656 Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Thu, 6 Nov 2014 19:20:29 +0300 Subject: [PATCH 27/27] Hmm... --- rpcs3/Emu/ARMv7/PSVFuncList.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/rpcs3/Emu/ARMv7/PSVFuncList.h b/rpcs3/Emu/ARMv7/PSVFuncList.h index 1f47c27a35..8ae8282104 100644 --- a/rpcs3/Emu/ARMv7/PSVFuncList.h +++ b/rpcs3/Emu/ARMv7/PSVFuncList.h @@ -437,7 +437,6 @@ namespace psv_func_detail static __forceinline T func(ARMv7Thread& CPU) { - return 0.0f; } }; @@ -449,7 +448,6 @@ namespace psv_func_detail static __forceinline T func(ARMv7Thread& CPU) { - return {}; } };