diff --git a/rpcs3/Emu/System.cpp b/rpcs3/Emu/System.cpp index d8d0b46af2..68a1554953 100644 --- a/rpcs3/Emu/System.cpp +++ b/rpcs3/Emu/System.cpp @@ -713,7 +713,7 @@ game_boot_result Emulator::Load(const std::string& title_id, bool add_only, bool initalize_timebased_time(); // Set RTM usage - g_use_rtm = utils::has_rtm() && ((utils::has_mpx() && g_cfg.core.enable_TSX == tsx_usage::enabled) || g_cfg.core.enable_TSX == tsx_usage::forced); + g_use_rtm = utils::has_rtm() && (((utils::has_mpx() && !utils::has_tsx_force_abort()) && g_cfg.core.enable_TSX == tsx_usage::enabled) || g_cfg.core.enable_TSX == tsx_usage::forced); if (!add_only) { @@ -726,7 +726,7 @@ game_boot_result Emulator::Load(const std::string& title_id, bool add_only, bool #endif sys_log.notice("Used configuration:\n%s\n", g_cfg.to_string()); - if (g_use_rtm && !utils::has_mpx()) + if (g_use_rtm && (!utils::has_mpx() || utils::has_tsx_force_abort())) { sys_log.warning("TSX forced by User"); } diff --git a/rpcs3/util/sysinfo.cpp b/rpcs3/util/sysinfo.cpp index e9aa78169a..318ec013d6 100755 --- a/rpcs3/util/sysinfo.cpp +++ b/rpcs3/util/sysinfo.cpp @@ -82,6 +82,12 @@ bool utils::has_tsx_force_abort() return g_value; } +bool utils::has_rtm_always_abort() +{ + static const bool g_value = get_cpuid(0, 0)[0] >= 0x7 && (get_cpuid(7, 0)[3] & 0x800) == 0x800; + return g_value; +} + bool utils::has_mpx() { static const bool g_value = get_cpuid(0, 0)[0] >= 0x7 && (get_cpuid(7, 0)[1] & 0x4000) == 0x4000; @@ -230,11 +236,15 @@ std::string utils::get_system_info() result += "-FA"; } - if (!has_mpx()) + if (!has_mpx() || has_tsx_force_abort()) { result += " disabled by default"; } } + else if (has_rtm_always_abort()) + { + result += " | TSX disabled via microcode"; + } return result; } diff --git a/rpcs3/util/sysinfo.hpp b/rpcs3/util/sysinfo.hpp index 9fd3d2c962..7925e3e1f9 100755 --- a/rpcs3/util/sysinfo.hpp +++ b/rpcs3/util/sysinfo.hpp @@ -20,6 +20,8 @@ namespace utils bool has_rtm(); bool has_tsx_force_abort(); + + bool has_rtm_always_abort(); bool has_mpx();