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;
};
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))
{
// 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)
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));

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)
{
// 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 0x2: type = lv2_file_type::edata; break;

View file

@ -413,7 +413,7 @@ namespace rsx
{
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)
{
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;
}

View file

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

View file

@ -244,7 +244,7 @@ namespace stx
});
for (pos = 0; pos < stx::typelist<typeinfo>().count(); pos++)
{
{
const auto& type = *order[pos].second;
const u32 id = type.index();

View file

@ -8,7 +8,7 @@ namespace stx
class init_mutex
{
// 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
atomic_t<u32> m_state = 0;