diff --git a/rpcs3/Emu/Cell/Modules/cellPhotoImport.cpp b/rpcs3/Emu/Cell/Modules/cellPhotoImport.cpp index 59a855dd41..be11e46a8f 100644 --- a/rpcs3/Emu/Cell/Modules/cellPhotoImport.cpp +++ b/rpcs3/Emu/Cell/Modules/cellPhotoImport.cpp @@ -80,7 +80,8 @@ error_code cellPhotoImport(u32 version, vm::cptr dstHddPath, vm::ptr s32 { vm::var filedata; - filedata->data_sub = vm::var(); + vm::var sub; + filedata->data_sub = sub; funcFinish(ppu, CELL_OK, filedata, userdata); return CELL_OK; }); @@ -95,7 +96,8 @@ error_code cellPhotoImport2(u32 version, vm::cptr dstHddPath, vm::ptr s32 { vm::var filedata; - filedata->data_sub = vm::var(); + vm::var sub; + filedata->data_sub = sub; funcFinish(ppu, CELL_OK, filedata, userdata); return CELL_OK; }); diff --git a/rpcs3/Emu/Cell/Modules/sceNpTrophy.cpp b/rpcs3/Emu/Cell/Modules/sceNpTrophy.cpp index 8e7063efa9..d942bb34ba 100644 --- a/rpcs3/Emu/Cell/Modules/sceNpTrophy.cpp +++ b/rpcs3/Emu/Cell/Modules/sceNpTrophy.cpp @@ -309,7 +309,7 @@ error_code sceNpTrophyRegisterContext(ppu_thread& ppu, u32 context, u32 handle, ctxt->tropusr.reset(tropusr); // TODO: Callbacks - // From RE-ing a game's state machine, it seems the possible order is one of the following: + // From RE-ing a game's state machine, it seems the possible order is one of the following: // * Install (Not installed) - Setup - Progress * ? - Finalize - Complete - Installed // * Reinstall (Corrupted) - Setup - Progress * ? - Finalize - Complete - Installed // * Update (Required update) - Setup - Progress * ? - Finalize - Complete - Installed @@ -533,8 +533,8 @@ error_code sceNpTrophyUnlockTrophy(u32 context, u32 handle, s32 trophyId, vm::pt std::vector trophyIconData; trophyIconFile.read(trophyIconData, iconSize); - vm::ptr details = vm::make_var(SceNpTrophyDetails()); - vm::ptr _ = vm::make_var(SceNpTrophyData()); + vm::var details({0}); + vm::var _({0}); s32 ret = sceNpTrophyGetTrophyInfo(context, handle, trophyId, details, _); if (ret != CELL_OK) diff --git a/rpcs3/Emu/Cell/Modules/sys_prx_.cpp b/rpcs3/Emu/Cell/Modules/sys_prx_.cpp index 6691918095..dd25dfe810 100644 --- a/rpcs3/Emu/Cell/Modules/sys_prx_.cpp +++ b/rpcs3/Emu/Cell/Modules/sys_prx_.cpp @@ -12,14 +12,7 @@ extern vm::gvar g_ppu_prx_lwm; // Convert the array of 32-bit pointers to 64-bit pointers using stack allocation static auto convert_path_list(vm::cpptr path_list, s32 count) { - vm::var[]> result(count); - - for (s32 i = 0; i < count; i++) - { - result[i] = path_list[i]; - } - - return std::move(result); + return vm::var[]>(count, path_list.get_ptr()); } // Execute start or stop module function diff --git a/rpcs3/Emu/Cell/Modules/sys_spu_.cpp b/rpcs3/Emu/Cell/Modules/sys_spu_.cpp index 2a725de993..45d89a79b1 100644 --- a/rpcs3/Emu/Cell/Modules/sys_spu_.cpp +++ b/rpcs3/Emu/Cell/Modules/sys_spu_.cpp @@ -188,7 +188,7 @@ error_code sys_spu_elf_get_information(u32 elf_img, vm::ptr entry, vm::ptr< sysPrxForUser.warning("sys_spu_elf_get_information(elf_img=0x%x, entry=*0x%x, nseg=*0x%x)", elf_img, entry, nseg); // Initialize ELF loader - vm::var info(spu_elf_info{}); + vm::var info({0}); if (auto res = info->init(vm::cast(elf_img))) { @@ -202,7 +202,7 @@ error_code sys_spu_elf_get_information(u32 elf_img, vm::ptr entry, vm::ptr< } // Load ELF header - vm::var> ehdr(elf_ehdr{}); + vm::var> ehdr({0}); if (info->ldr->get_ehdr(ehdr) || ehdr->e_machine != elf_machine::spu || !ehdr->e_phnum) { @@ -234,7 +234,7 @@ error_code sys_spu_elf_get_segments(u32 elf_img, vm::ptr segmen sysPrxForUser.warning("sys_spu_elf_get_segments(elf_img=0x%x, segments=*0x%x, nseg=0x%x)", elf_img, segments, nseg); // Initialize ELF loader - vm::var info(spu_elf_info{}); + vm::var info({0}); if (auto res = info->init(vm::cast(elf_img))) { @@ -242,7 +242,7 @@ error_code sys_spu_elf_get_segments(u32 elf_img, vm::ptr segmen } // Load ELF header - vm::var> ehdr(elf_ehdr{}); + vm::var> ehdr({0}); if (info->ldr->get_ehdr(ehdr) || ehdr->e_machine != elf_machine::spu || !ehdr->e_phnum) { @@ -281,7 +281,7 @@ error_code sys_spu_image_import(vm::ptr img, u32 src, u32 type) } // Initialize ELF loader - vm::var info(spu_elf_info{}); + vm::var info({0}); if (auto res = info->init(vm::cast(src))) { @@ -295,7 +295,7 @@ error_code sys_spu_image_import(vm::ptr img, u32 src, u32 type) } // Load ELF header - vm::var> ehdr(elf_ehdr{}); + vm::var> ehdr({0}); if (info->ldr->get_ehdr(ehdr) || ehdr->e_machine != elf_machine::spu || !ehdr->e_phnum) { diff --git a/rpcs3/Emu/Cell/lv2/sys_mmapper.cpp b/rpcs3/Emu/Cell/lv2/sys_mmapper.cpp index 730a1dbfff..b8b7bbeedb 100644 --- a/rpcs3/Emu/Cell/lv2/sys_mmapper.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_mmapper.cpp @@ -426,7 +426,7 @@ error_code sys_mmapper_enable_page_fault_notification(u32 start_addr, u32 event_ } } - vm::ptr port_id = vm::make_var(0); + vm::var port_id(0); error_code res = sys_event_port_create(port_id, SYS_EVENT_PORT_LOCAL, SYS_MEMORY_PAGE_FAULT_EVENT_KEY); sys_event_port_connect_local(port_id->value(), event_queue_id); diff --git a/rpcs3/Emu/Cell/lv2/sys_rsx.cpp b/rpcs3/Emu/Cell/lv2/sys_rsx.cpp index eb6db1715e..2fbca5f1fe 100644 --- a/rpcs3/Emu/Cell/lv2/sys_rsx.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_rsx.cpp @@ -131,11 +131,12 @@ s32 sys_rsx_context_allocate(vm::ptr context_id, vm::ptr lpar_dma_cont else rsx::get_current_renderer()->main_mem_size = 0x10000000; //256MB - sys_event_queue_attribute_t attr; - attr.protocol = SYS_SYNC_PRIORITY; - attr.type = SYS_PPU_QUEUE; - auto queueId = vm::make_var(0); - sys_event_queue_create(queueId, vm::make_var(attr), 0, 0x20); + vm::var attr; + attr->protocol = SYS_SYNC_PRIORITY; + attr->type = SYS_PPU_QUEUE; + attr->name_u64 = 0; + vm::var queueId(0); + sys_event_queue_create(queueId, attr, 0, 0x20); driverInfo.handler_queue = queueId->value(); sys_event_port_create(queueId, SYS_EVENT_PORT_LOCAL, 0); diff --git a/rpcs3/Emu/Memory/vm_var.h b/rpcs3/Emu/Memory/vm_var.h index 4822ea75c6..5c216f53dc 100644 --- a/rpcs3/Emu/Memory/vm_var.h +++ b/rpcs3/Emu/Memory/vm_var.h @@ -4,7 +4,7 @@ namespace vm { - template + template struct page_allocator { static inline vm::addr_t alloc(u32 size, u32 align) @@ -18,7 +18,7 @@ namespace vm } }; - template + template struct stack_allocator { static inline vm::addr_t alloc(u32 size, u32 align) @@ -32,38 +32,38 @@ namespace vm } }; - // Variable general specialization - template + // General variable base class + template class _var_base final : public _ptr_base { using pointer = _ptr_base; public: + // Unmoveable object + _var_base(const _var_base&) = delete; + _var_base() - : pointer(A::alloc(SIZE_32(T), alignof(T))) + : pointer(A::alloc(SIZE_32(T), alignof(T))) { } _var_base(const T& right) - : _var_base() + : _var_base() { std::memcpy(pointer::get_ptr(), &right, sizeof(T)); } - _var_base(_var_base&& right) - : pointer(right) - { - reinterpret_cast(static_cast(right)) = 0; - } - ~_var_base() { - if (pointer::addr()) A::dealloc(pointer::addr(), SIZE_32(T)); + if (pointer::addr()) + { + A::dealloc(pointer::addr(), SIZE_32(T)); + } } }; - // Dynamic length array variable - template + // Dynamic length array variable specialization + template class _var_base final : public _ptr_base { using pointer = _ptr_base; @@ -71,26 +71,33 @@ namespace vm u32 m_size; public: + // Unmoveable object + _var_base(const _var_base&) = delete; + _var_base(u32 count) - : pointer(A::alloc(SIZE_32(T) * count, alignof(T))) - , m_size(SIZE_32(T) * count) + : pointer(A::alloc(SIZE_32(T) * count, alignof(T))) + , m_size(SIZE_32(T) * count) { } - _var_base(_var_base&& right) - : pointer(right) - , m_size(right.m_size) + // Initialize via the iterator + template + _var_base(u32 count, I&& it) + : _var_base(count) { - reinterpret_cast(static_cast(right)) = 0; + std::copy_n(std::forward(it), count, pointer::get_ptr()); } ~_var_base() { - if (pointer::addr()) A::dealloc(pointer::addr(), m_size); + if (pointer::addr()) + { + A::dealloc(pointer::addr(), m_size); + } } // Remove operator -> - T* operator ->() const = delete; + T* operator->() const = delete; u32 get_count() const { @@ -109,36 +116,37 @@ namespace vm }; // LE variable - template using varl = _var_base, A>; + template + using varl = _var_base, A>; // BE variable - template using varb = _var_base, A>; + template + using varb = _var_base, A>; inline namespace ps3_ { // BE variable - template> using var = varb; + template > + using var = varb; // Make BE variable initialized from value - template> - inline auto make_var(const T& value) + template > + [[nodiscard]] auto make_var(const T& value) { return varb(value); } // Make char[] variable initialized from std::string - template> - static auto make_str(const std::string& str) + template > + [[nodiscard]] auto make_str(const std::string& str) { - var var_(size32(str) + 1); - std::memcpy(var_.get_ptr(), str.c_str(), str.size() + 1); - return var_; + return _var_base(size32(str) + 1, str.c_str()); } // Global HLE variable - template + template struct gvar : ptr { }; - } -} + } // namespace ps3_ +} // namespace vm