mirror of
https://github.com/RPCS3/rpcs3.git
synced 2024-11-25 04:02:42 +01:00
is_leaf_function fix (Linux)
This commit is contained in:
parent
fb56c14853
commit
7a356d3294
@ -1588,6 +1588,17 @@ bool handle_access_violation(u32 addr, bool is_writing, x64_context* context)
|
|||||||
// TODO: allow recovering from a page fault as a feature of PS3 virtual memory
|
// TODO: allow recovering from a page fault as a feature of PS3 virtual memory
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef __linux__
|
||||||
|
extern "C" struct dwarf_eh_bases
|
||||||
|
{
|
||||||
|
void* tbase;
|
||||||
|
void* dbase;
|
||||||
|
void* func;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern "C" struct fde* _Unwind_Find_FDE(void* pc, struct dwarf_eh_bases* bases);
|
||||||
|
#endif
|
||||||
|
|
||||||
// Detect leaf function
|
// Detect leaf function
|
||||||
static bool is_leaf_function(u64 rip)
|
static bool is_leaf_function(u64 rip)
|
||||||
{
|
{
|
||||||
@ -1602,10 +1613,33 @@ static bool is_leaf_function(u64 rip)
|
|||||||
return uw[0] == 1 && uw[1] == 0 && uw[2] == 0 && uw[3] == 0;
|
return uw[0] == 1 && uw[1] == 0 && uw[2] == 0 && uw[3] == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// No unwind info implies leaf function
|
||||||
|
return true;
|
||||||
|
#elif __linux__
|
||||||
|
struct dwarf_eh_bases bases;
|
||||||
|
|
||||||
|
if (struct fde* f = _Unwind_Find_FDE(reinterpret_cast<void*>(rip), &bases))
|
||||||
|
{
|
||||||
|
const auto words = (const u32*)f;
|
||||||
|
|
||||||
|
if (words[0] < 0x14)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (words[0] == 0x14 && !words[3] && !words[4])
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// No unwind info implies leaf function
|
// No unwind info implies leaf function
|
||||||
return true;
|
return true;
|
||||||
#else
|
#else
|
||||||
// TODO
|
// Unsupported
|
||||||
return false;
|
return false;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user