diff --git a/Utilities/BEType.h b/Utilities/BEType.h index ef298fdf93..1994f7a28d 100644 --- a/Utilities/BEType.h +++ b/Utilities/BEType.h @@ -1,6 +1,6 @@ #pragma once -#define IS_LE_MACHINE +#define IS_LE_MACHINE // only draft union u128 { @@ -334,26 +334,6 @@ union u128 return (_u64[0] != right._u64[0]) || (_u64[1] != right._u64[1]); } - force_inline u128 operator | (const u128& right) const - { - return fromV(_mm_or_si128(vi, right.vi)); - } - - force_inline u128 operator & (const u128& right) const - { - return fromV(_mm_and_si128(vi, right.vi)); - } - - force_inline u128 operator ^ (const u128& right) const - { - return fromV(_mm_xor_si128(vi, right.vi)); - } - - u128 operator ~ () const - { - return from64(~_u64[0], ~_u64[1]); - } - force_inline bool is_any_1() const // check if any bit is 1 { return _u64[0] || _u64[1]; @@ -381,15 +361,32 @@ union u128 static force_inline u128 byteswap(const u128 val) { - u128 ret; - ret._u64[0] = _byteswap_uint64(val._u64[1]); - ret._u64[1] = _byteswap_uint64(val._u64[0]); - return ret; + return fromV(_mm_shuffle_epi8(val.vi, _mm_set_epi8(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15))); } }; CHECK_SIZE_ALIGN(u128, 16, 16); +inline u128 operator |(const u128& left, const u128& right) +{ + return u128::fromV(_mm_or_si128(left.vi, right.vi)); +} + +inline u128 operator &(const u128& left, const u128& right) +{ + return u128::fromV(_mm_and_si128(left.vi, right.vi)); +} + +inline u128 operator ^(const u128& left, const u128& right) +{ + return u128::fromV(_mm_xor_si128(left.vi, right.vi)); +} + +inline u128 operator ~(const u128& other) +{ + return u128::from64(~other._u64[0], ~other._u64[1]); +} + static force_inline u128 sync_val_compare_and_swap(volatile u128* dest, u128 comp, u128 exch) { #if !defined(_MSC_VER) @@ -583,22 +580,8 @@ template struct be_storage template using be_storage_t = typename be_storage::type; -template -struct be_t +template class be_t { - using type = std::remove_cv_t; - using stype = be_storage_t>; - - stype m_data; - - static_assert(!std::is_class::value, "be_t<> error: invalid type (class or structure)"); - static_assert(!std::is_union::value || std::is_same::value, "be_t<> error: invalid type (union)"); - static_assert(!std::is_pointer::value, "be_t<> error: invalid type (pointer)"); - static_assert(!std::is_reference::value, "be_t<> error: invalid type (reference)"); - static_assert(!std::is_array::value, "be_t<> error: invalid type (array)"); - static_assert(__alignof(type) == __alignof(stype), "be_t<> error: unexpected alignment"); - -private: template struct _convert { @@ -624,69 +607,63 @@ private: { static force_inline be_t& func(Tfrom& be_value) { - Tto res = be_value >> ((sizeof(Tfrom)-sizeof(Tto)) * 8); + Tto res = be_value >> ((sizeof(Tfrom) - sizeof(Tto)) * 8); return (be_t&)res; } }; - const stype& ToBE() const - { - return m_data; - } - - type ToLE() const - { - return se_t::from_be(m_data); - } - - void FromBE(const stype& value) - { - m_data = value; - } - - void FromLE(const type& value) - { - m_data = se_t::to_be(value); - } - - static be_t MakeFromLE(const type& value) - { - stype data = se_t::to_be(value); - return (be_t&)data; - } - - static be_t MakeFromBE(const stype& value) - { - return (be_t&)value; - } - public: - //make be_t from current machine byte ordering - static be_t make(const type& value) - { + using type = std::remove_cv_t; + using stype = be_storage_t>; + #ifdef IS_LE_MACHINE - return MakeFromLE(value); + stype m_data; #else - return MakeFromBE(value); + type m_data; #endif + + static_assert(!std::is_class::value, "be_t<> error: invalid type (class or structure)"); + static_assert(!std::is_union::value || std::is_same::value, "be_t<> error: invalid type (union)"); + static_assert(!std::is_pointer::value, "be_t<> error: invalid type (pointer)"); + static_assert(!std::is_reference::value, "be_t<> error: invalid type (reference)"); + static_assert(!std::is_array::value, "be_t<> error: invalid type (array)"); + static_assert(!std::is_enum::value, "be_t<> error: invalid type (enumeration), use integral type instead"); + static_assert(__alignof(type) == __alignof(stype), "be_t<> error: unexpected alignment"); + + be_t() = default; + + be_t(const be_t&) = default; + + template::value>> be_t(const CT& value) +#ifdef IS_LE_MACHINE + : m_data(se_t::to_be(value)) +#else + : m_data(value) +#endif + { } - //get value in current machine byte ordering + // get value in current machine byte ordering force_inline type value() const { #ifdef IS_LE_MACHINE - return ToLE(); + return se_t::from_be(m_data); #else - return ToBE(); + return m_data; #endif } + // get underlying data without any byte order manipulation const stype& data() const { - return ToBE(); +#ifdef IS_LE_MACHINE + return m_data; +#else + return reinterpret_cast(m_data); +#endif } - be_t& operator =(const be_t& value) = default; + be_t& operator =(const be_t&) = default; template std::enable_if_t::value, be_t&> operator =(const CT& value) { @@ -695,7 +672,7 @@ public: return *this; } - //template::value>> operator CT() const + //template::value>> operator CT() const //{ // return value(); //} @@ -708,56 +685,69 @@ public: // conversion to another be_t type template operator be_t() const { - return be_t::make(value()); + return value(); // TODO (complicated cases like int-float conversions are not handled correctly) //return _convert sizeof(T)) ? 1 : (sizeof(T1) < sizeof(T) ? 2 : 0))>::func(m_data); } - template be_t& operator += (T1 right) { return *this = value() + right; } - template be_t& operator -= (T1 right) { return *this = value() - right; } - template be_t& operator *= (T1 right) { return *this = value() * right; } - template be_t& operator /= (T1 right) { return *this = value() / right; } - template be_t& operator %= (T1 right) { return *this = value() % right; } - template be_t& operator &= (T1 right) { return *this = value() & right; } - template be_t& operator |= (T1 right) { return *this = value() | right; } - template be_t& operator ^= (T1 right) { return *this = value() ^ right; } - template be_t& operator <<= (T1 right) { return *this = value() << right; } - template be_t& operator >>= (T1 right) { return *this = value() >> right; } + template be_t& operator +=(const T1& right) { return *this = value() + right; } + template be_t& operator -=(const T1& right) { return *this = value() - right; } + template be_t& operator *=(const T1& right) { return *this = value() * right; } + template be_t& operator /=(const T1& right) { return *this = value() / right; } + template be_t& operator %=(const T1& right) { return *this = value() % right; } - template be_t& operator += (const be_t& right) { return *this = ToLE() + right.ToLE(); } - template be_t& operator -= (const be_t& right) { return *this = ToLE() - right.ToLE(); } - template be_t& operator *= (const be_t& right) { return *this = ToLE() * right.ToLE(); } - template be_t& operator /= (const be_t& right) { return *this = ToLE() / right.ToLE(); } - template be_t& operator %= (const be_t& right) { return *this = ToLE() % right.ToLE(); } - template be_t& operator &= (const be_t& right) { return *this = ToBE() & right.ToBE(); } - template be_t& operator |= (const be_t& right) { return *this = ToBE() | right.ToBE(); } - template be_t& operator ^= (const be_t& right) { return *this = ToBE() ^ right.ToBE(); } + template be_t& operator <<=(const T1& right) { return *this = value() << right; } + template be_t& operator >>=(const T1& right) { return *this = value() >> right; } - template be_t operator & (const be_t& right) const { be_t res; res.FromBE(ToBE() & right.ToBE()); return res; } - template be_t operator | (const be_t& right) const { be_t res; res.FromBE(ToBE() | right.ToBE()); return res; } - template be_t operator ^ (const be_t& right) const { be_t res; res.FromBE(ToBE() ^ right.ToBE()); return res; } + template be_t& operator &=(const T1& right) { return m_data &= be_t(right).data(), *this; } + template be_t& operator |=(const T1& right) { return m_data |= be_t(right).data(), *this; } + template be_t& operator ^=(const T1& right) { return m_data ^= be_t(right).data(), *this; } - template bool operator == (T1 right) const { return (T1)ToLE() == right; } - template bool operator != (T1 right) const { return !(*this == right); } - template bool operator > (T1 right) const { return (T1)ToLE() > right; } - template bool operator < (T1 right) const { return (T1)ToLE() < right; } - template bool operator >= (T1 right) const { return (T1)ToLE() >= right; } - template bool operator <= (T1 right) const { return (T1)ToLE() <= right; } - - template bool operator == (const be_t& right) const { return ToBE() == right.ToBE(); } - template bool operator != (const be_t& right) const { return !(*this == right); } - template bool operator > (const be_t& right) const { return (T1)ToLE() > right.ToLE(); } - template bool operator < (const be_t& right) const { return (T1)ToLE() < right.ToLE(); } - template bool operator >= (const be_t& right) const { return (T1)ToLE() >= right.ToLE(); } - template bool operator <= (const be_t& right) const { return (T1)ToLE() <= right.ToLE(); } - - be_t operator++ (int) { be_t res = *this; *this += 1; return res; } - be_t operator-- (int) { be_t res = *this; *this -= 1; return res; } - be_t& operator++ () { *this += 1; return *this; } - be_t& operator-- () { *this -= 1; return *this; } + be_t operator ++(int) { be_t res = *this; *this += 1; return res; } + be_t operator --(int) { be_t res = *this; *this -= 1; return res; } + be_t& operator ++() { *this += 1; return *this; } + be_t& operator --() { *this -= 1; return *this; } }; +template inline std::enable_if_t::value, bool> operator ==(const be_t& left, const be_t& right) +{ + return left.data() == right.data(); +} + +template inline std::enable_if_t::value, bool> operator !=(const be_t& left, const be_t& right) +{ + return left.data() != right.data(); +} + +template inline std::enable_if_t::value, be_t> operator &(const be_t& left, const be_t& right) +{ + be_t result; + result.m_data = left.data() & right.data(); + return result; +} + +template inline std::enable_if_t::value, be_t> operator |(const be_t& left, const be_t& right) +{ + be_t result; + result.m_data = left.data() | right.data(); + return result; +} + +template inline std::enable_if_t::value, be_t> operator ^(const be_t& left, const be_t& right) +{ + be_t result; + result.m_data = left.data() ^ right.data(); + return result; +} + +template inline std::enable_if_t> operator ~(const be_t& other) +{ + be_t result; + result.m_data = ~other.data(); + return result; +} + template struct is_be_t : public std::integral_constant { }; @@ -804,95 +794,79 @@ template<> struct to_be { using type = s8; }; template struct _se : public const_se_t {}; template struct _se, T1, value> : public const_se_t {}; -//#define se(t, x) _se::value -#define se16(x) _se::value #define se32(x) _se::value -#define se64(x) _se::value -template -struct convert_le_be_t -{ - static Tto func(Tfrom value) - { - return (Tto)value; - } -}; - -template -struct convert_le_be_t, Tfrom> -{ - static be_t func(Tfrom value) - { - return be_t::make(value); - } -}; - -template -struct convert_le_be_t, be_t> -{ - static be_t func(be_t value) - { - return value; - } -}; - -template -struct convert_le_be_t> -{ - static Tto func(be_t value) - { - return value.value(); - } -}; - -template -force_inline Tto convert_le_be(Tfrom value) -{ - return convert_le_be_t::func(value); -} - -template -force_inline void convert_le_be(Tto& dst, Tfrom src) -{ - dst = convert_le_be_t::func(src); -} - -template struct le_t +template class le_t { +public: using type = std::remove_cv_t; using stype = be_storage_t>; - stype m_data; + type m_data; + + static_assert(!std::is_class::value, "le_t<> error: invalid type (class or structure)"); + static_assert(!std::is_union::value || std::is_same::value, "le_t<> error: invalid type (union)"); + static_assert(!std::is_pointer::value, "le_t<> error: invalid type (pointer)"); + static_assert(!std::is_reference::value, "le_t<> error: invalid type (reference)"); + static_assert(!std::is_array::value, "le_t<> error: invalid type (array)"); + static_assert(!std::is_enum::value, "le_t<> error: invalid type (enumeration), use integral type instead"); + static_assert(__alignof(type) == __alignof(stype), "le_t<> error: unexpected alignment"); + + le_t() = default; + + le_t(const le_t&) = default; + + template::value>> le_t(const CT& value) + : m_data(value) + { + } type value() const { - return reinterpret_cast(m_data); + return m_data; + } + + const stype& data() const + { + return reinterpret_cast(m_data); } le_t& operator =(const le_t& value) = default; template std::enable_if_t::value, le_t&> operator =(const CT& value) { - m_data = reinterpret_cast(value); - + m_data = value; return *this; } - //template operator std::enable_if_t::value, CT>() const - //{ - // return value(); - //} - operator type() const { return value(); } // conversion to another le_t type - //template operator const le_t() const - //{ - // return le_t::make(value()); - //} + template operator le_t() const + { + return value(); + } + + template le_t& operator +=(const T1& right) { return *this = value() + right; } + template le_t& operator -=(const T1& right) { return *this = value() - right; } + template le_t& operator *=(const T1& right) { return *this = value() * right; } + template le_t& operator /=(const T1& right) { return *this = value() / right; } + template le_t& operator %=(const T1& right) { return *this = value() % right; } + + template le_t& operator <<=(const T1& right) { return *this = value() << right; } + template le_t& operator >>=(const T1& right) { return *this = value() >> right; } + + template le_t& operator &=(const T1& right) { return m_data &= le_t(right).data(), *this; } + template le_t& operator |=(const T1& right) { return m_data |= le_t(right).data(), *this; } + template le_t& operator ^=(const T1& right) { return m_data ^= le_t(right).data(), *this; } + + le_t operator ++(int) { le_t res = *this; *this += 1; return res; } + le_t operator --(int) { le_t res = *this; *this -= 1; return res; } + le_t& operator ++() { *this += 1; return *this; } + le_t& operator --() { *this -= 1; return *this; } }; template struct is_le_t : public std::integral_constant diff --git a/Utilities/Thread.cpp b/Utilities/Thread.cpp index a39dbe9c2a..3595a3461f 100644 --- a/Utilities/Thread.cpp +++ b/Utilities/Thread.cpp @@ -1060,9 +1060,9 @@ bool handle_access_violation(u32 addr, bool is_writing, x64_context* context) switch (d_size) { - case 1: value = vm::priv_ref>(addr) &= value; break; - case 2: value = vm::priv_ref>(addr) &= value; break; - case 4: value = vm::priv_ref>(addr) &= value; break; + case 1: value = vm::priv_ref>(addr) &= static_cast(value); break; + case 2: value = vm::priv_ref>(addr) &= static_cast(value); break; + case 4: value = vm::priv_ref>(addr) &= static_cast(value); break; case 8: value = vm::priv_ref>(addr) &= value; break; default: return false; } diff --git a/rpcs3/Crypto/unself.cpp b/rpcs3/Crypto/unself.cpp index 495eac45dc..57f084e30b 100644 --- a/rpcs3/Crypto/unself.cpp +++ b/rpcs3/Crypto/unself.cpp @@ -935,9 +935,9 @@ bool SELFDecrypter::DecryptNPDRM(u8 *metadata, u32 metadata_size) bool SELFDecrypter::LoadMetadata() { aes_context aes; - u32 metadata_info_size = sizeof(meta_info); + u32 metadata_info_size = sizeof32(meta_info); u8 *metadata_info = (u8 *)malloc(metadata_info_size); - u32 metadata_headers_size = sce_hdr.se_hsize - (sizeof(sce_hdr) + sce_hdr.se_meta + sizeof(meta_info)); + u32 metadata_headers_size = sce_hdr.se_hsize - (sizeof32(sce_hdr) + sce_hdr.se_meta + sizeof32(meta_info)); u8 *metadata_headers = (u8 *)malloc(metadata_headers_size); // Locate and read the encrypted metadata info. diff --git a/rpcs3/Emu/ARMv7/ARMv7Decoder.cpp b/rpcs3/Emu/ARMv7/ARMv7Decoder.cpp index f5c61bcd46..aa0a4398fe 100644 --- a/rpcs3/Emu/ARMv7/ARMv7Decoder.cpp +++ b/rpcs3/Emu/ARMv7/ARMv7Decoder.cpp @@ -1280,7 +1280,7 @@ void armv7_decoder_initialize(u32 addr, u32 end_addr, bool dump) const u32 i2 = (code.data >> 11) & 0x1 ^ s ^ 1; const u32 target = (addr + 4 & ~3) + sign<25, u32>(s << 24 | i2 << 23 | i1 << 22 | (code.data & 0x3ff0000) >> 4 | (code.data & 0x7ff) << 1); - const u32 instr = vm::check_addr(target, 4) ? vm::psv::read32(target) : 0; + const u32 instr = vm::check_addr(target, 4) ? vm::psv::read32(target).value() : 0; // possibly a call to imported function: if (target >= end_addr && ((target - end_addr) % 16) == 0 && (instr & 0xfff000f0) == 0xe0700090) diff --git a/rpcs3/Emu/ARMv7/Modules/sceFiber.h b/rpcs3/Emu/ARMv7/Modules/sceFiber.h index 731ce843cd..521d0eeb13 100644 --- a/rpcs3/Emu/ARMv7/Modules/sceFiber.h +++ b/rpcs3/Emu/ARMv7/Modules/sceFiber.h @@ -2,35 +2,28 @@ using SceFiberEntry = func_def; -struct SceFiber +struct set_alignment(8) SceFiber { le_t padding[16]; }; CHECK_SIZE_ALIGN(SceFiber, 128, 8); -struct SceFiberOptParam +struct set_alignment(8) SceFiberOptParam { le_t padding[16]; }; CHECK_SIZE_ALIGN(SceFiberOptParam, 128, 8); -struct SceFiberInfo +struct set_alignment(8) SceFiberInfo { - union - { - le_t padding[16]; - - struct - { - vm::lptr entry; - le_t argOnInitialize; - vm::lptr addrContext; - le_t sizeContext; - char name[32]; - }; - }; + vm::lptr entry; + le_t argOnInitialize; + vm::lptr addrContext; + le_t sizeContext; + char name[32]; + u8 padding[80]; }; CHECK_SIZE_ALIGN(SceFiberInfo, 128, 8); diff --git a/rpcs3/Emu/ARMv7/Modules/sceLibKernel.h b/rpcs3/Emu/ARMv7/Modules/sceLibKernel.h index fba40f8964..3fd02fa5e5 100644 --- a/rpcs3/Emu/ARMv7/Modules/sceLibKernel.h +++ b/rpcs3/Emu/ARMv7/Modules/sceLibKernel.h @@ -271,7 +271,8 @@ union SceKernelSysClock { le_t low; le_t hi; - }; + } + u; le_t quad; }; diff --git a/rpcs3/Emu/ARMv7/Modules/sceLocation.cpp b/rpcs3/Emu/ARMv7/Modules/sceLocation.cpp index 82c80b8b2d..99bca712ba 100644 --- a/rpcs3/Emu/ARMv7/Modules/sceLocation.cpp +++ b/rpcs3/Emu/ARMv7/Modules/sceLocation.cpp @@ -19,7 +19,7 @@ s32 sceLocationReopen(u8 handle, SceLocationLocationMethod lmethod, SceLocationH throw __FUNCTION__; } -s32 sceLocationGetMethod(u8 handle, vm::ptr lmethod, vm::ptr hmethod) +s32 sceLocationGetMethod(u8 handle, vm::ptr lmethod, vm::ptr hmethod) { throw __FUNCTION__; } @@ -64,12 +64,12 @@ s32 sceLocationConfirm(u8 handle) throw __FUNCTION__; } -s32 sceLocationConfirmGetStatus(u8 handle, vm::ptr status) +s32 sceLocationConfirmGetStatus(u8 handle, vm::ptr status) { throw __FUNCTION__; } -s32 sceLocationConfirmGetResult(u8 handle, vm::ptr result) +s32 sceLocationConfirmGetResult(u8 handle, vm::ptr result) { throw __FUNCTION__; } diff --git a/rpcs3/Emu/ARMv7/Modules/sceNpBasic.cpp b/rpcs3/Emu/ARMv7/Modules/sceNpBasic.cpp index 1cb1328049..604a9136cc 100644 --- a/rpcs3/Emu/ARMv7/Modules/sceNpBasic.cpp +++ b/rpcs3/Emu/ARMv7/Modules/sceNpBasic.cpp @@ -29,7 +29,7 @@ s32 sceNpBasicCheckCallback() throw __FUNCTION__; } -s32 sceNpBasicGetFriendOnlineStatus(vm::cptr friendId, vm::ptr status) +s32 sceNpBasicGetFriendOnlineStatus(vm::cptr friendId, vm::ptr status) { throw __FUNCTION__; } diff --git a/rpcs3/Emu/ARMv7/Modules/sceNpManager.cpp b/rpcs3/Emu/ARMv7/Modules/sceNpManager.cpp index e06ac49b47..cb6618e5be 100644 --- a/rpcs3/Emu/ARMv7/Modules/sceNpManager.cpp +++ b/rpcs3/Emu/ARMv7/Modules/sceNpManager.cpp @@ -19,7 +19,7 @@ s32 sceNpCheckCallback() throw __FUNCTION__; } -s32 sceNpGetServiceState(vm::ptr state) +s32 sceNpGetServiceState(vm::ptr state) { throw __FUNCTION__; } diff --git a/rpcs3/Emu/Cell/PPUInterpreter.cpp b/rpcs3/Emu/Cell/PPUInterpreter.cpp index 74152cfe60..fc64e48196 100644 --- a/rpcs3/Emu/Cell/PPUInterpreter.cpp +++ b/rpcs3/Emu/Cell/PPUInterpreter.cpp @@ -2080,7 +2080,7 @@ void ppu_interpreter::STWCX_(PPUThread& CPU, ppu_opcode_t op) { const u64 addr = op.ra ? CPU.GPR[op.ra] + CPU.GPR[op.rb] : CPU.GPR[op.rb]; - const be_t value = be_t::make((u32)CPU.GPR[op.rs]); + const be_t value = (u32)CPU.GPR[op.rs]; CPU.SetCR_EQ(0, vm::reservation_update(vm::cast(addr), &value, sizeof(value))); } @@ -2140,7 +2140,7 @@ void ppu_interpreter::STDCX_(PPUThread& CPU, ppu_opcode_t op) { const u64 addr = op.ra ? CPU.GPR[op.ra] + CPU.GPR[op.rb] : CPU.GPR[op.rb]; - const be_t value = be_t::make(CPU.GPR[op.rs]); + const be_t value = CPU.GPR[op.rs]; CPU.SetCR_EQ(0, vm::reservation_update(vm::cast(addr), &value, sizeof(value))); } diff --git a/rpcs3/Emu/Cell/PPUInterpreter.h b/rpcs3/Emu/Cell/PPUInterpreter.h index 90f8acd973..1d3f1c7449 100644 --- a/rpcs3/Emu/Cell/PPUInterpreter.h +++ b/rpcs3/Emu/Cell/PPUInterpreter.h @@ -2754,7 +2754,7 @@ private: { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; - const be_t value = be_t::make((u32)CPU.GPR[rs]); + const be_t value = (u32)CPU.GPR[rs]; CPU.SetCR_EQ(0, vm::reservation_update(vm::cast(addr), &value, sizeof(value))); } void STWX(u32 rs, u32 ra, u32 rb) @@ -2806,7 +2806,7 @@ private: { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; - const be_t value = be_t::make(CPU.GPR[rs]); + const be_t value = CPU.GPR[rs]; CPU.SetCR_EQ(0, vm::reservation_update(vm::cast(addr), &value, sizeof(value))); } void STBX(u32 rs, u32 ra, u32 rb) diff --git a/rpcs3/Emu/Cell/PPUThread.cpp b/rpcs3/Emu/Cell/PPUThread.cpp index 411ae01e49..e76dd906f1 100644 --- a/rpcs3/Emu/Cell/PPUThread.cpp +++ b/rpcs3/Emu/Cell/PPUThread.cpp @@ -520,8 +520,8 @@ void PPUThread::DoReset() void PPUThread::InitRegs() { - const u32 pc = entry ? vm::read32(entry) : 0; - const u32 rtoc = entry ? vm::read32(entry + 4) : 0; + const u32 pc = entry ? vm::read32(entry).value() : 0; + const u32 rtoc = entry ? vm::read32(entry + 4).value() : 0; SetPc(pc); @@ -764,7 +764,7 @@ cpu_thread& ppu_thread::args(std::initializer_list values) const u32 arg_size = align(u32(arg.size() + 1), stack_align); const u32 arg_addr = vm::alloc(arg_size, vm::main); - std::strcpy(vm::get_ptr(arg_addr), arg.c_str()); + std::memcpy(vm::get_ptr(arg_addr), arg.c_str(), arg.size() + 1); argv[argc++] = arg_addr; } diff --git a/rpcs3/Emu/Cell/SPUThread.cpp b/rpcs3/Emu/Cell/SPUThread.cpp index 8a0ef10548..7b4a7476fa 100644 --- a/rpcs3/Emu/Cell/SPUThread.cpp +++ b/rpcs3/Emu/Cell/SPUThread.cpp @@ -355,7 +355,7 @@ void SPUThread::do_dma_list_cmd(u32 cmd, spu_mfc_arg_t args) args.lsa += std::max(size, 16); } - if (rec->sb.data() & se16(0x8000)) + if (rec->sb & 0x8000) { ch_stall_stat.push_bit_or(1 << args.tag); diff --git a/rpcs3/Emu/Memory/vm_ptr.h b/rpcs3/Emu/Memory/vm_ptr.h index 8052ffb17a..6ec7af080e 100644 --- a/rpcs3/Emu/Memory/vm_ptr.h +++ b/rpcs3/Emu/Memory/vm_ptr.h @@ -52,9 +52,9 @@ namespace vm m_addr = value; } - template static std::enable_if_t::value, _ptr_base> make(const AT2& addr) + template static std::enable_if_t::value, _ptr_base> make(const AT2& addr) { - return{ convert_le_be(addr) }; + return{ addr }; } T* get_ptr() const @@ -82,7 +82,7 @@ namespace vm // enable only the conversions which are originally possible between pointer types template::value>> operator _ptr_base() const { - return{ convert_le_be(vm::cast(m_addr)) }; + return{ vm::cast(m_addr) }; } template::value>> explicit operator T2*() const @@ -127,9 +127,9 @@ namespace vm m_addr = value; } - template static _ptr_base make(const AT2& addr) + template static std::enable_if_t::value, _ptr_base> make(const AT2& addr) { - return{ convert_le_be(addr) }; + return{ addr }; } // defined in CB_FUNC.h, passing context is mandatory @@ -141,7 +141,7 @@ namespace vm // conversion to another function pointer template operator _ptr_base() const { - return{ convert_le_be(vm::cast(m_addr)) }; + return{ vm::cast(m_addr) }; } explicit operator bool() const @@ -315,19 +315,19 @@ template inline vm::if_arithmetical_ptr_t inline vm::if_arithmetical_ptr_t> operator +(const vm::_ptr_base& ptr, to_ne_t count) { - return{ convert_le_be(ptr.m_addr + count * sizeof32(T)) }; + return{ ptr.m_addr + count * sizeof32(T) }; } // addition operator for vm::_ptr_base (integer + pointer) template inline vm::if_arithmetical_ptr_t> operator +(to_ne_t count, const vm::_ptr_base& ptr) { - return{ convert_le_be(ptr.m_addr + count * sizeof32(T)) }; + return{ ptr.m_addr + count * sizeof32(T) }; } // subtraction operator for vm::_ptr_base (pointer - integer) template inline vm::if_arithmetical_ptr_t> operator -(const vm::_ptr_base& ptr, to_ne_t count) { - return{ convert_le_be(ptr.m_addr - count * sizeof32(T)) }; + return{ ptr.m_addr - count * sizeof32(T) }; } // pointer difference operator for vm::_ptr_base diff --git a/rpcs3/Emu/Memory/vm_ref.h b/rpcs3/Emu/Memory/vm_ref.h index f420a68083..47ce252b32 100644 --- a/rpcs3/Emu/Memory/vm_ref.h +++ b/rpcs3/Emu/Memory/vm_ref.h @@ -17,9 +17,9 @@ namespace vm return m_addr; } - template static _ref_base make(const AT2& addr) + template static std::enable_if_t::value, _ref_base> make(const AT2& addr) { - return{ convert_le_be(addr) }; + return{ addr }; } T& get_ref() const diff --git a/rpcs3/Emu/RSX/Common/FragmentProgramDecompiler.cpp b/rpcs3/Emu/RSX/Common/FragmentProgramDecompiler.cpp index 61b97a098d..7a457bb15d 100644 --- a/rpcs3/Emu/RSX/Common/FragmentProgramDecompiler.cpp +++ b/rpcs3/Emu/RSX/Common/FragmentProgramDecompiler.cpp @@ -114,7 +114,7 @@ std::string FragmentProgramDecompiler::AddConst() return name; } - auto data = vm::ps3::ptr::make(m_addr + m_size + 4 * sizeof(u32)); + auto data = vm::ps3::ptr::make(m_addr + m_size + 4 * sizeof32(u32)); m_offset = 2 * 4 * sizeof(u32); u32 x = GetData(data[0]); diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index 9f0fbe9f42..09d51c55a5 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -188,7 +188,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const // NV406E case NV406E_SET_REFERENCE: { - m_ctrl->ref.exchange(be_t::make(ARGS(0))); + m_ctrl->ref.exchange(ARGS(0)); break; } @@ -2523,7 +2523,7 @@ void RSXThread::Task() { u32 offs = cmd & 0x1fffffff; //LOG_WARNING(RSX, "rsx jump(0x%x) #addr=0x%x, cmd=0x%x, get=0x%x, put=0x%x", offs, m_ioAddress + get, cmd, get, put); - m_ctrl->get.exchange(be_t::make(offs)); + m_ctrl->get.exchange(offs); continue; } if (cmd & CELL_GCM_METHOD_FLAG_CALL) @@ -2531,7 +2531,7 @@ void RSXThread::Task() m_call_stack.push(get + 4); u32 offs = cmd & ~3; //LOG_WARNING(RSX, "rsx call(0x%x) #0x%x - 0x%x", offs, cmd, get); - m_ctrl->get.exchange(be_t::make(offs)); + m_ctrl->get.exchange(offs); continue; } if (cmd == CELL_GCM_METHOD_FLAG_RETURN) @@ -2539,7 +2539,7 @@ void RSXThread::Task() u32 get = m_call_stack.top(); m_call_stack.pop(); //LOG_WARNING(RSX, "rsx return(0x%x)", get); - m_ctrl->get.exchange(be_t::make(get)); + m_ctrl->get.exchange(get); continue; } if (cmd & CELL_GCM_METHOD_FLAG_NON_INCREMENT) diff --git a/rpcs3/Emu/RSX/sysutil_video.h b/rpcs3/Emu/RSX/sysutil_video.h index 9975a33046..eac1effdff 100644 --- a/rpcs3/Emu/RSX/sysutil_video.h +++ b/rpcs3/Emu/RSX/sysutil_video.h @@ -229,15 +229,15 @@ enum CellVideoOutRGBOutputRange static const CellVideoOutResolution ResolutionTable[] = { - { be_t::make(0xffff), be_t::make(0xffff) }, //0 - 0 - { be_t::make(1920), be_t::make(1080) }, //1 - 1 - { be_t::make(1280), be_t::make(720) }, //2 - 2 - { be_t::make(720), be_t::make(480) }, //4 - 3 - { be_t::make(720), be_t::make(576) }, //5 - 4 - { be_t::make(1600), be_t::make(1080) }, //10 - 5 - { be_t::make(1440), be_t::make(1080) }, //11 - 6 - { be_t::make(1280), be_t::make(1080) }, //12 - 7 - { be_t::make(960), be_t::make(1080) }, //13 - 8 + { 0xffff, 0xffff }, //0 - 0 + { 1920, 1080 }, //1 - 1 + { 1280, 720 }, //2 - 2 + { 720, 480 }, //4 - 3 + { 720, 576 }, //5 - 4 + { 1600, 1080 }, //10 - 5 + { 1440, 1080 }, //11 - 6 + { 1280, 1080 }, //12 - 7 + { 960, 1080 }, //13 - 8 }; inline static u32 ResolutionIdToNum(u32 id) diff --git a/rpcs3/Emu/SysCalls/Modules/cellAdec.cpp b/rpcs3/Emu/SysCalls/Modules/cellAdec.cpp index d754cd53c9..28a1553c53 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellAdec.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellAdec.cpp @@ -22,7 +22,7 @@ extern Module cellAdec; #define ADEC_ERROR(...) { cellAdec.Error(__VA_ARGS__); Emu.Pause(); return; } // only for decoder thread -AudioDecoder::AudioDecoder(AudioCodecType type, u32 addr, u32 size, vm::ptr func, u32 arg) +AudioDecoder::AudioDecoder(s32 type, u32 addr, u32 size, vm::ptr func, u32 arg) : type(type) , memAddr(addr) , memSize(size) @@ -478,7 +478,7 @@ void adecOpen(u32 adec_id) // TODO: call from the constructor }); } -bool adecCheckType(AudioCodecType type) +bool adecCheckType(s32 type) { switch (type) { @@ -825,8 +825,8 @@ s32 cellAdecGetPcmItem(u32 handle, vm::pptr pcmItem) pcm->startAddr = 0x00000312; // invalid address (no output) pcm->size = af.size; pcm->status = CELL_OK; - pcm->auInfo.pts.lower = (u32)af.pts; - pcm->auInfo.pts.upper = af.pts >> 32; + pcm->auInfo.pts.lower = (u32)(af.pts); + pcm->auInfo.pts.upper = (u32)(af.pts >> 32); pcm->auInfo.size = af.auSize; pcm->auInfo.startAddr = af.auAddr; pcm->auInfo.userData = af.userdata; @@ -836,7 +836,7 @@ s32 cellAdecGetPcmItem(u32 handle, vm::pptr pcmItem) auto atx = vm::ptr::make(pcm.addr() + sizeof32(CellAdecPcmItem)); atx->samplingFreq = frame->sample_rate; - atx->nbytes = frame->nb_samples * sizeof(float); + atx->nbytes = frame->nb_samples * sizeof32(float); if (frame->channels == 1) { atx->channelConfigIndex = 1; diff --git a/rpcs3/Emu/SysCalls/Modules/cellAdec.h b/rpcs3/Emu/SysCalls/Modules/cellAdec.h index 713798fb41..bd821636c2 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellAdec.h +++ b/rpcs3/Emu/SysCalls/Modules/cellAdec.h @@ -248,7 +248,7 @@ enum }; // Audio Codec Type -enum AudioCodecType +enum AudioCodecType : s32 { CELL_ADEC_TYPE_RESERVED1, CELL_ADEC_TYPE_LPCM_PAMF, @@ -284,7 +284,7 @@ enum AudioCodecType CELL_ADEC_TYPE_RESERVED25, }; -static bool adecIsAtracX(const AudioCodecType type) +inline bool adecIsAtracX(s32 type) { return type == CELL_ADEC_TYPE_ATRACX || type == CELL_ADEC_TYPE_ATRACX_2CH @@ -293,7 +293,7 @@ static bool adecIsAtracX(const AudioCodecType type) } // Output Channel Number -enum CellAdecChannel +enum CellAdecChannel : s32 { CELL_ADEC_CH_RESERVED1, CELL_ADEC_CH_MONO, @@ -311,7 +311,7 @@ enum CellAdecChannel }; // Sampling Rate -enum CellAdecSampleRate +enum CellAdecSampleRate : s32 { CELL_ADEC_FS_RESERVED1 = 0, CELL_ADEC_FS_48kHz = 1, @@ -319,7 +319,7 @@ enum CellAdecSampleRate CELL_ADEC_FS_8kHz = 5, }; -enum CellAdecBitLength +enum CellAdecBitLength : s32 { CELL_ADEC_BIT_LENGTH_RESERVED1, CELL_ADEC_BIT_LENGTH_16, @@ -329,7 +329,7 @@ enum CellAdecBitLength struct CellAdecType { - be_t audioCodecType; + be_t audioCodecType; // AudioCodecType }; struct CellAdecAttr @@ -360,7 +360,7 @@ struct CellAdecResourceEx }; // Callback Messages -enum CellAdecMsgType +enum CellAdecMsgType : s32 { CELL_ADEC_MSG_TYPE_AUDONE, CELL_ADEC_MSG_TYPE_PCMOUT, @@ -368,7 +368,7 @@ enum CellAdecMsgType CELL_ADEC_MSG_TYPE_SEQDONE, }; -typedef s32(CellAdecCbMsg)(u32 handle, CellAdecMsgType msgType, s32 msgData, u32 cbArg); +using CellAdecCbMsg = func_def; struct CellAdecCb { @@ -376,8 +376,6 @@ struct CellAdecCb be_t cbArg; }; -typedef CellCodecTimeStamp CellAdecTimeStamp; - // AU Info struct CellAdecAuInfo { @@ -420,13 +418,13 @@ struct CellAdecLpcmInfo }; // CELP Excitation Mode -enum CELP_ExcitationMode +enum CELP_ExcitationMode : s32 { CELL_ADEC_CELP_EXCITATION_MODE_RPE = 1, }; // CELP RPE Configuration -enum CELP_RPEConfig +enum CELP_RPEConfig : s32 { CELL_ADEC_CELP_RPE_CONFIG_0, CELL_ADEC_CELP_RPE_CONFIG_1, @@ -435,7 +433,7 @@ enum CELP_RPEConfig }; // CELP Word Size -enum CELP_WordSize +enum CELP_WordSize : s32 { CELL_ADEC_CELP_WORD_SZ_INT16_LE, CELL_ADEC_CELP_WORD_SZ_FLOAT, @@ -460,13 +458,13 @@ struct CellAdecCelpInfo }; // CELP8 Excitation Mode -enum CELP8_ExcitationMode +enum CELP8_ExcitationMode : s32 { CELL_ADEC_CELP8_EXCITATION_MODE_MPE = 0, }; // CELP8 MPE Configuration -enum CELP8_MPEConfig +enum CELP8_MPEConfig : s32 { CELL_ADEC_CELP8_MPE_CONFIG_0 = 0, CELL_ADEC_CELP8_MPE_CONFIG_2 = 2, @@ -481,7 +479,7 @@ enum CELP8_MPEConfig }; // CELP8 Word Size -enum CELP8_WordSize +enum CELP8_WordSize : s32 { CELL_ADEC_CELP8_WORD_SZ_FLOAT, }; @@ -504,14 +502,14 @@ struct CellAdecCelp8Info be_t wordSize; }; -enum MPEG4AAC_ConfigType +enum MPEG4AAC_ConfigType : s32 { ADIFHeader = 0, ADTSHeader = 1, RawDataBlockOnly = 2, }; -enum MPEG4AAC_SamplingFreq +enum MPEG4AAC_SamplingFreq : s32 { SF_96000 = 0, SF_88200 = 1, @@ -530,26 +528,30 @@ enum MPEG4AAC_SamplingFreq // MPEG4 AAC Parameters struct CellAdecParamM4Aac { - be_t configNumber; + be_t configNumber; // MPEG4AAC_ConfigType - union { - struct mp { struct mp2 + union + { + struct { - be_t adifProgramNumber; // 0 - } adifConfig; }; + be_t programNumber; + } + adifConfig; - struct mp3 { struct mp4 + struct { - be_t samplingFreqIndex; + be_t samplingFreqIndex; // MPEG4AAC_SamplingFreq be_t profile; // LC profile (1) - } rawDataBlockConfig; }; - } configInfo; + } + rawDataBlockConfig; + } + configInfo; be_t enableDownmix; // enable downmix to 2.0 (if (enableDownmix)) }; // MPEG4 AAC BSI -struct CellAdecM4AacInfo +struct set_alignment(16) CellAdecM4AacInfo { be_t samplingFreq; // [Hz] be_t numberOfChannels; @@ -561,55 +563,52 @@ struct CellAdecM4AacInfo be_t enableSBR; be_t SBRUpsamplingFactor; be_t isBsiValid; - be_t configNumber; - - be_t pad1; // TODO: check alignment + be_t configNumber; // MPEG4AAC_ConfigType - union { - struct mp5 { - struct m6 - { - be_t copyrightIdPresent; - char copyrightId[9]; - be_t originalCopy; - be_t home; - be_t bitstreamType; - be_t bitrate; - be_t numberOfProgramConfigElements; - be_t bufferFullness; - } adif; - }; + union + { + struct + { + be_t copyrightIdPresent; + char copyrightId[9]; + be_t originalCopy; + be_t home; + be_t bitstreamType; + be_t bitrate; + be_t numberOfProgramConfigElements; + be_t bufferFullness; + } + adif; - struct mp7 { - struct mp8 - { - be_t id; - be_t layer; - be_t protectionAbsent; - be_t profile; - be_t samplingFreqIndex; - be_t privateBit; - be_t channelConfiguration; - be_t originalCopy; - be_t home; - be_t copyrightIdBit; - be_t copyrightIdStart; - be_t frameLength; - be_t bufferFullness; - be_t numberOfRawDataBlocks; - be_t crcCheck; - } adts; - }; - } bsi; + struct mp8 + { + be_t id; + be_t layer; + be_t protectionAbsent; + be_t profile; + be_t samplingFreqIndex; + be_t privateBit; + be_t channelConfiguration; + be_t originalCopy; + be_t home; + be_t copyrightIdBit; + be_t copyrightIdStart; + be_t frameLength; + be_t bufferFullness; + be_t numberOfRawDataBlocks; + be_t crcCheck; + } + adts; + } + bsi; - be_t pad2; // TODO: check alignment - - struct mp9 + struct { be_t matrixMixdownPresent; be_t mixdownIndex; be_t pseudoSurroundEnable; - } matrixMixdown; + } + matrixMixdown; be_t reserved; }; @@ -760,15 +759,15 @@ enum ATRAC3_JointType : s32 struct CellAdecParamAtrac3 { be_t nch; // channel count - be_t isJoint; + be_t isJoint; // ATRAC3_JointType be_t nbytes; // byte count of single AU (???) - be_t bw_pcm; // bit length of output PCM sample + be_t bw_pcm; // ATRAC3_WordSize, bit length of output PCM sample }; struct CellAdecAtrac3Info { be_t nch; - be_t isJoint; + be_t isJoint; // ATRAC3_JointType be_t nbytes; }; @@ -799,7 +798,7 @@ struct CellAdecParamAtracX be_t nch_out; be_t nbytes; std::array extra_config_data; // downmix coefficients - be_t bw_pcm; + be_t bw_pcm; // ATRACX_WordSize ATRACX_DownmixFlag downmix_flag; ATRACX_ATSHeaderInclude au_includes_ats_hdr_flg; }; @@ -833,7 +832,7 @@ enum MP3_CRCMode : u8 struct CellAdecParamMP3 { - be_t bw_pcm; + be_t bw_pcm; // MP3_WordSize }; struct CellAdecMP3Info @@ -852,20 +851,20 @@ struct CellAdecMP3Info be_t i_error_code; }; -enum M2BC_SampleFrequency +enum M2BC_SampleFrequency : s32 { CELL_ADEC_BSI_M2BC_SAMPLE_FREQUENCY_44 = 0, CELL_ADEC_BSI_M2BC_SAMPLE_FREQUENCY_48 = 1, CELL_ADEC_BSI_M2BC_SAMPLE_FREQUENCY_32 = 2, }; -enum M2BC_ErrorProtection +enum M2BC_ErrorProtection : s32 { CELL_ADEC_BSI_M2BC_ERROR_PROTECTION_NONE = 0, CELL_ADEC_BSI_M2BC_ERROR_PROTECTION_EXIST = 1, }; -enum M2BC_BitrateIndex +enum M2BC_BitrateIndex : s32 { CELL_ADEC_BSI_M2BC_BITRATE_32 = 1, CELL_ADEC_BSI_M2BC_BITRATE_48 = 2, @@ -883,7 +882,7 @@ enum M2BC_BitrateIndex CELL_ADEC_BSI_M2BC_BITRATE_384 = 14, }; -enum M2BC_StereoMode +enum M2BC_StereoMode : s32 { CELL_ADEC_BSI_M2BC_STEREO_MODE_STERO = 0, CELL_ADEC_BSI_M2BC_STEREO_MODE_JOINTSTERO = 1, @@ -891,7 +890,7 @@ enum M2BC_StereoMode CELL_ADEC_BSI_M2BC_STEREO_MODE_MONO = 3, }; -enum M2BC_StereoModeEx +enum M2BC_StereoModeEx : s32 { CELL_ADEC_BSI_M2BC_STEREO_EXMODE_0 = 0, CELL_ADEC_BSI_M2BC_STEREO_EXMODE_1 = 1, @@ -899,26 +898,26 @@ enum M2BC_StereoModeEx CELL_ADEC_BSI_M2BC_STEREO_EXMODE_3 = 3, }; -enum M2BC_Emphasis +enum M2BC_Emphasis : s32 { CELL_ADEC_BSI_M2BC_EMPHASIS_NONE = 0, CELL_ADEC_BSI_M2BC_EMPHASIS_50_15 = 1, CELL_ADEC_BSI_M2BC_EMPHASIS_CCITT = 3, }; -enum M2BC_CopyrightBit +enum M2BC_CopyrightBit : s32 { CELL_ADEC_BSI_M2BC_COPYRIGHT_NONE = 0, CELL_ADEC_BSI_M2BC_COPYRIGHT_ON = 1, }; -enum M2BC_OriginalBit +enum M2BC_OriginalBit : s32 { CELL_ADEC_BSI_M2BC_ORIGINAL_COPY = 0, CELL_ADEC_BSI_M2BC_ORIGINAL_ORIGINAL = 1, }; -enum M2BC_SurroundMode +enum M2BC_SurroundMode : s32 { CELL_ADEC_BSI_M2BC_SURROUND_NONE = 0, CELL_ADEC_BSI_M2BC_SURROUND_MONO = 1, @@ -926,33 +925,33 @@ enum M2BC_SurroundMode CELL_ADEC_BSI_M2BC_SURROUND_SECOND = 3, }; -enum M2BC_CenterMode +enum M2BC_CenterMode : s32 { CELL_ADEC_BSI_M2BC_CENTER_NONE = 0, CELL_ADEC_BSI_M2BC_CENTER_EXIST = 1, CELL_ADEC_BSI_M2BC_CENTER_PHANTOM = 3, }; -enum M2BC_LFE +enum M2BC_LFE : s32 { CELL_ADEC_BSI_M2BC_LFE_NONE = 0, CELL_ADEC_BSI_M2BC_LFE_EXIST = 1, }; -enum M2BC_AudioMixMode +enum M2BC_AudioMixMode : s32 { CELL_ADEC_BSI_M2BC_AUDIOMIX_LARGE = 0, CELL_ADEC_BSI_M2BC_AUDIOMIX_SMALLE = 1, }; -enum M2BC_MCExtension +enum M2BC_MCExtension : s32 { CELL_ADEC_BSI_M2BC_MCEXTENSION_2CH = 0, CELL_ADEC_BSI_M2BC_MCEXTENSION_5CH = 1, CELL_ADEC_BSI_M2BC_MCEXTENSION_7CH = 2, }; -enum M2BC_ChannelConfig +enum M2BC_ChannelConfig : s32 { CELL_ADEC_BSI_M2BC_CH_CONFIG_MONO = 0, CELL_ADEC_BSI_M2BC_CH_CONFIG_DUAL = 1, @@ -1130,7 +1129,7 @@ public: squeue_t frames; - const AudioCodecType type; + const s32 type; const u32 memAddr; const u32 memSize; const vm::ptr cbFunc; @@ -1148,7 +1147,7 @@ public: PPUThread* adecCb; - AudioDecoder(AudioCodecType type, u32 addr, u32 size, vm::ptr func, u32 arg); + AudioDecoder(s32 type, u32 addr, u32 size, vm::ptr func, u32 arg); ~AudioDecoder(); }; diff --git a/rpcs3/Emu/SysCalls/Modules/cellAudio.cpp b/rpcs3/Emu/SysCalls/Modules/cellAudio.cpp index 9ebfb31270..dd03c80d11 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellAudio.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellAudio.cpp @@ -881,7 +881,7 @@ s32 cellAudioAddData(u32 portNum, vm::ptr src, u32 samples, float volume) const AudioPortConfig& port = g_audio.ports[portNum]; - const auto dst = vm::ptr::make(port.addr + (port.tag % port.block) * port.channel * 256 * sizeof(float)); + const auto dst = vm::ptr::make(port.addr + u32(port.tag % port.block) * port.channel * 256 * sizeof32(float)); for (u32 i = 0; i < samples * port.channel; i++) { @@ -914,7 +914,7 @@ s32 cellAudioAdd2chData(u32 portNum, vm::ptr src, u32 samples, float volu const AudioPortConfig& port = g_audio.ports[portNum]; - const auto dst = vm::ptr::make(port.addr + (port.tag % port.block) * port.channel * 256 * sizeof(float)); + const auto dst = vm::ptr::make(port.addr + s32(port.tag % port.block) * port.channel * 256 * sizeof32(float)); if (port.channel == 2) { @@ -970,7 +970,7 @@ s32 cellAudioAdd6chData(u32 portNum, vm::ptr src, float volume) const AudioPortConfig& port = g_audio.ports[portNum]; - const auto dst = vm::ptr::make(port.addr + (port.tag % port.block) * port.channel * 256 * sizeof(float)); + const auto dst = vm::ptr::make(port.addr + s32(port.tag % port.block) * port.channel * 256 * sizeof32(float)); if (port.channel == 2 || port.channel == 6) { diff --git a/rpcs3/Emu/SysCalls/Modules/cellCamera.cpp b/rpcs3/Emu/SysCalls/Modules/cellCamera.cpp index a6f8ee0372..05df0aeb3e 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellCamera.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellCamera.cpp @@ -6,16 +6,16 @@ #include "cellCamera.h" extern Module cellCamera; -const char* attributes[] = {"GAIN", "REDBLUEGAIN", "SATURATION", "EXPOSURE", "BRIGHTNESS", "AEC", "AGC", "AWB", "ABC", "LED", "AUDIOGAIN", "QS", "NONZEROCOEFFS", "YUVFLAG", - "JPEGFLAG", "BACKLIGHTCOMP", "MIRRORFLAG", "MEASUREDQS", "422FLAG", "USBLOAD", "GAMMA", "GREENGAIN", "AGCLIMIT", "DENOISE", "FRAMERATEADJUST", - "PIXELOUTLIERFILTER", "AGCLOW", "AGCHIGH", "DEVICELOCATION", "FORMATCAP", "FORMATINDEX", "NUMFRAME", "FRAMEINDEX", "FRAMESIZE", "INTERVALTYPE", - "INTERVALINDEX", "INTERVALVALUE", "COLORMATCHING", "PLFREQ", "DEVICEID", "DEVICECAP", "DEVICESPEED", "UVCREQCODE", "UVCREQDATA", "DEVICEID2", - "READMODE", "GAMEPID", "PBUFFER", "READFINISH", "ATTRIBUTE_UNKNOWN"}; +//const char* attributes[] = {"GAIN", "REDBLUEGAIN", "SATURATION", "EXPOSURE", "BRIGHTNESS", "AEC", "AGC", "AWB", "ABC", "LED", "AUDIOGAIN", "QS", "NONZEROCOEFFS", "YUVFLAG", +// "JPEGFLAG", "BACKLIGHTCOMP", "MIRRORFLAG", "MEASUREDQS", "422FLAG", "USBLOAD", "GAMMA", "GREENGAIN", "AGCLIMIT", "DENOISE", "FRAMERATEADJUST", +// "PIXELOUTLIERFILTER", "AGCLOW", "AGCHIGH", "DEVICELOCATION", "FORMATCAP", "FORMATINDEX", "NUMFRAME", "FRAMEINDEX", "FRAMESIZE", "INTERVALTYPE", +// "INTERVALINDEX", "INTERVALVALUE", "COLORMATCHING", "PLFREQ", "DEVICEID", "DEVICECAP", "DEVICESPEED", "UVCREQCODE", "UVCREQDATA", "DEVICEID2", +// "READMODE", "GAMEPID", "PBUFFER", "READFINISH", "ATTRIBUTE_UNKNOWN"}; struct cellCameraInternal { bool m_bInitialized; - CellCamera m_camera; + //CellCamera m_camera; cellCameraInternal() : m_bInitialized(false) @@ -25,7 +25,7 @@ struct cellCameraInternal cellCameraInternal cellCameraInstance; -int cellCameraInit() +s32 cellCameraInit() { cellCamera.Warning("cellCameraInit()"); @@ -37,43 +37,43 @@ int cellCameraInit() if (Ini.CameraType.GetValue() == 1) { - CellCamera camera; - camera.attributes.SATURATION = 164; - camera.attributes.BRIGHTNESS = 96; - camera.attributes.AEC = 1; - camera.attributes.AGC = 1; - camera.attributes.AWB = 1; - camera.attributes.ABC = 0; - camera.attributes.LED = 1; - camera.attributes.QS = 0; - camera.attributes.NONZEROCOEFFS[0] = 32; - camera.attributes.NONZEROCOEFFS[1] = 32; - camera.attributes.YUVFLAG = 0; - camera.attributes.BACKLIGHTCOMP = 0; - camera.attributes.MIRRORFLAG = 1; - camera.attributes._422FLAG = 1; - camera.attributes.USBLOAD = 4; - cellCameraInstance.m_camera = camera; + //CellCamera camera; + //camera.attributes.SATURATION = 164; + //camera.attributes.BRIGHTNESS = 96; + //camera.attributes.AEC = 1; + //camera.attributes.AGC = 1; + //camera.attributes.AWB = 1; + //camera.attributes.ABC = 0; + //camera.attributes.LED = 1; + //camera.attributes.QS = 0; + //camera.attributes.NONZEROCOEFFS[0] = 32; + //camera.attributes.NONZEROCOEFFS[1] = 32; + //camera.attributes.YUVFLAG = 0; + //camera.attributes.BACKLIGHTCOMP = 0; + //camera.attributes.MIRRORFLAG = 1; + //camera.attributes._422FLAG = 1; + //camera.attributes.USBLOAD = 4; + //cellCameraInstance.m_camera = camera; } else if (Ini.CameraType.GetValue() == 2) { - CellCamera camera; - camera.attributes.SATURATION = 64; - camera.attributes.BRIGHTNESS = 8; - camera.attributes.AEC = 1; - camera.attributes.AGC = 1; - camera.attributes.AWB = 1; - camera.attributes.LED = 1; - camera.attributes.BACKLIGHTCOMP = 0; - camera.attributes.MIRRORFLAG = 1; - camera.attributes.GAMMA = 1; - camera.attributes.AGCLIMIT = 4; - camera.attributes.DENOISE = 0; - camera.attributes.FRAMERATEADJUST = 0; - camera.attributes.PIXELOUTLIERFILTER = 1; - camera.attributes.AGCLOW = 48; - camera.attributes.AGCHIGH = 64; - cellCameraInstance.m_camera = camera; + //CellCamera camera; + //camera.attributes.SATURATION = 64; + //camera.attributes.BRIGHTNESS = 8; + //camera.attributes.AEC = 1; + //camera.attributes.AGC = 1; + //camera.attributes.AWB = 1; + //camera.attributes.LED = 1; + //camera.attributes.BACKLIGHTCOMP = 0; + //camera.attributes.MIRRORFLAG = 1; + //camera.attributes.GAMMA = 1; + //camera.attributes.AGCLIMIT = 4; + //camera.attributes.DENOISE = 0; + //camera.attributes.FRAMERATEADJUST = 0; + //camera.attributes.PIXELOUTLIERFILTER = 1; + //camera.attributes.AGCLOW = 48; + //camera.attributes.AGCHIGH = 64; + //cellCameraInstance.m_camera = camera; } // TODO: Some other default attributes? Need to check the actual behaviour on a real PS3. @@ -82,7 +82,7 @@ int cellCameraInit() return CELL_OK; } -int cellCameraEnd() +s32 cellCameraEnd() { cellCamera.Warning("cellCameraEnd()"); @@ -94,13 +94,13 @@ int cellCameraEnd() return CELL_OK; } -int cellCameraOpen() +s32 cellCameraOpen() { UNIMPLEMENTED_FUNC(cellCamera); return CELL_OK; } -int cellCameraOpenEx() +s32 cellCameraOpenEx() { UNIMPLEMENTED_FUNC(cellCamera); @@ -110,7 +110,7 @@ int cellCameraOpenEx() return CELL_OK; } -int cellCameraClose() +s32 cellCameraClose() { UNIMPLEMENTED_FUNC(cellCamera); @@ -120,7 +120,7 @@ int cellCameraClose() return CELL_OK; } -int cellCameraGetDeviceGUID() +s32 cellCameraGetDeviceGUID() { UNIMPLEMENTED_FUNC(cellCamera); @@ -130,9 +130,9 @@ int cellCameraGetDeviceGUID() return CELL_OK; } -int cellCameraGetType(s32 dev_num, vm::ptr type) +s32 cellCameraGetType(s32 dev_num, vm::ptr type) { - cellCamera.Warning("cellCameraGetType(dev_num=%d, type_addr=0x%x)", dev_num, type.addr()); + cellCamera.Warning("cellCameraGetType(dev_num=%d, type=*0x%x)", dev_num, type); if (!cellCameraInstance.m_bInitialized) return CELL_CAMERA_ERROR_NOT_INIT; @@ -148,271 +148,271 @@ int cellCameraGetType(s32 dev_num, vm::ptr type) return CELL_OK; } -int cellCameraIsAvailable() +s32 cellCameraIsAvailable() { UNIMPLEMENTED_FUNC(cellCamera); return CELL_OK; } -int cellCameraIsAttached() +s32 cellCameraIsAttached() { UNIMPLEMENTED_FUNC(cellCamera); return CELL_OK; } -int cellCameraIsOpen() +s32 cellCameraIsOpen() { UNIMPLEMENTED_FUNC(cellCamera); return CELL_OK; } -int cellCameraIsStarted() +s32 cellCameraIsStarted() { UNIMPLEMENTED_FUNC(cellCamera); return CELL_OK; } -int cellCameraGetAttribute(s32 dev_num, CellCameraAttribute attrib, vm::ptr arg1, vm::ptr arg2) +s32 cellCameraGetAttribute(s32 dev_num, s32 attrib, vm::ptr arg1, vm::ptr arg2) { - cellCamera.Warning("cellCameraGetAttribute(dev_num=%d, attrib=%s(%d), arg1=0x%x, arg2=0x%x)", dev_num, attributes[attrib], arg1.addr(), arg2.addr()); + cellCamera.Warning("cellCameraGetAttribute(dev_num=%d, attrib=%d, arg1=*0x%x, arg2=*0x%x)", dev_num, attrib, arg1, arg2); if (!cellCameraInstance.m_bInitialized) return CELL_CAMERA_ERROR_NOT_INIT; - switch (attrib) - { - case 0: - *arg1 = cellCameraInstance.m_camera.attributes.GAIN; break; - case 1: - *arg1 = cellCameraInstance.m_camera.attributes.REDBLUEGAIN; break; - case 2: - *arg1 = cellCameraInstance.m_camera.attributes.SATURATION; break; - case 3: - *arg1 = cellCameraInstance.m_camera.attributes.EXPOSURE; break; - case 4: - *arg1 = cellCameraInstance.m_camera.attributes.BRIGHTNESS; break; - case 5: - *arg1 = cellCameraInstance.m_camera.attributes.AEC; break; - case 6: - *arg1 = cellCameraInstance.m_camera.attributes.AGC; break; - case 7: - *arg1 = cellCameraInstance.m_camera.attributes.AWB; break; - case 8: - *arg1 = cellCameraInstance.m_camera.attributes.ABC; break; - case 9: - *arg1 = cellCameraInstance.m_camera.attributes.LED; break; - case 10: - *arg1 = cellCameraInstance.m_camera.attributes.AUDIOGAIN; break; - case 11: - *arg1 = cellCameraInstance.m_camera.attributes.QS; break; - case 12: - { - *arg1 = cellCameraInstance.m_camera.attributes.NONZEROCOEFFS[0]; - *arg2 = cellCameraInstance.m_camera.attributes.NONZEROCOEFFS[1]; - break; - } - case 13: - *arg1 = cellCameraInstance.m_camera.attributes.YUVFLAG; break; - case 14: - *arg1 = cellCameraInstance.m_camera.attributes.JPEGFLAG; break; - case 15: - *arg1 = cellCameraInstance.m_camera.attributes.BACKLIGHTCOMP; break; - case 16: - *arg1 = cellCameraInstance.m_camera.attributes.MIRRORFLAG; break; - case 17: - *arg1 = cellCameraInstance.m_camera.attributes.MEASUREDQS; break; - case 18: - *arg1 = cellCameraInstance.m_camera.attributes._422FLAG; break; - case 19: - *arg1 = cellCameraInstance.m_camera.attributes.USBLOAD; break; - case 20: - *arg1 = cellCameraInstance.m_camera.attributes.GAMMA; break; - case 21: - *arg1 = cellCameraInstance.m_camera.attributes.GREENGAIN; break; - case 22: - *arg1 = cellCameraInstance.m_camera.attributes.AGCLIMIT; break; - case 23: - *arg1 = cellCameraInstance.m_camera.attributes.DENOISE; break; - case 24: - *arg1 = cellCameraInstance.m_camera.attributes.FRAMERATEADJUST; break; - case 25: - *arg1 = cellCameraInstance.m_camera.attributes.PIXELOUTLIERFILTER; break; - case 26: - *arg1 = cellCameraInstance.m_camera.attributes.AGCLOW; break; - case 27: - *arg1 = cellCameraInstance.m_camera.attributes.AGCHIGH; break; - case 28: - *arg1 = cellCameraInstance.m_camera.attributes.DEVICELOCATION; break; - case 29: - *arg1 = cellCameraInstance.m_camera.attributes.FORMATCAP; break; - case 30: - *arg1 = cellCameraInstance.m_camera.attributes.FORMATINDEX; break; - case 31: - *arg1 = cellCameraInstance.m_camera.attributes.NUMFRAME; break; - case 32: - *arg1 = cellCameraInstance.m_camera.attributes.FRAMEINDEX; break; - case 33: - *arg1 = cellCameraInstance.m_camera.attributes.FRAMESIZE; break; - case 34: - *arg1 = cellCameraInstance.m_camera.attributes.INTERVALTYPE; break; - case 35: - *arg1 = cellCameraInstance.m_camera.attributes.INTERVALINDEX; break; - case 36: - *arg1 = cellCameraInstance.m_camera.attributes.INTERVALVALUE; break; - case 37: - *arg1 = cellCameraInstance.m_camera.attributes.COLORMATCHING; break; - case 38: - *arg1 = cellCameraInstance.m_camera.attributes.PLFREQ; break; - case 39: - *arg1 = cellCameraInstance.m_camera.attributes.DEVICEID; break; - case 40: - *arg1 = cellCameraInstance.m_camera.attributes.DEVICECAP; break; - case 41: - *arg1 = cellCameraInstance.m_camera.attributes.DEVICESPEED; break; - case 42: - *arg1 = cellCameraInstance.m_camera.attributes.UVCREQCODE; break; - case 43: - *arg1 = cellCameraInstance.m_camera.attributes.UVCREQDATA; break; - case 44: - *arg1 = cellCameraInstance.m_camera.attributes.DEVICEID2; break; - case 45: - *arg1 = cellCameraInstance.m_camera.attributes.READMODE; break; - case 46: - *arg1 = cellCameraInstance.m_camera.attributes.GAMEPID; break; - case 47: - *arg1 = cellCameraInstance.m_camera.attributes.PBUFFER; break; - case 48: - *arg1 = cellCameraInstance.m_camera.attributes.READFINISH; break; - case 49: - *arg1 = cellCameraInstance.m_camera.attributes.ATTRIBUTE_UNKNOWN; break; - default: - cellCamera.Error("Unexpected cellCameraGetAttribute attribute: %d", attrib); break; - } + //switch (attrib) + //{ + //case 0: + // *arg1 = cellCameraInstance.m_camera.attributes.GAIN; break; + //case 1: + // *arg1 = cellCameraInstance.m_camera.attributes.REDBLUEGAIN; break; + //case 2: + // *arg1 = cellCameraInstance.m_camera.attributes.SATURATION; break; + //case 3: + // *arg1 = cellCameraInstance.m_camera.attributes.EXPOSURE; break; + //case 4: + // *arg1 = cellCameraInstance.m_camera.attributes.BRIGHTNESS; break; + //case 5: + // *arg1 = cellCameraInstance.m_camera.attributes.AEC; break; + //case 6: + // *arg1 = cellCameraInstance.m_camera.attributes.AGC; break; + //case 7: + // *arg1 = cellCameraInstance.m_camera.attributes.AWB; break; + //case 8: + // *arg1 = cellCameraInstance.m_camera.attributes.ABC; break; + //case 9: + // *arg1 = cellCameraInstance.m_camera.attributes.LED; break; + //case 10: + // *arg1 = cellCameraInstance.m_camera.attributes.AUDIOGAIN; break; + //case 11: + // *arg1 = cellCameraInstance.m_camera.attributes.QS; break; + //case 12: + //{ + // *arg1 = cellCameraInstance.m_camera.attributes.NONZEROCOEFFS[0]; + // *arg2 = cellCameraInstance.m_camera.attributes.NONZEROCOEFFS[1]; + // break; + //} + //case 13: + // *arg1 = cellCameraInstance.m_camera.attributes.YUVFLAG; break; + //case 14: + // *arg1 = cellCameraInstance.m_camera.attributes.JPEGFLAG; break; + //case 15: + // *arg1 = cellCameraInstance.m_camera.attributes.BACKLIGHTCOMP; break; + //case 16: + // *arg1 = cellCameraInstance.m_camera.attributes.MIRRORFLAG; break; + //case 17: + // *arg1 = cellCameraInstance.m_camera.attributes.MEASUREDQS; break; + //case 18: + // *arg1 = cellCameraInstance.m_camera.attributes._422FLAG; break; + //case 19: + // *arg1 = cellCameraInstance.m_camera.attributes.USBLOAD; break; + //case 20: + // *arg1 = cellCameraInstance.m_camera.attributes.GAMMA; break; + //case 21: + // *arg1 = cellCameraInstance.m_camera.attributes.GREENGAIN; break; + //case 22: + // *arg1 = cellCameraInstance.m_camera.attributes.AGCLIMIT; break; + //case 23: + // *arg1 = cellCameraInstance.m_camera.attributes.DENOISE; break; + //case 24: + // *arg1 = cellCameraInstance.m_camera.attributes.FRAMERATEADJUST; break; + //case 25: + // *arg1 = cellCameraInstance.m_camera.attributes.PIXELOUTLIERFILTER; break; + //case 26: + // *arg1 = cellCameraInstance.m_camera.attributes.AGCLOW; break; + //case 27: + // *arg1 = cellCameraInstance.m_camera.attributes.AGCHIGH; break; + //case 28: + // *arg1 = cellCameraInstance.m_camera.attributes.DEVICELOCATION; break; + //case 29: + // *arg1 = cellCameraInstance.m_camera.attributes.FORMATCAP; break; + //case 30: + // *arg1 = cellCameraInstance.m_camera.attributes.FORMATINDEX; break; + //case 31: + // *arg1 = cellCameraInstance.m_camera.attributes.NUMFRAME; break; + //case 32: + // *arg1 = cellCameraInstance.m_camera.attributes.FRAMEINDEX; break; + //case 33: + // *arg1 = cellCameraInstance.m_camera.attributes.FRAMESIZE; break; + //case 34: + // *arg1 = cellCameraInstance.m_camera.attributes.INTERVALTYPE; break; + //case 35: + // *arg1 = cellCameraInstance.m_camera.attributes.INTERVALINDEX; break; + //case 36: + // *arg1 = cellCameraInstance.m_camera.attributes.INTERVALVALUE; break; + //case 37: + // *arg1 = cellCameraInstance.m_camera.attributes.COLORMATCHING; break; + //case 38: + // *arg1 = cellCameraInstance.m_camera.attributes.PLFREQ; break; + //case 39: + // *arg1 = cellCameraInstance.m_camera.attributes.DEVICEID; break; + //case 40: + // *arg1 = cellCameraInstance.m_camera.attributes.DEVICECAP; break; + //case 41: + // *arg1 = cellCameraInstance.m_camera.attributes.DEVICESPEED; break; + //case 42: + // *arg1 = cellCameraInstance.m_camera.attributes.UVCREQCODE; break; + //case 43: + // *arg1 = cellCameraInstance.m_camera.attributes.UVCREQDATA; break; + //case 44: + // *arg1 = cellCameraInstance.m_camera.attributes.DEVICEID2; break; + //case 45: + // *arg1 = cellCameraInstance.m_camera.attributes.READMODE; break; + //case 46: + // *arg1 = cellCameraInstance.m_camera.attributes.GAMEPID; break; + //case 47: + // *arg1 = cellCameraInstance.m_camera.attributes.PBUFFER; break; + //case 48: + // *arg1 = cellCameraInstance.m_camera.attributes.READFINISH; break; + //case 49: + // *arg1 = cellCameraInstance.m_camera.attributes.ATTRIBUTE_UNKNOWN; break; + //default: + // cellCamera.Error("Unexpected cellCameraGetAttribute attribute: %d", attrib); break; + //} return CELL_OK; } -int cellCameraSetAttribute(s32 dev_num, CellCameraAttribute attrib, u32 arg1, u32 arg2) +s32 cellCameraSetAttribute(s32 dev_num, s32 attrib, u32 arg1, u32 arg2) { - cellCamera.Warning("cellCameraSetAttribute(dev_num=%d, attrib=%s(%d), arg1=%d, arg2=%d)", dev_num, attributes[attrib], attrib, arg1, arg2); + cellCamera.Warning("cellCameraSetAttribute(dev_num=%d, attrib=%d, arg1=%d, arg2=%d)", dev_num, attrib, arg1, arg2); if (!cellCameraInstance.m_bInitialized) return CELL_CAMERA_ERROR_NOT_INIT; - switch (attrib) - { - case 0: - cellCameraInstance.m_camera.attributes.GAIN = arg1; break; - case 1: - cellCameraInstance.m_camera.attributes.REDBLUEGAIN = arg1; break; - case 2: - cellCameraInstance.m_camera.attributes.SATURATION = arg1; break; - case 3: - cellCameraInstance.m_camera.attributes.EXPOSURE = arg1; break; - case 4: - cellCameraInstance.m_camera.attributes.BRIGHTNESS = arg1; break; - case 5: - cellCameraInstance.m_camera.attributes.AEC = arg1; break; - case 6: - cellCameraInstance.m_camera.attributes.AGC = arg1; break; - case 7: - cellCameraInstance.m_camera.attributes.AWB = arg1; break; - case 8: - cellCameraInstance.m_camera.attributes.ABC = arg1; break; - case 9: - cellCameraInstance.m_camera.attributes.LED = arg1; break; - case 10: - cellCameraInstance.m_camera.attributes.AUDIOGAIN = arg1; break; - case 11: - cellCameraInstance.m_camera.attributes.QS = arg1; break; - case 12: - { - cellCameraInstance.m_camera.attributes.NONZEROCOEFFS[0] = arg1; - cellCameraInstance.m_camera.attributes.NONZEROCOEFFS[1] = arg2; - break; - } - case 13: - cellCameraInstance.m_camera.attributes.YUVFLAG = arg1; break; - case 14: - cellCameraInstance.m_camera.attributes.JPEGFLAG = arg1; break; - case 15: - cellCameraInstance.m_camera.attributes.BACKLIGHTCOMP = arg1; break; - case 16: - cellCameraInstance.m_camera.attributes.MIRRORFLAG = arg1; break; - case 17: - return CELL_CAMERA_ERROR_PARAM; break; - case 18: - cellCameraInstance.m_camera.attributes._422FLAG = arg1; break; - case 19: - cellCameraInstance.m_camera.attributes.USBLOAD = arg1; break; - case 20: - cellCameraInstance.m_camera.attributes.GAMMA = arg1; break; - case 21: - cellCameraInstance.m_camera.attributes.GREENGAIN = arg1; break; - case 22: - cellCameraInstance.m_camera.attributes.AGCLIMIT = arg1; break; - case 23: - cellCameraInstance.m_camera.attributes.DENOISE = arg1; break; - case 24: - cellCameraInstance.m_camera.attributes.FRAMERATEADJUST = arg1; break; - case 25: - cellCameraInstance.m_camera.attributes.PIXELOUTLIERFILTER = arg1; break; - case 26: - cellCameraInstance.m_camera.attributes.AGCLOW = arg1; break; - case 27: - cellCameraInstance.m_camera.attributes.AGCHIGH = arg1; break; - case 28: - cellCameraInstance.m_camera.attributes.DEVICELOCATION = arg1; break; - case 29: - cellCamera.Error("Tried to write to read-only (?) value: FORMATCAP"); break; - case 30: - cellCameraInstance.m_camera.attributes.FORMATINDEX = arg1; break; - case 31: - cellCameraInstance.m_camera.attributes.NUMFRAME = arg1; break; - case 32: - cellCameraInstance.m_camera.attributes.FRAMEINDEX = arg1; break; - case 33: - cellCameraInstance.m_camera.attributes.FRAMESIZE = arg1; break; - case 34: - cellCameraInstance.m_camera.attributes.INTERVALTYPE = arg1; break; - case 35: - cellCameraInstance.m_camera.attributes.INTERVALINDEX = arg1; break; - case 36: - cellCameraInstance.m_camera.attributes.INTERVALVALUE = arg1; break; - case 37: - cellCameraInstance.m_camera.attributes.COLORMATCHING = arg1; break; - case 38: - cellCameraInstance.m_camera.attributes.PLFREQ = arg1; break; - case 39: - return CELL_CAMERA_ERROR_PARAM; break; - case 40: - cellCameraInstance.m_camera.attributes.DEVICECAP = arg1; break; - case 41: - cellCameraInstance.m_camera.attributes.DEVICESPEED = arg1; break; - case 42: - cellCameraInstance.m_camera.attributes.UVCREQCODE = arg1; break; - case 43: - cellCameraInstance.m_camera.attributes.UVCREQDATA = arg1; break; - case 44: - return CELL_CAMERA_ERROR_PARAM; break; - case 45: - cellCamera.Error("Tried to write to read-only (?) value: READMODE"); break; - case 46: - cellCameraInstance.m_camera.attributes.GAMEPID = arg1; break; - case 47: - cellCameraInstance.m_camera.attributes.PBUFFER = arg1; break; - case 48: - cellCameraInstance.m_camera.attributes.READFINISH = arg1; break; - case 49: - cellCamera.Error("Tried to write to read-only (?) value: ATTRIBUTE_UNKNOWN"); break; - default: - cellCamera.Error("Unexpected cellCameraGetAttribute attribute: %d", attrib); break; - } + //switch (attrib) + //{ + //case 0: + // cellCameraInstance.m_camera.attributes.GAIN = arg1; break; + //case 1: + // cellCameraInstance.m_camera.attributes.REDBLUEGAIN = arg1; break; + //case 2: + // cellCameraInstance.m_camera.attributes.SATURATION = arg1; break; + //case 3: + // cellCameraInstance.m_camera.attributes.EXPOSURE = arg1; break; + //case 4: + // cellCameraInstance.m_camera.attributes.BRIGHTNESS = arg1; break; + //case 5: + // cellCameraInstance.m_camera.attributes.AEC = arg1; break; + //case 6: + // cellCameraInstance.m_camera.attributes.AGC = arg1; break; + //case 7: + // cellCameraInstance.m_camera.attributes.AWB = arg1; break; + //case 8: + // cellCameraInstance.m_camera.attributes.ABC = arg1; break; + //case 9: + // cellCameraInstance.m_camera.attributes.LED = arg1; break; + //case 10: + // cellCameraInstance.m_camera.attributes.AUDIOGAIN = arg1; break; + //case 11: + // cellCameraInstance.m_camera.attributes.QS = arg1; break; + //case 12: + //{ + // cellCameraInstance.m_camera.attributes.NONZEROCOEFFS[0] = arg1; + // cellCameraInstance.m_camera.attributes.NONZEROCOEFFS[1] = arg2; + // break; + //} + //case 13: + // cellCameraInstance.m_camera.attributes.YUVFLAG = arg1; break; + //case 14: + // cellCameraInstance.m_camera.attributes.JPEGFLAG = arg1; break; + //case 15: + // cellCameraInstance.m_camera.attributes.BACKLIGHTCOMP = arg1; break; + //case 16: + // cellCameraInstance.m_camera.attributes.MIRRORFLAG = arg1; break; + //case 17: + // return CELL_CAMERA_ERROR_PARAM; break; + //case 18: + // cellCameraInstance.m_camera.attributes._422FLAG = arg1; break; + //case 19: + // cellCameraInstance.m_camera.attributes.USBLOAD = arg1; break; + //case 20: + // cellCameraInstance.m_camera.attributes.GAMMA = arg1; break; + //case 21: + // cellCameraInstance.m_camera.attributes.GREENGAIN = arg1; break; + //case 22: + // cellCameraInstance.m_camera.attributes.AGCLIMIT = arg1; break; + //case 23: + // cellCameraInstance.m_camera.attributes.DENOISE = arg1; break; + //case 24: + // cellCameraInstance.m_camera.attributes.FRAMERATEADJUST = arg1; break; + //case 25: + // cellCameraInstance.m_camera.attributes.PIXELOUTLIERFILTER = arg1; break; + //case 26: + // cellCameraInstance.m_camera.attributes.AGCLOW = arg1; break; + //case 27: + // cellCameraInstance.m_camera.attributes.AGCHIGH = arg1; break; + //case 28: + // cellCameraInstance.m_camera.attributes.DEVICELOCATION = arg1; break; + //case 29: + // cellCamera.Error("Tried to write to read-only (?) value: FORMATCAP"); break; + //case 30: + // cellCameraInstance.m_camera.attributes.FORMATINDEX = arg1; break; + //case 31: + // cellCameraInstance.m_camera.attributes.NUMFRAME = arg1; break; + //case 32: + // cellCameraInstance.m_camera.attributes.FRAMEINDEX = arg1; break; + //case 33: + // cellCameraInstance.m_camera.attributes.FRAMESIZE = arg1; break; + //case 34: + // cellCameraInstance.m_camera.attributes.INTERVALTYPE = arg1; break; + //case 35: + // cellCameraInstance.m_camera.attributes.INTERVALINDEX = arg1; break; + //case 36: + // cellCameraInstance.m_camera.attributes.INTERVALVALUE = arg1; break; + //case 37: + // cellCameraInstance.m_camera.attributes.COLORMATCHING = arg1; break; + //case 38: + // cellCameraInstance.m_camera.attributes.PLFREQ = arg1; break; + //case 39: + // return CELL_CAMERA_ERROR_PARAM; break; + //case 40: + // cellCameraInstance.m_camera.attributes.DEVICECAP = arg1; break; + //case 41: + // cellCameraInstance.m_camera.attributes.DEVICESPEED = arg1; break; + //case 42: + // cellCameraInstance.m_camera.attributes.UVCREQCODE = arg1; break; + //case 43: + // cellCameraInstance.m_camera.attributes.UVCREQDATA = arg1; break; + //case 44: + // return CELL_CAMERA_ERROR_PARAM; break; + //case 45: + // cellCamera.Error("Tried to write to read-only (?) value: READMODE"); break; + //case 46: + // cellCameraInstance.m_camera.attributes.GAMEPID = arg1; break; + //case 47: + // cellCameraInstance.m_camera.attributes.PBUFFER = arg1; break; + //case 48: + // cellCameraInstance.m_camera.attributes.READFINISH = arg1; break; + //case 49: + // cellCamera.Error("Tried to write to read-only (?) value: ATTRIBUTE_UNKNOWN"); break; + //default: + // cellCamera.Error("Unexpected cellCameraGetAttribute attribute: %d", attrib); break; + //} return CELL_OK; } -int cellCameraGetBufferSize() +s32 cellCameraGetBufferSize() { UNIMPLEMENTED_FUNC(cellCamera); @@ -422,13 +422,13 @@ int cellCameraGetBufferSize() return CELL_OK; } -int cellCameraGetBufferInfo() +s32 cellCameraGetBufferInfo() { UNIMPLEMENTED_FUNC(cellCamera); return CELL_OK; } -int cellCameraGetBufferInfoEx() +s32 cellCameraGetBufferInfoEx() { UNIMPLEMENTED_FUNC(cellCamera); @@ -438,31 +438,31 @@ int cellCameraGetBufferInfoEx() return CELL_OK; } -int cellCameraPrepExtensionUnit() +s32 cellCameraPrepExtensionUnit() { UNIMPLEMENTED_FUNC(cellCamera); return CELL_OK; } -int cellCameraCtrlExtensionUnit() +s32 cellCameraCtrlExtensionUnit() { UNIMPLEMENTED_FUNC(cellCamera); return CELL_OK; } -int cellCameraGetExtensionUnit() +s32 cellCameraGetExtensionUnit() { UNIMPLEMENTED_FUNC(cellCamera); return CELL_OK; } -int cellCameraSetExtensionUnit() +s32 cellCameraSetExtensionUnit() { UNIMPLEMENTED_FUNC(cellCamera); return CELL_OK; } -int cellCameraReset() +s32 cellCameraReset() { UNIMPLEMENTED_FUNC(cellCamera); @@ -472,7 +472,7 @@ int cellCameraReset() return CELL_OK; } -int cellCameraStart() +s32 cellCameraStart() { UNIMPLEMENTED_FUNC(cellCamera); @@ -482,7 +482,7 @@ int cellCameraStart() return CELL_OK; } -int cellCameraRead() +s32 cellCameraRead() { UNIMPLEMENTED_FUNC(cellCamera); @@ -492,7 +492,7 @@ int cellCameraRead() return CELL_OK; } -int cellCameraReadEx() +s32 cellCameraReadEx() { UNIMPLEMENTED_FUNC(cellCamera); @@ -502,7 +502,7 @@ int cellCameraReadEx() return CELL_OK; } -int cellCameraReadComplete() +s32 cellCameraReadComplete() { UNIMPLEMENTED_FUNC(cellCamera); @@ -512,7 +512,7 @@ int cellCameraReadComplete() return CELL_OK; } -int cellCameraStop() +s32 cellCameraStop() { UNIMPLEMENTED_FUNC(cellCamera); @@ -522,7 +522,7 @@ int cellCameraStop() return CELL_OK; } -int cellCameraSetNotifyEventQueue() +s32 cellCameraSetNotifyEventQueue() { UNIMPLEMENTED_FUNC(cellCamera); @@ -532,7 +532,7 @@ int cellCameraSetNotifyEventQueue() return CELL_OK; } -int cellCameraRemoveNotifyEventQueue() +s32 cellCameraRemoveNotifyEventQueue() { UNIMPLEMENTED_FUNC(cellCamera); @@ -542,7 +542,7 @@ int cellCameraRemoveNotifyEventQueue() return CELL_OK; } -int cellCameraSetNotifyEventQueue2() +s32 cellCameraSetNotifyEventQueue2() { UNIMPLEMENTED_FUNC(cellCamera); @@ -552,7 +552,7 @@ int cellCameraSetNotifyEventQueue2() return CELL_OK; } -int cellCameraRemoveNotifyEventQueue2() +s32 cellCameraRemoveNotifyEventQueue2() { UNIMPLEMENTED_FUNC(cellCamera); diff --git a/rpcs3/Emu/SysCalls/Modules/cellCamera.h b/rpcs3/Emu/SysCalls/Modules/cellCamera.h index e1bc6362ea..c2af508a8b 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellCamera.h +++ b/rpcs3/Emu/SysCalls/Modules/cellCamera.h @@ -194,7 +194,7 @@ enum }; // Camera types -enum CellCameraType +enum CellCameraType : s32 { CELL_CAMERA_TYPE_UNKNOWN, CELL_CAMERA_EYETOY, @@ -203,7 +203,7 @@ enum CellCameraType }; // Image format -enum CellCameraFormat +enum CellCameraFormat : s32 { CELL_CAMERA_FORMAT_UNKNOWN, CELL_CAMERA_JPG, @@ -217,7 +217,7 @@ enum CellCameraFormat }; // Image resolution -enum CellCameraResolution +enum CellCameraResolution : s32 { CELL_CAMERA_RESOLUTION_UNKNOWN, CELL_CAMERA_VGA, @@ -227,7 +227,7 @@ enum CellCameraResolution }; // Camera attributes -enum CellCameraAttribute +enum CellCameraAttribute : s32 { CELL_CAMERA_GAIN, CELL_CAMERA_REDBLUEGAIN, @@ -286,84 +286,21 @@ enum CellCameraAttribute struct CellCameraInfoEx { - CellCameraFormat format; - CellCameraResolution resolution; + be_t format; // CellCameraFormat + be_t resolution; // CellCameraResolution be_t framerate; - be_t buffer; + + vm::bptr buffer; be_t bytesize; be_t width; be_t height; be_t dev_num; be_t guid; + be_t info_ver; be_t container; be_t read_mode; - be_t pbuf[2]; -}; - -// Custom struct for keeping track of camera attributes -struct CellCameraAttributes -{ - u32 GAIN; - u32 REDBLUEGAIN; - u32 SATURATION; - u32 EXPOSURE; - u32 BRIGHTNESS; - u32 AEC; - u32 AGC; - u32 AWB; - u32 ABC; - u32 LED; - u32 AUDIOGAIN; - u32 QS; - u32 NONZEROCOEFFS[2]; - u32 YUVFLAG; - u32 JPEGFLAG; - u32 BACKLIGHTCOMP; - u32 MIRRORFLAG; - u32 MEASUREDQS; - u32 _422FLAG; - u32 USBLOAD; - u32 GAMMA; - u32 GREENGAIN; - u32 AGCLIMIT; - u32 DENOISE; - u32 FRAMERATEADJUST; - u32 PIXELOUTLIERFILTER; - u32 AGCLOW; - u32 AGCHIGH; - u32 DEVICELOCATION; - - u32 FORMATCAP = 100; - u32 FORMATINDEX; - u32 NUMFRAME; - u32 FRAMEINDEX; - u32 FRAMESIZE; - u32 INTERVALTYPE; - u32 INTERVALINDEX; - u32 INTERVALVALUE; - u32 COLORMATCHING; - u32 PLFREQ; - u32 DEVICEID; - u32 DEVICECAP; - u32 DEVICESPEED; - u32 UVCREQCODE; - u32 UVCREQDATA; - u32 DEVICEID2; - - u32 READMODE = 300; - u32 GAMEPID; - u32 PBUFFER; - u32 READFINISH; - - u32 ATTRIBUTE_UNKNOWN = 500; -}; - -// Custom struct to keep track of cameras -struct CellCamera -{ - CellCameraAttributes attributes; - CellCameraInfoEx info; + vm::bptr pbuf[2]; }; struct CellCameraReadEx @@ -371,6 +308,13 @@ struct CellCameraReadEx be_t version; be_t frame; be_t bytesread; - //system_time_t timestamp; // TODO: Replace this with something - be_t pbuf; -}; \ No newline at end of file + be_t timestamp; + vm::bptr pbuf; +}; + +// Custom struct to keep track of cameras +struct Camera +{ + u32 attr[512]; + //CellCameraInfoEx info; +}; diff --git a/rpcs3/Emu/SysCalls/Modules/cellDmux.cpp b/rpcs3/Emu/SysCalls/Modules/cellDmux.cpp index 1ed9b97ec0..ccf1b5b48d 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellDmux.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellDmux.cpp @@ -169,7 +169,7 @@ void ElementaryStream::push_au(u32 size, u64 dts, u64 pts, u64 userdata, bool ra info->reserved = 0; info->userData = userdata; - auto spec = vm::ptr::make(put + sizeof(CellDmuxAuInfoEx)); + auto spec = vm::ptr::make(put + sizeof32(CellDmuxAuInfoEx)); *spec = specific; auto inf = vm::ptr::make(put + 64); diff --git a/rpcs3/Emu/SysCalls/Modules/cellDmux.h b/rpcs3/Emu/SysCalls/Modules/cellDmux.h index 011389a65e..68aff5fd8f 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellDmux.h +++ b/rpcs3/Emu/SysCalls/Modules/cellDmux.h @@ -12,27 +12,27 @@ enum CELL_DMUX_ERROR_FATAL = 0x80610205, }; -enum CellDmuxStreamType +enum CellDmuxStreamType : s32 { CELL_DMUX_STREAM_TYPE_UNDEF = 0, CELL_DMUX_STREAM_TYPE_PAMF = 1, CELL_DMUX_STREAM_TYPE_TERMINATOR = 2, }; -enum CellDmuxMsgType +enum CellDmuxMsgType : s32 { CELL_DMUX_MSG_TYPE_DEMUX_DONE = 0, CELL_DMUX_MSG_TYPE_FATAL_ERR = 1, CELL_DMUX_MSG_TYPE_PROG_END_CODE = 2, }; -enum CellDmuxEsMsgType +enum CellDmuxEsMsgType : s32 { CELL_DMUX_ES_MSG_TYPE_AU_FOUND = 0, CELL_DMUX_ES_MSG_TYPE_FLUSH_DONE = 1, }; -enum CellDmuxPamfM2vLevel +enum CellDmuxPamfM2vLevel : s32 { CELL_DMUX_PAMF_M2V_MP_LL = 0, CELL_DMUX_PAMF_M2V_MP_ML, @@ -40,7 +40,7 @@ enum CellDmuxPamfM2vLevel CELL_DMUX_PAMF_M2V_MP_HL, }; -enum CellDmuxPamfAvcLevel +enum CellDmuxPamfAvcLevel : s32 { CELL_DMUX_PAMF_AVC_LEVEL_2P1 = 21, CELL_DMUX_PAMF_AVC_LEVEL_3P0 = 30, @@ -114,18 +114,18 @@ struct CellDmuxPamfEsSpecificInfoUserData be_t reserved1; }; -enum CellDmuxPamfSamplingFrequency +enum CellDmuxPamfSamplingFrequency : s32 { CELL_DMUX_PAMF_FS_48K = 48000, }; -enum CellDmuxPamfBitsPerSample +enum CellDmuxPamfBitsPerSample : s32 { CELL_DMUX_PAMF_BITS_PER_SAMPLE_16 = 16, CELL_DMUX_PAMF_BITS_PER_SAMPLE_24 = 24, }; -enum CellDmuxPamfLpcmChannelAssignmentInfo +enum CellDmuxPamfLpcmChannelAssignmentInfo : s32 { CELL_DMUX_PAMF_LPCM_CH_M1 = 1, CELL_DMUX_PAMF_LPCM_CH_LR = 3, @@ -133,12 +133,12 @@ enum CellDmuxPamfLpcmChannelAssignmentInfo CELL_DMUX_PAMF_LPCM_CH_LRCLSCS1CS2RSLFE = 11, }; -enum CellDmuxPamfLpcmFs +enum CellDmuxPamfLpcmFs : s32 { CELL_DMUX_PAMF_LPCM_FS_48K = 1, }; -enum CellDmuxPamfLpcmBitsPerSamples +enum CellDmuxPamfLpcmBitsPerSamples : s32 { CELL_DMUX_PAMF_LPCM_BITS_PER_SAMPLE_16 = 1, CELL_DMUX_PAMF_LPCM_BITS_PER_SAMPLE_24 = 3, @@ -146,20 +146,20 @@ enum CellDmuxPamfLpcmBitsPerSamples struct CellDmuxMsg { - be_t msgType; //CellDmuxMsgType enum + be_t msgType; // CellDmuxMsgType be_t supplementalInfo; }; struct CellDmuxEsMsg { - be_t msgType; //CellDmuxEsMsgType enum + be_t msgType; // CellDmuxEsMsgType be_t supplementalInfo; }; struct CellDmuxType { - be_t streamType; - be_t reserved[2]; //0 + be_t streamType; // CellDmuxStreamType + be_t reserved[2]; }; struct CellDmuxPamfSpecificInfo @@ -170,7 +170,7 @@ struct CellDmuxPamfSpecificInfo struct CellDmuxType2 { - be_t streamType; + be_t streamType; // CellDmuxStreamType be_t streamSpecificInfo; }; @@ -219,7 +219,7 @@ struct CellDmuxResource2 be_t shit[4]; }; -typedef u32(CellDmuxCbMsg)(u32 demuxerHandle, vm::ptr demuxerMsg, u32 cbArg); +using CellDmuxCbMsg = func_def demuxerMsg, u32 cbArg)>; struct CellDmuxCb { @@ -227,7 +227,7 @@ struct CellDmuxCb be_t cbArg; }; -typedef u32(CellDmuxCbEsMsg)(u32 demuxerHandle, u32 esHandle, vm::ptr esMsg, u32 cbArg); +using CellDmuxCbEsMsg = func_def esMsg, u32 cbArg)>; struct CellDmuxEsCb { diff --git a/rpcs3/Emu/SysCalls/Modules/cellFont.cpp b/rpcs3/Emu/SysCalls/Modules/cellFont.cpp index 7d2e4c0d8b..5b650a15dd 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellFont.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellFont.cpp @@ -417,11 +417,11 @@ int cellFontGetCharGlyphMetrics(vm::ptr font, u32 code, vm::ptrwidth = (x1-x0) * scale; metrics->height = (y1-y0) * scale; metrics->Horizontal.bearingX = (float)leftSideBearing * scale; - metrics->Horizontal.bearingY = 0; + metrics->Horizontal.bearingY = 0.f; metrics->Horizontal.advance = (float)advanceWidth * scale; - metrics->Vertical.bearingX = 0; - metrics->Vertical.bearingY = 0; - metrics->Vertical.advance = 0; + metrics->Vertical.bearingX = 0.f; + metrics->Vertical.bearingY = 0.f; + metrics->Vertical.advance = 0.f; return CELL_FONT_OK; } diff --git a/rpcs3/Emu/SysCalls/Modules/cellFs.cpp b/rpcs3/Emu/SysCalls/Modules/cellFs.cpp index 7caf96266a..db7c587a7e 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellFs.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellFs.cpp @@ -320,7 +320,7 @@ s32 cellFsStReadInit(u32 fd, vm::cptr ringbuf) return CELL_FS_EINVAL; } - if (ringbuf->block_size.data() & se64(0xfff)) // check if a multiple of sector size + if (ringbuf->block_size & 0xfff) // check if a multiple of sector size { return CELL_FS_EINVAL; } diff --git a/rpcs3/Emu/SysCalls/Modules/cellGcmSys.cpp b/rpcs3/Emu/SysCalls/Modules/cellGcmSys.cpp index a1c160532e..607c81fbc8 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellGcmSys.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellGcmSys.cpp @@ -63,8 +63,8 @@ CellGcmOffsetTable offsetTable; void InitOffsetTable() { - offsetTable.ioAddress.set(be_t::make((u32)Memory.Alloc(3072 * sizeof(u16), 1))); - offsetTable.eaAddress.set(be_t::make((u32)Memory.Alloc(512 * sizeof(u16), 1))); + offsetTable.ioAddress.set((u32)Memory.Alloc(3072 * sizeof(u16), 1)); + offsetTable.eaAddress.set((u32)Memory.Alloc(512 * sizeof(u16), 1)); memset(offsetTable.ioAddress.get_ptr(), 0xFF, 3072 * sizeof(u16)); memset(offsetTable.eaAddress.get_ptr(), 0xFF, 512 * sizeof(u16)); @@ -317,7 +317,7 @@ void _cellGcmFunc15(vm::ptr context) return; } -size_t g_defaultCommandBufferBegin, g_defaultCommandBufferFragmentCount; +u32 g_defaultCommandBufferBegin, g_defaultCommandBufferFragmentCount; // Called by cellGcmInit s32 _cellGcmInitBody(vm::ptr context, u32 cmdSize, u32 ioSize, u32 ioAddress) @@ -368,7 +368,7 @@ s32 _cellGcmInitBody(vm::ptr context, u32 cmdSize, u32 ioSiz current_context.begin = g_defaultCommandBufferBegin + 4096; // 4 kb reserved at the beginning current_context.end = g_defaultCommandBufferBegin + 32 * 1024 - 4; // 4b at the end for jump current_context.current = current_context.begin; - current_context.callback.set(be_t::make(Emu.GetRSXCallback() - 4)); + current_context.callback.set(Emu.GetRSXCallback() - 4); gcm_info.context_addr = Memory.MainMem.AllocAlign(0x1000); gcm_info.control_addr = gcm_info.context_addr + 0x40; @@ -379,9 +379,9 @@ s32 _cellGcmInitBody(vm::ptr context, u32 cmdSize, u32 ioSiz vm::write32(context.addr(), gcm_info.context_addr); auto& ctrl = vm::get_ref(gcm_info.control_addr); - ctrl.put.write_relaxed(be_t::make(0)); - ctrl.get.write_relaxed(be_t::make(0)); - ctrl.ref.write_relaxed(be_t::make(-1)); + ctrl.put.write_relaxed(0); + ctrl.get.write_relaxed(0); + ctrl.ref.write_relaxed(-1); auto& render = Emu.GetGSManager().GetRender(); render.m_ctxt_addr = context.addr(); @@ -1164,7 +1164,7 @@ s32 cellGcmSetTile(u8 index, u8 location, u32 offset, u32 size, u32 pitch, u8 co */ static std::pair getNextCommandBufferBeginEnd(u32 current) { - size_t currentRange = (current - g_defaultCommandBufferBegin) / (32 * 1024); + u32 currentRange = (current - g_defaultCommandBufferBegin) / (32 * 1024); if (currentRange >= g_defaultCommandBufferFragmentCount - 1) return std::make_pair(g_defaultCommandBufferBegin + 4096, g_defaultCommandBufferBegin + 32 * 1024 - 4); return std::make_pair(g_defaultCommandBufferBegin + (currentRange + 1) * 32 * 1024, @@ -1206,7 +1206,7 @@ s32 cellGcmCallback(vm::ptr context, u32 count) auto& ctrl = vm::get_ref(gcm_info.control_addr); const std::chrono::time_point enterWait = std::chrono::system_clock::now(); // Flush command buffer (ie allow RSX to read up to context->current) - ctrl.put.exchange(be_t::make(getOffsetFromAddress(context->current))); + ctrl.put.exchange(getOffsetFromAddress(context->current)); std::pair newCommandBuffer = getNextCommandBufferBeginEnd(context->current); u32 offset = getOffsetFromAddress(newCommandBuffer.first); @@ -1235,7 +1235,7 @@ s32 cellGcmCallback(vm::ptr context, u32 count) //if (0) //{ // auto& ctrl = vm::get_ref(gcm_info.control_addr); - // be_t res = be_t::make(context->current - context->begin - ctrl.put.read_relaxed()); + // be_t res = context->current - context->begin - ctrl.put.read_relaxed(); // if (res != 0) // { @@ -1246,7 +1246,7 @@ s32 cellGcmCallback(vm::ptr context, u32 count) // context->current = context->begin + res; // ctrl.put.write_relaxed(res); - // ctrl.get.write_relaxed(be_t::make(0)); + // ctrl.get.write_relaxed(0); // return CELL_OK; //} @@ -1270,7 +1270,7 @@ s32 cellGcmCallback(vm::ptr context, u32 count) // vm::write32(context->current, CELL_GCM_METHOD_FLAG_JUMP | offset); // set JUMP cmd // auto& ctrl = vm::get_ref(gcm_info.control_addr); - // ctrl.put.exchange(be_t::make(offset)); + // ctrl.put.exchange(offset); //} //else //{ diff --git a/rpcs3/Emu/SysCalls/Modules/cellPad.cpp b/rpcs3/Emu/SysCalls/Modules/cellPad.cpp index 7b09ba37d7..79384466ef 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellPad.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellPad.cpp @@ -75,7 +75,7 @@ s32 cellPadPeriphGetInfo(vm::ptr info) sys_io.Warning("cellPadPeriphGetInfo(info_addr=0x%x)", info.addr()); // TODO: Support other types of controllers - for (int i = 0; i < info->now_connect; i++) + for (u32 i = 0; i < info->now_connect; i++) { info->pclass_type[i] = CELL_PAD_PCLASS_TYPE_STANDARD; } diff --git a/rpcs3/Emu/SysCalls/Modules/cellPamf.cpp b/rpcs3/Emu/SysCalls/Modules/cellPamf.cpp index 3237b584bb..bf53893659 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellPamf.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellPamf.cpp @@ -486,8 +486,8 @@ s32 cellPamfReaderGetStreamInfo(vm::ptr pSelf, u32 pInfo_addr, u if (header.AVC.aspectRatioIdc == 0xff) { - info->sarWidth = header.AVC.sarWidth; - info->sarHeight = header.AVC.sarHeight; + info->sarWidth = header.AVC.sarInfo.width; + info->sarHeight = header.AVC.sarInfo.height; } else { diff --git a/rpcs3/Emu/SysCalls/Modules/cellPamf.h b/rpcs3/Emu/SysCalls/Modules/cellPamf.h index b32d75374b..d919b491ea 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellPamf.h +++ b/rpcs3/Emu/SysCalls/Modules/cellPamf.h @@ -284,13 +284,16 @@ struct PamfStreamHeader be_t frameCropRightOffset; be_t frameCropTopOffset; be_t frameCropBottomOffset; + union { struct { - be_t sarWidth; - be_t sarHeight; - }; + be_t width; + be_t height; + } + sarInfo; + struct { u8 x14; // contains videoFormat and videoFullRangeFlag @@ -299,10 +302,11 @@ struct PamfStreamHeader u8 matrixCoefficients; }; }; + u8 x18; // contains entropyCodingModeFlag, deblockingFilterFlag, minNumSlicePerPictureIdc, nfwIdc u8 maxMeanBitrate; - - } AVC; + } + AVC; // M2V specific information struct @@ -322,8 +326,8 @@ struct PamfStreamHeader u8 colourPrimaries; u8 transferCharacteristics; u8 matrixCoefficients; - - } M2V; + } + M2V; // Audio specific information struct @@ -332,8 +336,8 @@ struct PamfStreamHeader u8 channels; // number of channels (1, 2, 6, 8) u8 freq; // 1 (always 48000) u8 bps; // LPCM only - - } audio; + } + audio; }; }; diff --git a/rpcs3/Emu/SysCalls/Modules/cellPng.h b/rpcs3/Emu/SysCalls/Modules/cellPng.h index 2ea038a9b9..9066aee992 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellPng.h +++ b/rpcs3/Emu/SysCalls/Modules/cellPng.h @@ -2,7 +2,7 @@ namespace vm { using namespace ps3; } -enum CellPngTxtType +enum CellPngTxtType : s32 { CELL_PNG_TEXT = 0, CELL_PNG_ZTXT = 1, @@ -33,7 +33,7 @@ struct CellPngSPLTentry be_t paletteEntriesNumber; }; -enum CellPngUnknownLocation +enum CellPngUnknownLocation : s32 { CELL_PNG_BEFORE_PLTE = 1, CELL_PNG_BEFORE_IDAT = 2, @@ -42,7 +42,7 @@ enum CellPngUnknownLocation struct CellPngTextInfo { - be_t txtType; + be_t txtType; // CellPngTxtType vm::bptr keyword; vm::bptr text; be_t textLength; @@ -172,5 +172,5 @@ struct CellPngUnknownChunk char chunkType[5]; vm::bptr chunkData; be_t length; - be_t location; + be_t location; // CellPngUnknownLocation }; diff --git a/rpcs3/Emu/SysCalls/Modules/cellSearch.h b/rpcs3/Emu/SysCalls/Modules/cellSearch.h index af72515101..be910c9be4 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellSearch.h +++ b/rpcs3/Emu/SysCalls/Modules/cellSearch.h @@ -5,7 +5,6 @@ namespace vm { using namespace ps3; } // Error Codes enum { - CELL_SEARCH_OK = 0, CELL_SEARCH_CANCELED = 1, CELL_SEARCH_ERROR_PARAM = 0x8002C801, CELL_SEARCH_ERROR_BUSY = 0x8002C802, @@ -41,7 +40,7 @@ enum }; // Sort keys -enum +enum : s32 { CELL_SEARCH_SORTKEY_NONE = 0, CELL_SEARCH_SORTKEY_DEFAULT = 1, @@ -57,7 +56,7 @@ enum }; // Sort order -enum +enum : s32 { CELL_SEARCH_SORTORDER_NONE = 0, CELL_SEARCH_SORTORDER_ASCENDING = 1, @@ -65,7 +64,7 @@ enum }; // Content types -enum +enum : s32 { CELL_SEARCH_CONTENTTYPE_NONE = 0, CELL_SEARCH_CONTENTTYPE_MUSIC = 1, @@ -78,7 +77,7 @@ enum }; // Codecs -enum CellSearchCodec +enum CellSearchCodec : s32 { CELL_SEARCH_CODEC_UNKNOWN = 0, CELL_SEARCH_CODEC_MPEG2 = 1, @@ -112,7 +111,7 @@ enum CellSearchCodec }; // Scene types -enum CellSearchSceneType +enum CellSearchSceneType : s32 { CELL_SEARCH_SCENETYPE_NONE = 0, CELL_SEARCH_SCENETYPE_CHAPTER = 1, @@ -121,7 +120,7 @@ enum CellSearchSceneType }; // List types -enum CellSearchListType +enum CellSearchListType : s32 { CELL_SEARCH_LISTTYPE_MUSIC_ALBUM = 1, CELL_SEARCH_LISTTYPE_MUSIC_GENRE = 2, @@ -130,7 +129,7 @@ enum CellSearchListType }; // Content status -enum CellSearchContentStatus +enum CellSearchContentStatus : s32 { CELL_SEARCH_CONTENTSTATUS_AVAILABLE, CELL_SEARCH_CONTENTSTATUS_NOT_SUPPORTED, @@ -138,7 +137,7 @@ enum CellSearchContentStatus }; // Search orientation -enum CellSearchOrientation +enum CellSearchOrientation : s32 { CELL_SEARCH_ORIENTATION_UNKNOWN, CELL_SEARCH_ORIENTATION_TOP_LEFT, @@ -148,13 +147,13 @@ enum CellSearchOrientation }; // Search modes -enum CellSearchMode +enum CellSearchMode : s32 { CELL_SEARCH_MODE_NORMAL = 0, }; // Search events -enum CellSearchEvent +enum CellSearchEvent : s32 { CELL_SEARCH_EVENT_NOTIFICATION = 0, CELL_SEARCH_EVENT_INITIALIZE_RESULT, @@ -181,7 +180,7 @@ struct CellSearchResultParam struct CellSearchMusicListInfo { - be_t listType; + be_t listType; // CellSearchListType be_t numOfItems; be_t duration; char title[CELL_SEARCH_TITLE_LEN_MAX + 1]; @@ -192,7 +191,7 @@ struct CellSearchMusicListInfo struct CellSearchPhotoListInfo { - be_t listType; + be_t listType; // CellSearchListType be_t numOfItems; char title[CELL_SEARCH_TITLE_LEN_MAX + 1]; char reserved[3]; @@ -200,7 +199,7 @@ struct CellSearchPhotoListInfo struct CellSearchVideoListInfo { - be_t listType; + be_t listType; // CellSearchListType be_t numOfItems; be_t duration; char title[CELL_SEARCH_TITLE_LEN_MAX + 1]; @@ -220,8 +219,8 @@ struct CellSearchMusicInfo be_t quantizationBitrate; be_t playCount; be_t drmEncrypted; - be_t codec; - be_t status; + be_t codec; // CellSearchCodec + be_t status; // CellSearchContentStatus char diskNumber[8]; char title[CELL_SEARCH_TITLE_LEN_MAX + 1]; char reserved[3]; @@ -240,9 +239,9 @@ struct CellSearchPhotoInfo be_t takenDate; be_t width; be_t height; - be_t orientation; - be_t codec; - be_t status; + be_t orientation; // CellSearchOrientation + be_t codec; // CellSearchCodec + be_t status; // CellSearchContentStatus char title[CELL_SEARCH_TITLE_LEN_MAX + 1]; char reserved[3]; char albumTitle[CELL_SEARCH_TITLE_LEN_MAX + 1]; @@ -259,9 +258,9 @@ struct CellSearchVideoInfo be_t audioBitrate; be_t playCount; be_t drmEncrypted; - be_t videoCodec; - be_t audioCodec; - be_t status; + be_t videoCodec; // CellSearchCodec + be_t audioCodec; // CellSearchCodec + be_t status; // CellSearchContentStatus char title[CELL_SEARCH_TITLE_LEN_MAX + 1]; char reserved[3]; char albumTitle[CELL_SEARCH_TITLE_LEN_MAX + 1]; @@ -270,7 +269,7 @@ struct CellSearchVideoInfo struct CellSearchVideoSceneInfo { - be_t sceneType; + be_t sceneType; // CellSearchSceneType be_t startTime_ms; be_t endTime_ms; CellSearchContentId videoId; @@ -301,4 +300,4 @@ struct CellSearchTimeInfo be_t takenDate; be_t importedDate; be_t modifiedDate; -}; \ No newline at end of file +}; diff --git a/rpcs3/Emu/SysCalls/Modules/cellSpurs.cpp b/rpcs3/Emu/SysCalls/Modules/cellSpurs.cpp index 3478028406..de61f9f5d0 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellSpurs.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellSpurs.cpp @@ -144,7 +144,7 @@ s32 cellSpursTasksetAttributeSetName(vm::ptr attr, vm s32 cellSpursTasksetAttributeSetTasksetSize(vm::ptr attr, u32 size); s32 cellSpursTasksetAttributeEnableClearLS(vm::ptr attr, s32 enable); s32 _cellSpursTasksetAttribute2Initialize(vm::ptr attribute, u32 revision); -s32 cellSpursCreateTaskset2(PPUThread& CPU, vm::ptr spurs, vm::ptr taskset, vm::ptr attr); +s32 cellSpursCreateTaskset2(PPUThread& CPU, vm::ptr spurs, vm::ptr taskset, vm::ptr attr); s32 cellSpursDestroyTaskset2(); s32 cellSpursTasksetSetExceptionEventHandler(vm::ptr taskset, vm::ptr handler, vm::ptr arg); s32 cellSpursTasksetUnsetExceptionEventHandler(vm::ptr taskset); @@ -376,7 +376,7 @@ s32 spursAttachLv2EventQueue(PPUThread& CPU, vm::ptr spurs, u32 queue *port = connectedPort; if (!spursCreated) { - spurs->spuPortBits |= be_t::make(1ull << connectedPort); + spurs->spuPortBits |= 1ull << connectedPort; } return CELL_OK; @@ -417,7 +417,7 @@ s32 spursDetachLv2EventQueue(vm::ptr spurs, u8 spuPort, bool spursCre } } - spurs->spuPortBits &= be_t::make(~mask); + spurs->spuPortBits &= ~mask; } return CELL_OK; @@ -578,7 +578,7 @@ s32 spursCreateHandler(vm::ptr spurs, u32 ppuPriority) /// Invoke event handlers s32 spursInvokeEventHandlers(PPUThread& CPU, vm::ptr eventPortMux) { - if (eventPortMux->reqPending.exchange(be_t::make(0)).data()) + if (eventPortMux->reqPending.exchange(0).data()) { const vm::ptr handlerList = eventPortMux->handlerList.exchange(vm::null); @@ -1028,7 +1028,7 @@ s32 spursInit( if (!isSecond) { - spurs->wklEnabled.write_relaxed(be_t::make(0xffff)); + spurs->wklEnabled.write_relaxed(0xffff); } // Initialise trace @@ -1045,7 +1045,6 @@ s32 spursInit( spurs->wklInfoSysSrv.arg = 0; spurs->wklInfoSysSrv.uniqueId.write_relaxed(0xff); - auto sys_semaphore_attribute_initialize = [](vm::ptr attr) { attr->protocol = SYS_SYNC_PRIORITY; @@ -1223,7 +1222,7 @@ s32 spursInit( spurs->flags1 = (flags & SAF_EXIT_IF_NO_WORK ? SF1_EXIT_IF_NO_WORK : 0) | (isSecond ? SF1_32_WORKLOADS : 0); spurs->wklFlagReceiver.write_relaxed(0xff); - spurs->wklFlag.flag.write_relaxed(be_t::make(-1)); + spurs->wklFlag.flag.write_relaxed(-1); spurs->handlerDirty.write_relaxed(0); spurs->handlerWaiting.write_relaxed(0); spurs->handlerExiting.write_relaxed(0); @@ -1809,7 +1808,7 @@ s32 cellSpursEnableExceptionEventHandler(vm::ptr spurs, bool flag) } s32 rc = CELL_OK; - auto oldEnableEH = spurs->enableEH.exchange(be_t::make(flag ? 1u : 0u)); + auto oldEnableEH = spurs->enableEH.exchange(flag ? 1u : 0u); if (flag) { if (oldEnableEH == 0) @@ -1848,14 +1847,14 @@ s32 cellSpursSetGlobalExceptionEventHandler(vm::ptr spurs, vm::ptrglobalSpuExceptionHandler.compare_and_swap(be_t::make(0), be_t::make(1)); + auto handler = spurs->globalSpuExceptionHandler.compare_and_swap(0, 1); if (handler) { return CELL_SPURS_CORE_ERROR_BUSY; } spurs->globalSpuExceptionHandlerArgs = arg.addr(); - spurs->globalSpuExceptionHandler.exchange(be_t::make(eaHandler.addr())); + spurs->globalSpuExceptionHandler.exchange(eaHandler.addr()); return CELL_OK; } @@ -1866,7 +1865,7 @@ s32 cellSpursUnsetGlobalExceptionEventHandler(vm::ptr spurs) cellSpurs.Warning("cellSpursUnsetGlobalExceptionEventHandler(spurs=*0x%x)", spurs); spurs->globalSpuExceptionHandlerArgs = 0; - spurs->globalSpuExceptionHandler.exchange(be_t::make(0)); + spurs->globalSpuExceptionHandler.exchange(0); return CELL_OK; } @@ -2312,7 +2311,7 @@ s32 spursAddWorkload( v &= ~0xf; v |= (maxContention > 8 ? 8 : maxContention); }); - spurs->wklSignal1._and_not({ be_t::make(0x8000 >> index) }); // clear bit in wklFlag1 + spurs->wklSignal1._and_not({ 0x8000 >> index }); // clear bit in wklFlag1 } else { @@ -2321,7 +2320,7 @@ s32 spursAddWorkload( v &= ~0xf0; v |= (maxContention > 8 ? 8 : maxContention) << 4; }); - spurs->wklSignal2._and_not({ be_t::make(0x8000 >> index) }); // clear bit in wklFlag2 + spurs->wklSignal2._and_not({ 0x8000 >> index }); // clear bit in wklFlag2 } spurs->wklFlagReceiver.compare_and_swap(wnum, 0xff); @@ -2483,11 +2482,11 @@ s32 cellSpursSendWorkloadSignal(vm::ptr spurs, u32 wid) if (wid >= CELL_SPURS_MAX_WORKLOAD) { - spurs->wklSignal2 |= be_t::make(0x8000 >> (wid & 0x0F)); + spurs->wklSignal2 |= 0x8000 >> (wid & 0x0F); } else { - spurs->wklSignal1 |= be_t::make(0x8000 >> wid); + spurs->wklSignal1 |= 0x8000 >> wid; } return CELL_OK; @@ -2787,7 +2786,7 @@ s32 cellSpursEventFlagClear(vm::ptr eventFlag, u16 bits) return CELL_SPURS_TASK_ERROR_ALIGN; } - eventFlag->events &= be_t::make(~bits); + eventFlag->events &= ~bits; return CELL_OK; } @@ -3299,7 +3298,7 @@ s32 cellSpursEventFlagGetTasksetAddress(vm::ptr eventFlag, v return CELL_SPURS_TASK_ERROR_ALIGN; } - taskset->set(eventFlag->isIwl ? 0 : eventFlag->addr); + taskset->set(eventFlag->isIwl ? 0u : vm::cast(eventFlag->addr)); return CELL_OK; } @@ -3691,17 +3690,17 @@ s32 _cellSpursSendSignal(PPUThread& CPU, vm::ptr taskset, u32 return CELL_SPURS_TASK_ERROR_INVAL; } - auto _0 = be_t::make(u128::from32(0)); - auto disabled = taskset->enabled.value()._bit[taskId] ? false : true; + be_t _0(u128::from32(0)); + bool disabled = taskset->enabled.value()._bit[taskId]; auto invalid = (taskset->ready & taskset->pending_ready) != _0 || (taskset->running & taskset->waiting) != _0 || disabled || - ((taskset->running | taskset->ready | taskset->pending_ready | taskset->waiting | taskset->signalled) & be_t::make(~taskset->enabled.value())) != _0; + ((taskset->running | taskset->ready | taskset->pending_ready | taskset->waiting | taskset->signalled) & ~taskset->enabled) != _0; if (invalid) { return CELL_SPURS_TASK_ERROR_SRCH; } - auto shouldSignal = (taskset->waiting & be_t::make(~taskset->signalled.value()) & be_t::make(u128::fromBit(taskId))) != _0 ? true : false; + auto shouldSignal = ((taskset->waiting & ~taskset->signalled) & be_t(u128::fromBit(taskId))) != _0 ? true : false; auto signalled = taskset->signalled.value(); signalled._bit[taskId] = true; taskset->signalled = signalled; @@ -3880,23 +3879,19 @@ s32 cellSpursTaskGetContextSaveAreaSize() return CELL_OK; } -s32 cellSpursCreateTaskset2(PPUThread& CPU, vm::ptr spurs, vm::ptr taskset, vm::ptr attr) +s32 cellSpursCreateTaskset2(PPUThread& CPU, vm::ptr spurs, vm::ptr taskset, vm::ptr attr) { - cellSpurs.Warning("%s(spurs=0x%x, taskset=0x%x, attr=0x%x)", __FUNCTION__, spurs.addr(), taskset.addr(), attr.addr()); + cellSpurs.Warning("cellSpursCreateTaskset2(spurs=*0x%x, taskset=*0x%x, attr=*0x%x)", spurs, taskset, attr); - vm::ptr tmp_attr; + vm::stackvar tmp_attr(CPU); if (!attr) { - attr.set(tmp_attr.addr()); + attr = tmp_attr; _cellSpursTasksetAttribute2Initialize(attr, 0); } - auto rc = spursCreateTaskset(CPU, spurs, vm::ptr::make(taskset.addr()), attr->args, - vm::cptr::make(attr.addr() + offsetof(CellSpursTasksetAttribute, priority)), - attr->max_contention, attr->name, sizeof32(CellSpursTaskset2), (u8)attr->enable_clear_ls); - - if (rc != CELL_OK) + if (s32 rc = spursCreateTaskset(CPU, spurs, taskset, attr->args, attr.of(&CellSpursTasksetAttribute2::priority), attr->max_contention, attr->name, sizeof32(CellSpursTaskset2), attr->enable_clear_ls)) { return rc; } diff --git a/rpcs3/Emu/SysCalls/Modules/cellSpurs.h b/rpcs3/Emu/SysCalls/Modules/cellSpurs.h index 9d2e3f59cf..cc0f9ca695 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellSpurs.h +++ b/rpcs3/Emu/SysCalls/Modules/cellSpurs.h @@ -143,7 +143,7 @@ enum SpursFlags1 : u8 SF1_EXIT_IF_NO_WORK = 0x80, }; -enum SpursWorkloadConstants : u64 +enum SpursWorkloadConstants : u32 { // Workload states SPURS_WKL_STATE_NON_EXISTENT = 0, @@ -153,15 +153,18 @@ enum SpursWorkloadConstants : u64 SPURS_WKL_STATE_REMOVABLE = 4, SPURS_WKL_STATE_INVALID = 5, - // GUID - SPURS_GUID_SYS_WKL = 0x1BB841BF38F89D33ull, - SPURS_GUID_TASKSET_PM = 0x836E915B2E654143ull, - // Image addresses SPURS_IMG_ADDR_SYS_SRV_WORKLOAD = 0x100, SPURS_IMG_ADDR_TASKSET_PM = 0x200, }; +enum SpursWorkloadGUIDs : u64 +{ + // GUID + SPURS_GUID_SYS_WKL = 0x1BB841BF38F89D33ull, + SPURS_GUID_TASKSET_PM = 0x836E915B2E654143ull, +}; + enum CellSpursModulePollStatus { CELL_SPURS_MODULE_POLL_STATUS_READYCOUNT = 1, @@ -617,8 +620,8 @@ struct set_alignment(128) CellSpursEventFlag union { - atomic_be_t ctrl;// 0x00 - atomic_be_t events; // 0x00 + atomic_be_t ctrl; // 0x00 + atomic_be_t events; // 0x00 }; be_t spuTaskUsedWaitSlots; // 0x08 A bit is set to 1 if the wait slot corresponding to the bit is used by an SPU task and 0 otherwise diff --git a/rpcs3/Emu/SysCalls/Modules/cellSpursSpu.cpp b/rpcs3/Emu/SysCalls/Modules/cellSpursSpu.cpp index dc2816bb82..323da36754 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellSpursSpu.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellSpursSpu.cpp @@ -138,19 +138,19 @@ bool spursDma(SPUThread & spu, u32 cmd, u64 ea, u32 lsa, u32 size, u32 tag) { u32 spursDmaGetCompletionStatus(SPUThread & spu, u32 tagMask) { spu.set_ch_value(MFC_WrTagMask, tagMask); spu.set_ch_value(MFC_WrTagUpdate, MFC_TAG_UPDATE_IMMEDIATE); - return spu.get_ch_value(MFC_RdTagStat); + return spu.get_ch_value(MFC_RdTagStat); } /// Wait for DMA operations to complete u32 spursDmaWaitForCompletion(SPUThread & spu, u32 tagMask, bool waitForAll) { spu.set_ch_value(MFC_WrTagMask, tagMask); spu.set_ch_value(MFC_WrTagUpdate, waitForAll ? MFC_TAG_UPDATE_ALL : MFC_TAG_UPDATE_ANY); - return spu.get_ch_value(MFC_RdTagStat); + return spu.get_ch_value(MFC_RdTagStat); } /// Halt the SPU void spursHalt(SPUThread & spu) { - spu.halt(); + spu.halt(); } //---------------------------------------------------------------------------- @@ -253,12 +253,12 @@ bool spursKernel1SelectWorkload(SPUThread & spu) { if (!isPoll || wklSelectedId == ctxt->wklCurrentId) { // Clear workload signal for the selected workload - spurs->wklSignal1.write_relaxed(be_t::make(spurs->wklSignal1.read_relaxed() & ~(0x8000 >> wklSelectedId))); - spurs->wklSignal2.write_relaxed(be_t::make(spurs->wklSignal1.read_relaxed() & ~(0x80000000u >> wklSelectedId))); + spurs->wklSignal1.write_relaxed(spurs->wklSignal1.read_relaxed() & ~(0x8000 >> wklSelectedId)); + spurs->wklSignal2.write_relaxed(spurs->wklSignal1.read_relaxed() & ~(0x80000000u >> wklSelectedId)); // If the selected workload is the wklFlag workload then pull the wklFlag to all 1s if (wklSelectedId == spurs->wklFlagReceiver.read_relaxed()) { - spurs->wklFlag.flag.write_relaxed(be_t::make(0xFFFFFFFF)); + spurs->wklFlag.flag.write_relaxed(0xFFFFFFFF); } } } @@ -405,12 +405,12 @@ bool spursKernel2SelectWorkload(SPUThread & spu) { if (!isPoll || wklSelectedId == ctxt->wklCurrentId) { // Clear workload signal for the selected workload - spurs->wklSignal1.write_relaxed(be_t::make(spurs->wklSignal1.read_relaxed() & ~(0x8000 >> wklSelectedId))); - spurs->wklSignal2.write_relaxed(be_t::make(spurs->wklSignal1.read_relaxed() & ~(0x80000000u >> wklSelectedId))); + spurs->wklSignal1.write_relaxed(spurs->wklSignal1.read_relaxed() & ~(0x8000 >> wklSelectedId)); + spurs->wklSignal2.write_relaxed(spurs->wklSignal1.read_relaxed() & ~(0x80000000u >> wklSelectedId)); // If the selected workload is the wklFlag workload then pull the wklFlag to all 1s if (wklSelectedId == spurs->wklFlagReceiver.read_relaxed()) { - spurs->wklFlag.flag.write_relaxed(be_t::make(0xFFFFFFFF)); + spurs->wklFlag.flag.write_relaxed(0xFFFFFFFF); } } } @@ -1179,15 +1179,15 @@ s32 spursTasksetProcessRequest(SPUThread & spu, s32 request, u32 * taskId, u32 * auto taskset = ctxt->taskset.priv_ptr(); // Verify taskset state is valid - auto _0 = be_t::make(u128::from32(0)); + be_t _0(u128::from32(0)); if ((taskset->waiting & taskset->running) != _0 || (taskset->ready & taskset->pending_ready) != _0 || - ((taskset->running | taskset->ready | taskset->pending_ready | taskset->signalled | taskset->waiting) & be_t::make(~taskset->enabled.value())) != _0) { + ((taskset->running | taskset->ready | taskset->pending_ready | taskset->signalled | taskset->waiting) & ~taskset->enabled) != _0) { assert(!"Invalid taskset state"); spursHalt(spu); } // Find the number of tasks that have become ready since the last iteration - auto newlyReadyTasks = (taskset->signalled | taskset->pending_ready).value() & ~taskset->ready.value(); + auto newlyReadyTasks = (taskset->signalled | taskset->pending_ready) & ~taskset->ready.value(); numNewlyReadyTasks = 0; for (auto i = 0; i < 128; i++) { if (newlyReadyTasks._bit[i]) { @@ -1197,11 +1197,11 @@ s32 spursTasksetProcessRequest(SPUThread & spu, s32 request, u32 * taskId, u32 * u128 readyButNotRunning; u8 selectedTaskId; - auto running = taskset->running.value(); - auto waiting = taskset->waiting.value(); - auto enabled = taskset->enabled.value(); - auto signalled = (taskset->signalled & (taskset->ready | taskset->pending_ready)).value(); - auto ready = (taskset->signalled | taskset->ready | taskset->pending_ready).value(); + u128 running = taskset->running.value(); + u128 waiting = taskset->waiting.value(); + u128 enabled = taskset->enabled.value(); + u128 signalled = (taskset->signalled & (taskset->ready | taskset->pending_ready)); + u128 ready = (taskset->signalled | taskset->ready | taskset->pending_ready); switch (request) { case SPURS_TASKSET_REQUEST_POLL_SIGNAL: @@ -1420,8 +1420,8 @@ s32 spursTasketSaveTaskContext(SPUThread & spu) { u128 r; spu.FPSCR.Read(r); ctxt->savedContextFpscr = r; - ctxt->savedSpuWriteEventMask = spu.get_ch_value(SPU_RdEventMask); - ctxt->savedWriteTagGroupQueryMask = spu.get_ch_value(MFC_RdTagMask); + ctxt->savedSpuWriteEventMask = spu.get_ch_value(SPU_RdEventMask); + ctxt->savedWriteTagGroupQueryMask = spu.get_ch_value(MFC_RdTagMask); // Store the processor context const u32 contextSaveStorage = vm::cast(taskInfo->context_save_storage_and_alloc_ls_blocks & -0x80); @@ -1577,8 +1577,8 @@ s32 spursTasksetProcessSyscall(SPUThread & spu, u32 syscallNum, u32 args) { spursTasksetProcessRequest(spu, SPURS_TASKSET_REQUEST_DESTROY_TASK, nullptr, nullptr); } - auto addr = ctxt->x2FD4 == 4 ? taskset->x78 : ctxt->x2FC0; - auto args = ctxt->x2FD4 == 4 ? 0 : ctxt->x2FC8; + const u64 addr = ctxt->x2FD4 == 4 ? taskset->x78 : ctxt->x2FC0; + const u64 args = ctxt->x2FD4 == 4 ? 0 : ctxt->x2FC8.value(); spursTasksetOnTaskExit(spu, addr, ctxt->taskId, ctxt->taskExitCode, args); } @@ -1695,7 +1695,7 @@ s32 spursTasksetLoadElf(SPUThread & spu, u32 * entryPoint, u32 * lowestLoadAddr, return CELL_SPURS_TASK_ERROR_FAULT; } - _lowestLoadAddr = _lowestLoadAddr > phdr.data_be.p_vaddr ? phdr.data_be.p_vaddr : _lowestLoadAddr; + _lowestLoadAddr > phdr.data_be.p_vaddr ? _lowestLoadAddr = phdr.data_be.p_vaddr : _lowestLoadAddr; } } } diff --git a/rpcs3/Emu/SysCalls/Modules/cellSync.cpp b/rpcs3/Emu/SysCalls/Modules/cellSync.cpp index fbb93be9d2..ab17450231 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellSync.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellSync.cpp @@ -58,12 +58,12 @@ s32 cellSyncMutexLock(vm::ptr mutex) } // prx: increase acquire_count and remember its old value - const auto order = mutex->acquire_count++; + const auto order = mutex->cnt.acq++; // prx: wait until release_count is equal to old acquire_count g_sync_mutex_wm.wait_op(mutex.addr(), [mutex, order]() { - return order == mutex->release_count.read_relaxed(); + return order == mutex->cnt.rel.read_relaxed(); }); mutex->sync_var.read_sync(); @@ -88,7 +88,7 @@ s32 cellSyncMutexTryLock(vm::ptr mutex) // prx: lock only if acquire_count and release_count are equal return mutex->sync_var.atomic_op(CELL_OK, [](CellSyncMutex::sync_t& mutex) -> s32 { - return (mutex.acquire_count++ != mutex.release_count) ? CELL_SYNC_ERROR_BUSY : CELL_OK; + return (mutex.cnt_acq++ != mutex.cnt_rel) ? CELL_SYNC_ERROR_BUSY : CELL_OK; }); } @@ -106,7 +106,7 @@ s32 cellSyncMutexUnlock(vm::ptr mutex) } // prx: increase release count - mutex->release_count++; + mutex->cnt.rel++; g_sync_mutex_wm.notify(mutex.addr()); @@ -129,7 +129,7 @@ s32 syncBarrierInitialize(vm::ptr barrier, u16 total_count) } // prx: zeroize first u16, write total_count in second u16 and sync - barrier->data.exchange({ be_t::make(0), be_t::make(total_count) }); + barrier->data.exchange({ 0, total_count }); return CELL_OK; } @@ -452,7 +452,7 @@ s32 cellSyncRwmTryWrite(vm::ptr rwm, vm::cptr buffer) } // prx: compare m_readers | m_writers with 0, return if not zero, set m_writers to 1 - if (!rwm->data.compare_and_swap_test({}, { be_t::make(0), be_t::make(1) })) + if (!rwm->data.compare_and_swap_test({ 0, 0 }, { 0, 1 })) { return CELL_SYNC_ERROR_BUSY; } @@ -556,7 +556,7 @@ s32 cellSyncQueuePush(vm::ptr queue, vm::cptr buffer) memcpy(&queue->m_buffer[position * size], buffer.get_ptr(), size); // prx: atomically insert 0 in 5th u8 - queue->data &= { be_t::make(~0), be_t::make(0xffffff) }; + queue->data &= { 0xffffffffu, 0x00ffffff }; g_sync_queue_wm.notify(queue.addr()); @@ -593,7 +593,7 @@ s32 cellSyncQueueTryPush(vm::ptr queue, vm::cptr buffer) memcpy(&queue->m_buffer[position * size], buffer.get_ptr(), size); - queue->data &= { be_t::make(~0), be_t::make(0xffffff) }; + queue->data &= { 0xffffffffu, 0x00ffffff }; g_sync_queue_wm.notify(queue.addr()); @@ -653,7 +653,7 @@ s32 cellSyncQueuePop(vm::ptr queue, vm::ptr buffer) memcpy(buffer.get_ptr(), &queue->m_buffer[position * size], size); // prx: atomically insert 0 in first u8 - queue->data &= { be_t::make(0xffffff), be_t::make(~0) }; + queue->data &= { 0x00ffffff, 0xffffffffu }; g_sync_queue_wm.notify(queue.addr()); @@ -690,7 +690,7 @@ s32 cellSyncQueueTryPop(vm::ptr queue, vm::ptr buffer) memcpy(buffer.get_ptr(), &queue->m_buffer[position * size], size); - queue->data &= { be_t::make(0xffffff), be_t::make(~0) }; + queue->data &= { 0x00ffffff, 0xffffffffu }; g_sync_queue_wm.notify(queue.addr()); @@ -742,7 +742,7 @@ s32 cellSyncQueuePeek(vm::ptr queue, vm::ptr buffer) memcpy(buffer.get_ptr(), &queue->m_buffer[position * size], size); - queue->data &= { be_t::make(0xffffff), be_t::make(~0) }; + queue->data &= { 0x00ffffff, 0xffffffffu }; g_sync_queue_wm.notify(queue.addr()); @@ -779,7 +779,7 @@ s32 cellSyncQueueTryPeek(vm::ptr queue, vm::ptr buffer) memcpy(buffer.get_ptr(), &queue->m_buffer[position * size], size); - queue->data &= { be_t::make(0xffffff), be_t::make(~0) }; + queue->data &= { 0x00ffffff, 0xffffffffu }; g_sync_queue_wm.notify(queue.addr()); @@ -890,13 +890,13 @@ void syncLFQueueInit(vm::ptr queue, vm::ptr buffer, u32 siz //m_bs[2] //m_bs[3] queue->m_v1 = -1; - queue->push2 = { { be_t::make(-1) } }; - queue->pop2 = { { be_t::make(-1) } }; + queue->push2 = { { 0xffff } }; + queue->pop2 = { { 0xffff } }; } else { - queue->pop1 = { { be_t::make(0), be_t::make(0), queue->pop1.read_relaxed().m_h3, be_t::make(0) } }; - queue->push1 = { { be_t::make(0), be_t::make(0), queue->push1.read_relaxed().m_h7, be_t::make(0) } }; + queue->pop1 = { { 0, 0, queue->pop1.read_relaxed().m_h3, 0 } }; + queue->push1 = { { 0, 0, queue->push1.read_relaxed().m_h7, 0 } }; queue->m_bs[0] = -1; // written as u32 queue->m_bs[1] = -1; queue->m_bs[2] = -1; @@ -1829,7 +1829,7 @@ s32 _cellSyncLFQueueGetSignalAddress(vm::cptr queue, vm::pptr queue, vm::ptr direction) +s32 cellSyncLFQueueGetDirection(vm::cptr queue, vm::ptr direction) { cellSync.Log("cellSyncLFQueueGetDirection(queue=*0x%x, direction=*0x%x)", queue, direction); diff --git a/rpcs3/Emu/SysCalls/Modules/cellSync.h b/rpcs3/Emu/SysCalls/Modules/cellSync.h index f96ca6a237..858f3cb6d7 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellSync.h +++ b/rpcs3/Emu/SysCalls/Modules/cellSync.h @@ -35,15 +35,16 @@ union set_alignment(4) CellSyncMutex { struct sync_t { - be_t release_count; // increased when mutex is unlocked - be_t acquire_count; // increased when mutex is locked + be_t cnt_rel; // increased when mutex is unlocked + be_t cnt_acq; // increased when mutex is locked }; struct { - atomic_be_t release_count; - atomic_be_t acquire_count; - }; + atomic_be_t rel; + atomic_be_t acq; + } + cnt; atomic_be_t sync_var; }; @@ -157,9 +158,9 @@ struct set_alignment(128) 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_direction; // 0x24 CellSyncQueueDirection be_t m_v1; // 0x28 atomic_be_t init; // 0x2C atomic_be_t push2; // 0x30 diff --git a/rpcs3/Emu/SysCalls/Modules/cellVdec.cpp b/rpcs3/Emu/SysCalls/Modules/cellVdec.cpp index 18a5207841..d50c2bbda6 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellVdec.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellVdec.cpp @@ -23,7 +23,7 @@ extern Module cellVdec; #define VDEC_ERROR(...) { cellVdec.Error(__VA_ARGS__); Emu.Pause(); return; } // only for decoder thread -VideoDecoder::VideoDecoder(CellVdecCodecType type, u32 profile, u32 addr, u32 size, vm::ptr func, u32 arg) +VideoDecoder::VideoDecoder(s32 type, u32 profile, u32 addr, u32 size, vm::ptr func, u32 arg) : type(type) , profile(profile) , memAddr(addr) @@ -189,7 +189,7 @@ next: } } -u32 vdecQueryAttr(CellVdecCodecType type, u32 profile, u32 spec_addr /* may be 0 */, vm::ptr attr) +u32 vdecQueryAttr(s32 type, u32 profile, u32 spec_addr /* may be 0 */, vm::ptr attr) { switch (type) // TODO: check profile levels { @@ -827,23 +827,23 @@ s32 cellVdecGetPicItem(u32 handle, vm::pptr picItem) info->startAddr = 0x00000123; // invalid value (no address for picture) info->size = align(av_image_get_buffer_size(vdec->ctx->pix_fmt, vdec->ctx->width, vdec->ctx->height, 1), 128); info->auNum = 1; - info->auPts[0].lower = (u32)vf.pts; - info->auPts[0].upper = vf.pts >> 32; + info->auPts[0].lower = (u32)(vf.pts); + info->auPts[0].upper = (u32)(vf.pts >> 32); info->auPts[1].lower = (u32)CODEC_TS_INVALID; info->auPts[1].upper = (u32)CODEC_TS_INVALID; - info->auDts[0].lower = (u32)vf.dts; - info->auDts[0].upper = vf.dts >> 32; + info->auDts[0].lower = (u32)(vf.dts); + info->auDts[0].upper = (u32)(vf.dts >> 32); info->auDts[1].lower = (u32)CODEC_TS_INVALID; info->auDts[1].upper = (u32)CODEC_TS_INVALID; info->auUserData[0] = vf.userdata; info->auUserData[1] = 0; info->status = CELL_OK; info->attr = CELL_VDEC_PICITEM_ATTR_NORMAL; - info->picInfo_addr = info.addr() + sizeof(CellVdecPicItem); + info->picInfo_addr = info.addr() + sizeof32(CellVdecPicItem); if (vdec->type == CELL_VDEC_CODEC_TYPE_AVC) { - auto avc = vm::ptr::make(info.addr() + sizeof(CellVdecPicItem)); + auto avc = vm::ptr::make(info.addr() + sizeof32(CellVdecPicItem)); avc->horizontalSize = frame.width; avc->verticalSize = frame.height; @@ -897,7 +897,7 @@ s32 cellVdecGetPicItem(u32 handle, vm::pptr picItem) } else if (vdec->type == CELL_VDEC_CODEC_TYPE_DIVX) { - auto dvx = vm::ptr::make(info.addr() + sizeof(CellVdecPicItem)); + auto dvx = vm::ptr::make(info.addr() + sizeof32(CellVdecPicItem)); switch (frame.pict_type) { @@ -931,7 +931,7 @@ s32 cellVdecGetPicItem(u32 handle, vm::pptr picItem) } else if (vdec->type == CELL_VDEC_CODEC_TYPE_MPEG2) { - auto mp2 = vm::ptr::make(info.addr() + sizeof(CellVdecPicItem)); + auto mp2 = vm::ptr::make(info.addr() + sizeof32(CellVdecPicItem)); cellVdec.Fatal("cellVdecGetPicItem(MPEG2)"); } diff --git a/rpcs3/Emu/SysCalls/Modules/cellVdec.h b/rpcs3/Emu/SysCalls/Modules/cellVdec.h index d48ced76fa..c0b9caf80b 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellVdec.h +++ b/rpcs3/Emu/SysCalls/Modules/cellVdec.h @@ -14,15 +14,15 @@ enum CELL_VDEC_ERROR_FATAL = 0x80610180, }; -enum CellVdecCodecType : u32 +enum CellVdecCodecType : s32 { - CELL_VDEC_CODEC_TYPE_MPEG2 = 0x00000000, - CELL_VDEC_CODEC_TYPE_AVC = 0x00000001, - CELL_VDEC_CODEC_TYPE_DIVX = 0x00000005, + CELL_VDEC_CODEC_TYPE_MPEG2 = 0, + CELL_VDEC_CODEC_TYPE_AVC = 1, + CELL_VDEC_CODEC_TYPE_DIVX = 5, }; // Callback Messages -enum CellVdecMsgType : u32 +enum CellVdecMsgType : s32 { CELL_VDEC_MSG_TYPE_AUDONE, // decoding finished CELL_VDEC_MSG_TYPE_PICOUT, // picture done @@ -31,7 +31,7 @@ enum CellVdecMsgType : u32 }; // Decoder Operation Mode -enum CellVdecDecodeMode : u32 +enum CellVdecDecodeMode : s32 { CELL_VDEC_DEC_MODE_NORMAL, CELL_VDEC_DEC_MODE_B_SKIP, @@ -39,7 +39,7 @@ enum CellVdecDecodeMode : u32 }; // Output Picture Format Type -enum CellVdecPicFormatType : u32 +enum CellVdecPicFormatType : s32 { CELL_VDEC_PICFMT_ARGB32_ILV, CELL_VDEC_PICFMT_RGBA32_ILV, @@ -48,13 +48,13 @@ enum CellVdecPicFormatType : u32 }; // Output Color Matrix Coef -enum CellVdecColorMatrixType : u32 +enum CellVdecColorMatrixType : s32 { CELL_VDEC_COLOR_MATRIX_TYPE_BT601, CELL_VDEC_COLOR_MATRIX_TYPE_BT709, }; -enum CellVdecPicAttr : u32 +enum CellVdecPicAttr : s32 { CELL_VDEC_PICITEM_ATTR_NORMAL, CELL_VDEC_PICITEM_ATTR_SKIPPED, @@ -76,14 +76,14 @@ enum CellVdecFrameRate : u8 // Codec Type Information struct CellVdecType { - be_t codecType; + be_t codecType; // CellVdecCodecType be_t profileLevel; }; // Extended Codec Type Information struct CellVdecTypeEx { - be_t codecType; + be_t codecType; // CellVdecCodecType be_t profileLevel; be_t codecSpecificInfo_addr; }; @@ -128,9 +128,6 @@ struct CellVdecResourceEx be_t spursResource_addr; }; -// Presentation Time Stamp -typedef CellCodecTimeStamp CellVdecTimeStamp; - // Access Unit Information struct CellVdecAuInfo { @@ -145,7 +142,7 @@ struct CellVdecAuInfo // Output Picture Information struct CellVdecPicItem { - be_t codecType; + be_t codecType; // CellVdecCodecType be_t startAddr; be_t size; u8 auNum; @@ -153,28 +150,28 @@ struct CellVdecPicItem CellCodecTimeStamp auDts[2]; be_t auUserData[2]; be_t status; - be_t attr; + be_t attr; // CellVdecPicAttr be_t picInfo_addr; }; // Output Picture Format struct CellVdecPicFormat { - be_t formatType; - be_t colorMatrixType; + be_t formatType; // CellVdecPicFormatType + be_t colorMatrixType; // CellVdecColorMatrixType u8 alpha; }; struct CellVdecPicFormat2 { - be_t formatType; - be_t colorMatrixType; + be_t formatType; // CellVdecPicFormatType + be_t colorMatrixType; // CellVdecColorMatrixType be_t unk0; u8 alpha; be_t unk1; }; -typedef u32(CellVdecCbMsg)(u32 handle, CellVdecMsgType msgType, s32 msgData, u32 cbArg); +using CellVdecCbMsg = func_def; // Callback Function Information struct CellVdecCb @@ -470,7 +467,7 @@ struct CellVdecDivxInfo DIVX_transferCharacteristics transferCharacteristics; DIVX_matrixCoefficients matrixCoefficients; DIVX_pictureStruct pictureStruct; - be_t frameRateCode; + be_t frameRateCode; // DIVX_frameRateCode }; enum MPEG2_level @@ -640,8 +637,8 @@ struct CellVdecMpeg2Info u8 number_of_frame_centre_offsets[2]; be_t frame_centre_horizontal_offset[2][3]; be_t frame_centre_vertical_offset[2][3]; - be_t headerPresentFlags; - be_t headerRetentionFlags; + be_t headerPresentFlags; // MPEG2_headerFlags + be_t headerRetentionFlags; // MPEG2_headerFlags bool mpeg1Flag; u8 ccDataLength[2]; u8 ccData[2][128]; @@ -719,7 +716,7 @@ public: squeue_t frames; - const CellVdecCodecType type; + const s32 type; const u32 profile; const u32 memAddr; const u32 memSize; @@ -734,7 +731,7 @@ public: PPUThread* vdecCb; - VideoDecoder(CellVdecCodecType type, u32 profile, u32 addr, u32 size, vm::ptr func, u32 arg); + VideoDecoder(s32 type, u32 profile, u32 addr, u32 size, vm::ptr func, u32 arg); ~VideoDecoder(); }; diff --git a/rpcs3/Emu/SysCalls/Modules/cellVpost.h b/rpcs3/Emu/SysCalls/Modules/cellVpost.h index 0cf9577075..eab6d8a3b4 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellVpost.h +++ b/rpcs3/Emu/SysCalls/Modules/cellVpost.h @@ -139,23 +139,23 @@ enum CELL_VPOST_CSC_ERROR_E_FATAL_SPUCORE_FAIL = 0x806184c2, }; -enum CellVpostPictureDepth +enum CellVpostPictureDepth : s32 { CELL_VPOST_PIC_DEPTH_8, }; -enum CellVpostPictureFormatIn +enum CellVpostPictureFormatIn : s32 { CELL_VPOST_PIC_FMT_IN_YUV420_PLANAR, }; -enum CellVpostPictureFormatOut +enum CellVpostPictureFormatOut : s32 { CELL_VPOST_PIC_FMT_OUT_RGBA_ILV, CELL_VPOST_PIC_FMT_OUT_YUV420_PLANAR, }; -enum CellVpostPictureStructure +enum CellVpostPictureStructure : s32 { CELL_VPOST_PIC_STRUCT_PFRM, CELL_VPOST_PIC_STRUCT_IFRM, @@ -163,7 +163,7 @@ enum CellVpostPictureStructure CELL_VPOST_PIC_STRUCT_IBTM, }; -enum CellVpostExecType +enum CellVpostExecType : s32 { CELL_VPOST_EXEC_TYPE_PFRM_PFRM, CELL_VPOST_EXEC_TYPE_PTOP_ITOP, @@ -175,31 +175,31 @@ enum CellVpostExecType CELL_VPOST_EXEC_TYPE_IBTM_IBTM, }; -enum CellVpostChromaPositionType +enum CellVpostChromaPositionType : s32 { CELL_VPOST_CHROMA_POS_TYPE_A, CELL_VPOST_CHROMA_POS_TYPE_B, }; -enum CellVpostScanType +enum CellVpostScanType : s32 { CELL_VPOST_SCAN_TYPE_P, CELL_VPOST_SCAN_TYPE_I, }; -enum CellVpostQuantRange +enum CellVpostQuantRange : s32 { CELL_VPOST_QUANT_RANGE_FULL, CELL_VPOST_QUANT_RANGE_BROADCAST, }; -enum CellVpostColorMatrix +enum CellVpostColorMatrix : s32 { CELL_VPOST_COLOR_MATRIX_BT601, CELL_VPOST_COLOR_MATRIX_BT709, }; -enum CellVpostScalerType +enum CellVpostScalerType : s32 { CELL_VPOST_SCALER_TYPE_BILINEAR, CELL_VPOST_SCALER_TYPE_LINEAR_SHARP, @@ -207,7 +207,7 @@ enum CellVpostScalerType CELL_VPOST_SCALER_TYPE_8X4TAP, }; -enum CellVpostIpcType +enum CellVpostIpcType : s32 { CELL_VPOST_IPC_TYPE_DOUBLING, CELL_VPOST_IPC_TYPE_LINEAR, @@ -218,13 +218,13 @@ struct CellVpostCfgParam { be_t inMaxWidth; be_t inMaxHeight; - be_t inDepth; - be_t inPicFmt; + be_t inDepth; // CellVpostPictureDepth + be_t inPicFmt; // CellVpostPictureFormatIn be_t outMaxWidth; be_t outMaxHeight; - be_t outDepth; - be_t outPicFmt; + be_t outDepth; // CellVpostPictureDepth + be_t outPicFmt; // CellVpostPictureFormatOut be_t reserved1; be_t reserved2; @@ -267,16 +267,16 @@ struct CellVpostWindow struct CellVpostCtrlParam { - be_t execType; + be_t execType; // CellVpostExecType - be_t scalerType; - be_t ipcType; + be_t scalerType; // CellVpostScalerType + be_t ipcType; // CellVpostIpcType be_t inWidth; be_t inHeight; - be_t inChromaPosType; - be_t inQuantRange; - be_t inColorMatrix; + be_t inChromaPosType; // CellVpostChromaPositionType + be_t inQuantRange; // CellVpostQuantRange + be_t inColorMatrix; // CellVpostColorMatrix CellVpostWindow inWindow; be_t outWidth; @@ -294,23 +294,23 @@ struct CellVpostPictureInfo { be_t inWidth; be_t inHeight; - be_t inDepth; - be_t inScanType; - be_t inPicFmt; - be_t inChromaPosType; - be_t inPicStruct; - be_t inQuantRange; - be_t inColorMatrix; + be_t inDepth; // CellVpostPictureDepth + be_t inScanType; // CellVpostScanType + be_t inPicFmt; // CellVpostPictureFormatIn + be_t inChromaPosType; // CellVpostChromaPositionType + be_t inPicStruct; // CellVpostPictureStructure + be_t inQuantRange; // CellVpostQuantRange + be_t inColorMatrix; // CellVpostColorMatrix be_t outWidth; be_t outHeight; - be_t outDepth; - be_t outScanType; - be_t outPicFmt; - be_t outChromaPosType; - be_t outPicStruct; - be_t outQuantRange; - be_t outColorMatrix; + be_t outDepth; // CellVpostPictureDepth + be_t outScanType; // CellVpostScanType + be_t outPicFmt; // CellVpostPictureFormatOut + be_t outChromaPosType; // CellVpostChromaPositionType + be_t outPicStruct; // CellVpostPictureStructure + be_t outQuantRange; // CellVpostQuantRange + be_t outColorMatrix; // CellVpostColorMatrix be_t userData; diff --git a/rpcs3/Emu/SysCalls/Modules/sysPrxForUser.cpp b/rpcs3/Emu/SysCalls/Modules/sysPrxForUser.cpp index bb793e49f3..2878101c64 100644 --- a/rpcs3/Emu/SysCalls/Modules/sysPrxForUser.cpp +++ b/rpcs3/Emu/SysCalls/Modules/sysPrxForUser.cpp @@ -112,7 +112,7 @@ s32 sys_lwmutex_create(vm::ptr lwmutex, vm::ptrlock_var = { { lwmutex::free, lwmutex::zero } }; + lwmutex->lock_var = { { lwmutex_free, 0 } }; lwmutex->attribute = attr->recursive | attr->protocol; lwmutex->recursive_count = 0; lwmutex->sleep_queue = Emu.GetIdManager().make(protocol, attr->name_u64); @@ -125,7 +125,7 @@ s32 sys_lwmutex_destroy(PPUThread& CPU, vm::ptr lwmutex) sysPrxForUser.Log("sys_lwmutex_destroy(lwmutex=*0x%x)", lwmutex); // check to prevent recursive locking in the next call - if (lwmutex->owner.read_relaxed() == CPU.GetId()) + if (lwmutex->vars.owner.read_relaxed() == CPU.GetId()) { return CELL_EBUSY; } @@ -146,7 +146,7 @@ s32 sys_lwmutex_destroy(PPUThread& CPU, vm::ptr lwmutex) } // deleting succeeded - lwmutex->owner.exchange(lwmutex::dead); + lwmutex->vars.owner.exchange(lwmutex_dead); return CELL_OK; } @@ -155,10 +155,10 @@ s32 sys_lwmutex_lock(PPUThread& CPU, vm::ptr lwmutex, u64 timeout { sysPrxForUser.Log("sys_lwmutex_lock(lwmutex=*0x%x, timeout=0x%llx)", lwmutex, timeout); - const be_t tid = be_t::make(CPU.GetId()); + const be_t tid = CPU.GetId(); // try to lock lightweight mutex - const be_t old_owner = lwmutex->owner.compare_and_swap(lwmutex::free, tid); + const be_t old_owner = lwmutex->vars.owner.compare_and_swap(lwmutex_free, tid); if (old_owner.data() == se32(lwmutex_free)) { @@ -197,9 +197,9 @@ s32 sys_lwmutex_lock(PPUThread& CPU, vm::ptr lwmutex, u64 timeout for (u32 i = 0; i < 300; i++) { - if (lwmutex->owner.read_relaxed().data() == se32(lwmutex_free)) + if (lwmutex->vars.owner.read_relaxed().data() == se32(lwmutex_free)) { - if (lwmutex->owner.compare_and_swap_test(lwmutex::free, tid)) + if (lwmutex->vars.owner.compare_and_swap_test(lwmutex_free, tid)) { // locking succeeded return CELL_OK; @@ -210,7 +210,7 @@ s32 sys_lwmutex_lock(PPUThread& CPU, vm::ptr lwmutex, u64 timeout // atomically increment waiter value using 64 bit op lwmutex->all_info++; - if (lwmutex->owner.compare_and_swap_test(lwmutex::free, tid)) + if (lwmutex->vars.owner.compare_and_swap_test(lwmutex_free, tid)) { // locking succeeded lwmutex->all_info--; @@ -226,7 +226,7 @@ s32 sys_lwmutex_lock(PPUThread& CPU, vm::ptr lwmutex, u64 timeout if (res == CELL_OK) { // locking succeeded - auto old = lwmutex->owner.exchange(tid); + auto old = lwmutex->vars.owner.exchange(tid); if (old.data() != se32(lwmutex_reserved) && !Emu.IsStopped()) { @@ -249,10 +249,10 @@ s32 sys_lwmutex_trylock(PPUThread& CPU, vm::ptr lwmutex) { sysPrxForUser.Log("sys_lwmutex_trylock(lwmutex=*0x%x)", lwmutex); - const be_t tid = be_t::make(CPU.GetId()); + const be_t tid = CPU.GetId(); // try to lock lightweight mutex - const be_t old_owner = lwmutex->owner.compare_and_swap(lwmutex::free, tid); + const be_t old_owner = lwmutex->vars.owner.compare_and_swap(lwmutex_free, tid); if (old_owner.data() == se32(lwmutex_free)) { @@ -297,7 +297,7 @@ s32 sys_lwmutex_trylock(PPUThread& CPU, vm::ptr lwmutex) if (res == CELL_OK) { // locking succeeded - auto old = lwmutex->owner.exchange(tid); + auto old = lwmutex->vars.owner.exchange(tid); if (old.data() != se32(lwmutex_reserved) && !Emu.IsStopped()) { @@ -316,10 +316,10 @@ s32 sys_lwmutex_unlock(PPUThread& CPU, vm::ptr lwmutex) { sysPrxForUser.Log("sys_lwmutex_unlock(lwmutex=*0x%x)", lwmutex); - const be_t tid = be_t::make(CPU.GetId()); + const be_t tid = CPU.GetId(); // check owner - if (lwmutex->owner.read_relaxed() != tid) + if (lwmutex->vars.owner.read_relaxed() != tid) { return CELL_EPERM; } @@ -333,7 +333,7 @@ s32 sys_lwmutex_unlock(PPUThread& CPU, vm::ptr lwmutex) } // ensure that waiter is zero - if (lwmutex->lock_var.compare_and_swap_test({ tid, lwmutex::zero }, { lwmutex::free, lwmutex::zero })) + if (lwmutex->lock_var.compare_and_swap_test({ tid, 0 }, { lwmutex_free, 0 })) { // unlocking succeeded return CELL_OK; @@ -345,7 +345,7 @@ s32 sys_lwmutex_unlock(PPUThread& CPU, vm::ptr lwmutex) } // set special value - lwmutex->owner.exchange(lwmutex::reserved); + lwmutex->vars.owner.exchange(lwmutex_reserved); // call the syscall if (_sys_lwmutex_unlock(lwmutex->sleep_queue) == CELL_ESRCH) @@ -392,7 +392,7 @@ s32 sys_lwcond_signal(PPUThread& CPU, vm::ptr lwcond) //return _sys_lwcond_signal(lwcond->lwcond_queue, 0, -1, 2); } - if (lwmutex->owner.read_relaxed() == CPU.GetId()) + if (lwmutex->vars.owner.read_relaxed() == CPU.GetId()) { // if owns the mutex lwmutex->all_info++; @@ -450,7 +450,7 @@ s32 sys_lwcond_signal_all(PPUThread& CPU, vm::ptr lwcond) //return _sys_lwcond_signal_all(lwcond->lwcond_queue, lwmutex->sleep_queue, 2); } - if (lwmutex->owner.read_relaxed() == CPU.GetId()) + if (lwmutex->vars.owner.read_relaxed() == CPU.GetId()) { // if owns the mutex, call the syscall const s32 res = _sys_lwcond_signal_all(lwcond->lwcond_queue, lwmutex->sleep_queue, 1); @@ -507,7 +507,7 @@ s32 sys_lwcond_signal_to(PPUThread& CPU, vm::ptr lwcond, u32 ppu_t //return _sys_lwcond_signal(lwcond->lwcond_queue, 0, ppu_thread_id, 2); } - if (lwmutex->owner.read_relaxed() == CPU.GetId()) + if (lwmutex->vars.owner.read_relaxed() == CPU.GetId()) { // if owns the mutex lwmutex->all_info++; @@ -557,11 +557,11 @@ s32 sys_lwcond_wait(PPUThread& CPU, vm::ptr lwcond, u64 timeout) { sysPrxForUser.Log("sys_lwcond_wait(lwcond=*0x%x, timeout=0x%llx)", lwcond, timeout); - const be_t tid = be_t::make(CPU.GetId()); + const be_t tid = CPU.GetId(); const vm::ptr lwmutex = lwcond->lwmutex; - if (lwmutex->owner.read_relaxed() != tid) + if (lwmutex->vars.owner.read_relaxed() != tid) { // if not owner of the mutex return CELL_EPERM; @@ -571,7 +571,7 @@ s32 sys_lwcond_wait(PPUThread& CPU, vm::ptr lwcond, u64 timeout) const be_t recursive_value = lwmutex->recursive_count; // set special value - lwmutex->owner = { lwmutex::reserved }; + lwmutex->vars.owner = { lwmutex_reserved }; lwmutex->recursive_count = 0; // call the syscall @@ -585,7 +585,7 @@ s32 sys_lwcond_wait(PPUThread& CPU, vm::ptr lwcond, u64 timeout) } // restore owner and recursive value - const auto old = lwmutex->owner.exchange(tid); + const auto old = lwmutex->vars.owner.exchange(tid); lwmutex->recursive_count = recursive_value; if (old.data() != se32(lwmutex_reserved) && !Emu.IsStopped()) @@ -614,7 +614,7 @@ s32 sys_lwcond_wait(PPUThread& CPU, vm::ptr lwcond, u64 timeout) if (res == CELL_EDEADLK) { // restore owner and recursive value - const auto old = lwmutex->owner.exchange(tid); + const auto old = lwmutex->vars.owner.exchange(tid); lwmutex->recursive_count = recursive_value; if (old.data() != se32(lwmutex_reserved) && !Emu.IsStopped()) @@ -743,7 +743,7 @@ std::string ps3_fmt(PPUThread& context, vm::cptr fmt, u32 g_count, u32 f_c case 's': { // string - auto string = vm::cptr::make(context.get_next_gpr_arg(g_count, f_count, v_count)); + auto string = vm::cptr::make(context.get_next_gpr_arg(g_count, f_count, v_count)); if (plus_sign || minus_sign || space_sign || number_sign || zero_padding || width || prec) break; @@ -904,7 +904,7 @@ s32 sys_raw_spu_image_load(s32 id, vm::ptr img) const auto stamp1 = get_system_time(); - vm::write32(RAW_SPU_BASE_ADDR + RAW_SPU_OFFSET * id + RAW_SPU_PROB_OFFSET + SPU_NPC_offs, img->entry_point | be_t::make(1)); + vm::write32(RAW_SPU_BASE_ADDR + RAW_SPU_OFFSET * id + RAW_SPU_PROB_OFFSET + SPU_NPC_offs, img->entry_point | 1); const auto stamp2 = get_system_time(); @@ -1179,7 +1179,7 @@ void sys_spinlock_initialize(vm::ptr> lock) sysPrxForUser.Log("sys_spinlock_initialize(lock=*0x%x)", lock); // prx: set 0 and sync - lock->exchange(be_t::make(0)); + lock->exchange(0); } void sys_spinlock_lock(vm::ptr> lock) @@ -1187,7 +1187,7 @@ void sys_spinlock_lock(vm::ptr> lock) sysPrxForUser.Log("sys_spinlock_lock(lock=*0x%x)", lock); // prx: exchange with 0xabadcafe, repeat until exchanged with 0 - while (lock->exchange(be_t::make(0xabadcafe)).data()) + while (lock->exchange(0xabadcafe).data()) { g_sys_spinlock_wm.wait_op(lock.addr(), [lock](){ return lock->read_relaxed().data() == 0; }); @@ -1204,7 +1204,7 @@ s32 sys_spinlock_trylock(vm::ptr> lock) sysPrxForUser.Log("sys_spinlock_trylock(lock=*0x%x)", lock); // prx: exchange with 0xabadcafe, translate exchanged value - if (lock->exchange(be_t::make(0xabadcafe)).data()) + if (lock->exchange(0xabadcafe).data()) { return CELL_EBUSY; } @@ -1217,7 +1217,7 @@ void sys_spinlock_unlock(vm::ptr> lock) sysPrxForUser.Log("sys_spinlock_unlock(lock=*0x%x)", lock); // prx: sync and set 0 - lock->exchange(be_t::make(0)); + lock->exchange(0); g_sys_spinlock_wm.notify(lock.addr()); } @@ -1274,7 +1274,7 @@ void sys_ppu_thread_once(PPUThread& CPU, vm::ptr> once_ctrl, vm std::lock_guard lock(g_once_mutex); - if (once_ctrl->compare_and_swap_test(be_t::make(SYS_PPU_THREAD_ONCE_INIT), be_t::make(SYS_PPU_THREAD_DONE_INIT))) + if (once_ctrl->compare_and_swap_test(SYS_PPU_THREAD_ONCE_INIT, SYS_PPU_THREAD_DONE_INIT)) { // call init function using current thread context init(CPU); diff --git a/rpcs3/Emu/SysCalls/lv2/sys_lwmutex.h b/rpcs3/Emu/SysCalls/lv2/sys_lwmutex.h index ed0bb82345..7412ee65af 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_lwmutex.h +++ b/rpcs3/Emu/SysCalls/lv2/sys_lwmutex.h @@ -16,29 +16,11 @@ struct sys_lwmutex_attribute_t enum : u32 { - lwmutex_zero = 0u, - lwmutex_free = 0u - 1u, - lwmutex_dead = 0u - 2u, - lwmutex_reserved = 0u - 3u, + lwmutex_free = 0xffffffffu, + lwmutex_dead = 0xfffffffeu, + lwmutex_reserved = 0xfffffffdu, }; -namespace lwmutex -{ - template - struct const_be_u32_t - { - operator const be_t() const - { - return be_t::make(_value); - } - }; - - static const_be_u32_t zero; - static const_be_u32_t free; - static const_be_u32_t dead; - static const_be_u32_t reserved; -} - struct sys_lwmutex_t { struct sync_var_t @@ -55,7 +37,8 @@ struct sys_lwmutex_t { atomic_be_t owner; atomic_be_t waiter; - }; + } + vars; atomic_be_t all_info; }; diff --git a/rpcs3/Emu/SysCalls/lv2/sys_prx.cpp b/rpcs3/Emu/SysCalls/lv2/sys_prx.cpp index 1380af5ba5..2374e1ade3 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_prx.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_prx.cpp @@ -192,7 +192,7 @@ s32 sys_prx_start_module(s32 id, u64 flags, vm::ptris_started = true; - pOpt->entry_point.set(be_t::make(prx->start ? prx->start.addr() : ~0ull)); + pOpt->entry_point.set(prx->start ? prx->start.addr() : ~0ull); return CELL_OK; } @@ -212,7 +212,7 @@ s32 sys_prx_stop_module(s32 id, u64 flags, vm::ptr // return CELL_PRX_ERROR_ALREADY_STOPPED; //prx->is_started = false; - pOpt->entry_point.set(be_t::make(prx->stop ? prx->stop.addr() : -1)); + pOpt->entry_point.set(prx->stop ? prx->stop.addr() : -1); return CELL_OK; } diff --git a/rpcs3/Loader/ELF32.cpp b/rpcs3/Loader/ELF32.cpp index 41766f9443..4c916c4c51 100644 --- a/rpcs3/Loader/ELF32.cpp +++ b/rpcs3/Loader/ELF32.cpp @@ -36,23 +36,23 @@ namespace loader return bad_file; } - if (m_ehdr.data_le.e_phnum && (m_ehdr.is_le() ? m_ehdr.data_le.e_phentsize : m_ehdr.data_be.e_phentsize) != sizeof(phdr)) + if (m_ehdr.data_le.e_phnum && (m_ehdr.is_le() ? m_ehdr.data_le.e_phentsize != sizeof(phdr) : m_ehdr.data_be.e_phentsize != sizeof(phdr))) { return broken_file; } - if (m_ehdr.data_le.e_shnum && (m_ehdr.is_le() ? m_ehdr.data_le.e_shentsize : m_ehdr.data_be.e_shentsize) != sizeof(shdr)) + if (m_ehdr.data_le.e_shnum && (m_ehdr.is_le() ? m_ehdr.data_le.e_shentsize != sizeof(shdr) : m_ehdr.data_be.e_shentsize != sizeof(shdr))) { return broken_file; } - LOG_WARNING(LOADER, "m_ehdr.e_type = 0x%x", (u16)(m_ehdr.is_le() ? m_ehdr.data_le.e_type : m_ehdr.data_be.e_type)); + LOG_WARNING(LOADER, "m_ehdr.e_type = 0x%x", m_ehdr.is_le() ? m_ehdr.data_le.e_type : m_ehdr.data_be.e_type.value()); if (m_ehdr.data_le.e_phnum) { - m_phdrs.resize(m_ehdr.is_le() ? m_ehdr.data_le.e_phnum : m_ehdr.data_be.e_phnum); - m_stream->Seek(handler::get_stream_offset() + (m_ehdr.is_le() ? m_ehdr.data_le.e_phoff : m_ehdr.data_be.e_phoff)); - size_t size = (m_ehdr.is_le() ? m_ehdr.data_le.e_phnum : m_ehdr.data_be.e_phnum) * sizeof(phdr); + m_phdrs.resize(m_ehdr.is_le() ? m_ehdr.data_le.e_phnum : m_ehdr.data_be.e_phnum.value()); + m_stream->Seek(handler::get_stream_offset() + (m_ehdr.is_le() ? m_ehdr.data_le.e_phoff : m_ehdr.data_be.e_phoff.value())); + size_t size = (m_ehdr.is_le() ? m_ehdr.data_le.e_phnum : m_ehdr.data_be.e_phnum.value()) * sizeof(phdr); if (m_stream->Read(m_phdrs.data(), size) != size) return broken_file; @@ -60,9 +60,9 @@ namespace loader if (m_ehdr.data_le.e_shnum) { - m_shdrs.resize(m_ehdr.is_le() ? m_ehdr.data_le.e_shnum : m_ehdr.data_be.e_shnum); - m_stream->Seek(handler::get_stream_offset() + (m_ehdr.is_le() ? m_ehdr.data_le.e_shoff : m_ehdr.data_be.e_shoff)); - size_t size = (m_ehdr.is_le() ? m_ehdr.data_le.e_shnum : m_ehdr.data_be.e_shnum) * sizeof(shdr); + m_shdrs.resize(m_ehdr.is_le() ? m_ehdr.data_le.e_shnum : m_ehdr.data_be.e_shnum.value()); + m_stream->Seek(handler::get_stream_offset() + (m_ehdr.is_le() ? m_ehdr.data_le.e_shoff : m_ehdr.data_be.e_shoff.value())); + size_t size = (m_ehdr.is_le() ? m_ehdr.data_le.e_shnum : m_ehdr.data_be.e_shnum.value()) * sizeof(shdr); if (m_stream->Read(m_shdrs.data(), size) != size) return broken_file; @@ -74,7 +74,7 @@ namespace loader handler::error_code elf32::load() { Elf_Machine machine; - switch (machine = (Elf_Machine)(u16)(m_ehdr.is_le() ? m_ehdr.data_le.e_machine : m_ehdr.data_be.e_machine)) + switch (machine = (Elf_Machine)(u16)(m_ehdr.is_le() ? m_ehdr.data_le.e_machine : m_ehdr.data_be.e_machine.value())) { case MACHINE_MIPS: vm::psp::init(); break; case MACHINE_ARM: vm::psv::init(); break; @@ -401,13 +401,13 @@ namespace loader armv7_decoder_initialize(code_start, code_end); const std::string& thread_name = proc_param->sceUserMainThreadName ? proc_param->sceUserMainThreadName.get_ptr() : "main_thread"; - const u32 stack_size = proc_param->sceUserMainThreadStackSize ? *proc_param->sceUserMainThreadStackSize : 256 * 1024; - const u32 priority = proc_param->sceUserMainThreadPriority ? *proc_param->sceUserMainThreadPriority : 160; + const u32 stack_size = proc_param->sceUserMainThreadStackSize ? proc_param->sceUserMainThreadStackSize->value() : 256 * 1024; + const u32 priority = proc_param->sceUserMainThreadPriority ? proc_param->sceUserMainThreadPriority->value() : 160; armv7_thread(entry, thread_name, stack_size, priority).args({ Emu.GetPath(), "-emu" }).run(); break; } - case MACHINE_SPU: spu_thread(m_ehdr.is_le() ? m_ehdr.data_le.e_entry : m_ehdr.data_be.e_entry, "main_thread").args({ Emu.GetPath()/*, "-emu"*/ }).run(); break; + case MACHINE_SPU: spu_thread(m_ehdr.is_le() ? m_ehdr.data_le.e_entry : m_ehdr.data_be.e_entry.value(), "main_thread").args({ Emu.GetPath()/*, "-emu"*/ }).run(); break; } return ok; @@ -415,16 +415,16 @@ namespace loader handler::error_code elf32::load_data(u32 offset, bool skip_writeable) { - Elf_Machine machine = (Elf_Machine)(u16)(m_ehdr.is_le() ? m_ehdr.data_le.e_machine : m_ehdr.data_be.e_machine); + Elf_Machine machine = (Elf_Machine)(u16)(m_ehdr.is_le() ? m_ehdr.data_le.e_machine : m_ehdr.data_be.e_machine.value()); for (auto &phdr : m_phdrs) { - u32 memsz = m_ehdr.is_le() ? phdr.data_le.p_memsz : phdr.data_be.p_memsz; - u32 filesz = m_ehdr.is_le() ? phdr.data_le.p_filesz : phdr.data_be.p_filesz; - u32 vaddr = offset + (m_ehdr.is_le() ? phdr.data_le.p_vaddr : phdr.data_be.p_vaddr); - u32 offset = m_ehdr.is_le() ? phdr.data_le.p_offset : phdr.data_be.p_offset; + u32 memsz = m_ehdr.is_le() ? phdr.data_le.p_memsz : phdr.data_be.p_memsz.value(); + u32 filesz = m_ehdr.is_le() ? phdr.data_le.p_filesz : phdr.data_be.p_filesz.value(); + u32 vaddr = offset + (m_ehdr.is_le() ? phdr.data_le.p_vaddr : phdr.data_be.p_vaddr.value()); + u32 offset = m_ehdr.is_le() ? phdr.data_le.p_offset : phdr.data_be.p_offset.value(); - switch (m_ehdr.is_le() ? phdr.data_le.p_type : phdr.data_be.p_type) + switch (m_ehdr.is_le() ? phdr.data_le.p_type : phdr.data_be.p_type.value()) { case 0x00000001: //LOAD if (phdr.data_le.p_memsz) diff --git a/rpcs3/Loader/ELF64.cpp b/rpcs3/Loader/ELF64.cpp index 4b8e9c70e4..d26bb3f267 100644 --- a/rpcs3/Loader/ELF64.cpp +++ b/rpcs3/Loader/ELF64.cpp @@ -117,7 +117,7 @@ namespace loader return loading_error; } - segment.initial_addr.set(phdr.p_vaddr.addr()); + segment.initial_addr = phdr.p_vaddr; LOG_WARNING(LOADER, "segment addr=0x%x, initial addr = 0x%x", segment.begin.addr(), segment.initial_addr.addr()); if (phdr.p_filesz) @@ -365,7 +365,7 @@ namespace loader { for (auto &e : m.second.exports) { - auto code = vm::cptr::make(vm::check_addr(e.second, 8) ? vm::read32(e.second) : 0); + auto code = vm::cptr::make(vm::check_addr(e.second, 8) ? vm::read32(e.second).value() : 0); bool is_empty = !code || (code[0] == 0x38600000 && code[1] == BLR()); diff --git a/rpcs3/Loader/TROPUSR.cpp b/rpcs3/Loader/TROPUSR.cpp index d7ba52d755..76e343f24d 100644 --- a/rpcs3/Loader/TROPUSR.cpp +++ b/rpcs3/Loader/TROPUSR.cpp @@ -140,20 +140,8 @@ bool TROPUSRLoader::Generate(const std::string& filepath, const std::string& con default: trophy_grade = 0; } - TROPUSREntry4 entry4 = { - be_t::make(4), - be_t::make(sizeof(TROPUSREntry4) - 0x10), - be_t::make((u32)m_table4.size()), - be_t::make(0), - be_t::make(trophy_id), - be_t::make(trophy_grade), - be_t::make(0xFFFFFFFF) }; - TROPUSREntry6 entry6 = { - be_t::make(6), - be_t::make(sizeof(TROPUSREntry6) - 0x10), - be_t::make((u32)m_table6.size()), - be_t::make(0), - be_t::make(trophy_id) }; + TROPUSREntry4 entry4 = { 4, sizeof32(TROPUSREntry4) - 0x10, (u32)m_table4.size(), 0, trophy_id, trophy_grade, 0xFFFFFFFF }; + TROPUSREntry6 entry6 = { 6, sizeof32(TROPUSREntry6) - 0x10, (u32)m_table6.size(), 0, trophy_id }; m_table4.push_back(entry4); m_table6.push_back(entry6); @@ -161,19 +149,9 @@ bool TROPUSRLoader::Generate(const std::string& filepath, const std::string& con } u64 offset = sizeof(TROPUSRHeader) + 2 * sizeof(TROPUSRTableHeader); - TROPUSRTableHeader table4header = { - be_t::make(4), - be_t::make(sizeof(TROPUSREntry4) - 0x10), - be_t::make(1), - be_t::make((u32)m_table4.size()), - be_t::make(offset) }; + TROPUSRTableHeader table4header = { 4, sizeof32(TROPUSREntry4) - 0x10, 1, (u32)m_table4.size(), offset }; offset += m_table4.size() * sizeof(TROPUSREntry4); - TROPUSRTableHeader table6header = { - be_t::make(6), - be_t::make(sizeof(TROPUSREntry6) - 0x10), - be_t::make(1), - be_t::make((u32)m_table6.size()), - be_t::make(offset) }; + TROPUSRTableHeader table6header = { 6, sizeof32(TROPUSREntry6) - 0x10, 1, (u32)m_table6.size(), offset }; offset += m_table6.size() * sizeof(TROPUSREntry6); m_tableHeaders.clear();