mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-01-30 12:32:43 +00:00
Unfatal Segfaults
This commit is contained in:
parent
53267e283b
commit
28feea0447
@ -1403,7 +1403,6 @@ bool handle_access_violation(u32 addr, bool is_writing, x64_context* context) no
|
|||||||
// Hack: allocate memory in case the emulator is stopping
|
// Hack: allocate memory in case the emulator is stopping
|
||||||
const auto hack_alloc = [&]()
|
const auto hack_alloc = [&]()
|
||||||
{
|
{
|
||||||
// If failed the value remains true and std::terminate should be called
|
|
||||||
g_tls_access_violation_recovered = true;
|
g_tls_access_violation_recovered = true;
|
||||||
|
|
||||||
const auto area = vm::reserve_map(vm::any, addr & -0x10000, 0x10000);
|
const auto area = vm::reserve_map(vm::any, addr & -0x10000, 0x10000);
|
||||||
@ -1529,7 +1528,8 @@ bool handle_access_violation(u32 addr, bool is_writing, x64_context* context) no
|
|||||||
|
|
||||||
if (sending_error)
|
if (sending_error)
|
||||||
{
|
{
|
||||||
vm_log.fatal("Unknown error 0x%x while trying to pass page fault.", +sending_error);
|
vm_log.error("Unknown error 0x%x while trying to pass page fault.", +sending_error);
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -1548,7 +1548,7 @@ bool handle_access_violation(u32 addr, bool is_writing, x64_context* context) no
|
|||||||
// Reschedule, test cpu state and try recovery if stopped
|
// Reschedule, test cpu state and try recovery if stopped
|
||||||
if (cpu->test_stopped() && !hack_alloc())
|
if (cpu->test_stopped() && !hack_alloc())
|
||||||
{
|
{
|
||||||
std::terminate();
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -1569,7 +1569,7 @@ bool handle_access_violation(u32 addr, bool is_writing, x64_context* context) no
|
|||||||
|
|
||||||
if (cpu->check_state() && !hack_alloc())
|
if (cpu->check_state() && !hack_alloc())
|
||||||
{
|
{
|
||||||
std::terminate();
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -1606,7 +1606,7 @@ bool handle_access_violation(u32 addr, bool is_writing, x64_context* context) no
|
|||||||
|
|
||||||
if (Emu.IsStopped() && !hack_alloc())
|
if (Emu.IsStopped() && !hack_alloc())
|
||||||
{
|
{
|
||||||
std::terminate();
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -1676,8 +1676,6 @@ static LONG exception_filter(PEXCEPTION_POINTERS pExp) noexcept
|
|||||||
if (thread_ctrl::get_current())
|
if (thread_ctrl::get_current())
|
||||||
{
|
{
|
||||||
fmt::append(msg, "Emu Thread Name: '%s'.\n", thread_ctrl::get_name());
|
fmt::append(msg, "Emu Thread Name: '%s'.\n", thread_ctrl::get_name());
|
||||||
|
|
||||||
sys_log.notice("\n%s", dump_useful_thread_info());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Report full thread name if not an emu thread
|
// TODO: Report full thread name if not an emu thread
|
||||||
@ -1739,14 +1737,7 @@ static LONG exception_filter(PEXCEPTION_POINTERS pExp) noexcept
|
|||||||
|
|
||||||
// TODO: print registers and the callstack
|
// TODO: print registers and the callstack
|
||||||
|
|
||||||
sys_log.fatal("\n%s", msg);
|
thread_ctrl::emergency_exit(msg);
|
||||||
|
|
||||||
if (!IsDebuggerPresent())
|
|
||||||
{
|
|
||||||
report_fatal_error(msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
return EXCEPTION_CONTINUE_SEARCH;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const bool s_exception_handler_set = []() -> bool
|
const bool s_exception_handler_set = []() -> bool
|
||||||
@ -1810,24 +1801,25 @@ static void signal_handler(int sig, siginfo_t* info, void* uct) noexcept
|
|||||||
if (thread_ctrl::get_current())
|
if (thread_ctrl::get_current())
|
||||||
{
|
{
|
||||||
fmt::append(msg, "Emu Thread Name: '%s'.\n", thread_ctrl::get_name());
|
fmt::append(msg, "Emu Thread Name: '%s'.\n", thread_ctrl::get_name());
|
||||||
sys_log.notice("\n%s", dump_useful_thread_info());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Report full thread name if not an emu thread
|
// TODO: Report full thread name if not an emu thread
|
||||||
|
|
||||||
fmt::append(msg, "Thread id = %s.\n", std::this_thread::get_id());
|
fmt::append(msg, "Thread id = %s.\n", std::this_thread::get_id());
|
||||||
|
|
||||||
sys_log.fatal("\n%s", msg);
|
|
||||||
std::fprintf(stderr, "%s\n", msg.c_str());
|
|
||||||
|
|
||||||
if (IsDebuggerPresent())
|
if (IsDebuggerPresent())
|
||||||
{
|
{
|
||||||
|
sys_log.fatal("\n%s", msg);
|
||||||
|
std::fprintf(stderr, "%s\n", msg.c_str());
|
||||||
|
|
||||||
|
sys_log.notice("\n%s", dump_useful_thread_info());
|
||||||
|
|
||||||
// Convert to SIGTRAP
|
// Convert to SIGTRAP
|
||||||
raise(SIGTRAP);
|
raise(SIGTRAP);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
report_fatal_error(msg);
|
thread_ctrl::emergency_exit(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
void sigpipe_signaling_handler(int)
|
void sigpipe_signaling_handler(int)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user