Some fixes

This commit is contained in:
Nekotekina 2014-09-30 02:28:02 +04:00
parent 6b53479ac3
commit 68cdc95da5
7 changed files with 168 additions and 47 deletions

View File

@ -6,7 +6,7 @@
bool LogBase::CheckLogging() const
{
return Ini.HLELogging.GetValue();
return Ini.HLELogging.GetValue() || m_logging;
}
void LogBase::LogOutput(LogType type, const char* info, const std::string& text) const

View File

@ -31,12 +31,12 @@ public:
template<typename... Targs> __noinline void Notice(const u32 id, const char* fmt, Targs... args) const
{
LogOutput(LogNotice, id, ": ", fmt::Format(fmt, args...));
LogOutput(LogNotice, id, " : ", fmt::Format(fmt, args...));
}
template<typename... Targs> __noinline void Notice(const char* fmt, Targs... args) const
{
LogOutput(LogNotice, ": ", fmt::Format(fmt, args...));
LogOutput(LogNotice, " : ", fmt::Format(fmt, args...));
}
template<typename... Targs> __forceinline void Log(const char* fmt, Targs... args) const
@ -57,12 +57,12 @@ public:
template<typename... Targs> __noinline void Success(const u32 id, const char* fmt, Targs... args) const
{
LogOutput(LogSuccess, id, ": ", fmt::Format(fmt, args...));
LogOutput(LogSuccess, id, " : ", fmt::Format(fmt, args...));
}
template<typename... Targs> __noinline void Success(const char* fmt, Targs... args) const
{
LogOutput(LogSuccess, ": ", fmt::Format(fmt, args...));
LogOutput(LogSuccess, " : ", fmt::Format(fmt, args...));
}
template<typename... Targs> __noinline void Warning(const u32 id, const char* fmt, Targs... args) const

View File

@ -19,7 +19,7 @@ u32 libpngdec_rtoc;
s32 pngDecCreate(
vm::ptr<u32> mainHandle,
vm::ptr<const CellPngDecThreadInParam> param,
vm::ptr<const CellPngDecExtThreadInParam> ext = {})
vm::ptr<const CellPngDecExtThreadInParam> ext = vm::ptr<const CellPngDecExtThreadInParam>::make(0))
{
// alloc memory (should probably use param->cbCtrlMallocFunc)
auto dec = CellPngDecMainHandle::make(Memory.Alloc(sizeof(PngDecoder), 128));
@ -60,8 +60,8 @@ s32 pngDecOpen(
vm::ptr<u32> subHandle,
vm::ptr<const CellPngDecSrc> src,
vm::ptr<CellPngDecOpnInfo> openInfo,
vm::ptr<const CellPngDecCbCtrlStrm> cb = {},
vm::ptr<const CellPngDecOpnParam> param = {})
vm::ptr<const CellPngDecCbCtrlStrm> cb = vm::ptr<const CellPngDecCbCtrlStrm>::make(0),
vm::ptr<const CellPngDecOpnParam> param = vm::ptr<const CellPngDecOpnParam>::make(0))
{
// alloc memory (should probably use dec->malloc)
auto stream = CellPngDecSubHandle::make(Memory.Alloc(sizeof(PngStream), 128));
@ -129,7 +129,7 @@ s32 pngDecClose(CellPngDecSubHandle stream)
s32 pngReadHeader(
CellPngDecSubHandle stream,
vm::ptr<CellPngDecInfo> info,
vm::ptr<CellPngDecExtInfo> extInfo = {})
vm::ptr<CellPngDecExtInfo> extInfo = vm::ptr<CellPngDecExtInfo>::make(0))
{
CellPngDecInfo& current_info = stream->info;
@ -193,8 +193,8 @@ s32 pngDecSetParameter(
CellPngDecSubHandle stream,
vm::ptr<const CellPngDecInParam> inParam,
vm::ptr<CellPngDecOutParam> outParam,
vm::ptr<const CellPngDecExtInParam> extInParam = {},
vm::ptr<CellPngDecExtOutParam> extOutParam = {})
vm::ptr<const CellPngDecExtInParam> extInParam = vm::ptr<const CellPngDecExtInParam>::make(0),
vm::ptr<CellPngDecExtOutParam> extOutParam = vm::ptr<CellPngDecExtOutParam>::make(0))
{
CellPngDecInfo& current_info = stream->info;
CellPngDecOutParam& current_outParam = stream->outParam;
@ -235,8 +235,8 @@ s32 pngDecodeData(
vm::ptr<u8> data,
vm::ptr<const CellPngDecDataCtrlParam> dataCtrlParam,
vm::ptr<CellPngDecDataOutInfo> dataOutInfo,
vm::ptr<const CellPngDecCbCtrlDisp> cbCtrlDisp = {},
vm::ptr<CellPngDecDispParam> dispParam = {})
vm::ptr<const CellPngDecCbCtrlDisp> cbCtrlDisp = vm::ptr<const CellPngDecCbCtrlDisp>::make(0),
vm::ptr<CellPngDecDispParam> dispParam = vm::ptr<CellPngDecDispParam>::make(0))
{
dataOutInfo->status = CELL_PNGDEC_DEC_STATUS_STOP;

View File

@ -603,7 +603,7 @@ void cellRescExit()
if (IsPalTemporal())
{
cellGcmSetSecondVFrequency(CELL_GCM_DISPLAY_FREQUENCY_DISABLE);
cellGcmSetVBlankHandler({});
cellGcmSetVBlankHandler(vm::ptr<void(*)(const u32)>::make(0));
//GcmSysTypePrefix::cellGcmSetSecondVHandler(NULL);
if (IsPalInterpolate())
@ -780,20 +780,20 @@ int cellRescSetDisplayMode(u32 displayMode)
cellGcmSetSecondVFrequency(CELL_GCM_DISPLAY_FREQUENCY_59_94HZ);
//cellGcmSetVBlankHandler(IntrHandler50);
//cellGcmSetSecondVHandler(IntrHandler60);
cellGcmSetFlipHandler({});
cellGcmSetFlipHandler(vm::ptr<void(*)(const u32)>::make(0));
}
else if (IsPalDrop())
{
//InitLabels();
cellGcmSetSecondVFrequency(CELL_GCM_DISPLAY_FREQUENCY_59_94HZ);
cellGcmSetVBlankHandler({});
cellGcmSetVBlankHandler(vm::ptr<void(*)(const u32)>::make(0));
//cellGcmSetSecondVHandler(IntrHandler60Drop);
cellGcmSetFlipHandler({});
cellGcmSetFlipHandler(vm::ptr<void(*)(const u32)>::make(0));
}
else if (IsPal60Hsync())
{
cellGcmSetSecondVFrequency(CELL_GCM_DISPLAY_FREQUENCY_59_94HZ);
cellGcmSetVBlankHandler({});
cellGcmSetVBlankHandler(vm::ptr<void(*)(const u32)>::make(0));
}
if (s_rescInternalInstance->s_applicationVBlankHandler) SetVBlankHandler(s_rescInternalInstance->s_applicationVBlankHandler);

View File

@ -1,5 +1,6 @@
#include "stdafx.h"
#include "Emu/Memory/Memory.h"
#include "Emu/System.h"
#include "Emu/SysCalls/Modules.h"
#include "Emu/SysCalls/Callback.h"
@ -92,7 +93,7 @@ s64 spursInit(
if (!isSecond)
{
spurs->m.wklMsk1.write_relaxed(be_t<u32>::make(0xffff));
spurs->m.wklMskA.write_relaxed(be_t<u32>::make(0xffff));
}
spurs->m.xCC = 0;
spurs->m.xCD = 0;
@ -184,7 +185,7 @@ s64 spursInit(
assert(lwmutex_create(spurs->m.mutex, SYS_SYNC_PRIORITY, SYS_SYNC_NOT_RECURSIVE, *(u64*)"_spuPrv") == CELL_OK);
assert(lwcond_create(spurs->m.cond, spurs->m.mutex, *(u64*)"_spuPrv") == CELL_OK);
spurs->m.flags1 = (flags & SAF_EXIT_IF_NO_WORK) << 7 | (isSecond ? 0x40 : 0);
spurs->m.flags1 = (flags & SAF_EXIT_IF_NO_WORK ? SF1_EXIT_IF_NO_WORK : 0) | (isSecond ? SF1_IS_SECOND : 0);
spurs->m.flagRecv.write_relaxed(0xff);
spurs->m.wklFlag.flag.write_relaxed(be_t<u32>::make(-1));
spurs->_u8[0xD64] = 0;
@ -206,10 +207,110 @@ s64 spursInit(
spurs->m.ppu0 = ppu_thread_create(0, 0, ppuPriority, 0x4000, true, false, name + "SpursHdlr0", [spurs](PPUThread& CPU)
{
#ifdef PRX_DEBUG
#ifdef PRX_DEBUG_XXX
return cb_call<void, vm::ptr<CellSpurs>>(CPU, libsre + 0x9214, libsre_rtoc, spurs);
#endif
if (spurs->m.flags & SAF_UNKNOWN_FLAG_30)
{
return;
}
while (true)
{
if (Emu.IsStopped())
{
cellSpurs->Warning("SPURS Handler Thread 0 aborted");
return;
}
if (spurs->m.flags1 & SF1_EXIT_IF_NO_WORK)
{
assert(sys_lwmutex_lock(spurs->get_lwmutex(), 0) == CELL_OK);
if (spurs->m.xD66.read_relaxed())
{
assert(sys_lwmutex_unlock(spurs->get_lwmutex()) == CELL_OK);
return;
}
else while (true)
{
spurs->m.xD64.exchange(0);
if (spurs->m.exception.ToBE() == 0)
{
bool do_break = false;
for (u32 i = 0; i < 16; i++)
{
if (spurs->m.wklStat1[i].read_relaxed() == 2 &&
spurs->m.wklG1[i].wklPriority.ToBE() != 0 &&
spurs->_u8[0x50 + i] & 0xf // check wklMaxCnt
)
{
if (spurs->m.wklReadyCount[i].read_relaxed() ||
spurs->m.wklSet1.read_relaxed() & (0x8000u >> i) ||
spurs->m.wklFlag.flag.read_relaxed() == 0 &&
spurs->m.flagRecv.read_relaxed() == (u8)i
)
{
do_break = true;
break;
}
}
}
if (spurs->m.flags1 & SF1_IS_SECOND) for (u32 i = 0; i < 16; i++)
{
if (spurs->m.wklStat2[i].read_relaxed() == 2 &&
spurs->m.wklG2[i].wklPriority.ToBE() != 0 &&
spurs->_u8[0x50 + i] & 0xf0 // check wklMaxCnt
)
{
if (spurs->m.wklReadyCount[i + 0x10].read_relaxed() ||
spurs->m.wklSet2.read_relaxed() & (0x8000u >> i) ||
spurs->m.wklFlag.flag.read_relaxed() == 0 &&
spurs->m.flagRecv.read_relaxed() == (u8)i + 0x10
)
{
do_break = true;
break;
}
}
}
if (do_break) break; // from while
}
spurs->m.xD65.exchange(1);
if (spurs->m.xD64.read_relaxed() == 0)
{
assert(sys_lwcond_wait(spurs->get_lwcond(), 0) == CELL_OK);
}
spurs->m.xD65.exchange(0);
if (spurs->m.xD66.read_relaxed())
{
assert(sys_lwmutex_unlock(spurs->get_lwmutex()) == CELL_OK);
return;
}
}
assert(sys_lwmutex_unlock(spurs->get_lwmutex()) == CELL_OK);
}
if (Emu.IsStopped()) continue;
assert(sys_spu_thread_group_start(spurs->m.spuTG) == CELL_OK);
if (s32 res = sys_spu_thread_group_join(spurs->m.spuTG, vm::ptr<be_t<u32>>::make(0), vm::ptr<be_t<u32>>::make(0)))
{
if (res == CELL_ESTAT)
{
return;
}
assert(res == CELL_OK);
}
if (Emu.IsStopped()) continue;
if ((spurs->m.flags1 & SF1_EXIT_IF_NO_WORK) == 0)
{
assert(spurs->m.xD66.read_relaxed() == 1 || Emu.IsStopped());
return;
}
}
})->GetId();
spurs->m.ppu1 = ppu_thread_create(0, 0, ppuPriority, 0x8000, true, false, name + "SpursHdlr1", [spurs](PPUThread& CPU)
@ -775,9 +876,9 @@ s64 spursWakeUp(vm::ptr<CellSpurs> spurs)
spurs->m.xD64.exchange(1);
if (spurs->m.xD65.read_sync())
{
assert(sys_lwmutex_lock(vm::ptr<sys_lwmutex_t>::make(spurs.addr() + 0xdb0), 0) == 0);
assert(sys_lwcond_signal(vm::ptr<sys_lwcond_t>::make(spurs.addr() + 0xdc8)) == 0);
assert(sys_lwmutex_unlock(vm::ptr<sys_lwmutex_t>::make(spurs.addr() + 0xdb0)) == 0);
assert(sys_lwmutex_lock(spurs->get_lwmutex(), 0) == 0);
assert(sys_lwcond_signal(spurs->get_lwcond()) == 0);
assert(sys_lwmutex_unlock(spurs->get_lwmutex()) == 0);
}
return CELL_OK;
}
@ -826,8 +927,8 @@ s32 spursAddWorkload(
}
u32 wnum;
const u32 wmax = spurs->m.flags1 & 0x40 ? 0x20 : 0x10; // check isSecond (TODO: check if can be changed)
spurs->m.wklMsk1.atomic_op([spurs, wmax, &wnum](be_t<u32>& value)
const u32 wmax = spurs->m.flags1 & SF1_IS_SECOND ? 0x20u : 0x10u; // TODO: check if can be changed
spurs->m.wklMskA.atomic_op([spurs, wmax, &wnum](be_t<u32>& value)
{
wnum = cntlz32(~(u32)value); // found empty position
if (wnum < wmax)
@ -842,7 +943,7 @@ s32 spursAddWorkload(
return CELL_SPURS_POLICY_MODULE_ERROR_AGAIN;
}
u32 index = wnum % 0x10;
u32 index = wnum & 0xf;
if (wnum <= 15)
{
assert((spurs->m.wklA[wnum] & 0xf) == 0);
@ -856,15 +957,15 @@ s32 spursAddWorkload(
spurs->m.wklG1[wnum].wklPriority = *(be_t<u64>*)priorityTable;
spurs->m.wklH1[wnum].nameClass = nameClass;
spurs->m.wklH1[wnum].nameInstance = nameInstance;
memset(spurs->m.wklF1[wnum].unk0, 0, 0x18); // clear struct preserving semaphore id
memset(spurs->m.wklF1[wnum].unk1, 0, 0x60);
memset(spurs->m.wklF1[wnum].unk0, 0, 0x20); // clear struct preserving semaphore id
memset(spurs->m.wklF1[wnum].unk1, 0, 0x58);
if (hook)
{
spurs->m.wklF1[wnum].hook = hook;
spurs->m.wklF1[wnum].hookArg = hookArg;
spurs->m.wklE1[wnum] |= 2;
}
if ((spurs->m.flags1 & 0x40) == 0)
if ((spurs->m.flags1 & SF1_IS_SECOND) == 0)
{
spurs->m.wklReadyCount[wnum + 16].write_relaxed(0);
spurs->m.wklMinCnt[wnum] = minContention > 8 ? 8 : minContention;
@ -883,8 +984,8 @@ s32 spursAddWorkload(
spurs->m.wklG2[index].wklPriority = *(be_t<u64>*)priorityTable;
spurs->m.wklH2[index].nameClass = nameClass;
spurs->m.wklH2[index].nameInstance = nameInstance;
memset(spurs->m.wklF2[index].unk0, 0, 0x18); // clear struct preserving semaphore id
memset(spurs->m.wklF2[index].unk1, 0, 0x60);
memset(spurs->m.wklF2[index].unk0, 0, 0x20); // clear struct preserving semaphore id
memset(spurs->m.wklF2[index].unk1, 0, 0x58);
if (hook)
{
spurs->m.wklF2[index].hook = hook;
@ -920,7 +1021,7 @@ s32 spursAddWorkload(
u32 res_wkl;
CellSpurs::_sub_str3& wkl = wnum <= 15 ? spurs->m.wklG1[wnum] : spurs->m.wklG2[wnum & 0xf];
spurs->m.wklMsk2.atomic_op_sync([spurs, &wkl, wnum, &res_wkl](be_t<u32>& v)
spurs->m.wklMskB.atomic_op_sync([spurs, &wkl, wnum, &res_wkl](be_t<u32>& v)
{
const u32 mask = v.ToLE() & ~(0x80000000u >> wnum);
res_wkl = 0;
@ -951,7 +1052,7 @@ s32 spursAddWorkload(
spurs->wklStat(wnum).exchange(2);
spurs->m.xBD.exchange(0xff);
spurs->m.x72.exchange(0);
spurs->m.x72.exchange(0xff);
return CELL_OK;
}
@ -981,10 +1082,10 @@ s64 cellSpursAddWorkload(
*priorityTable,
minContention,
maxContention,
{},
{},
{},
{});
vm::ptr<const char>::make(0),
vm::ptr<const char>::make(0),
vm::ptr<CellSpursShutdownCompletionEventHook>::make(0),
vm::ptr<void>::make(0));
}
s64 _cellSpursWorkloadAttributeInitialize(
@ -1162,11 +1263,11 @@ s64 _cellSpursWorkloadFlagReceiver(vm::ptr<CellSpurs> spurs, u32 wid, u32 is_set
{
return CELL_SPURS_POLICY_MODULE_ERROR_ALIGN;
}
if (wid >= (spurs->m.flags1 & 0x40 ? 0x20u : 0x10u))
if (wid >= (spurs->m.flags1 & SF1_IS_SECOND ? 0x20u : 0x10u))
{
return CELL_SPURS_POLICY_MODULE_ERROR_INVAL;
}
if ((spurs->m.wklMsk1.read_relaxed().ToLE() & (0x80000000u >> wid)) == 0)
if ((spurs->m.wklMskA.read_relaxed().ToLE() & (0x80000000u >> wid)) == 0)
{
return CELL_SPURS_POLICY_MODULE_ERROR_SRCH;
}
@ -1274,11 +1375,11 @@ s64 cellSpursReadyCountStore(vm::ptr<CellSpurs> spurs, u32 wid, u32 value)
{
return CELL_SPURS_POLICY_MODULE_ERROR_ALIGN;
}
if (wid >= (spurs->m.flags1 & 0x40 ? 0x20u : 0x10u) || value > 0xff)
if (wid >= (spurs->m.flags1 & SF1_IS_SECOND ? 0x20u : 0x10u) || value > 0xff)
{
return CELL_SPURS_POLICY_MODULE_ERROR_INVAL;
}
if ((spurs->m.wklMsk1.read_relaxed().ToLE() & (0x80000000u >> wid)) == 0)
if ((spurs->m.wklMskA.read_relaxed().ToLE() & (0x80000000u >> wid)) == 0)
{
return CELL_SPURS_POLICY_MODULE_ERROR_SRCH;
}

View File

@ -141,8 +141,10 @@ struct CellSpurs;
enum SpursAttrFlags : u32
{
SAF_NONE = 0x0,
SAF_EXIT_IF_NO_WORK = 0x1,
SAF_SECOND_VERSION = 0x4,
SAF_UNKNOWN_FLAG_30 = 0x2,
SAF_SECOND_VERSION = 0x4,
SAF_UNKNOWN_FLAG_9 = 0x00400000,
SAF_UNKNOWN_FLAG_8 = 0x00800000,
@ -154,6 +156,14 @@ enum SpursAttrFlags : u32
SAF_UNKNOWN_FLAG_0 = 0x80000000,
};
enum SpursFlags1 : u8
{
SF1_NONE = 0x0,
SF1_IS_SECOND = 0x40,
SF1_EXIT_IF_NO_WORK = 0x80,
};
struct CellSpursAttribute
{
static const uint align = 8;
@ -279,8 +289,8 @@ struct CellSpurs
atomic_t<u8> wklStat1[0x10]; // 0x80
u8 wklD1[0x10]; // 0x90
u8 wklE1[0x10]; // 0xA0
atomic_t<u32> wklMsk1; // 0xB0
atomic_t<u32> wklMsk2; // 0xB4
atomic_t<u32> wklMskA; // 0xB0
atomic_t<u32> wklMskB; // 0xB4
u8 xB8[5]; // 0xB8
atomic_t<u8> xBD; // 0xBD
u8 xBE[2]; // 0xBE
@ -361,6 +371,16 @@ struct CellSpurs
return m.wklStat1[wid & 0xf];
}
}
__forceinline vm::ptr<sys_lwmutex_t> get_lwmutex()
{
return vm::ptr<sys_lwmutex_t>::make(Memory.RealToVirtualAddr(&m.mutex));
}
__forceinline vm::ptr<sys_lwcond_t> get_lwcond()
{
return vm::ptr<sys_lwcond_t>::make(Memory.RealToVirtualAddr(&m.cond));
}
};
typedef CellSpurs CellSpurs2;

View File

@ -1087,7 +1087,7 @@ s32 syncLFQueueGetPushPointer(vm::ptr<CellSyncLFQueue> queue, s32& pointer, u32
}
}
assert(sys_event_queue_receive(queue->m_eq_id, {}, 0) == CELL_OK);
assert(sys_event_queue_receive(queue->m_eq_id, vm::ptr<sys_event_data>::make(0), 0) == CELL_OK);
var1 = 1;
}
}
@ -1466,7 +1466,7 @@ s32 syncLFQueueGetPopPointer(vm::ptr<CellSyncLFQueue> queue, s32& pointer, u32 i
}
}
assert(sys_event_queue_receive(queue->m_eq_id, {}, 0) == CELL_OK);
assert(sys_event_queue_receive(queue->m_eq_id, vm::ptr<sys_event_data>::make(0), 0) == CELL_OK);
var1 = 1;
}
}