diff --git a/rpcs3/Emu/Memory/vm_ptr.h b/rpcs3/Emu/Memory/vm_ptr.h index 4b600d9eab..adc82349d0 100644 --- a/rpcs3/Emu/Memory/vm_ptr.h +++ b/rpcs3/Emu/Memory/vm_ptr.h @@ -410,11 +410,10 @@ namespace vm { static bptrl make(AT addr) { - return (bptrl&)addr; + return (bptrl&)_ptr_base::type>::make(convert_le_be::type>(addr)); } using _ptr_base::type>::operator=; - //using _ptr_base::type>::operator const _ptr_base; }; //BE pointer to BE data @@ -422,11 +421,10 @@ namespace vm { static bptrb make(AT addr) { - return (bptrb&)addr; + return (bptrb&)_ptr_base::type, lvl, typename to_be_t::type>::make(convert_le_be::type>(addr)); } using _ptr_base::type, lvl, typename to_be_t::type>::operator=; - //using _ptr_base::type, lvl, typename to_be_t::type>::operator const _ptr_base::type, lvl, AT>; }; //LE pointer to BE data @@ -434,11 +432,10 @@ namespace vm { static lptrb make(AT addr) { - return (lptrb&)addr; + return (lptrb&)_ptr_base::type, lvl, AT>::make(addr); } using _ptr_base::type, lvl, AT>::operator=; - //using _ptr_base::type, lvl, AT>::operator const _ptr_base::type, lvl, typename to_be_t::type>; }; //LE pointer to LE data @@ -446,37 +443,47 @@ namespace vm { static lptrl make(AT addr) { - return (lptrl&)addr; + return (lptrl&)_ptr_base::make(addr); } using _ptr_base::operator=; - //using _ptr_base::operator const _ptr_base::type>; }; namespace ps3 { + template struct ptr; + template struct bptr; + //default pointer for HLE functions (LE pointer to BE data) - template struct ptr : public lptrb + template struct ptr : public lptrb { static ptr make(AT addr) { - return (ptr&)addr; + return (ptr&)lptrb::make(addr); + } + + vm::ps3::bptr to_be() const + { + return vm::ps3::bptr::make(addr()); } using lptrb::operator=; - //using lptrb::operator const _ptr_base::type, lvl, AT>; }; //default pointer for HLE structures (BE pointer to BE data) - template struct bptr : public bptrb + template struct bptr : public bptrb { static bptr make(AT addr) { - return (bptr&)addr; + return (bptr&)bptrb::make(addr); + } + + vm::ps3::ptr to_le() const + { + return vm::ps3::ptr::make(addr()); } using bptrb::operator=; - //using bptrb::operator const _ptr_base::type, lvl, AT>; }; } @@ -487,7 +494,7 @@ namespace vm { static ptr make(AT addr) { - return (ptr&)addr; + return (ptr&)lptrl::make(addr); } using lptrl::operator=; diff --git a/rpcs3/Emu/SysCalls/Modules/cellAdec.cpp b/rpcs3/Emu/SysCalls/Modules/cellAdec.cpp index 52f8e06a64..75a8763003 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellAdec.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellAdec.cpp @@ -529,7 +529,7 @@ int cellAdecOpen(vm::ptr type, vm::ptr res, vm:: if (!adecCheckType(type->audioCodecType)) return CELL_ADEC_ERROR_ARG; - *handle = adecOpen(new AudioDecoder(type->audioCodecType, res->startAddr, res->totalMemSize, vm::ptr::make(cb->cbFunc.addr()), cb->cbArg)); + *handle = adecOpen(new AudioDecoder(type->audioCodecType, res->startAddr, res->totalMemSize, cb->cbFunc.to_le(), cb->cbArg)); return CELL_OK; } @@ -541,7 +541,7 @@ int cellAdecOpenEx(vm::ptr type, vm::ptr res, if (!adecCheckType(type->audioCodecType)) return CELL_ADEC_ERROR_ARG; - *handle = adecOpen(new AudioDecoder(type->audioCodecType, res->startAddr, res->totalMemSize, vm::ptr::make(cb->cbFunc.addr()), cb->cbArg)); + *handle = adecOpen(new AudioDecoder(type->audioCodecType, res->startAddr, res->totalMemSize, cb->cbFunc.to_le(), cb->cbArg)); return CELL_OK; } diff --git a/rpcs3/Emu/SysCalls/Modules/cellDmux.cpp b/rpcs3/Emu/SysCalls/Modules/cellDmux.cpp index cea8ba8569..9bf3c1ff03 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellDmux.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellDmux.cpp @@ -803,7 +803,7 @@ int cellDmuxOpen(vm::ptr demuxerType, vm::ptrmemAddr, demuxerResource->memSize, vm::ptr::make(demuxerCb->cbMsgFunc.addr()), demuxerCb->cbArg)); + *demuxerHandle = dmuxOpen(new Demuxer(demuxerResource->memAddr, demuxerResource->memSize, demuxerCb->cbMsgFunc.to_le(), demuxerCb->cbArg)); return CELL_OK; } @@ -821,7 +821,7 @@ int cellDmuxOpenEx(vm::ptr demuxerType, vm::ptrmemAddr, demuxerResourceEx->memSize, vm::ptr::make(demuxerCb->cbMsgFunc.addr()), demuxerCb->cbArg)); + *demuxerHandle = dmuxOpen(new Demuxer(demuxerResourceEx->memAddr, demuxerResourceEx->memSize, demuxerCb->cbMsgFunc.to_le(), demuxerCb->cbArg)); return CELL_OK; } @@ -839,7 +839,7 @@ int cellDmuxOpen2(vm::ptr demuxerType2, vm::ptrmemAddr, demuxerResource2->memSize, vm::ptr::make(demuxerCb->cbMsgFunc.addr()), demuxerCb->cbArg)); + *demuxerHandle = dmuxOpen(new Demuxer(demuxerResource2->memAddr, demuxerResource2->memSize, demuxerCb->cbMsgFunc.to_le(), demuxerCb->cbArg)); return CELL_OK; } @@ -988,7 +988,7 @@ int cellDmuxEnableEs(u32 demuxerHandle, vm::ptr esFil std::shared_ptr es(new ElementaryStream(dmux.get(), esResourceInfo->memAddr, esResourceInfo->memSize, esFilterId->filterIdMajor, esFilterId->filterIdMinor, esFilterId->supplementalInfo1, esFilterId->supplementalInfo2, - vm::ptr::make(esCb->cbEsMsgFunc.addr()), esCb->cbArg, esSpecificInfo_addr)); + esCb->cbEsMsgFunc.to_le(), esCb->cbArg, esSpecificInfo_addr)); u32 id = cellDmux->GetNewId(es); es->id = id; diff --git a/rpcs3/Emu/SysCalls/Modules/cellGifDec.cpp b/rpcs3/Emu/SysCalls/Modules/cellGifDec.cpp index 6fafce19a5..8d46d2b917 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellGifDec.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellGifDec.cpp @@ -39,7 +39,7 @@ int cellGifDecOpen(u32 mainHandle, vm::ptr subHandle, vm::ptr> fd; - int ret = cellFsOpen(vm::ptr::make(src->fileName.addr()), 0, fd, vm::ptr::make(0), 0); + int ret = cellFsOpen(src->fileName.to_le(), 0, fd, vm::ptr::make(0), 0); current_subHandle->fd = fd.value(); if (ret != CELL_OK) return CELL_GIFDEC_ERROR_OPEN_FILE; diff --git a/rpcs3/Emu/SysCalls/Modules/cellJpgDec.cpp b/rpcs3/Emu/SysCalls/Modules/cellJpgDec.cpp index 1601720601..eecc0987a4 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellJpgDec.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellJpgDec.cpp @@ -45,7 +45,7 @@ int cellJpgDecOpen(u32 mainHandle, vm::ptr subHandle, vm::ptr> fd; - int ret = cellFsOpen(vm::ptr::make(src->fileName.addr()), 0, fd, vm::ptr::make(0), 0); + int ret = cellFsOpen(src->fileName.to_le(), 0, fd, vm::ptr::make(0), 0); current_subHandle->fd = fd.value(); if (ret != CELL_OK) return CELL_JPGDEC_ERROR_OPEN_FILE; diff --git a/rpcs3/Emu/SysCalls/Modules/cellPngDec.cpp b/rpcs3/Emu/SysCalls/Modules/cellPngDec.cpp index bbd9c24c75..93c79343b6 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellPngDec.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellPngDec.cpp @@ -86,7 +86,7 @@ s64 pngDecOpen( case se32(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); + int ret = cellFsOpen(src->fileName.to_le(), 0, fd, vm::ptr::make(0), 0); stream->fd = fd.value(); if (ret != CELL_OK) return CELL_PNGDEC_ERROR_OPEN_FILE; diff --git a/rpcs3/Emu/SysCalls/Modules/cellSaveData.cpp b/rpcs3/Emu/SysCalls/Modules/cellSaveData.cpp index 0b29465729..18724020af 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellSaveData.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellSaveData.cpp @@ -205,7 +205,7 @@ void getSaveDataStat(SaveDataEntry entry, vm::ptr statGet) strcpy_trunc(statGet->getParam.listParam, entry.listParam); statGet->fileNum = 0; - statGet->fileList.set(be_t::make(0)); + statGet->fileList.set(0); statGet->fileListNum = 0; std::string saveDir = "/dev_hdd0/home/00000001/savedata/" + entry.dirName; // TODO: Get the path of the current user vfsDir dir(saveDir); @@ -242,7 +242,7 @@ void getSaveDataStat(SaveDataEntry entry, vm::ptr statGet) } } - statGet->fileList = vm::ptr::make((u32)Memory.Alloc(sizeof(CellSaveDataFileStat) * fileEntries.size(), 8)); + statGet->fileList.set((u32)Memory.Alloc(sizeof(CellSaveDataFileStat) * fileEntries.size(), 8)); for (u32 i = 0; i < fileEntries.size(); i++) { CellSaveDataFileStat *dst = &statGet->fileList[i]; memcpy(dst, &fileEntries[i], sizeof(CellSaveDataFileStat)); @@ -366,8 +366,8 @@ s32 cellSaveDataListSave2( // Sort the entries and fill the listGet->dirList array std::sort(saveEntries.begin(), saveEntries.end(), sortSaveDataEntry(setList->sortType, setList->sortOrder)); - listGet->dirList = vm::bptr::make(setBuf->buf.addr()); - auto dirList = vm::get_ptr(listGet->dirList.addr()); + listGet->dirList.set(setBuf->buf.addr()); + auto dirList = listGet->dirList.get_ptr(); for (u32 i=0; i::make(listSet->fixedList.addr()), listSet->fixedListNum); + setSaveDataList(saveEntries, listSet->fixedList.to_le(), listSet->fixedListNum); if (listSet->newData) - addNewSaveDataEntry(saveEntries, vm::ptr::make(listSet->newData.addr())); + addNewSaveDataEntry(saveEntries, listSet->newData.to_le()); if (saveEntries.size() == 0) { cellSysutil->Error("cellSaveDataListSave2: No save entries found!"); // TODO: Find a better way to handle this error return CELL_OK; @@ -458,8 +458,8 @@ s32 cellSaveDataListLoad2( // Sort the entries and fill the listGet->dirList array std::sort(saveEntries.begin(), saveEntries.end(), sortSaveDataEntry(setList->sortType, setList->sortOrder)); - listGet->dirList = vm::bptr::make(setBuf->buf.addr()); - auto dirList = vm::get_ptr(listGet->dirList.addr()); + listGet->dirList.set(setBuf->buf.addr()); + auto dirList = listGet->dirList.get_ptr(); for (u32 i=0; i::make(listSet->fixedList.addr()), listSet->fixedListNum); + setSaveDataList(saveEntries, listSet->fixedList.to_le(), listSet->fixedListNum); if (listSet->newData) - addNewSaveDataEntry(saveEntries, vm::ptr::make(listSet->newData.addr())); + addNewSaveDataEntry(saveEntries, listSet->newData.to_le()); if (saveEntries.size() == 0) { cellSysutil->Error("cellSaveDataListLoad2: No save entries found!"); // TODO: Find a better way to handle this error return CELL_OK; @@ -548,8 +548,8 @@ s32 cellSaveDataFixedSave2( // Sort the entries and fill the listGet->dirList array std::sort(saveEntries.begin(), saveEntries.end(), sortSaveDataEntry(setList->sortType, setList->sortOrder)); - listGet->dirList = vm::bptr::make(setBuf->buf.addr()); - auto dirList = vm::get_ptr(listGet->dirList.addr()); + listGet->dirList.set(setBuf->buf.addr()); + auto dirList = listGet->dirList.get_ptr(); for (u32 i = 0; idirList array std::sort(saveEntries.begin(), saveEntries.end(), sortSaveDataEntry(setList->sortType, setList->sortOrder)); - listGet->dirList = vm::bptr::make(setBuf->buf.addr()); - auto dirList = vm::get_ptr(listGet->dirList.addr()); + listGet->dirList.set(setBuf->buf.addr()); + auto dirList = listGet->dirList.get_ptr(); for (u32 i = 0; i type, vm::ptrWarning("cellVdecOpen(type_addr=0x%x, res_addr=0x%x, cb_addr=0x%x, handle_addr=0x%x)", type.addr(), res.addr(), cb.addr(), handle.addr()); - *handle = vdecOpen(new VideoDecoder(type->codecType, type->profileLevel, res->memAddr, res->memSize, vm::ptr::make(cb->cbFunc.addr()), cb->cbArg)); + *handle = vdecOpen(new VideoDecoder(type->codecType, type->profileLevel, res->memAddr, res->memSize, cb->cbFunc.to_le(), cb->cbArg)); return CELL_OK; } @@ -585,7 +585,7 @@ int cellVdecOpenEx(vm::ptr type, vm::ptrWarning("cellVdecOpenEx(type_addr=0x%x, res_addr=0x%x, cb_addr=0x%x, handle_addr=0x%x)", type.addr(), res.addr(), cb.addr(), handle.addr()); - *handle = vdecOpen(new VideoDecoder(type->codecType, type->profileLevel, res->memAddr, res->memSize, vm::ptr::make(cb->cbFunc.addr()), cb->cbArg)); + *handle = vdecOpen(new VideoDecoder(type->codecType, type->profileLevel, res->memAddr, res->memSize, cb->cbFunc.to_le(), cb->cbArg)); return CELL_OK; } diff --git a/rpcs3/Emu/SysCalls/lv2/sys_lwcond.cpp b/rpcs3/Emu/SysCalls/lv2/sys_lwcond.cpp index 6670f797e6..b15551d2d3 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_lwcond.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_lwcond.cpp @@ -65,7 +65,7 @@ s32 sys_lwcond_signal(vm::ptr lwcond) return CELL_ESRCH; } - auto mutex = vm::ptr::make(lwcond->lwmutex.addr()); + auto mutex = lwcond->lwmutex.to_le(); if (u32 target = lw->queue.signal(mutex->attribute)) { @@ -89,7 +89,7 @@ s32 sys_lwcond_signal_all(vm::ptr lwcond) return CELL_ESRCH; } - auto mutex = vm::ptr::make(lwcond->lwmutex.addr()); + auto mutex = lwcond->lwmutex.to_le(); while (u32 target = lw->queue.signal(mutex->attribute)) { @@ -138,9 +138,9 @@ s32 sys_lwcond_wait(PPUThread& CPU, vm::ptr lwcond, u64 timeout) return CELL_ESRCH; } - auto mutex = vm::ptr::make(lwcond->lwmutex.addr()); + auto mutex = lwcond->lwmutex.to_le(); u32 tid_le = CPU.GetId(); - be_t tid = be_t::make(tid_le); + auto tid = be_t::make(tid_le); std::shared_ptr sq; if (!Emu.GetIdManager().GetIDData((u32)mutex->sleep_queue, sq)) @@ -160,7 +160,7 @@ s32 sys_lwcond_wait(PPUThread& CPU, vm::ptr lwcond, u64 timeout) auto old_recursive = mutex->recursive_count.read_relaxed(); mutex->recursive_count.exchange(be_t::make(0)); - be_t target = be_t::make(sq->signal(mutex->attribute)); + auto target = be_t::make(sq->signal(mutex->attribute)); if (!mutex->owner.compare_and_swap_test(tid, target)) { assert(!"sys_lwcond_wait(): mutex unlocking failed"); diff --git a/rpcs3/Emu/SysCalls/lv2/sys_ppu_thread.cpp b/rpcs3/Emu/SysCalls/lv2/sys_ppu_thread.cpp index 4f2d19d532..9a7e1768bc 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_ppu_thread.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_ppu_thread.cpp @@ -214,8 +214,7 @@ void sys_ppu_thread_once(PPUThread& CPU, vm::ptr> once_ctrl, vm::p { sys_ppu_thread.Warning("sys_ppu_thread_once(once_ctrl_addr=0x%x, init_addr=0x%x)", once_ctrl.addr(), init.addr()); - be_t cmp = be_t::make(SYS_PPU_THREAD_ONCE_INIT); - if (once_ctrl->compare_and_swap(cmp, be_t::make(SYS_PPU_THREAD_DONE_INIT)) == cmp) + if (once_ctrl->compare_and_swap_test(be_t::make(SYS_PPU_THREAD_ONCE_INIT), be_t::make(SYS_PPU_THREAD_DONE_INIT))) { init(CPU); }