diff --git a/rpcs3/Emu/Cell/Modules/cellGame.cpp b/rpcs3/Emu/Cell/Modules/cellGame.cpp index 21dddcdd1a..8cd876ce3a 100644 --- a/rpcs3/Emu/Cell/Modules/cellGame.cpp +++ b/rpcs3/Emu/Cell/Modules/cellGame.cpp @@ -16,6 +16,7 @@ #include "Utilities/StrUtil.h" #include "Utilities/span.h" #include "util/init_mutex.hpp" +#include "util/asm.hpp" #include @@ -1343,7 +1344,7 @@ error_code cellDiscGameGetBootDiscInfo(vm::ptr getP } // Always sets 0 at first dword - reinterpret_cast*>(getParam->titleId)[0] = 0; + *utils::bless>(getParam->titleId + 0) = 0; // This is also called by non-disc games, see NPUB90029 static const std::string dir = "/dev_bdvd/PS3_GAME"s; diff --git a/rpcs3/Emu/Cell/Modules/cellGifDec.cpp b/rpcs3/Emu/Cell/Modules/cellGifDec.cpp index 3211feafcd..0135f65cf8 100644 --- a/rpcs3/Emu/Cell/Modules/cellGifDec.cpp +++ b/rpcs3/Emu/Cell/Modules/cellGifDec.cpp @@ -9,6 +9,8 @@ #include "Emu/Cell/lv2/sys_fs.h" #include "cellGifDec.h" +#include "util/asm.hpp" + LOG_CHANNEL(cellGifDec); // Temporarily @@ -131,8 +133,8 @@ error_code cellGifDecReadHeader(PMainHandle mainHandle, PSubHandle subHandle, PI } } - if (*reinterpret_cast*>(buffer) != 0x47494638u || - (*reinterpret_cast*>(buffer + 4) != 0x6139u && *reinterpret_cast*>(buffer + 4) != 0x6137u)) // Error: The first 6 bytes are not a valid GIF signature + if (*utils::bless>(buffer + 0) != 0x47494638u || + (*utils::bless>(buffer + 4) != 0x6139u && *utils::bless>(buffer + 4) != 0x6137u)) // Error: The first 6 bytes are not a valid GIF signature { return CELL_GIFDEC_ERROR_STREAM_FORMAT; // Surprisingly there is no error code related with headerss } diff --git a/rpcs3/Emu/Cell/Modules/cellJpgDec.cpp b/rpcs3/Emu/Cell/Modules/cellJpgDec.cpp index 7f25a2fe14..e7a779b510 100644 --- a/rpcs3/Emu/Cell/Modules/cellJpgDec.cpp +++ b/rpcs3/Emu/Cell/Modules/cellJpgDec.cpp @@ -9,6 +9,8 @@ #include "Emu/Cell/lv2/sys_fs.h" #include "cellJpgDec.h" +#include "util/asm.hpp" + LOG_CHANNEL(cellJpgDec); // Temporarily @@ -146,8 +148,8 @@ error_code cellJpgDecReadHeader(u32 mainHandle, u32 subHandle, vm::ptr*>(buffer.get()) != 0xE0FFD8FF || // Error: Not a valid SOI header - *reinterpret_cast(buffer.get() + 6) != "JFIF"_u32) // Error: Not a valid JFIF string + if (*utils::bless>(buffer.get() + 0) != 0xE0FFD8FF || // Error: Not a valid SOI header + *utils::bless(buffer.get() + 6) != "JFIF"_u32) // Error: Not a valid JFIF string { return CELL_JPGDEC_ERROR_HEADER; } diff --git a/rpcs3/Emu/Cell/Modules/cellL10n.cpp b/rpcs3/Emu/Cell/Modules/cellL10n.cpp index 826cdd5657..5cdc6f942e 100644 --- a/rpcs3/Emu/Cell/Modules/cellL10n.cpp +++ b/rpcs3/Emu/Cell/Modules/cellL10n.cpp @@ -16,6 +16,8 @@ typedef const char *HostCode; #include "cellL10n.h" +#include "util/asm.hpp" + LOG_CHANNEL(cellL10n); // Translate code id to code name. some codepage may has another name. @@ -235,7 +237,7 @@ s32 _ConvertStr(s32 src_code, const void *src, s32 src_len, s32 dst_code, void * if (dst != NULL) { usz dstLen = *dst_len; - usz ictd = iconv(ict, const_cast(reinterpret_cast(&src)), &srcLen, reinterpret_cast(&dst), &dstLen); + usz ictd = iconv(ict, utils::bless(&src), &srcLen, utils::bless(&dst), &dstLen); *dst_len -= dstLen; if (ictd == umax) { @@ -260,7 +262,7 @@ s32 _ConvertStr(s32 src_code, const void *src, s32 src_len, s32 dst_code, void * { //char *bufPtr = buf; usz bufLeft = sizeof(buf); - usz ictd = iconv(ict, const_cast(reinterpret_cast(&src)), &srcLen, reinterpret_cast(&dst), &bufLeft); + usz ictd = iconv(ict, utils::bless(&src), &srcLen, utils::bless(&dst), &bufLeft); *dst_len += sizeof(buf) - bufLeft; if (ictd == umax && errno != E2BIG) { diff --git a/rpcs3/Emu/Cell/lv2/sys_net.cpp b/rpcs3/Emu/Cell/lv2/sys_net.cpp index 13109d0cd0..56d03c5200 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_net.cpp @@ -548,7 +548,7 @@ struct nt_p2p_port auto* hdr_ptr = reinterpret_cast(packet_data+sizeof(u16)); hdr_ptr->checksum = 0; - hdr_ptr->checksum = tcp_checksum(reinterpret_cast(hdr_ptr), sizeof(lv2_socket::p2ps_i::encapsulated_tcp) + datasize); + hdr_ptr->checksum = tcp_checksum(utils::bless(hdr_ptr), sizeof(lv2_socket::p2ps_i::encapsulated_tcp) + datasize); return packet; } diff --git a/rpcs3/Emu/Io/Skylander.cpp b/rpcs3/Emu/Io/Skylander.cpp index c2767546ac..aa6b624b3b 100644 --- a/rpcs3/Emu/Io/Skylander.cpp +++ b/rpcs3/Emu/Io/Skylander.cpp @@ -2,6 +2,8 @@ #include "Skylander.h" #include "Emu/Cell/lv2/sys_usbd.h" +#include "util/asm.hpp" + LOG_CHANNEL(skylander_log, "skylander"); sky_portal g_skyportal; @@ -89,9 +91,9 @@ void sky_portal::get_status(u8* reply_buf) status |= s.status; } - memset(reply_buf, 0, 0x20); + std::memset(reply_buf, 0, 0x20); reply_buf[0] = 0x53; - reinterpret_cast&>(reply_buf[1]) = status; + *utils::bless>(reply_buf + 1) = status; reply_buf[5] = interrupt_counter++; reply_buf[6] = 0x01; } @@ -157,7 +159,7 @@ u8 sky_portal::load_skylander(u8* buf, fs::file in_file) { std::lock_guard lock(sky_mutex); - u32 sky_serial = reinterpret_cast&>(buf[0]); + u32 sky_serial = *utils::bless>(buf); u8 found_slot = 0xFF; // mimics spot retaining on the portal diff --git a/rpcs3/Emu/NP/rpcn_client.cpp b/rpcs3/Emu/NP/rpcn_client.cpp index 20f001fc99..43ac4e7b70 100644 --- a/rpcs3/Emu/NP/rpcn_client.cpp +++ b/rpcs3/Emu/NP/rpcn_client.cpp @@ -11,6 +11,8 @@ #include "Emu/IdManager.h" #include "Emu/System.h" +#include "util/asm.hpp" + #include "generated/np2_structs_generated.h" #ifdef _WIN32 @@ -421,8 +423,8 @@ bool rpcn_client::manage_connection() { if (msg.size() == 6) { - addr_sig = reinterpret_cast&>(msg[0]); - port_sig = reinterpret_cast&>(msg[4]); + addr_sig = *utils::bless>(&msg[0]); + port_sig = *utils::bless>(&msg[4]); [[maybe_unused]] in_addr orig{}; orig.s_addr = addr_sig; @@ -440,7 +442,7 @@ bool rpcn_client::manage_connection() { std::vector ping(9); ping[0] = 1; - *reinterpret_cast*>(&ping[1]) = user_id; + *utils::bless>(&ping[1]) = user_id; if (send_packet_from_p2p_port(ping, addr_rpcn_udp) == -1) { rpcn_log.error("Failed to send ping to rpcn!"); @@ -462,9 +464,9 @@ bool rpcn_client::manage_connection() } const u8 packet_type = header[0]; - const u16 command = reinterpret_cast&>(header[1]); - const u16 packet_size = reinterpret_cast&>(header[3]); - const u32 packet_id = reinterpret_cast&>(header[5]); + const u16 command = *utils::bless>(&header[1]); + const u16 packet_size = *utils::bless>(&header[3]); + const u32 packet_id = *utils::bless>(&header[5]); if (packet_size < RPCN_HEADER_SIZE) return error_and_disconnect("Invalid packet size"); @@ -844,7 +846,7 @@ bool rpcn_client::search_room(u32 req_id, const SceNpCommunicationId& communicat } flatbuffers::Offset> attrid_vec; if (req->attrIdNum) - attrid_vec = builder.CreateVector(reinterpret_cast(req->attrId.get_ptr()), req->attrIdNum); + attrid_vec = builder.CreateVector(utils::bless(req->attrId.get_ptr()), req->attrIdNum); SearchRoomRequestBuilder s_req(builder); s_req.add_option(req->option); @@ -940,7 +942,7 @@ bool rpcn_client::get_roomdata_internal(u32 req_id, const SceNpCommunicationId& flatbuffers::Offset> final_attr_ids_vec; if (req->attrIdNum) - final_attr_ids_vec = builder.CreateVector(reinterpret_cast(req->attrId.get_ptr()), req->attrIdNum); + final_attr_ids_vec = builder.CreateVector(utils::bless(req->attrId.get_ptr()), req->attrIdNum); auto req_finished = CreateGetRoomDataInternalRequest(builder, req->roomId, final_attr_ids_vec); @@ -994,7 +996,7 @@ bool rpcn_client::set_roomdata_internal(u32 req_id, const SceNpCommunicationId& flatbuffers::Offset> final_ownerprivilege_vec; if (req->ownerPrivilegeRankNum) - final_ownerprivilege_vec = builder.CreateVector(reinterpret_cast(req->ownerPrivilegeRank.get_ptr()), req->ownerPrivilegeRankNum); + final_ownerprivilege_vec = builder.CreateVector(utils::bless(req->ownerPrivilegeRank.get_ptr()), req->ownerPrivilegeRankNum); auto req_finished = CreateSetRoomDataInternalRequest(builder, req->roomId, req->flagFilter, req->flagAttr, final_binattrinternal_vec, final_grouppasswordconfig_vec, final_passwordSlotMask, final_ownerprivilege_vec); @@ -1021,7 +1023,7 @@ bool rpcn_client::ping_room_owner(u32 req_id, const SceNpCommunicationId& commun data.resize(COMMUNICATION_ID_SIZE + sizeof(u64)); memcpy(data.data(), communication_id.data, COMMUNICATION_ID_SIZE); - reinterpret_cast&>(data[COMMUNICATION_ID_SIZE]) = room_id; + *utils::bless>(&data[COMMUNICATION_ID_SIZE]) = room_id; if (!forge_send(CommandType::PingRoomOwner, req_id, data)) return false; diff --git a/rpcs3/Emu/NP/rpcn_client.h b/rpcs3/Emu/NP/rpcn_client.h index 6d53e9d652..a7c7382bf1 100644 --- a/rpcs3/Emu/NP/rpcn_client.h +++ b/rpcs3/Emu/NP/rpcn_client.h @@ -5,6 +5,8 @@ #include #include "Utilities/mutex.h" +#include "util/asm.hpp" + #ifdef _WIN32 #include #include @@ -45,7 +47,7 @@ public: error = true; return 0; } - T res = reinterpret_cast&>(vec[i]); + T res = *utils::bless>(&vec[i]); i += sizeof(T); return res; } @@ -84,7 +86,7 @@ public: template void insert(T value) { - value = reinterpret_cast>(value); + value = std::bit_cast, T>(value); // resize + memcpy instead? for (usz index = 0; index < sizeof(T); index++) { diff --git a/rpcs3/Emu/RSX/Common/BufferUtils.cpp b/rpcs3/Emu/RSX/Common/BufferUtils.cpp index b8db764b65..4fe6ff599d 100644 --- a/rpcs3/Emu/RSX/Common/BufferUtils.cpp +++ b/rpcs3/Emu/RSX/Common/BufferUtils.cpp @@ -5,6 +5,7 @@ #include "util/to_endian.hpp" #include "util/sysinfo.hpp" +#include "util/asm.hpp" #include "emmintrin.h" #include "immintrin.h" @@ -142,8 +143,8 @@ namespace if (remaining) { - const auto src_ptr2 = reinterpret_cast*>(src_ptr); - const auto dst_ptr2 = reinterpret_cast*>(dst_ptr); + const auto src_ptr2 = utils::bless>(src_ptr); + const auto dst_ptr2 = utils::bless>(dst_ptr); for (u32 i = 0; i < remaining; ++i) dst_ptr2[i] = src_ptr2[i]; @@ -220,8 +221,8 @@ namespace if (remaining) { - const auto src_ptr2 = reinterpret_cast*>(src_ptr); - const auto dst_ptr2 = reinterpret_cast*>(dst_ptr); + const auto src_ptr2 = utils::bless>(src_ptr); + const auto dst_ptr2 = utils::bless>(dst_ptr); for (u32 i = 0; i < remaining; ++i) { @@ -285,8 +286,8 @@ namespace if (remaining) { - auto src_ptr2 = reinterpret_cast*>(src_ptr); - auto dst_ptr2 = reinterpret_cast*>(dst_ptr); + auto src_ptr2 = utils::bless>(src_ptr); + auto dst_ptr2 = utils::bless>(dst_ptr); for (u32 i = 0; i < remaining; ++i) dst_ptr2[i] = src_ptr2[i]; @@ -349,8 +350,8 @@ namespace const u8 attribute_sz = min_block_size >> 2; for (u32 n = 0; n < remainder; ++n) { - auto src_ptr2 = reinterpret_cast*>(src_ptr); - auto dst_ptr2 = reinterpret_cast(dst_ptr); + auto src_ptr2 = utils::bless>(src_ptr); + auto dst_ptr2 = utils::bless(dst_ptr); for (u32 v = 0; v < attribute_sz; ++v) dst_ptr2[v] = src_ptr2[v]; @@ -415,8 +416,8 @@ namespace const u8 attribute_sz = min_block_size >> 1; for (u32 n = 0; n < remainder; ++n) { - auto src_ptr2 = reinterpret_cast*>(src_ptr); - auto dst_ptr2 = reinterpret_cast(dst_ptr); + auto src_ptr2 = utils::bless>(src_ptr); + auto dst_ptr2 = utils::bless(dst_ptr); for (u32 v = 0; v < attribute_sz; ++v) dst_ptr2[v] = src_ptr2[v]; diff --git a/rpcs3/Input/ds3_pad_handler.cpp b/rpcs3/Input/ds3_pad_handler.cpp index 9d1c7a032d..fd3e029bbc 100644 --- a/rpcs3/Input/ds3_pad_handler.cpp +++ b/rpcs3/Input/ds3_pad_handler.cpp @@ -2,6 +2,8 @@ #include "ds3_pad_handler.h" #include "Emu/Io/pad_config.h" +#include "util/asm.hpp" + LOG_CHANNEL(ds3_log, "DS3"); struct ds3_rumble @@ -444,14 +446,14 @@ void ds3_pad_handler::get_extended_info(const std::shared_ptr& device #ifdef _WIN32 // Official Sony Windows DS3 driver seems to do the same modification of this value as the ps3 - pad->m_sensors[0].m_value = *reinterpret_cast*>(&ds3dev->padData[41 + DS3_HID_OFFSET]); + pad->m_sensors[0].m_value = *utils::bless>(&ds3dev->padData[41 + DS3_HID_OFFSET]); #else // When getting raw values from the device this adjustement is needed - pad->m_sensors[0].m_value = 512 - (*reinterpret_cast*>(&ds3dev->padData[41]) - 512); + pad->m_sensors[0].m_value = 512 - (*utils::bless>(&ds3dev->padData[41]) - 512); #endif - pad->m_sensors[1].m_value = *reinterpret_cast*>(&ds3dev->padData[45 + DS3_HID_OFFSET]); - pad->m_sensors[2].m_value = *reinterpret_cast*>(&ds3dev->padData[43 + DS3_HID_OFFSET]); - pad->m_sensors[3].m_value = *reinterpret_cast*>(&ds3dev->padData[47 + DS3_HID_OFFSET]); + pad->m_sensors[1].m_value = *utils::bless>(&ds3dev->padData[45 + DS3_HID_OFFSET]); + pad->m_sensors[2].m_value = *utils::bless>(&ds3dev->padData[43 + DS3_HID_OFFSET]); + pad->m_sensors[3].m_value = *utils::bless>(&ds3dev->padData[47 + DS3_HID_OFFSET]); // Those are formulas used to adjust sensor values in sys_hid code but I couldn't find all the vars. //auto polish_value = [](s32 value, s32 dword_0x0, s32 dword_0x4, s32 dword_0x8, s32 dword_0xC, s32 dword_0x18, s32 dword_0x1C) -> u16 diff --git a/rpcs3/rpcs3qt/osk_dialog_frame.cpp b/rpcs3/rpcs3qt/osk_dialog_frame.cpp index 05fc640503..2d2357e654 100644 --- a/rpcs3/rpcs3qt/osk_dialog_frame.cpp +++ b/rpcs3/rpcs3qt/osk_dialog_frame.cpp @@ -2,6 +2,8 @@ #include "custom_dialog.h" #include "Emu/Cell/Modules/cellMsgDialog.h" +#include "util/asm.hpp" + #include #include #include @@ -173,7 +175,7 @@ void osk_dialog_frame::Create(const std::string& title, const std::u16string& me void osk_dialog_frame::SetOskText(const QString& text) { - std::memcpy(osk_text, reinterpret_cast(text.constData()), (text.size() + 1u) * sizeof(char16_t)); + std::memcpy(osk_text, utils::bless(text.constData()), (text.size() + 1u) * sizeof(char16_t)); } void osk_dialog_frame::Close(bool accepted) diff --git a/rpcs3/rpcs3qt/skylander_dialog.cpp b/rpcs3/rpcs3qt/skylander_dialog.cpp index ffeaf4b314..08b5e92d5b 100644 --- a/rpcs3/rpcs3qt/skylander_dialog.cpp +++ b/rpcs3/rpcs3qt/skylander_dialog.cpp @@ -6,6 +6,8 @@ #include "skylander_dialog.h" #include "Emu/Io/Skylander.h" +#include "util/asm.hpp" + #include #include #include @@ -643,17 +645,17 @@ skylander_creator_dialog::skylander_creator_dialog(QWidget* parent) std::array buf{}; auto data = buf.data(); // Set the block permissions - reinterpret_cast&>(data[0x36]) = 0x690F0F0F; + *utils::bless>(&data[0x36]) = 0x690F0F0F; for (u32 index = 1; index < 0x10; index++) { - reinterpret_cast&>(data[(index * 0x40) + 0x36]) = 0x69080F7F; + *utils::bless>(&data[(index * 0x40) + 0x36]) = 0x69080F7F; } // Set the skylander infos - reinterpret_cast&>(data[0]) = (sky_id | sky_var) + 1; - reinterpret_cast&>(data[0x10]) = sky_id; - reinterpret_cast&>(data[0x1C]) = sky_var; + *utils::bless>(&data[0]) = (sky_id | sky_var) + 1; + *utils::bless>(&data[0x10]) = sky_id; + *utils::bless>(&data[0x1C]) = sky_var; // Set checksum - reinterpret_cast&>(data[0x1E]) = skylander_crc16(0xFFFF, data, 0x1E); + *utils::bless>(&data[0x1E]) = skylander_crc16(0xFFFF, data, 0x1E); sky_file.write(buf.data(), buf.size()); sky_file.close();