diff --git a/Utilities/BEType.h b/Utilities/BEType.h index c3be3eb9e6..274d7d7e0a 100644 --- a/Utilities/BEType.h +++ b/Utilities/BEType.h @@ -888,6 +888,14 @@ template struct le_t //} }; +template struct is_le_t : public std::integral_constant +{ +}; + +template struct is_le_t> : public std::integral_constant +{ +}; + template struct to_le { using type = std::conditional_t::value || std::is_enum::value, le_t, T>; diff --git a/rpcs3/Emu/ARMv7/ARMv7Callback.h b/rpcs3/Emu/ARMv7/ARMv7Callback.h index 0777ed4f20..b8d7daa452 100644 --- a/rpcs3/Emu/ARMv7/ARMv7Callback.h +++ b/rpcs3/Emu/ARMv7/ARMv7Callback.h @@ -5,7 +5,7 @@ namespace vm { template - force_inline RT _ptr_base::operator()(ARMv7Context& context, T... args) const + force_inline RT _ptr_base::operator()(ARMv7Context& context, T... args) const { return psv_func_detail::func_caller::call(context, vm::cast(this->addr()), args...); } diff --git a/rpcs3/Emu/Memory/vm_ptr.h b/rpcs3/Emu/Memory/vm_ptr.h index 11fe0307f4..dfa1797f72 100644 --- a/rpcs3/Emu/Memory/vm_ptr.h +++ b/rpcs3/Emu/Memory/vm_ptr.h @@ -5,7 +5,7 @@ struct ARMv7Context; namespace vm { - template + template struct _ptr_base { AT m_addr; @@ -15,84 +15,14 @@ namespace vm static_assert(!std::is_pointer::value, "vm::_ptr_base<> error: invalid type (pointer)"); static_assert(!std::is_reference::value, "vm::_ptr_base<> error: invalid type (reference)"); - static const u32 address_size = sizeof(AT); - - _ptr_base operator++ (int) - { - AT result = m_addr; - m_addr += address_size; - return make(result); - } - - _ptr_base& operator++ () - { - m_addr += address_size; - return *this; - } - - _ptr_base operator-- (int) - { - AT result = m_addr; - m_addr -= address_size; - return make(result); - } - - _ptr_base& operator-- () - { - m_addr -= address_size; - return *this; - } - - _ptr_base& operator += (AT count) - { - m_addr += count * address_size; - return *this; - } - - _ptr_base& operator -= (AT count) - { - m_addr -= count * address_size; - return *this; - } - - _ptr_base operator + (to_ne_t count) const { return make(m_addr + count * address_size); } - _ptr_base operator - (to_ne_t count) const { return make(m_addr - count * address_size); } - - force_inline bool operator <(const _ptr_base& right) const { return m_addr < right.m_addr; } - force_inline bool operator <=(const _ptr_base& right) const { return m_addr <= right.m_addr; } - force_inline bool operator >(const _ptr_base& right) const { return m_addr > right.m_addr; } - force_inline bool operator >=(const _ptr_base& right) const { return m_addr >= right.m_addr; } - force_inline bool operator ==(const _ptr_base& right) const { return m_addr == right.m_addr; } - force_inline bool operator !=(const _ptr_base& right) const { return m_addr != right.m_addr; } - force_inline bool operator ==(const nullptr_t& right) const { return m_addr == 0; } - force_inline bool operator !=(const nullptr_t& right) const { return m_addr != 0; } - explicit operator bool() const { return m_addr != 0; } - - force_inline _ptr_base::value, to_be_t, AT>> operator *() const - { - AT addr = convert_le_be(read64(convert_le_be(m_addr))); - return (_ptr_base::value, to_be_t, AT>>&)addr; - } - - force_inline _ptr_base::value, to_be_t, AT>> operator [](AT index) const - { - AT addr = convert_le_be(read64(convert_le_be(m_addr + 8 * index))); - return (_ptr_base::value, to_be_t, AT>>&)addr; - } - - template operator _ptr_base() const - { - return{ convert_le_be(m_addr) }; - } - AT addr() const { return m_addr; } - - template void set(U&& value) + + template std::enable_if_t::value> set(const CT& value) { - m_addr = convert_le_be(value); + m_addr = value; } template static _ptr_base make(const AT2& addr) @@ -100,106 +30,6 @@ namespace vm return{ convert_le_be(addr) }; } - _ptr_base& operator = (const _ptr_base& right) = default; - }; - - template - struct _ptr_base - { - AT m_addr; - - using type = T; - - static_assert(!std::is_pointer::value, "vm::_ptr_base<> error: invalid type (pointer)"); - static_assert(!std::is_reference::value, "vm::_ptr_base<> error: invalid type (reference)"); - - force_inline static const u32 data_size() - { - return convert_le_be(sizeof(T)); - } - - force_inline T* const operator -> () const - { - return vm::get_ptr(vm::cast(m_addr)); - } - - _ptr_base operator++ (int) - { - AT result = m_addr; - m_addr += data_size(); - return make(result); - } - - _ptr_base& operator++ () - { - m_addr += data_size(); - return *this; - } - - _ptr_base operator-- (int) - { - AT result = m_addr; - m_addr -= data_size(); - return make(result); - } - - _ptr_base& operator-- () - { - m_addr -= data_size(); - return *this; - } - - _ptr_base& operator += (AT count) - { - m_addr += count * data_size(); - return *this; - } - - _ptr_base& operator -= (AT count) - { - m_addr -= count * data_size(); - return *this; - } - - _ptr_base operator + (to_ne_t count) const { return make(convert_le_be(convert_le_be(m_addr) +count * convert_le_be(data_size()))); } - _ptr_base operator - (to_ne_t count) const { return make(convert_le_be(convert_le_be(m_addr) -count * convert_le_be(data_size()))); } - - force_inline T& operator *() const - { - return vm::get_ref(vm::cast(m_addr)); - } - - force_inline T& operator [](to_ne_t index) const - { - return vm::get_ref(vm::cast(m_addr + data_size() * index)); - } - - force_inline bool operator <(const _ptr_base& right) const { return m_addr < right.m_addr; } - force_inline bool operator <=(const _ptr_base& right) const { return m_addr <= right.m_addr; } - force_inline bool operator >(const _ptr_base& right) const { return m_addr > right.m_addr; } - force_inline bool operator >=(const _ptr_base& right) const { return m_addr >= right.m_addr; } - force_inline bool operator ==(const _ptr_base& right) const { return m_addr == right.m_addr; } - force_inline bool operator !=(const _ptr_base& right) const { return m_addr != right.m_addr; } - force_inline bool operator ==(const nullptr_t& right) const { return m_addr == 0; } - force_inline bool operator !=(const nullptr_t& right) const { return m_addr != 0; } - explicit operator bool() const { return m_addr != 0; } - explicit operator T*() const { return get_ptr(); } - - template operator _ptr_base() const - { - return{ convert_le_be(m_addr) }; - } - - AT addr() const - { - return m_addr; - } - - template void set(U&& value) - { - m_addr = convert_le_be(value); - } - T* get_ptr() const { return vm::get_ptr(vm::cast(m_addr)); @@ -209,134 +39,59 @@ namespace vm { return vm::priv_ptr(vm::cast(m_addr)); } - - template static _ptr_base make(const AT2& addr) - { - return{ convert_le_be(addr) }; - } - _ptr_base& operator = (const _ptr_base& right) = default; - }; - - template - struct _ptr_base - { - AT m_addr; - - AT addr() const - { - return m_addr; - } - - template - void set(U&& value) - { - m_addr = convert_le_be(value); - } - - void* get_ptr() const - { - return vm::get_ptr(vm::cast(m_addr)); - } - - void* priv_ptr() const - { - return vm::priv_ptr(vm::cast(m_addr)); - } - - explicit operator void*() const + T* operator ->() const { return get_ptr(); } - force_inline bool operator <(const _ptr_base& right) const { return m_addr < right.m_addr; } - force_inline bool operator <=(const _ptr_base& right) const { return m_addr <= right.m_addr; } - force_inline bool operator >(const _ptr_base& right) const { return m_addr > right.m_addr; } - force_inline bool operator >=(const _ptr_base& right) const { return m_addr >= right.m_addr; } - force_inline bool operator ==(const _ptr_base& right) const { return m_addr == right.m_addr; } - force_inline bool operator !=(const _ptr_base& right) const { return m_addr != right.m_addr; } - force_inline bool operator ==(const nullptr_t& right) const { return m_addr == 0; } - force_inline bool operator !=(const nullptr_t& right) const { return m_addr != 0; } - explicit operator bool() const { return m_addr != 0; } - - template operator _ptr_base() const + template std::add_lvalue_reference_t operator [](u32 index) const { - return{ convert_le_be(m_addr) }; + return vm::get_ref(vm::cast(m_addr + sizeof32(T) * index)); } - template operator _ptr_base() const + template operator _ptr_base() const { - return{ convert_le_be(m_addr) }; + return{ convert_le_be(vm::cast(m_addr)) }; } - template static _ptr_base make(const AT2& addr) + template operator std::enable_if_t::value, _ptr_base>() const { - return{ convert_le_be(addr) }; + return{ convert_le_be(vm::cast(m_addr)) }; } - _ptr_base& operator = (const _ptr_base& right) = default; - }; - - template - struct _ptr_base - { - AT m_addr; - - AT addr() const - { - return m_addr; - } - - template - void set(U&& value) - { - m_addr = convert_le_be(value); - } - - const void* get_ptr() const - { - return vm::get_ptr(vm::cast(m_addr)); - } - - const void* priv_ptr() const - { - return vm::priv_ptr(vm::cast(m_addr)); - } - - explicit operator const void*() const + explicit operator T*() const { return get_ptr(); } - force_inline bool operator <(const _ptr_base& right) const { return m_addr < right.m_addr; } - force_inline bool operator <=(const _ptr_base& right) const { return m_addr <= right.m_addr; } - force_inline bool operator >(const _ptr_base& right) const { return m_addr > right.m_addr; } - force_inline bool operator >=(const _ptr_base& right) const { return m_addr >= right.m_addr; } - force_inline bool operator ==(const _ptr_base& right) const { return m_addr == right.m_addr; } - force_inline bool operator !=(const _ptr_base& right) const { return m_addr != right.m_addr; } - force_inline bool operator ==(const nullptr_t& right) const { return m_addr == 0; } - force_inline bool operator !=(const nullptr_t& right) const { return m_addr != 0; } - explicit operator bool() const { return m_addr != 0; } - - template operator _ptr_base() const + explicit operator bool() const { - return{ convert_le_be(m_addr) }; + return m_addr != 0; } - - template static _ptr_base make(const AT2& addr) - { - return{ convert_le_be(addr) }; - } - - _ptr_base& operator = (const _ptr_base& right) = default; }; template - struct _ptr_base + struct _ptr_base { AT m_addr; - typedef RT(type)(T...); + using type = func_def; + + AT addr() const + { + return m_addr; + } + + template std::enable_if_t::value> set(const CT& value) + { + m_addr = value; + } + + template static _ptr_base make(const AT2& addr) + { + return{ convert_le_be(addr) }; + } // defined in CB_FUNC.h, call using specified PPU thread context RT operator()(PPUThread& CPU, T... args) const; @@ -347,48 +102,31 @@ namespace vm // defined in CB_FUNC.h, call using current PPU thread context RT operator()(T... args) const; - AT addr() const + // conversion to function object + operator std::function() const { - return m_addr; + const u32 addr = vm::cast(m_addr); + + return [addr](T... args) -> RT + { + return _ptr_base{ addr }(args...); + }; } - template - void set(U&& value) + // conversion to another function pointer + template operator _ptr_base() const { - m_addr = convert_le_be(value); + return{ convert_le_be(vm::cast(m_addr)) }; } - force_inline bool operator <(const _ptr_base& right) const { return m_addr < right.m_addr; } - force_inline bool operator <=(const _ptr_base& right) const { return m_addr <= right.m_addr; } - force_inline bool operator >(const _ptr_base& right) const { return m_addr > right.m_addr; } - force_inline bool operator >=(const _ptr_base& right) const { return m_addr >= right.m_addr; } - force_inline bool operator ==(const _ptr_base& right) const { return m_addr == right.m_addr; } - force_inline bool operator !=(const _ptr_base& right) const { return m_addr != right.m_addr; } - force_inline bool operator ==(const nullptr_t& right) const { return m_addr == 0; } - force_inline bool operator !=(const nullptr_t& right) const { return m_addr != 0; } - explicit operator bool() const { return m_addr != 0; } - - template operator _ptr_base() const + explicit operator bool() const { - return{ convert_le_be(m_addr) }; + return m_addr != 0; } - - template static _ptr_base make(const AT2& addr) - { - return{ convert_le_be(addr) }; - } - - operator const std::function() const - { - const AT addr = convert_le_be(m_addr); - return [addr](T... args) -> RT { return make(addr)(args...); }; - } - - _ptr_base& operator = (const _ptr_base& right) = default; }; template - struct _ptr_base + struct _ptr_base { AT m_addr; @@ -396,39 +134,51 @@ namespace vm }; // Native endianness pointer to LE data - template using ptrl = _ptr_base, lvl, AT>; + template using ptrl = _ptr_base, AT>; // Native endianness pointer to BE data - template using ptrb = _ptr_base, lvl, AT>; + template using ptrb = _ptr_base, AT>; // BE pointer to LE data - template using bptrl = _ptr_base, lvl, to_be_t>; + template using bptrl = _ptr_base, to_be_t>; // BE pointer to BE data - template using bptrb = _ptr_base, lvl, to_be_t>; + template using bptrb = _ptr_base, to_be_t>; // LE pointer to LE data - template using lptrl = _ptr_base, lvl, to_le_t>; + template using lptrl = _ptr_base, to_le_t>; // LE pointer to BE data - template using lptrb = _ptr_base, lvl, to_le_t>; + template using lptrb = _ptr_base, to_le_t>; namespace ps3 { // default pointer for PS3 HLE functions (Native endianness pointer to BE data) - template using ptr = ptrb; + template using ptr = ptrb; + + // default pointer to pointer for PS3 HLE functions (Native endianness pointer to BE pointer to BE data) + template using pptr = ptr, AT>; // default pointer for PS3 HLE structures (BE pointer to BE data) - template using bptr = bptrb; + template using bptr = bptrb; + + // default pointer to pointer for PS3 HLE structures (BE pointer to BE pointer to BE data) + template using bpptr = bptr, AT>; } namespace psv { // default pointer for PSV HLE functions (Native endianness pointer to LE data) - template using ptr = ptrl; + template using ptr = ptrl; + + // default pointer to pointer for PSV HLE functions (Native endianness pointer to LE pointer to LE data) + template using pptr = ptr>; // default pointer for PSV HLE structures (LE pointer to LE data) - template using lptr = lptrl; + template using lptr = lptrl; + + // default pointer to pointer for PSV HLE structures (LE pointer to LE pointer to LE data) + template using lpptr = lptr>; } // PS3 emulation is main now, so lets it be as default @@ -436,7 +186,7 @@ namespace vm struct null_t { - template operator _ptr_base() const + template operator _ptr_base() const { return{}; } @@ -444,49 +194,171 @@ namespace vm // vm::null is convertible to any vm::ptr type as null pointer in virtual memory static null_t null; + + // helper SFINAE type for vm::_ptr_base comparison operators (enables comparison between equal types and between any type and void*) + template using if_comparable_t = std::enable_if_t< + std::is_void::value || + std::is_void::value || + std::is_same, std::remove_cv_t>::value, + RT>; } -// external specialization for is_be_t<> +// indirection operator for vm::_ptr_base +template std::enable_if_t::value, T&> operator *(const vm::_ptr_base& ptr) +{ + return vm::get_ref(vm::cast(ptr.m_addr)); +} -template -struct is_be_t> : public std::integral_constant::value> +// postfix increment operator for vm::_ptr_base +template std::enable_if_t::value, vm::_ptr_base> operator ++(vm::_ptr_base& ptr, int) +{ + const AT result = ptr.m_addr; + ptr.m_addr += sizeof32(T); + return{ result }; +} + +// prefix increment operator for vm::_ptr_base +template std::enable_if_t::value, vm::_ptr_base&> operator ++(vm::_ptr_base& ptr) +{ + ptr.m_addr += sizeof32(T); + return ptr; +} + +// postfix decrement operator for vm::_ptr_base +template std::enable_if_t::value, vm::_ptr_base> operator --(vm::_ptr_base& ptr, int) +{ + const AT result = ptr.m_addr; + ptr.m_addr -= sizeof32(T); + return{ result }; +} + +// prefix decrement operator for vm::_ptr_base +template std::enable_if_t::value, vm::_ptr_base&> operator --(vm::_ptr_base& ptr) +{ + ptr.m_addr -= sizeof32(T); + return ptr; +} + +// addition assignment operator for vm::_ptr_base (pointer += integer) +template std::enable_if_t::value, vm::_ptr_base&> operator +=(vm::_ptr_base& ptr, to_ne_t count) +{ + ptr.m_addr += count * sizeof32(T); + return ptr; +} + +// subtraction assignment operator for vm::_ptr_base (pointer -= integer) +template std::enable_if_t::value, vm::_ptr_base&> operator -=(vm::_ptr_base& ptr, to_ne_t count) +{ + ptr.m_addr -= count * sizeof32(T); + return ptr; +} + +// addition operator for vm::_ptr_base (pointer + integer) +template std::enable_if_t::value, vm::_ptr_base> operator +(const vm::_ptr_base& ptr, to_ne_t count) +{ + return{ convert_le_be(ptr.m_addr + count * sizeof32(T)) }; +} + +// subtraction operator for vm::_ptr_base (pointer - integer) +template std::enable_if_t::value, vm::_ptr_base> operator -(const vm::_ptr_base& ptr, to_ne_t count) +{ + return{ convert_le_be(ptr.m_addr - count * sizeof32(T)) }; +} + +// pointer difference operator for vm::_ptr_base +template std::enable_if_t< + !std::is_void::value && + !std::is_void::value && + std::is_same, std::remove_cv_t>::value, + u32> operator -(const vm::_ptr_base& left, const vm::_ptr_base& right) +{ + return static_cast((left.m_addr - right.m_addr) / sizeof32(T1)); +} + +// comparison operator for vm::_ptr_base (pointer1 == pointer2) +template vm::if_comparable_t operator ==(const vm::_ptr_base& left, const vm::_ptr_base& right) +{ + return left.m_addr == right.m_addr; +} + +// comparison operator for vm::_ptr_base (pointer1 != pointer2) +template vm::if_comparable_t operator !=(const vm::_ptr_base& left, const vm::_ptr_base& right) +{ + return left.m_addr != right.m_addr; +} + +// comparison operator for vm::_ptr_base (pointer1 < pointer2) +template vm::if_comparable_t operator <(const vm::_ptr_base& left, const vm::_ptr_base& right) +{ + return left.m_addr < right.m_addr; +} + +// comparison operator for vm::_ptr_base (pointer1 <= pointer2) +template vm::if_comparable_t operator <=(const vm::_ptr_base& left, const vm::_ptr_base& right) +{ + return left.m_addr <= right.m_addr; +} + +// comparison operator for vm::_ptr_base (pointer1 > pointer2) +template vm::if_comparable_t operator >(const vm::_ptr_base& left, const vm::_ptr_base& right) +{ + return left.m_addr > right.m_addr; +} + +// comparison operator for vm::_ptr_base (pointer1 >= pointer2) +template vm::if_comparable_t operator >=(const vm::_ptr_base& left, const vm::_ptr_base& right) +{ + return left.m_addr >= right.m_addr; +} + +// external specialization for is_be_t<> (true if AT is be_t<>) + +template +struct is_be_t> : public std::integral_constant::value> { }; -// external specialization for to_ne_t<> +// external specialization for is_le_t<> (true if AT is le_t<>) -template -struct to_ne> +template +struct is_le_t> : public std::integral_constant::value> { - using type = vm::_ptr_base>; }; -// external specialization for to_be_t<> +// external specialization for to_ne_t<> (change AT endianness to native) -template -struct to_be> +template +struct to_ne> { - using type = vm::_ptr_base>; + using type = vm::_ptr_base>; }; -// external specialization for to_le_t<> (not used) +// external specialization for to_be_t<> (change AT endianness to BE) -template -struct to_le> +template +struct to_be> { - using type = vm::_ptr_base>; + using type = vm::_ptr_base>; +}; + +// external specialization for to_le_t<> (change AT endianness to LE) + +template +struct to_le> +{ + using type = vm::_ptr_base>; }; namespace fmt { // external specialization for fmt::format function - template - struct unveil, false> + template + struct unveil, false> { using result_type = typename unveil::result_type; - force_inline static result_type get_value(const vm::_ptr_base& arg) + force_inline static result_type get_value(const vm::_ptr_base& arg) { return unveil::get_value(arg.addr()); } @@ -498,17 +370,17 @@ namespace fmt template struct cast_ppu_gpr; -template -struct cast_ppu_gpr, false> +template +struct cast_ppu_gpr, false> { - force_inline static u64 to_gpr(const vm::_ptr_base& value) + force_inline static u64 to_gpr(const vm::_ptr_base& value) { return cast_ppu_gpr::value>::to_gpr(value.addr()); } - force_inline static vm::_ptr_base from_gpr(const u64 reg) + force_inline static vm::_ptr_base from_gpr(const u64 reg) { - return vm::_ptr_base::make(cast_ppu_gpr::value>::from_gpr(reg)); + return vm::_ptr_base::make(cast_ppu_gpr::value>::from_gpr(reg)); } }; @@ -517,16 +389,16 @@ struct cast_ppu_gpr, false> template struct cast_armv7_gpr; -template -struct cast_armv7_gpr, false> +template +struct cast_armv7_gpr, false> { - force_inline static u32 to_gpr(const vm::_ptr_base& value) + force_inline static u32 to_gpr(const vm::_ptr_base& value) { return cast_armv7_gpr::value>::to_gpr(value.addr()); } - force_inline static vm::_ptr_base from_gpr(const u32 reg) + force_inline static vm::_ptr_base from_gpr(const u32 reg) { - return vm::_ptr_base::make(cast_armv7_gpr::value>::from_gpr(reg)); + return vm::_ptr_base::make(cast_armv7_gpr::value>::from_gpr(reg)); } }; diff --git a/rpcs3/Emu/Memory/vm_ref.h b/rpcs3/Emu/Memory/vm_ref.h index 4777091120..2aa453a2b6 100644 --- a/rpcs3/Emu/Memory/vm_ref.h +++ b/rpcs3/Emu/Memory/vm_ref.h @@ -9,6 +9,8 @@ namespace vm static_assert(!std::is_pointer::value, "vm::_ref_base<> error: invalid type (pointer)"); static_assert(!std::is_reference::value, "vm::_ref_base<> error: invalid type (reference)"); + static_assert(!std::is_function::value, "vm::_ref_base<> error: invalid type (function)"); + static_assert(!std::is_void::value, "vm::_ref_base<> error: invalid type (void)"); AT addr() const { @@ -98,24 +100,31 @@ namespace vm namespace psv { // default reference for PSV HLE functions (Native endianness reference to LE data) - template using ref = refl; + template using ref = refl; // default reference for PSV HLE structures (LE reference to LE data) - template using lref = lrefl; + template using lref = lrefl; } //PS3 emulation is main now, so lets it be as default using namespace ps3; } -// external specialization for is_be_t<> +// external specialization for is_be_t<> (true if AT's endianness is BE) template struct is_be_t> : public std::integral_constant::value> { }; -// external specialization for to_ne_t<> +// external specialization for is_le_t<> (true if AT's endianness is LE) + +template +struct is_le_t> : public std::integral_constant::value> +{ +}; + +// external specialization for to_ne_t<> (change AT's endianness to native) template struct to_ne> @@ -123,7 +132,7 @@ struct to_ne> using type = vm::_ref_base>; }; -// external specialization for to_be_t<> +// external specialization for to_be_t<> (change AT's endianness to BE) template struct to_be> @@ -131,7 +140,7 @@ struct to_be> using type = vm::_ref_base>; }; -// external specialization for to_le_t<> (not used) +// external specialization for to_le_t<> (change AT's endianness to LE) template struct to_le> diff --git a/rpcs3/Emu/Memory/vm_var.h b/rpcs3/Emu/Memory/vm_var.h index dfef1b4a9b..a342f7df2a 100644 --- a/rpcs3/Emu/Memory/vm_var.h +++ b/rpcs3/Emu/Memory/vm_var.h @@ -108,24 +108,24 @@ namespace vm } */ - template operator _ptr_base() const + template operator _ptr_base() const { - return _ptr_base::make(m_addr); + return _ptr_base::make(m_addr); } - template operator _ptr_base() const + template operator _ptr_base() const { - return _ptr_base::make(m_addr); + return _ptr_base::make(m_addr); } - template operator _ptr_base() const + template operator _ptr_base() const { - return _ptr_base::make(m_addr); + return _ptr_base::make(m_addr); } - template operator _ptr_base() const + template operator _ptr_base() const { - return _ptr_base::make(m_addr); + return _ptr_base::make(m_addr); } operator T&() @@ -614,24 +614,24 @@ namespace vm } */ - template operator _ptr_base() const + template operator _ptr_base() const { - return _ptr_base::make(m_data.addr); + return _ptr_base::make(m_data.addr); } - template operator _ptr_base() const + template operator _ptr_base() const { - return _ptr_base::make(m_data.addr); + return _ptr_base::make(m_data.addr); } - template operator _ptr_base() const + template operator _ptr_base() const { - return _ptr_base::make(m_data.addr); + return _ptr_base::make(m_data.addr); } - template operator _ptr_base() const + template operator _ptr_base() const { - return _ptr_base::make(m_data.addr); + return _ptr_base::make(m_data.addr); } operator T&() diff --git a/rpcs3/Emu/RSX/CgBinaryProgram.h b/rpcs3/Emu/RSX/CgBinaryProgram.h index 185c0002d6..89959d0300 100644 --- a/rpcs3/Emu/RSX/CgBinaryProgram.h +++ b/rpcs3/Emu/RSX/CgBinaryProgram.h @@ -301,7 +301,7 @@ public: m_arb_shader += fmt::format("#%d ", i) + param_type + param_name + param_semantic + param_const + "\n"; - offset += sizeof(CgBinaryParameter); + offset += sizeof32(CgBinaryParameter); } m_arb_shader += "\n"; @@ -355,7 +355,7 @@ public: m_arb_shader += fmt::format("#%d ", i) + param_type + param_name + param_semantic + param_const + "\n"; - offset += sizeof(CgBinaryParameter); + offset += sizeof32(CgBinaryParameter); } m_arb_shader += "\n"; diff --git a/rpcs3/Emu/SysCalls/CB_FUNC.h b/rpcs3/Emu/SysCalls/CB_FUNC.h index 545f2b0d1f..148feb5426 100644 --- a/rpcs3/Emu/SysCalls/CB_FUNC.h +++ b/rpcs3/Emu/SysCalls/CB_FUNC.h @@ -162,7 +162,7 @@ namespace cb_detail namespace vm { template - force_inline RT _ptr_base::operator()(PPUThread& CPU, T... args) const + force_inline RT _ptr_base::operator()(PPUThread& CPU, T... args) const { const auto data = vm::get_ptr>(vm::cast(m_addr)); const u32 pc = data[0]; @@ -172,7 +172,7 @@ namespace vm } template - force_inline RT _ptr_base::operator()(T... args) const + force_inline RT _ptr_base::operator()(T... args) const { return operator()(GetCurrentPPUThread(), args...); } diff --git a/rpcs3/Emu/SysCalls/Modules/cellAdec.cpp b/rpcs3/Emu/SysCalls/Modules/cellAdec.cpp index 528cc2b3cf..4e410636b1 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellAdec.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellAdec.cpp @@ -792,7 +792,7 @@ s32 cellAdecGetPcm(u32 handle, vm::ptr outBuffer) return CELL_OK; } -s32 cellAdecGetPcmItem(u32 handle, vm::ptr> pcmItem) +s32 cellAdecGetPcmItem(u32 handle, vm::pptr pcmItem) { cellAdec.Log("cellAdecGetPcmItem(handle=0x%x, pcmItem=**0x%x)", handle, pcmItem); @@ -821,7 +821,7 @@ s32 cellAdecGetPcmItem(u32 handle, vm::ptr> pcmItem) } pcm->pcmHandle = 0; // ??? - pcm->pcmAttr.bsiInfo_addr = pcm.addr() + sizeof(CellAdecPcmItem); + pcm->pcmAttr.bsiInfo_addr = pcm.addr() + sizeof32(CellAdecPcmItem); pcm->startAddr = 0x00000312; // invalid address (no output) pcm->size = af.size; pcm->status = CELL_OK; @@ -833,7 +833,7 @@ s32 cellAdecGetPcmItem(u32 handle, vm::ptr> pcmItem) if (adecIsAtracX(adec->type)) { - auto atx = vm::ptr::make(pcm.addr() + sizeof(CellAdecPcmItem)); + auto atx = vm::ptr::make(pcm.addr() + sizeof32(CellAdecPcmItem)); atx->samplingFreq = frame->sample_rate; atx->nbytes = frame->nb_samples * sizeof(float); @@ -861,7 +861,7 @@ s32 cellAdecGetPcmItem(u32 handle, vm::ptr> pcmItem) } else if (adec->type == CELL_ADEC_TYPE_MP3) { - auto mp3 = vm::ptr::make(pcm.addr() + sizeof(CellAdecPcmItem)); + auto mp3 = vm::ptr::make(pcm.addr() + sizeof32(CellAdecPcmItem)); // TODO memset(mp3.get_ptr(), 0, sizeof(CellAdecMP3Info)); diff --git a/rpcs3/Emu/SysCalls/Modules/cellGifDec.h b/rpcs3/Emu/SysCalls/Modules/cellGifDec.h index a324179faa..ec00dedd82 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellGifDec.h +++ b/rpcs3/Emu/SysCalls/Modules/cellGifDec.h @@ -153,7 +153,7 @@ struct CellGifDecDataCtrlParam be_t outputBytesPerLine; }; -//Custom structs +// Custom structs struct GifDecoder { }; diff --git a/rpcs3/Emu/SysCalls/Modules/cellPng.h b/rpcs3/Emu/SysCalls/Modules/cellPng.h index 79c88a83fe..3237fcd869 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellPng.h +++ b/rpcs3/Emu/SysCalls/Modules/cellPng.h @@ -162,7 +162,7 @@ struct CellPngPCAL be_t equationType; be_t numberOfParameters; vm::bptr unitName; - vm::bptr parameter; + vm::bpptr parameter; }; struct CellPngUnknownChunk diff --git a/rpcs3/Emu/SysCalls/Modules/cellPngDec.cpp b/rpcs3/Emu/SysCalls/Modules/cellPngDec.cpp index fc59a1410a..c6180006a1 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellPngDec.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellPngDec.cpp @@ -517,7 +517,7 @@ s32 cellPngDecExtDecodeData( s32 cellPngDecGetUnknownChunks( CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, - vm::ptr> unknownChunk, + vm::pptr unknownChunk, vm::ptr unknownChunkNumber) { UNIMPLEMENTED_FUNC(cellPngDec); @@ -618,7 +618,7 @@ s32 cellPngDecGetTextChunk( CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr textInfoNum, - vm::ptr> textInfo) + vm::pptr textInfo) { UNIMPLEMENTED_FUNC(cellPngDec); return CELL_OK; diff --git a/rpcs3/Emu/SysCalls/Modules/cellSpurs.cpp b/rpcs3/Emu/SysCalls/Modules/cellSpurs.cpp index 4f95d79c20..9f96909219 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellSpurs.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellSpurs.cpp @@ -1263,7 +1263,7 @@ s32 _cellSpursWorkloadFlagReceiver(vm::ptr spurs, u32 wid, u32 is_set return CELL_OK; } -s32 cellSpursGetWorkloadFlag(vm::ptr spurs, vm::ptr> flag) +s32 cellSpursGetWorkloadFlag(vm::ptr spurs, vm::pptr flag) { cellSpurs.Warning("%s(spurs_addr=0x%x, flag_addr=0x%x)", __FUNCTION__, spurs.addr(), flag.addr()); @@ -2736,7 +2736,7 @@ s32 cellSpursTasksetSetExceptionEventHandler(vm::ptr taskset, return CELL_SPURS_TASK_ERROR_INVAL; } - if (taskset->m.exception_handler != 0) + if (taskset->m.exception_handler) { return CELL_SPURS_TASK_ERROR_BUSY; } @@ -2996,7 +2996,7 @@ s32 spursTraceInitialize(vm::ptr spurs, vm::ptr b return CELL_SPURS_CORE_ERROR_INVAL; } - if (spurs->m.traceBuffer != 0) + if (spurs->m.traceBuffer) { return CELL_SPURS_CORE_ERROR_STAT; } diff --git a/rpcs3/Emu/SysCalls/Modules/cellSpurs.h b/rpcs3/Emu/SysCalls/Modules/cellSpurs.h index f2ef406994..8a049fc7cf 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellSpurs.h +++ b/rpcs3/Emu/SysCalls/Modules/cellSpurs.h @@ -388,8 +388,8 @@ struct CellSpurs u8 unk0[0x20]; // 0x00 - SPU exceptionh handler 0x08 - SPU exception handler args be_t sem; // 0x20 u8 unk1[0x8]; - vm::bptr hook; // 0x30 - vm::bptr hookArg; // 0x38 + vm::bptr hook; // 0x30 + vm::bptr hookArg; // 0x38 u8 unk2[0x40]; }; @@ -409,7 +409,7 @@ struct CellSpurs struct WorkloadInfo { - vm::bptr addr; // Address of the executable + vm::bptr addr; // Address of the executable be_t arg; // spu argument be_t size; atomic_be_t uniqueId; // The unique id is the same for all workloads with the same addr @@ -423,8 +423,8 @@ struct CellSpurs { static const uint size = 0x10; - vm::bptr nameClass; - vm::bptr nameInstance; + vm::bptr nameClass; + vm::bptr nameInstance; }; union @@ -475,7 +475,7 @@ struct CellSpurs u8 wklStatus2[0x10]; // 0xE0 u8 wklEvent2[0x10]; // 0xF0 _sub_str1 wklF1[0x10]; // 0x100 - vm::bptr traceBuffer; // 0x900 + vm::bptr traceBuffer; // 0x900 be_t traceStartIndex[6]; // 0x908 u8 unknown7[0x948 - 0x920]; // 0x920 be_t traceDataSize; // 0x948 @@ -641,7 +641,7 @@ struct CellSpursTaskset struct TaskInfo { CellSpursTaskArgument args; // 0x00 - vm::bptr elf_addr; // 0x10 + vm::bptr elf_addr; // 0x10 be_t context_save_storage_and_alloc_ls_blocks; // 0x18 This is (context_save_storage_addr | allocated_ls_blocks) CellSpursTaskLsPattern ls_pattern; // 0x20 }; @@ -662,7 +662,7 @@ struct CellSpursTaskset be_t enabled; // 0x30 be_t signalled; // 0x40 be_t waiting; // 0x50 - vm::bptr spurs; // 0x60 + vm::bptr spurs; // 0x60 be_t args; // 0x68 u8 enable_clear_ls; // 0x70 u8 x71; // 0x71 @@ -671,8 +671,8 @@ struct CellSpursTaskset be_t wid; // 0x74 be_t x78; // 0x78 TaskInfo task_info[128]; // 0x80 - vm::bptr exception_handler; // 0x1880 - vm::bptr exception_handler_arg; // 0x1888 + vm::bptr exception_handler; // 0x1880 + vm::bptr exception_handler_arg; // 0x1888 be_t size; // 0x1890 u32 unk2; // 0x1894 u32 event_flag_id1; // 0x1898 @@ -750,8 +750,8 @@ struct CellSpursTaskset2 struct TaskInfo { CellSpursTaskArgument args; - vm::bptr elf_addr; - vm::bptr context_save_storage; // This is (context_save_storage_addr | allocated_ls_blocks) + vm::bptr elf_addr; + vm::bptr context_save_storage; // This is (context_save_storage_addr | allocated_ls_blocks) CellSpursTaskLsPattern ls_pattern; }; @@ -771,7 +771,7 @@ struct CellSpursTaskset2 be_t enabled_set[4]; // 0x30 be_t signal_received_set[4]; // 0x40 be_t waiting_set[4]; // 0x50 - vm::bptr spurs; // 0x60 + vm::bptr spurs; // 0x60 be_t args; // 0x68 u8 enable_clear_ls; // 0x70 u8 x71; // 0x71 @@ -780,8 +780,8 @@ struct CellSpursTaskset2 be_t wid; // 0x74 be_t x78; // 0x78 TaskInfo task_info[128]; // 0x80 - vm::bptr exception_handler; // 0x1880 - vm::bptr exception_handler_arg; // 0x1888 + vm::bptr exception_handler; // 0x1880 + vm::bptr exception_handler_arg; // 0x1888 be_t size; // 0x1890 u32 unk2; // 0x1894 u32 event_flag_id1; // 0x1898 @@ -895,10 +895,10 @@ struct SpursKernelContext u8 wklLocPendingContention[0x10]; // 0x190 u8 priority[0x10]; // 0x1A0 u8 x1B0[0x10]; // 0x1B0 - vm::bptr spurs; // 0x1C0 + vm::bptr spurs; // 0x1C0 be_t spuNum; // 0x1C8 be_t dmaTagId; // 0x1CC - vm::bptr wklCurrentAddr; // 0x1D0 + vm::bptr wklCurrentAddr; // 0x1D0 be_t wklCurrentUniqueId; // 0x1D8 be_t wklCurrentId; // 0x1DC be_t exitToKernelAddr; // 0x1E0 @@ -932,7 +932,7 @@ struct SpursTasksetContext u8 tempAreaTaskset[0x80]; // 0x2700 u8 tempAreaTaskInfo[0x30]; // 0x2780 be_t x27B0; // 0x27B0 - vm::bptr taskset; // 0x27B8 + vm::bptr taskset; // 0x27B8 be_t kernelMgmtAddr; // 0x27C0 be_t syscallAddr; // 0x27C4 be_t x27C8; // 0x27C8 diff --git a/rpcs3/Emu/SysCalls/Modules/cellSync.cpp b/rpcs3/Emu/SysCalls/Modules/cellSync.cpp index f3e233a314..db6ec1be46 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellSync.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellSync.cpp @@ -1811,7 +1811,7 @@ s32 cellSyncLFQueueDepth(vm::ptr queue, vm::ptr depth) return CELL_OK; } -s32 _cellSyncLFQueueGetSignalAddress(vm::ptr queue, vm::ptr> ppSignal) +s32 _cellSyncLFQueueGetSignalAddress(vm::ptr queue, vm::pptr ppSignal) { cellSync.Log("_cellSyncLFQueueGetSignalAddress(queue=*0x%x, ppSignal=**0x%x)", queue, ppSignal); diff --git a/rpcs3/Emu/SysCalls/Modules/cellSync.h b/rpcs3/Emu/SysCalls/Modules/cellSync.h index c291d608c1..d5c9430752 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellSync.h +++ b/rpcs3/Emu/SysCalls/Modules/cellSync.h @@ -71,7 +71,7 @@ struct CellSyncRwm atomic_be_t data; be_t m_size; - vm::bptr m_buffer; + vm::bptr m_buffer; }; static_assert(sizeof(CellSyncRwm) == 16, "CellSyncRwm: wrong size"); @@ -87,7 +87,7 @@ struct CellSyncQueue atomic_be_t data; be_t m_size; be_t m_depth; - vm::bptr m_buffer; + vm::bptr m_buffer; be_t reserved; }; @@ -155,7 +155,7 @@ struct CellSyncLFQueue be_t m_size; // 0x10 be_t m_depth; // 0x14 - vm::bptr m_buffer; // 0x18 + vm::bptr m_buffer; // 0x18 u8 m_bs[4]; // 0x20 be_t m_direction; // 0x24 be_t m_v1; // 0x28 @@ -164,7 +164,7 @@ struct CellSyncLFQueue be_t m_hs1[15]; // 0x32 atomic_be_t pop2; // 0x50 be_t m_hs2[15]; // 0x52 - vm::bptr m_eaSignal; // 0x70 + vm::bptr m_eaSignal; // 0x70 be_t m_v2; // 0x78 be_t m_eq_id; // 0x7C diff --git a/rpcs3/Emu/SysCalls/Modules/cellVdec.cpp b/rpcs3/Emu/SysCalls/Modules/cellVdec.cpp index 665f8da71b..8315babc45 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellVdec.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellVdec.cpp @@ -795,7 +795,7 @@ s32 _nid_a21aa896(PPUThread& CPU, u32 handle, vm::ptr return cellVdecGetPicture(handle, format, outBuff); } -s32 cellVdecGetPicItem(u32 handle, vm::ptr> picItem) +s32 cellVdecGetPicItem(u32 handle, vm::pptr picItem) { cellVdec.Log("cellVdecGetPicItem(handle=0x%x, picItem=**0x%x)", handle, picItem); diff --git a/rpcs3/Emu/SysCalls/Modules/sceNpClans.cpp b/rpcs3/Emu/SysCalls/Modules/sceNpClans.cpp index d47cfb7955..3ea66374d1 100644 --- a/rpcs3/Emu/SysCalls/Modules/sceNpClans.cpp +++ b/rpcs3/Emu/SysCalls/Modules/sceNpClans.cpp @@ -377,7 +377,7 @@ int sceNpClansPostChallenge(vm::ptr handle, u32 clanId, if (!sceNpClansInstance.m_bSceNpClansInitialized) return SCE_NP_CLANS_ERROR_NOT_INITIALIZED; - if (data != 0) + if (data) return SCE_NP_CLANS_ERROR_NOT_SUPPORTED; //todo diff --git a/rpcs3/Emu/SysCalls/lv2/sys_process.cpp b/rpcs3/Emu/SysCalls/lv2/sys_process.cpp index c552e3aa45..1effa3cd6c 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_process.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_process.cpp @@ -80,7 +80,7 @@ void sys_game_process_exitspawn(vm::ptr path, u32 argv_addr, u32 env if (argv_addr) { - auto argvp = vm::ptr>::make(argv_addr); + auto argvp = vm::pptr::make(argv_addr); while (argvp && *argvp) { argv.push_back(argvp[0].get_ptr()); @@ -94,7 +94,7 @@ void sys_game_process_exitspawn(vm::ptr path, u32 argv_addr, u32 env if (envp_addr) { - auto envp = vm::ptr>::make(envp_addr); + auto envp = vm::pptr::make(envp_addr); while (envp && *envp) { env.push_back(envp[0].get_ptr()); @@ -154,7 +154,7 @@ void sys_game_process_exitspawn2(vm::ptr path, u32 argv_addr, u32 en if (argv_addr) { - auto argvp = vm::ptr>::make(argv_addr); + auto argvp = vm::pptr::make(argv_addr); while (argvp && *argvp) { argv.push_back(argvp[0].get_ptr()); @@ -169,7 +169,7 @@ void sys_game_process_exitspawn2(vm::ptr path, u32 argv_addr, u32 en if (envp_addr) { - auto envp = vm::ptr>::make(envp_addr); + auto envp = vm::pptr::make(envp_addr); while (envp && *envp) { env.push_back(envp[0].get_ptr()); diff --git a/rpcs3/Emu/SysCalls/lv2/sys_prx.cpp b/rpcs3/Emu/SysCalls/lv2/sys_prx.cpp index d89ec25a9b..377e40ceff 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_prx.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_prx.cpp @@ -140,7 +140,7 @@ s32 sys_prx_load_module(vm::ptr path, u64 flags, vm::ptr path_list, u64 flags, vm::ptr pOpt, vm::ptr id_list) +s32 sys_prx_load_module_list(s32 count, vm::pptr path_list, u64 flags, vm::ptr pOpt, vm::ptr id_list) { sys_prx.Warning("sys_prx_load_module_list(count=%d, path_list=*0x%x, flags=0x%llx, pOpt=*0x%x, id_list=*0x%x)", count, path_list, flags, pOpt, id_list); diff --git a/rpcs3/Emu/SysCalls/lv2/sys_prx.h b/rpcs3/Emu/SysCalls/lv2/sys_prx.h index 215aa3a4a6..d0b329cfe6 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_prx.h +++ b/rpcs3/Emu/SysCalls/lv2/sys_prx.h @@ -87,7 +87,7 @@ struct sys_prx_relocation_info_t u8 index_value; u8 index_addr; be_t type; - vm::bptr ptr; + vm::bptr ptr; }; @@ -102,14 +102,14 @@ struct sys_prx_start_module_option_t { be_t size; be_t put; - vm::bptr argv), 1, u64> entry_point; + vm::bptr argv), u64> entry_point; }; struct sys_prx_stop_module_option_t { be_t size; be_t put; - vm::bptr argv), 1, u64> entry_point; + vm::bptr argv), u64> entry_point; }; struct sys_prx_unload_module_option_t @@ -135,7 +135,7 @@ REG_ID_TYPE(lv2_prx_t, 0x23); // SYS_PRX_OBJECT // SysCalls s32 sys_prx_load_module(vm::ptr path, u64 flags, vm::ptr pOpt); -s32 sys_prx_load_module_list(s32 count, vm::ptr path_list, u64 flags, vm::ptr pOpt, vm::ptr id_list); +s32 sys_prx_load_module_list(s32 count, vm::pptr path_list, u64 flags, vm::ptr pOpt, vm::ptr id_list); s32 sys_prx_load_module_on_memcontainer(); s32 sys_prx_load_module_by_fd(); s32 sys_prx_load_module_on_memcontainer_by_fd(); diff --git a/rpcs3/Loader/ELF64.h b/rpcs3/Loader/ELF64.h index baa634eb95..8580c5be69 100644 --- a/rpcs3/Loader/ELF64.h +++ b/rpcs3/Loader/ELF64.h @@ -40,8 +40,8 @@ namespace loader be_t p_type; be_t p_flags; be_t p_offset; - bptr p_vaddr; - bptr p_paddr; + bptr p_vaddr; + bptr p_paddr; be_t p_filesz; be_t p_memsz; be_t p_align; @@ -52,7 +52,7 @@ namespace loader be_t sh_name; be_t sh_type; be_t sh_flags; - bptr sh_addr; + bptr sh_addr; be_t sh_offset; be_t sh_size; be_t sh_link; diff --git a/rpcs3/stdafx.h b/rpcs3/stdafx.h index da1c808a45..1b730b9109 100644 --- a/rpcs3/stdafx.h +++ b/rpcs3/stdafx.h @@ -57,7 +57,17 @@ template force_inline T align(const T addr, int align) return (addr + (align - 1)) & ~(align - 1); } -template using func_def = T; // workaround for MSVC bug +template struct sizeof32_t +{ + static const u32 value = static_cast(sizeof(T)); + + static_assert(value == sizeof(T), "sizeof32() error: sizeof() is too big"); +}; + +// return 32 bit sizeof() to avoid widening/narrowing conversions with size_t +#define sizeof32(type) sizeof32_t::value + +template using func_def = T; // workaround for MSVC bug: `using X = func_def;` instead of `using X = void();` #include "Utilities/BEType.h" #include "Utilities/StrFmt.h"