Cleanup, be_t fixed

Some functions renamed:
get_ps3_function_name
execute_syscall_by_index
This commit is contained in:
Nekotekina 2015-09-14 19:32:35 +03:00
parent 4e62ec7458
commit 59f1077a36
15 changed files with 476 additions and 564 deletions

File diff suppressed because it is too large Load diff

View file

@ -970,8 +970,8 @@ void ppu_interpreter::VSLB(PPUThread& CPU, ppu_opcode_t op)
void ppu_interpreter::VSLDOI(PPUThread& CPU, ppu_opcode_t op) void ppu_interpreter::VSLDOI(PPUThread& CPU, ppu_opcode_t op)
{ {
u8 tmpSRC[32]; u8 tmpSRC[32];
memcpy(tmpSRC, CPU.VPR[op.vb]._u8, 16); std::memcpy(tmpSRC, CPU.VPR + op.vb, 16);
memcpy(tmpSRC + 16, CPU.VPR[op.va]._u8, 16); std::memcpy(tmpSRC + 16, CPU.VPR + op.va, 16);
for (uint b = 0; b<16; b++) for (uint b = 0; b<16; b++)
{ {
@ -1475,7 +1475,7 @@ void ppu_interpreter::SC(PPUThread& CPU, ppu_opcode_t op)
{ {
switch (op.lev) switch (op.lev)
{ {
case 0x0: SysCalls::DoSyscall(CPU, CPU.GPR[11]); break; case 0x0: execute_syscall_by_index(CPU, CPU.GPR[11]); break;
case 0x3: CPU.fast_stop(); break; case 0x3: CPU.fast_stop(); break;
default: throw EXCEPTION(""); default: throw EXCEPTION("");
} }

View file

@ -1,9 +1,6 @@
#pragma once #pragma once
#include "Emu/Cell/PPUOpcodes.h" #include "Emu/Cell/PPUOpcodes.h"
#include "Emu/SysCalls/SysCalls.h"
#include "rpcs3/Ini.h"
#include "Emu/SysCalls/Modules.h"
#include "Emu/Memory/Memory.h" #include "Emu/Memory/Memory.h"
#include <stdint.h> #include <stdint.h>
@ -16,7 +13,7 @@
#include <fenv.h> #include <fenv.h>
extern u64 rotate_mask[64][64]; // defined in PPUThread.cpp, static didn't work correctly in GCC 4.9 for some reason extern u64 rotate_mask[64][64]; // defined in PPUThread.cpp
extern u64 get_timebased_time(); extern u64 get_timebased_time();
inline void InitRotateMask() inline void InitRotateMask()
@ -1327,8 +1324,8 @@ private:
void VPERM(u32 vd, u32 va, u32 vb, u32 vc) void VPERM(u32 vd, u32 va, u32 vb, u32 vc)
{ {
u8 tmpSRC[32]; u8 tmpSRC[32];
memcpy(tmpSRC, CPU.VPR[vb]._u8, 16); std::memcpy(tmpSRC, CPU.VPR + vb, 16);
memcpy(tmpSRC + 16, CPU.VPR[va]._u8, 16); std::memcpy(tmpSRC + 16, CPU.VPR + va, 16);
for (uint b = 0; b < 16; b++) for (uint b = 0; b < 16; b++)
{ {
@ -1703,8 +1700,8 @@ private:
void VSLDOI(u32 vd, u32 va, u32 vb, u32 sh) void VSLDOI(u32 vd, u32 va, u32 vb, u32 sh)
{ {
u8 tmpSRC[32]; u8 tmpSRC[32];
memcpy(tmpSRC, CPU.VPR[vb]._u8, 16); std::memcpy(tmpSRC, CPU.VPR + vb, 16);
memcpy(tmpSRC + 16, CPU.VPR[va]._u8, 16); std::memcpy(tmpSRC + 16, CPU.VPR + va, 16);
for(uint b=0; b<16; b++) for(uint b=0; b<16; b++)
{ {
@ -2232,13 +2229,17 @@ private:
} }
void HACK(u32 index) void HACK(u32 index)
{ {
extern void execute_ppu_func_by_index(PPUThread& ppu, u32 index);
execute_ppu_func_by_index(CPU, index); execute_ppu_func_by_index(CPU, index);
} }
void SC(u32 lev) void SC(u32 lev)
{ {
extern void execute_syscall_by_index(PPUThread& ppu, u64 code);
switch (lev) switch (lev)
{ {
case 0x0: SysCalls::DoSyscall(CPU, CPU.GPR[11]); break; case 0x0: execute_syscall_by_index(CPU, CPU.GPR[11]); break;
case 0x1: throw EXCEPTION("HyperCall LV1"); case 0x1: throw EXCEPTION("HyperCall LV1");
case 0x3: CPU.fast_stop(); break; case 0x3: CPU.fast_stop(); break;
default: throw EXCEPTION("Unknown level (0x%x)", lev); default: throw EXCEPTION("Unknown level (0x%x)", lev);
@ -2487,12 +2488,12 @@ private:
void LDX(u32 rd, u32 ra, u32 rb) void LDX(u32 rd, u32 ra, u32 rb)
{ {
const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb];
CPU.GPR[rd] = vm::read64(VM_CAST(addr)); CPU.GPR[rd] = vm::ps3::read64(VM_CAST(addr));
} }
void LWZX(u32 rd, u32 ra, u32 rb) void LWZX(u32 rd, u32 ra, u32 rb)
{ {
const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb];
CPU.GPR[rd] = vm::read32(VM_CAST(addr)); CPU.GPR[rd] = vm::ps3::read32(VM_CAST(addr));
} }
void SLW(u32 ra, u32 rs, u32 rb, u32 rc) void SLW(u32 ra, u32 rs, u32 rb, u32 rc)
{ {
@ -2564,7 +2565,7 @@ private:
void LVEHX(u32 vd, u32 ra, u32 rb) void LVEHX(u32 vd, u32 ra, u32 rb)
{ {
const u64 addr = (ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]) & ~1ULL; const u64 addr = (ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]) & ~1ULL;
CPU.VPR[vd]._u16[7 - ((addr >> 1) & 0x7)] = vm::read16(VM_CAST(addr)); CPU.VPR[vd]._u16[7 - ((addr >> 1) & 0x7)] = vm::ps3::read16(VM_CAST(addr));
// check LVEWX comments // check LVEWX comments
} }
void SUBF(u32 rd, u32 ra, u32 rb, u32 oe, u32 rc) void SUBF(u32 rd, u32 ra, u32 rb, u32 oe, u32 rc)
@ -2578,7 +2579,7 @@ private:
void LDUX(u32 rd, u32 ra, u32 rb) void LDUX(u32 rd, u32 ra, u32 rb)
{ {
const u64 addr = CPU.GPR[ra] + CPU.GPR[rb]; const u64 addr = CPU.GPR[ra] + CPU.GPR[rb];
CPU.GPR[rd] = vm::read64(VM_CAST(addr)); CPU.GPR[rd] = vm::ps3::read64(VM_CAST(addr));
CPU.GPR[ra] = addr; CPU.GPR[ra] = addr;
} }
void DCBST(u32 ra, u32 rb) void DCBST(u32 ra, u32 rb)
@ -2587,7 +2588,7 @@ private:
void LWZUX(u32 rd, u32 ra, u32 rb) void LWZUX(u32 rd, u32 ra, u32 rb)
{ {
const u64 addr = CPU.GPR[ra] + CPU.GPR[rb]; const u64 addr = CPU.GPR[ra] + CPU.GPR[rb];
CPU.GPR[rd] = vm::read32(VM_CAST(addr)); CPU.GPR[rd] = vm::ps3::read32(VM_CAST(addr));
CPU.GPR[ra] = addr; CPU.GPR[ra] = addr;
} }
void CNTLZD(u32 ra, u32 rs, u32 rc) void CNTLZD(u32 ra, u32 rs, u32 rc)
@ -2613,7 +2614,7 @@ private:
void LVEWX(u32 vd, u32 ra, u32 rb) void LVEWX(u32 vd, u32 ra, u32 rb)
{ {
const u64 addr = (ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]) & ~3ULL; const u64 addr = (ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]) & ~3ULL;
CPU.VPR[vd]._u32[3 - ((addr >> 2) & 0x3)] = vm::read32(VM_CAST(addr)); CPU.VPR[vd]._u32[3 - ((addr >> 2) & 0x3)] = vm::ps3::read32(VM_CAST(addr));
// It's not very good idea to implement it using read128(), // It's not very good idea to implement it using read128(),
// because it can theoretically read RawSPU 32-bit MMIO register (read128() will fail) // 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); //CPU.VPR[vd] = vm::read128((ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]) & ~0xfULL);
@ -2650,7 +2651,7 @@ private:
void LVX(u32 vd, u32 ra, u32 rb) void LVX(u32 vd, u32 ra, u32 rb)
{ {
const u64 addr = (ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]) & ~0xfull; const u64 addr = (ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]) & ~0xfull;
CPU.VPR[vd] = vm::read128(VM_CAST(addr)); CPU.VPR[vd] = vm::ps3::read128(VM_CAST(addr));
} }
void NEG(u32 rd, u32 ra, u32 oe, u32 rc) void NEG(u32 rd, u32 ra, u32 oe, u32 rc)
{ {
@ -2746,7 +2747,7 @@ private:
void STDX(u32 rs, u32 ra, u32 rb) void STDX(u32 rs, u32 ra, u32 rb)
{ {
const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb];
vm::write64(VM_CAST(addr), CPU.GPR[rs]); vm::ps3::write64(VM_CAST(addr), CPU.GPR[rs]);
} }
void STWCX_(u32 rs, u32 ra, u32 rb) void STWCX_(u32 rs, u32 ra, u32 rb)
{ {
@ -2758,31 +2759,31 @@ private:
void STWX(u32 rs, u32 ra, u32 rb) void STWX(u32 rs, u32 ra, u32 rb)
{ {
const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb];
vm::write32(VM_CAST(addr), (u32)CPU.GPR[rs]); vm::ps3::write32(VM_CAST(addr), (u32)CPU.GPR[rs]);
} }
void STVEHX(u32 vs, u32 ra, u32 rb) void STVEHX(u32 vs, u32 ra, u32 rb)
{ {
const u64 addr = (ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]) & ~1ULL; const u64 addr = (ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]) & ~1ULL;
const u8 eb = (addr & 0xf) >> 1; const u8 eb = (addr & 0xf) >> 1;
vm::write16(VM_CAST(addr), CPU.VPR[vs]._u16[7 - eb]); vm::ps3::write16(VM_CAST(addr), CPU.VPR[vs]._u16[7 - eb]);
} }
void STDUX(u32 rs, u32 ra, u32 rb) void STDUX(u32 rs, u32 ra, u32 rb)
{ {
const u64 addr = CPU.GPR[ra] + CPU.GPR[rb]; const u64 addr = CPU.GPR[ra] + CPU.GPR[rb];
vm::write64(VM_CAST(addr), CPU.GPR[rs]); vm::ps3::write64(VM_CAST(addr), CPU.GPR[rs]);
CPU.GPR[ra] = addr; CPU.GPR[ra] = addr;
} }
void STWUX(u32 rs, u32 ra, u32 rb) void STWUX(u32 rs, u32 ra, u32 rb)
{ {
const u64 addr = CPU.GPR[ra] + CPU.GPR[rb]; const u64 addr = CPU.GPR[ra] + CPU.GPR[rb];
vm::write32(VM_CAST(addr), (u32)CPU.GPR[rs]); vm::ps3::write32(VM_CAST(addr), (u32)CPU.GPR[rs]);
CPU.GPR[ra] = addr; CPU.GPR[ra] = addr;
} }
void STVEWX(u32 vs, u32 ra, u32 rb) void STVEWX(u32 vs, u32 ra, u32 rb)
{ {
const u64 addr = (ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]) & ~3ULL; const u64 addr = (ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]) & ~3ULL;
const u8 eb = (addr & 0xf) >> 2; const u8 eb = (addr & 0xf) >> 2;
vm::write32(VM_CAST(addr), CPU.VPR[vs]._u32[3 - eb]); vm::ps3::write32(VM_CAST(addr), CPU.VPR[vs]._u32[3 - eb]);
} }
void SUBFZE(u32 rd, u32 ra, u32 oe, u32 rc) void SUBFZE(u32 rd, u32 ra, u32 oe, u32 rc)
{ {
@ -2815,7 +2816,7 @@ private:
void STVX(u32 vs, u32 ra, u32 rb) void STVX(u32 vs, u32 ra, u32 rb)
{ {
const u64 addr = (ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]) & ~0xfull; const u64 addr = (ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]) & ~0xfull;
vm::write128(VM_CAST(addr), CPU.VPR[vs]); vm::ps3::write128(VM_CAST(addr), CPU.VPR[vs]);
} }
void MULLD(u32 rd, u32 ra, u32 rb, u32 oe, u32 rc) void MULLD(u32 rd, u32 ra, u32 rb, u32 oe, u32 rc)
{ {
@ -2875,7 +2876,7 @@ private:
void LHZX(u32 rd, u32 ra, u32 rb) void LHZX(u32 rd, u32 ra, u32 rb)
{ {
const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb];
CPU.GPR[rd] = vm::read16(VM_CAST(addr)); CPU.GPR[rd] = vm::ps3::read16(VM_CAST(addr));
} }
void EQV(u32 ra, u32 rs, u32 rb, u32 rc) void EQV(u32 ra, u32 rs, u32 rb, u32 rc)
{ {
@ -2889,7 +2890,7 @@ private:
void LHZUX(u32 rd, u32 ra, u32 rb) void LHZUX(u32 rd, u32 ra, u32 rb)
{ {
const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb];
CPU.GPR[rd] = vm::read16(VM_CAST(addr)); CPU.GPR[rd] = vm::ps3::read16(VM_CAST(addr));
CPU.GPR[ra] = addr; CPU.GPR[ra] = addr;
} }
void XOR(u32 ra, u32 rs, u32 rb, u32 rc) void XOR(u32 ra, u32 rs, u32 rb, u32 rc)
@ -2904,7 +2905,7 @@ private:
void LWAX(u32 rd, u32 ra, u32 rb) void LWAX(u32 rd, u32 ra, u32 rb)
{ {
const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb];
CPU.GPR[rd] = (s64)(s32)vm::read32(VM_CAST(addr)); CPU.GPR[rd] = (s64)(s32)vm::ps3::read32(VM_CAST(addr));
} }
void DST(u32 ra, u32 rb, u32 strm, u32 t) void DST(u32 ra, u32 rb, u32 strm, u32 t)
{ {
@ -2912,12 +2913,12 @@ private:
void LHAX(u32 rd, u32 ra, u32 rb) void LHAX(u32 rd, u32 ra, u32 rb)
{ {
const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb];
CPU.GPR[rd] = (s64)(s16)vm::read16(VM_CAST(addr)); CPU.GPR[rd] = (s64)(s16)vm::ps3::read16(VM_CAST(addr));
} }
void LVXL(u32 vd, u32 ra, u32 rb) void LVXL(u32 vd, u32 ra, u32 rb)
{ {
const u64 addr = (ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]) & ~0xfull; const u64 addr = (ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]) & ~0xfull;
CPU.VPR[vd] = vm::read128(VM_CAST(addr)); CPU.VPR[vd] = vm::ps3::read128(VM_CAST(addr));
} }
void MFTB(u32 rd, u32 spr) void MFTB(u32 rd, u32 spr)
{ {
@ -2934,7 +2935,7 @@ private:
void LWAUX(u32 rd, u32 ra, u32 rb) void LWAUX(u32 rd, u32 ra, u32 rb)
{ {
const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb];
CPU.GPR[rd] = (s64)(s32)vm::read32(VM_CAST(addr)); CPU.GPR[rd] = (s64)(s32)vm::ps3::read32(VM_CAST(addr));
CPU.GPR[ra] = addr; CPU.GPR[ra] = addr;
} }
void DSTST(u32 ra, u32 rb, u32 strm, u32 t) void DSTST(u32 ra, u32 rb, u32 strm, u32 t)
@ -2943,13 +2944,13 @@ private:
void LHAUX(u32 rd, u32 ra, u32 rb) void LHAUX(u32 rd, u32 ra, u32 rb)
{ {
const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb];
CPU.GPR[rd] = (s64)(s16)vm::read16(VM_CAST(addr)); CPU.GPR[rd] = (s64)(s16)vm::ps3::read16(VM_CAST(addr));
CPU.GPR[ra] = addr; CPU.GPR[ra] = addr;
} }
void STHX(u32 rs, u32 ra, u32 rb) void STHX(u32 rs, u32 ra, u32 rb)
{ {
const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb];
vm::write16(VM_CAST(addr), (u16)CPU.GPR[rs]); vm::ps3::write16(VM_CAST(addr), (u16)CPU.GPR[rs]);
} }
void ORC(u32 ra, u32 rs, u32 rb, u32 rc) void ORC(u32 ra, u32 rs, u32 rb, u32 rc)
{ {
@ -2963,7 +2964,7 @@ private:
void STHUX(u32 rs, u32 ra, u32 rb) void STHUX(u32 rs, u32 ra, u32 rb)
{ {
const u64 addr = CPU.GPR[ra] + CPU.GPR[rb]; const u64 addr = CPU.GPR[ra] + CPU.GPR[rb];
vm::write16(VM_CAST(addr), (u16)CPU.GPR[rs]); vm::ps3::write16(VM_CAST(addr), (u16)CPU.GPR[rs]);
CPU.GPR[ra] = addr; CPU.GPR[ra] = addr;
} }
void OR(u32 ra, u32 rs, u32 rb, u32 rc) void OR(u32 ra, u32 rs, u32 rb, u32 rc)
@ -3023,7 +3024,7 @@ private:
void STVXL(u32 vs, u32 ra, u32 rb) void STVXL(u32 vs, u32 ra, u32 rb)
{ {
const u64 addr = (ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]) & ~0xfull; const u64 addr = (ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]) & ~0xfull;
vm::write128(VM_CAST(addr), CPU.VPR[vs]); vm::ps3::write128(VM_CAST(addr), CPU.VPR[vs]);
} }
void DIVD(u32 rd, u32 ra, u32 rb, u32 oe, u32 rc) void DIVD(u32 rd, u32 ra, u32 rb, u32 oe, u32 rc)
{ {
@ -3148,7 +3149,7 @@ private:
{ {
if (N > 3) if (N > 3)
{ {
CPU.GPR[reg] = vm::read32(VM_CAST(addr)); CPU.GPR[reg] = vm::ps3::read32(VM_CAST(addr));
addr += 4; addr += 4;
N -= 4; N -= 4;
} }
@ -3216,7 +3217,7 @@ private:
u32 count = CPU.XER.XER & 0x7F; u32 count = CPU.XER.XER & 0x7F;
for (; count >= 4; count -= 4, addr += 4, rs = (rs+1) & 31) for (; count >= 4; count -= 4, addr += 4, rs = (rs+1) & 31)
{ {
vm::write32(VM_CAST(addr), (u32)CPU.GPR[rs]); vm::ps3::write32(VM_CAST(addr), (u32)CPU.GPR[rs]);
} }
if (count) if (count)
{ {
@ -3281,7 +3282,7 @@ private:
{ {
if (N > 3) if (N > 3)
{ {
vm::write32(VM_CAST(addr), (u32)CPU.GPR[reg]); vm::ps3::write32(VM_CAST(addr), (u32)CPU.GPR[reg]);
addr += 4; addr += 4;
N -= 4; N -= 4;
} }
@ -3424,7 +3425,7 @@ private:
void STFIWX(u32 frs, u32 ra, u32 rb) void STFIWX(u32 frs, u32 ra, u32 rb)
{ {
const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb];
vm::write32(VM_CAST(addr), (u32&)CPU.FPR[frs]); vm::ps3::write32(VM_CAST(addr), (u32&)CPU.FPR[frs]);
} }
void EXTSW(u32 ra, u32 rs, u32 rc) void EXTSW(u32 ra, u32 rs, u32 rc)
{ {
@ -3444,12 +3445,12 @@ private:
void LWZ(u32 rd, u32 ra, s32 d) void LWZ(u32 rd, u32 ra, s32 d)
{ {
const u64 addr = ra ? CPU.GPR[ra] + d : d; const u64 addr = ra ? CPU.GPR[ra] + d : d;
CPU.GPR[rd] = vm::read32(VM_CAST(addr)); CPU.GPR[rd] = vm::ps3::read32(VM_CAST(addr));
} }
void LWZU(u32 rd, u32 ra, s32 d) void LWZU(u32 rd, u32 ra, s32 d)
{ {
const u64 addr = CPU.GPR[ra] + d; const u64 addr = CPU.GPR[ra] + d;
CPU.GPR[rd] = vm::read32(VM_CAST(addr)); CPU.GPR[rd] = vm::ps3::read32(VM_CAST(addr));
CPU.GPR[ra] = addr; CPU.GPR[ra] = addr;
} }
void LBZ(u32 rd, u32 ra, s32 d) void LBZ(u32 rd, u32 ra, s32 d)
@ -3466,12 +3467,12 @@ private:
void STW(u32 rs, u32 ra, s32 d) void STW(u32 rs, u32 ra, s32 d)
{ {
const u64 addr = ra ? CPU.GPR[ra] + d : d; const u64 addr = ra ? CPU.GPR[ra] + d : d;
vm::write32(VM_CAST(addr), (u32)CPU.GPR[rs]); vm::ps3::write32(VM_CAST(addr), (u32)CPU.GPR[rs]);
} }
void STWU(u32 rs, u32 ra, s32 d) void STWU(u32 rs, u32 ra, s32 d)
{ {
const u64 addr = CPU.GPR[ra] + d; const u64 addr = CPU.GPR[ra] + d;
vm::write32(VM_CAST(addr), (u32)CPU.GPR[rs]); vm::ps3::write32(VM_CAST(addr), (u32)CPU.GPR[rs]);
CPU.GPR[ra] = addr; CPU.GPR[ra] = addr;
} }
void STB(u32 rs, u32 ra, s32 d) void STB(u32 rs, u32 ra, s32 d)
@ -3488,34 +3489,34 @@ private:
void LHZ(u32 rd, u32 ra, s32 d) void LHZ(u32 rd, u32 ra, s32 d)
{ {
const u64 addr = ra ? CPU.GPR[ra] + d : d; const u64 addr = ra ? CPU.GPR[ra] + d : d;
CPU.GPR[rd] = vm::read16(VM_CAST(addr)); CPU.GPR[rd] = vm::ps3::read16(VM_CAST(addr));
} }
void LHZU(u32 rd, u32 ra, s32 d) void LHZU(u32 rd, u32 ra, s32 d)
{ {
const u64 addr = CPU.GPR[ra] + d; const u64 addr = CPU.GPR[ra] + d;
CPU.GPR[rd] = vm::read16(VM_CAST(addr)); CPU.GPR[rd] = vm::ps3::read16(VM_CAST(addr));
CPU.GPR[ra] = addr; CPU.GPR[ra] = addr;
} }
void LHA(u32 rd, u32 ra, s32 d) void LHA(u32 rd, u32 ra, s32 d)
{ {
const u64 addr = ra ? CPU.GPR[ra] + d : d; const u64 addr = ra ? CPU.GPR[ra] + d : d;
CPU.GPR[rd] = (s64)(s16)vm::read16(VM_CAST(addr)); CPU.GPR[rd] = (s64)(s16)vm::ps3::read16(VM_CAST(addr));
} }
void LHAU(u32 rd, u32 ra, s32 d) void LHAU(u32 rd, u32 ra, s32 d)
{ {
const u64 addr = CPU.GPR[ra] + d; const u64 addr = CPU.GPR[ra] + d;
CPU.GPR[rd] = (s64)(s16)vm::read16(VM_CAST(addr)); CPU.GPR[rd] = (s64)(s16)vm::ps3::read16(VM_CAST(addr));
CPU.GPR[ra] = addr; CPU.GPR[ra] = addr;
} }
void STH(u32 rs, u32 ra, s32 d) void STH(u32 rs, u32 ra, s32 d)
{ {
const u64 addr = ra ? CPU.GPR[ra] + d : d; const u64 addr = ra ? CPU.GPR[ra] + d : d;
vm::write16(VM_CAST(addr), (u16)CPU.GPR[rs]); vm::ps3::write16(VM_CAST(addr), (u16)CPU.GPR[rs]);
} }
void STHU(u32 rs, u32 ra, s32 d) void STHU(u32 rs, u32 ra, s32 d)
{ {
const u64 addr = CPU.GPR[ra] + d; const u64 addr = CPU.GPR[ra] + d;
vm::write16(VM_CAST(addr), (u16)CPU.GPR[rs]); vm::ps3::write16(VM_CAST(addr), (u16)CPU.GPR[rs]);
CPU.GPR[ra] = addr; CPU.GPR[ra] = addr;
} }
void LMW(u32 rd, u32 ra, s32 d) void LMW(u32 rd, u32 ra, s32 d)
@ -3523,7 +3524,7 @@ private:
u64 addr = ra ? CPU.GPR[ra] + d : d; u64 addr = ra ? CPU.GPR[ra] + d : d;
for(u32 i=rd; i<32; ++i, addr += 4) for(u32 i=rd; i<32; ++i, addr += 4)
{ {
CPU.GPR[i] = vm::read32(VM_CAST(addr)); CPU.GPR[i] = vm::ps3::read32(VM_CAST(addr));
} }
} }
void STMW(u32 rs, u32 ra, s32 d) void STMW(u32 rs, u32 ra, s32 d)
@ -3531,7 +3532,7 @@ private:
u64 addr = ra ? CPU.GPR[ra] + d : d; u64 addr = ra ? CPU.GPR[ra] + d : d;
for(u32 i=rs; i<32; ++i, addr += 4) for(u32 i=rs; i<32; ++i, addr += 4)
{ {
vm::write32(VM_CAST(addr), (u32)CPU.GPR[i]); vm::ps3::write32(VM_CAST(addr), (u32)CPU.GPR[i]);
} }
} }
void LFS(u32 frd, u32 ra, s32 d) void LFS(u32 frd, u32 ra, s32 d)
@ -3619,18 +3620,18 @@ private:
void LD(u32 rd, u32 ra, s32 ds) void LD(u32 rd, u32 ra, s32 ds)
{ {
const u64 addr = ra ? CPU.GPR[ra] + ds : ds; const u64 addr = ra ? CPU.GPR[ra] + ds : ds;
CPU.GPR[rd] = vm::read64(VM_CAST(addr)); CPU.GPR[rd] = vm::ps3::read64(VM_CAST(addr));
} }
void LDU(u32 rd, u32 ra, s32 ds) void LDU(u32 rd, u32 ra, s32 ds)
{ {
const u64 addr = CPU.GPR[ra] + ds; const u64 addr = CPU.GPR[ra] + ds;
CPU.GPR[rd] = vm::read64(VM_CAST(addr)); CPU.GPR[rd] = vm::ps3::read64(VM_CAST(addr));
CPU.GPR[ra] = addr; CPU.GPR[ra] = addr;
} }
void LWA(u32 rd, u32 ra, s32 ds) void LWA(u32 rd, u32 ra, s32 ds)
{ {
const u64 addr = ra ? CPU.GPR[ra] + ds : ds; const u64 addr = ra ? CPU.GPR[ra] + ds : ds;
CPU.GPR[rd] = (s64)(s32)vm::read32(VM_CAST(addr)); CPU.GPR[rd] = (s64)(s32)vm::ps3::read32(VM_CAST(addr));
} }
void FDIVS(u32 frd, u32 fra, u32 frb, u32 rc) {FDIV(frd, fra, frb, rc, true);} void FDIVS(u32 frd, u32 fra, u32 frb, u32 rc) {FDIV(frd, fra, frb, rc, true);}
void FSUBS(u32 frd, u32 fra, u32 frb, u32 rc) {FSUB(frd, fra, frb, rc, true);} void FSUBS(u32 frd, u32 fra, u32 frb, u32 rc) {FSUB(frd, fra, frb, rc, true);}
@ -3684,12 +3685,12 @@ private:
void STD(u32 rs, u32 ra, s32 d) void STD(u32 rs, u32 ra, s32 d)
{ {
const u64 addr = ra ? CPU.GPR[ra] + d : d; const u64 addr = ra ? CPU.GPR[ra] + d : d;
vm::write64(VM_CAST(addr), CPU.GPR[rs]); vm::ps3::write64(VM_CAST(addr), CPU.GPR[rs]);
} }
void STDU(u32 rs, u32 ra, s32 ds) void STDU(u32 rs, u32 ra, s32 ds)
{ {
const u64 addr = CPU.GPR[ra] + ds; const u64 addr = CPU.GPR[ra] + ds;
vm::write64(VM_CAST(addr), CPU.GPR[rs]); vm::ps3::write64(VM_CAST(addr), CPU.GPR[rs]);
CPU.GPR[ra] = addr; CPU.GPR[ra] = addr;
} }
void MTFSB1(u32 crbd, u32 rc) void MTFSB1(u32 crbd, u32 rc)

View file

@ -1,5 +1,6 @@
#include "stdafx.h" #include "stdafx.h"
#ifdef LLVM_AVAILABLE #ifdef LLVM_AVAILABLE
#include "rpcs3/Ini.h"
#include "Utilities/Log.h" #include "Utilities/Log.h"
#include "Emu/System.h" #include "Emu/System.h"
#include "Emu/Cell/PPUDisAsm.h" #include "Emu/Cell/PPUDisAsm.h"

View file

@ -29,6 +29,9 @@
#pragma warning(pop) #pragma warning(pop)
#endif #endif
extern void execute_ppu_func_by_index(PPUThread& ppu, u32 id);
extern void execute_syscall_by_index(PPUThread& ppu, u64 code);
using namespace llvm; using namespace llvm;
using namespace ppu_recompiler_llvm; using namespace ppu_recompiler_llvm;
@ -1787,7 +1790,7 @@ void Compiler::HACK(u32 index) {
static u32 wrappedDoSyscall(PPUThread &CPU, u64 code) noexcept { static u32 wrappedDoSyscall(PPUThread &CPU, u64 code) noexcept {
try try
{ {
SysCalls::DoSyscall(CPU, code); execute_syscall_by_index(CPU, code);
return ExecutionStatus::ExecutionStatusBlockEnded; return ExecutionStatus::ExecutionStatusBlockEnded;
} }
catch (...) catch (...)
@ -1812,7 +1815,7 @@ void Compiler::SC(u32 lev) {
} }
break; break;
case 3: case 3:
Call<void>("PPUThread.FastStop", &PPUThread::fast_stop, m_state.args[CompileTaskState::Args::State]); Call<void>("PPUThread.fast_stop", &PPUThread::fast_stop, m_state.args[CompileTaskState::Args::State]);
break; break;
default: default:
CompilationError(fmt::format("SC %u", lev)); CompilationError(fmt::format("SC %u", lev));
@ -2160,7 +2163,7 @@ void Compiler::TW(u32 to, u32 ra, u32 rb) {
} }
void Compiler::LVSL(u32 vd, u32 ra, u32 rb) { void Compiler::LVSL(u32 vd, u32 ra, u32 rb) {
static const v128 s_lvsl_values[] = { static const u64 s_lvsl_values[0x10][2] = {
{ 0x08090A0B0C0D0E0F, 0x0001020304050607 }, { 0x08090A0B0C0D0E0F, 0x0001020304050607 },
{ 0x090A0B0C0D0E0F10, 0x0102030405060708 }, { 0x090A0B0C0D0E0F10, 0x0102030405060708 },
{ 0x0A0B0C0D0E0F1011, 0x0203040506070809 }, { 0x0A0B0C0D0E0F1011, 0x0203040506070809 },
@ -2389,7 +2392,7 @@ void Compiler::CMPL(u32 crfd, u32 l, u32 ra, u32 rb) {
} }
void Compiler::LVSR(u32 vd, u32 ra, u32 rb) { void Compiler::LVSR(u32 vd, u32 ra, u32 rb) {
static const v128 s_lvsr_values[] = { static const u64 s_lvsr_values[0x10][2] = {
{ 0x18191A1B1C1D1E1F, 0x1011121314151617 }, { 0x18191A1B1C1D1E1F, 0x1011121314151617 },
{ 0x1718191A1B1C1D1E, 0x0F10111213141516 }, { 0x1718191A1B1C1D1E, 0x0F10111213141516 },
{ 0x161718191A1B1C1D, 0x0E0F101112131415 }, { 0x161718191A1B1C1D, 0x0E0F101112131415 },

View file

@ -99,7 +99,7 @@ struct ppu_recompiler_llvm::PPUState {
address = addr; address = addr;
for (int i = 0; i < (sizeof(mem_block) / 8); i++) { for (int i = 0; i < (sizeof(mem_block) / 8); i++) {
mem_block[i] = vm::read64(address + (i * 8)); mem_block[i] = vm::ps3::read64(address + (i * 8));
} }
} }
@ -123,7 +123,7 @@ struct ppu_recompiler_llvm::PPUState {
ppu.TB = TB; ppu.TB = TB;
for (int i = 0; i < (sizeof(mem_block) / 8); i++) { for (int i = 0; i < (sizeof(mem_block) / 8); i++) {
vm::write64(address + (i * 8), mem_block[i]); vm::ps3::write64(address + (i * 8), mem_block[i]);
} }
} }

View file

@ -5,8 +5,6 @@
#include "Emu/System.h" #include "Emu/System.h"
#include "Emu/IdManager.h" #include "Emu/IdManager.h"
#include "Emu/Cell/PPUThread.h" #include "Emu/Cell/PPUThread.h"
#include "Emu/SysCalls/SysCalls.h"
#include "Emu/SysCalls/Modules.h"
#include "Emu/Cell/PPUDecoder.h" #include "Emu/Cell/PPUDecoder.h"
#include "Emu/Cell/PPUInterpreter.h" #include "Emu/Cell/PPUInterpreter.h"
#include "Emu/Cell/PPUInterpreter2.h" #include "Emu/Cell/PPUInterpreter2.h"
@ -51,7 +49,7 @@ void ppu_decoder_cache_t::initialize(u32 addr, u32 size)
inter->func = ppu_interpreter::NULL_OP; inter->func = ppu_interpreter::NULL_OP;
// decode PPU opcode // decode PPU opcode
dec.Decode(vm::read32(pos)); dec.Decode(vm::ps3::read32(pos));
// store function address // store function address
pointer[pos / 4] = inter->func; pointer[pos / 4] = inter->func;
@ -81,13 +79,15 @@ PPUThread::~PPUThread()
void PPUThread::dump_info() const void PPUThread::dump_info() const
{ {
extern std::string get_ps3_function_name(u64 fid);
if (~hle_code < 1024) if (~hle_code < 1024)
{ {
LOG_SUCCESS(HLE, "Last syscall: %lld (%s)", ~hle_code, SysCalls::GetFuncName(hle_code)); LOG_SUCCESS(HLE, "Last syscall: %lld (%s)", ~hle_code, get_ps3_function_name(hle_code));
} }
else if (hle_code) else if (hle_code)
{ {
LOG_SUCCESS(HLE, "Last function: %s (0x%llx)", SysCalls::GetFuncName(hle_code), hle_code); LOG_SUCCESS(HLE, "Last function: %s (0x%llx)", get_ps3_function_name(hle_code), hle_code);
} }
CPUThread::dump_info(); CPUThread::dump_info();
@ -214,7 +214,7 @@ int FPRdouble::Cmp(PPCdouble a, PPCdouble b)
u64 PPUThread::get_stack_arg(s32 i) u64 PPUThread::get_stack_arg(s32 i)
{ {
return vm::read64(VM_CAST(GPR[1] + 0x70 + 0x8 * (i - 9))); return vm::ps3::read64(VM_CAST(GPR[1] + 0x70 + 0x8 * (i - 9)));
} }
void PPUThread::fast_call(u32 addr, u32 rtoc) void PPUThread::fast_call(u32 addr, u32 rtoc)
@ -313,7 +313,7 @@ void PPUThread::task()
if (!m_state.load()) if (!m_state.load())
{ {
// call interpreter function // call interpreter function
func(*this, { vm::read32(PC) }); func(*this, { vm::ps3::read32(PC) });
// next instruction // next instruction
PC += 4; PC += 4;
@ -335,8 +335,8 @@ ppu_thread::ppu_thread(u32 entry, const std::string& name, u32 stack_size, s32 p
if (entry) if (entry)
{ {
ppu->PC = vm::read32(entry); ppu->PC = vm::ps3::read32(entry);
ppu->GPR[2] = vm::read32(entry + 4); // rtoc ppu->GPR[2] = vm::ps3::read32(entry + 4); // rtoc
} }
ppu->stack_size = stack_size ? stack_size : Emu.GetPrimaryStackSize(); ppu->stack_size = stack_size ? stack_size : Emu.GetPrimaryStackSize();

View file

@ -1012,3 +1012,20 @@ force_inline T cast_from_ppu_gpr(const u64 reg)
{ {
return cast_ppu_gpr<T>::from_gpr(reg); return cast_ppu_gpr<T>::from_gpr(reg);
} }
// flags set in ModuleFunc
enum : u32
{
MFF_FORCED_HLE = (1 << 0), // always call HLE function
MFF_NO_RETURN = (1 << 1), // uses EIF_USE_BRANCH flag with LLE, ignored with MFF_FORCED_HLE
};
// flags passed with index
enum : u32
{
EIF_SAVE_RTOC = (1 << 25), // save RTOC in [SP+0x28] before calling HLE/LLE function
EIF_PERFORM_BLR = (1 << 24), // do BLR after calling HLE/LLE function
EIF_USE_BRANCH = (1 << 23), // do only branch, LLE must be set, last_syscall must be zero
EIF_FLAGS = 0x3800000, // all flags
};

View file

@ -2,7 +2,7 @@
#include "Modules.h" #include "Modules.h"
#include "SysCalls.h" #include "SysCalls.h"
std::string SysCalls::GetFuncName(const u64 fid) std::string get_ps3_function_name(u64 fid)
{ {
// check syscalls // check syscalls
switch (~fid) switch (~fid)

View file

@ -112,18 +112,18 @@ ModuleFunc* get_ppu_func_by_index(u32 index)
return &g_ppu_func_list[index]; return &g_ppu_func_list[index];
} }
void execute_ppu_func_by_index(PPUThread& CPU, u32 index) void execute_ppu_func_by_index(PPUThread& ppu, u32 index)
{ {
if (auto func = get_ppu_func_by_index(index)) if (auto func = get_ppu_func_by_index(index))
{ {
// save RTOC if necessary // save RTOC if necessary
if (index & EIF_SAVE_RTOC) if (index & EIF_SAVE_RTOC)
{ {
vm::write64(VM_CAST(CPU.GPR[1] + 0x28), CPU.GPR[2]); vm::write64(VM_CAST(ppu.GPR[1] + 0x28), ppu.GPR[2]);
} }
// save old syscall/NID value // save old syscall/NID value
const auto last_code = CPU.hle_code; const auto last_code = ppu.hle_code;
// branch directly to the LLE function // branch directly to the LLE function
if (index & EIF_USE_BRANCH) if (index & EIF_USE_BRANCH)
@ -132,39 +132,39 @@ void execute_ppu_func_by_index(PPUThread& CPU, u32 index)
if (last_code) if (last_code)
{ {
throw EXCEPTION("This function cannot be called from the callback: %s (0x%llx)", SysCalls::GetFuncName(func->id), func->id); throw EXCEPTION("This function cannot be called from the callback: %s (0x%llx)", get_ps3_function_name(func->id), func->id);
} }
if (!func->lle_func) if (!func->lle_func)
{ {
throw EXCEPTION("LLE function not set: %s (0x%llx)", SysCalls::GetFuncName(func->id), func->id); throw EXCEPTION("LLE function not set: %s (0x%llx)", get_ps3_function_name(func->id), func->id);
} }
if (func->flags & MFF_FORCED_HLE) if (func->flags & MFF_FORCED_HLE)
{ {
throw EXCEPTION("Forced HLE enabled: %s (0x%llx)", SysCalls::GetFuncName(func->id), func->id); throw EXCEPTION("Forced HLE enabled: %s (0x%llx)", get_ps3_function_name(func->id), func->id);
} }
if (Ini.HLELogging.GetValue()) if (Ini.HLELogging.GetValue())
{ {
LOG_NOTICE(HLE, "Branch to LLE function: %s (0x%llx)", SysCalls::GetFuncName(func->id), func->id); LOG_NOTICE(HLE, "Branch to LLE function: %s (0x%llx)", get_ps3_function_name(func->id), func->id);
} }
if (index & EIF_PERFORM_BLR) if (index & EIF_PERFORM_BLR)
{ {
throw EXCEPTION("TODO: Branch with link: %s (0x%llx)", SysCalls::GetFuncName(func->id), func->id); throw EXCEPTION("TODO: Branch with link: %s (0x%llx)", get_ps3_function_name(func->id), func->id);
// CPU.LR = CPU.PC + 4; // CPU.LR = CPU.PC + 4;
} }
const auto data = vm::get_ptr<be_t<u32>>(func->lle_func.addr()); const auto data = vm::get_ptr<be_t<u32>>(func->lle_func.addr());
CPU.PC = data[0] - 4; ppu.PC = data[0] - 4;
CPU.GPR[2] = data[1]; // set rtoc ppu.GPR[2] = data[1]; // set rtoc
return; return;
} }
// change current syscall/NID value // change current syscall/NID value
CPU.hle_code = func->id; ppu.hle_code = func->id;
if (func->lle_func && !(func->flags & MFF_FORCED_HLE)) if (func->lle_func && !(func->flags & MFF_FORCED_HLE))
{ {
@ -176,49 +176,49 @@ void execute_ppu_func_by_index(PPUThread& CPU, u32 index)
if (Ini.HLELogging.GetValue()) if (Ini.HLELogging.GetValue())
{ {
LOG_NOTICE(HLE, "LLE function called: %s", SysCalls::GetFuncName(func->id)); LOG_NOTICE(HLE, "LLE function called: %s", get_ps3_function_name(func->id));
} }
CPU.fast_call(pc, rtoc); ppu.fast_call(pc, rtoc);
if (Ini.HLELogging.GetValue()) if (Ini.HLELogging.GetValue())
{ {
LOG_NOTICE(HLE, "LLE function finished: %s -> 0x%llx", SysCalls::GetFuncName(func->id), CPU.GPR[3]); LOG_NOTICE(HLE, "LLE function finished: %s -> 0x%llx", get_ps3_function_name(func->id), ppu.GPR[3]);
} }
} }
else if (func->func) else if (func->func)
{ {
if (Ini.HLELogging.GetValue()) if (Ini.HLELogging.GetValue())
{ {
LOG_NOTICE(HLE, "HLE function called: %s", SysCalls::GetFuncName(func->id)); LOG_NOTICE(HLE, "HLE function called: %s", get_ps3_function_name(func->id));
} }
func->func(CPU); func->func(ppu);
if (Ini.HLELogging.GetValue()) if (Ini.HLELogging.GetValue())
{ {
LOG_NOTICE(HLE, "HLE function finished: %s -> 0x%llx", SysCalls::GetFuncName(func->id), CPU.GPR[3]); LOG_NOTICE(HLE, "HLE function finished: %s -> 0x%llx", get_ps3_function_name(func->id), ppu.GPR[3]);
} }
} }
else else
{ {
LOG_ERROR(HLE, "Unimplemented function: %s -> CELL_OK", SysCalls::GetFuncName(func->id)); LOG_ERROR(HLE, "Unimplemented function: %s -> CELL_OK", get_ps3_function_name(func->id));
CPU.GPR[3] = 0; ppu.GPR[3] = 0;
} }
if (index & EIF_PERFORM_BLR) if (index & EIF_PERFORM_BLR)
{ {
// return if necessary // return if necessary
CPU.PC = VM_CAST(CPU.LR & ~3) - 4; ppu.PC = VM_CAST(ppu.LR & ~3) - 4;
} }
// execute module-specific error check // execute module-specific error check
if ((s64)CPU.GPR[3] < 0 && func->module && func->module->on_error) if ((s64)ppu.GPR[3] < 0 && func->module && func->module->on_error)
{ {
func->module->on_error(CPU.GPR[3], func); func->module->on_error(ppu.GPR[3], func);
} }
CPU.hle_code = last_code; ppu.hle_code = last_code;
} }
else else
{ {

View file

@ -9,23 +9,6 @@ namespace vm { using namespace ps3; }
template<typename T = void> class Module; template<typename T = void> class Module;
// flags set in ModuleFunc
enum : u32
{
MFF_FORCED_HLE = (1 << 0), // always call HLE function
MFF_NO_RETURN = (1 << 1), // uses EIF_USE_BRANCH flag with LLE, ignored with MFF_FORCED_HLE
};
// flags passed with index
enum : u32
{
EIF_SAVE_RTOC = (1 << 25), // save RTOC in [SP+0x28] before calling HLE/LLE function
EIF_PERFORM_BLR = (1 << 24), // do BLR after calling HLE/LLE function
EIF_USE_BRANCH = (1 << 23), // do only branch, LLE must be set, last_syscall must be zero
EIF_FLAGS = 0x3800000, // all flags
};
struct ModuleFunc struct ModuleFunc
{ {
u32 id; u32 id;
@ -153,7 +136,8 @@ void add_variable(u32 nid, Module<>* module, const char* name, u32(*addr)());
ModuleFunc* get_ppu_func_by_nid(u32 nid, u32* out_index = nullptr); ModuleFunc* get_ppu_func_by_nid(u32 nid, u32* out_index = nullptr);
ModuleFunc* get_ppu_func_by_index(u32 index); ModuleFunc* get_ppu_func_by_index(u32 index);
ModuleVariable* get_variable_by_nid(u32 nid); ModuleVariable* get_variable_by_nid(u32 nid);
void execute_ppu_func_by_index(PPUThread& CPU, u32 id); void execute_ppu_func_by_index(PPUThread& ppu, u32 id);
extern std::string get_ps3_function_name(u64 fid);
void clear_ppu_functions(); void clear_ppu_functions();
u32 get_function_id(const char* name); u32 get_function_id(const char* name);

View file

@ -37,7 +37,7 @@
void null_func(PPUThread& ppu) void null_func(PPUThread& ppu)
{ {
const u64 code = ppu.GPR[11]; const u64 code = ppu.GPR[11];
LOG_ERROR(HLE, "Unimplemented syscall %lld: %s -> CELL_OK", code, SysCalls::GetFuncName(~code)); LOG_ERROR(HLE, "Unimplemented syscall %lld: %s -> CELL_OK", code, get_ps3_function_name(~code));
ppu.GPR[3] = 0; ppu.GPR[3] = 0;
} }
@ -891,27 +891,27 @@ const ppu_func_caller g_sc_table[1024] =
null_func, null_func, null_func, BIND_FUNC(cellGcmCallback), //1023 UNS null_func, null_func, null_func, BIND_FUNC(cellGcmCallback), //1023 UNS
}; };
void SysCalls::DoSyscall(PPUThread& CPU, u64 code) void execute_syscall_by_index(PPUThread& ppu, u64 code)
{ {
if (code >= 1024) if (code >= 1024)
{ {
throw EXCEPTION("Invalid syscall number (0x%llx)", code); throw EXCEPTION("Invalid syscall number (0x%llx)", code);
} }
auto last_code = CPU.hle_code; auto last_code = ppu.hle_code;
CPU.hle_code = ~code; ppu.hle_code = ~code;
if (Ini.HLELogging.GetValue()) if (Ini.HLELogging.GetValue())
{ {
LOG_NOTICE(PPU, "Syscall %lld called: %s", code, SysCalls::GetFuncName(~code)); LOG_NOTICE(PPU, "Syscall %lld called: %s", code, get_ps3_function_name(~code));
} }
g_sc_table[code](CPU); g_sc_table[code](ppu);
if (Ini.HLELogging.GetValue()) if (Ini.HLELogging.GetValue())
{ {
LOG_NOTICE(PPU, "Syscall %lld finished: %s -> 0x%llx", code, SysCalls::GetFuncName(~code), CPU.GPR[3]); LOG_NOTICE(PPU, "Syscall %lld finished: %s -> 0x%llx", code, get_ps3_function_name(~code), ppu.GPR[3]);
} }
CPU.hle_code = last_code; ppu.hle_code = last_code;
} }

View file

@ -19,11 +19,5 @@ public:
} }
}; };
class PPUThread; void execute_syscall_by_index(class PPUThread& ppu, u64 code);
std::string get_ps3_function_name(u64 fid);
class SysCalls
{
public:
static void DoSyscall(PPUThread& CPU, u64 code);
static std::string GetFuncName(const u64 fid);
};

View file

@ -83,7 +83,7 @@ s32 prx_load_module(std::string path, u64 flags, vm::ptr<sys_prx_load_module_opt
if (!vm::check_addr(addr, 8) || !vm::check_addr(i_addr = vm::read32(addr), 4)) if (!vm::check_addr(addr, 8) || !vm::check_addr(i_addr = vm::read32(addr), 4))
{ {
sys_prx.Error("Failed to inject code for exported function '%s' (opd=0x%x, 0x%x)", SysCalls::GetFuncName(nid), addr, i_addr); sys_prx.Error("Failed to inject code for exported function '%s' (opd=0x%x, 0x%x)", get_ps3_function_name(nid), addr, i_addr);
} }
else else
{ {
@ -104,7 +104,7 @@ s32 prx_load_module(std::string path, u64 flags, vm::ptr<sys_prx_load_module_opt
if (!func) if (!func)
{ {
sys_prx.Error("Unknown function '%s' in '%s' module (0x%x)", SysCalls::GetFuncName(nid), module_.first); sys_prx.Error("Unknown function '%s' in '%s' module (0x%x)", get_ps3_function_name(nid), module_.first);
index = add_ppu_func(ModuleFunc(nid, 0, module, nullptr, nullptr)); index = add_ppu_func(ModuleFunc(nid, 0, module, nullptr, nullptr));
} }
@ -112,7 +112,7 @@ s32 prx_load_module(std::string path, u64 flags, vm::ptr<sys_prx_load_module_opt
{ {
const bool is_lle = func->lle_func && !(func->flags & MFF_FORCED_HLE); const bool is_lle = func->lle_func && !(func->flags & MFF_FORCED_HLE);
sys_prx.Error("Imported %sfunction '%s' in '%s' module (0x%x)", (is_lle ? "LLE " : ""), SysCalls::GetFuncName(nid), module_.first, addr); sys_prx.Error("Imported %sfunction '%s' in '%s' module (0x%x)", (is_lle ? "LLE " : ""), get_ps3_function_name(nid), module_.first, addr);
} }
if (!patch_ppu_import(addr, index)) if (!patch_ppu_import(addr, index))

View file

@ -167,8 +167,8 @@ namespace loader
module.exports[fnid] = fstub; module.exports[fnid] = fstub;
//LOG_NOTICE(LOADER, "Exported function '%s' in '%s' module (LLE)", SysCalls::GetFuncName(fnid).c_str(), module_name.c_str()); //LOG_NOTICE(LOADER, "Exported function '%s' in '%s' module (LLE)", get_ps3_function_name(fnid), module_name);
LOG_WARNING(LOADER, "**** %s: [%s] -> 0x%x", modulename.c_str(), SysCalls::GetFuncName(fnid).c_str(), (u32)fstub); LOG_WARNING(LOADER, "**** %s: [%s] -> 0x%x", modulename, get_ps3_function_name(fnid), (u32)fstub);
} }
} }
@ -204,7 +204,7 @@ namespace loader
module.imports[fnid] = fstub; module.imports[fnid] = fstub;
LOG_WARNING(LOADER, "**** %s: [%s] -> 0x%x", modulename.c_str(), SysCalls::GetFuncName(fnid).c_str(), (u32)fstub); LOG_WARNING(LOADER, "**** %s: [%s] -> 0x%x", modulename, get_ps3_function_name(fnid), (u32)fstub);
} }
} }
} }
@ -449,7 +449,7 @@ namespace loader
if (!vm::check_addr(addr, 8) || !vm::check_addr(i_addr = vm::read32(addr), 4)) if (!vm::check_addr(addr, 8) || !vm::check_addr(i_addr = vm::read32(addr), 4))
{ {
LOG_ERROR(LOADER, "Failed to inject code for exported function '%s' (opd=0x%x, 0x%x)", SysCalls::GetFuncName(nid), addr, i_addr); LOG_ERROR(LOADER, "Failed to inject code for exported function '%s' (opd=0x%x, 0x%x)", get_ps3_function_name(nid), addr, i_addr);
} }
else else
{ {
@ -470,18 +470,18 @@ namespace loader
if (!func) if (!func)
{ {
LOG_ERROR(LOADER, "Unknown function '%s' (0x%x)", SysCalls::GetFuncName(nid), addr); LOG_ERROR(LOADER, "Unknown function '%s' (0x%x)", get_ps3_function_name(nid), addr);
index = add_ppu_func(ModuleFunc(nid, 0, module, nullptr, nullptr)); index = add_ppu_func(ModuleFunc(nid, 0, module, nullptr, nullptr));
} }
else else
{ {
LOG_NOTICE(LOADER, "Imported function '%s' (0x%x)", SysCalls::GetFuncName(nid), addr); LOG_NOTICE(LOADER, "Imported function '%s' (0x%x)", get_ps3_function_name(nid), addr);
} }
if (!patch_ppu_import(addr, index)) if (!patch_ppu_import(addr, index))
{ {
LOG_ERROR(LOADER, "Failed to inject code for function '%s' (0x%x)", SysCalls::GetFuncName(nid), addr); LOG_ERROR(LOADER, "Failed to inject code for function '%s' (0x%x)", get_ps3_function_name(nid), addr);
} }
} }
} }
@ -708,7 +708,7 @@ namespace loader
if (!func) if (!func)
{ {
LOG_ERROR(LOADER, "Unknown function '%s' in '%s' module (0x%x)", SysCalls::GetFuncName(nid), module_name, addr); LOG_ERROR(LOADER, "Unknown function '%s' in '%s' module (0x%x)", get_ps3_function_name(nid), module_name, addr);
index = add_ppu_func(ModuleFunc(nid, 0, module, nullptr, nullptr)); index = add_ppu_func(ModuleFunc(nid, 0, module, nullptr, nullptr));
} }
@ -716,7 +716,7 @@ namespace loader
{ {
const bool is_lle = func->lle_func && !(func->flags & MFF_FORCED_HLE); const bool is_lle = func->lle_func && !(func->flags & MFF_FORCED_HLE);
LOG_NOTICE(LOADER, "Imported %sfunction '%s' in '%s' module (0x%x)", is_lle ? "LLE " : "", SysCalls::GetFuncName(nid), module_name, addr); LOG_NOTICE(LOADER, "Imported %sfunction '%s' in '%s' module (0x%x)", is_lle ? "LLE " : "", get_ps3_function_name(nid), module_name, addr);
} }
if (!patch_ppu_import(addr, index)) if (!patch_ppu_import(addr, index))