Unexpected bugfixes

Mostly unaligned memory access.
Also includes workarounds for ubsan execution.
This commit is contained in:
Nekotekina 2022-09-29 12:04:38 +03:00 committed by Ivan
parent 7d1c18a569
commit ae809ad320
8 changed files with 26 additions and 27 deletions

View file

@ -1038,7 +1038,7 @@ void ppu_thread::dump_regs(std::string& ret) const
return addr % 4 == 0 && vm::check_addr(addr, vm::page_executable) && g_ppu_itype.decode(*vm::get_super_ptr<u32>(addr)) != ppu_itype::UNK; return addr % 4 == 0 && vm::check_addr(addr, vm::page_executable) && g_ppu_itype.decode(*vm::get_super_ptr<u32>(addr)) != ppu_itype::UNK;
}; };
if (const u32 reg_ptr = *vm::get_super_ptr<u32>(static_cast<u32>(reg)); if (const u32 reg_ptr = *vm::get_super_ptr<be_t<u32, 1>>(static_cast<u32>(reg));
vm::check_addr<8>(reg_ptr) && !vm::check_addr(toc, vm::page_executable)) vm::check_addr<8>(reg_ptr) && !vm::check_addr(toc, vm::page_executable))
{ {
// Check executability and alignment // Check executability and alignment

View file

@ -534,7 +534,7 @@ Value* PPUTranslator::Shuffle(Value* left, Value* right, std::initializer_list<u
// Transform indices (works for vectors with size 2^N) // Transform indices (works for vectors with size 2^N)
for (usz i = 0; i < indices.size(); i++) for (usz i = 0; i < indices.size(); i++)
{ {
data.push_back(indices.end()[~i] ^ mask); data.push_back(*(indices.begin() + indices.size() - 1 - i) ^ mask);
} }
return m_ir->CreateShuffleVector(left, right, ConstantDataVector::get(m_context, data)); return m_ir->CreateShuffleVector(left, right, ConstantDataVector::get(m_context, data));

View file

@ -829,7 +829,7 @@ lv2_file::open_result_t lv2_file::open(std::string_view vpath, s32 flags, s32 mo
if (size == 8) if (size == 8)
{ {
// see lv2_file::open_raw // see lv2_file::open_raw
switch (*static_cast<const be_t<u64>*>(arg)) switch (*static_cast<const be_t<u64, 1>*>(arg))
{ {
case 0x18000000010: type = lv2_file_type::sdata; break; case 0x18000000010: type = lv2_file_type::sdata; break;
case 0x2: type = lv2_file_type::edata; break; case 0x2: type = lv2_file_type::edata; break;

View file

@ -413,7 +413,7 @@ namespace rsx
{ {
for (auto &e : memory_tag_samples) for (auto &e : memory_tag_samples)
{ {
e.second = *reinterpret_cast<u64*>(vm::g_sudo_addr + e.first); e.second = *reinterpret_cast<nse_t<u64, 1>*>(vm::g_sudo_addr + e.first);
} }
} }
@ -426,7 +426,7 @@ namespace rsx
{ {
for (auto &e : memory_tag_samples) for (auto &e : memory_tag_samples)
{ {
if (e.second != *reinterpret_cast<u64*>(vm::g_sudo_addr + e.first)) if (e.second != *reinterpret_cast<nse_t<u64, 1>*>(vm::g_sudo_addr + e.first))
return false; return false;
} }

View file

@ -557,27 +557,26 @@ namespace glsl
if (props.require_texture_ops) if (props.require_texture_ops)
{ {
OS <<
// Declare special texture control flags // Declare special texture control flags
"#define GAMMA_R_MASK (1 << " << rsx::texture_control_bits::GAMMA_R << ")\n" OS << "#define GAMMA_R_MASK (1 << " << rsx::texture_control_bits::GAMMA_R << ")\n";
"#define GAMMA_G_MASK (1 << " << rsx::texture_control_bits::GAMMA_G << ")\n" OS << "#define GAMMA_G_MASK (1 << " << rsx::texture_control_bits::GAMMA_G << ")\n";
"#define GAMMA_B_MASK (1 << " << rsx::texture_control_bits::GAMMA_B << ")\n" OS << "#define GAMMA_B_MASK (1 << " << rsx::texture_control_bits::GAMMA_B << ")\n";
"#define GAMMA_A_MASK (1 << " << rsx::texture_control_bits::GAMMA_A << ")\n" OS << "#define GAMMA_A_MASK (1 << " << rsx::texture_control_bits::GAMMA_A << ")\n";
"#define EXPAND_R_MASK (1 << " << rsx::texture_control_bits::EXPAND_R << ")\n" OS << "#define EXPAND_R_MASK (1 << " << rsx::texture_control_bits::EXPAND_R << ")\n";
"#define EXPAND_G_MASK (1 << " << rsx::texture_control_bits::EXPAND_G << ")\n" OS << "#define EXPAND_G_MASK (1 << " << rsx::texture_control_bits::EXPAND_G << ")\n";
"#define EXPAND_B_MASK (1 << " << rsx::texture_control_bits::EXPAND_B << ")\n" OS << "#define EXPAND_B_MASK (1 << " << rsx::texture_control_bits::EXPAND_B << ")\n";
"#define EXPAND_A_MASK (1 << " << rsx::texture_control_bits::EXPAND_A << ")\n\n" OS << "#define EXPAND_A_MASK (1 << " << rsx::texture_control_bits::EXPAND_A << ")\n\n";
"#define ALPHAKILL " << rsx::texture_control_bits::ALPHAKILL << "\n" OS << "#define ALPHAKILL " << rsx::texture_control_bits::ALPHAKILL << "\n";
"#define RENORMALIZE " << rsx::texture_control_bits::RENORMALIZE << "\n" OS << "#define RENORMALIZE " << rsx::texture_control_bits::RENORMALIZE << "\n";
"#define DEPTH_FLOAT " << rsx::texture_control_bits::DEPTH_FLOAT << "\n" OS << "#define DEPTH_FLOAT " << rsx::texture_control_bits::DEPTH_FLOAT << "\n";
"#define DEPTH_COMPARE " << rsx::texture_control_bits::DEPTH_COMPARE_OP << "\n" OS << "#define DEPTH_COMPARE " << rsx::texture_control_bits::DEPTH_COMPARE_OP << "\n";
"#define FILTERED_MAG_BIT " << rsx::texture_control_bits::FILTERED_MAG << "\n" OS << "#define FILTERED_MAG_BIT " << rsx::texture_control_bits::FILTERED_MAG << "\n";
"#define FILTERED_MIN_BIT " << rsx::texture_control_bits::FILTERED_MIN << "\n" OS << "#define FILTERED_MIN_BIT " << rsx::texture_control_bits::FILTERED_MIN << "\n";
"#define INT_COORDS_BIT " << rsx::texture_control_bits::UNNORMALIZED_COORDS << "\n" OS << "#define INT_COORDS_BIT " << rsx::texture_control_bits::UNNORMALIZED_COORDS << "\n";
"#define GAMMA_CTRL_MASK (GAMMA_R_MASK|GAMMA_G_MASK|GAMMA_B_MASK|GAMMA_A_MASK)\n" OS << "#define GAMMA_CTRL_MASK (GAMMA_R_MASK|GAMMA_G_MASK|GAMMA_B_MASK|GAMMA_A_MASK)\n";
"#define SIGN_EXPAND_MASK (EXPAND_R_MASK|EXPAND_G_MASK|EXPAND_B_MASK|EXPAND_A_MASK)\n" OS << "#define SIGN_EXPAND_MASK (EXPAND_R_MASK|EXPAND_G_MASK|EXPAND_B_MASK|EXPAND_A_MASK)\n";
"#define FILTERED_MASK (FILTERED_MAG_BIT|FILTERED_MIN_BIT)\n\n"; OS << "#define FILTERED_MASK (FILTERED_MAG_BIT|FILTERED_MIN_BIT)\n\n";
} }
} }

View file

@ -661,7 +661,7 @@ rpcn_account_edit_dialog::rpcn_account_edit_dialog(QWidget* parent)
rpcn_ask_password_dialog ask_pass(this, tr("Please enter your password:")); rpcn_ask_password_dialog ask_pass(this, tr("Please enter your password:"));
ask_pass.exec(); ask_pass.exec();
auto password = ask_pass.get_password(); auto& password = ask_pass.get_password();
if (!password) if (!password)
return; return;

View file

@ -8,7 +8,7 @@ namespace stx
class init_mutex class init_mutex
{ {
// Set after initialization and removed before finalization // Set after initialization and removed before finalization
static const u32 c_init_bit = 0x8000'0000; static constexpr u32 c_init_bit = 0x8000'0000;
// Contains "reader" count and init bit // Contains "reader" count and init bit
atomic_t<u32> m_state = 0; atomic_t<u32> m_state = 0;