Fix NCE Destruction

NCE is implicitly depended on by the `GPU` class due to the NCE Memory Trapping API so the destruction of it must take place after the destruction of the `GPU` class. Additionally, to prevent bugs the NCE destructor must set `staticNce` to `nullptr` as the signal handler will potentially access a destroyed instance of NCE otherwise.
This commit is contained in:
PixelyIon 2022-04-11 20:38:07 +05:30
parent 815f1f4067
commit cd8fa66326
3 changed files with 8 additions and 2 deletions

View File

@ -63,13 +63,13 @@ namespace skyline {
std::shared_ptr<JvmManager> jvm; std::shared_ptr<JvmManager> jvm;
std::shared_ptr<Settings> settings; std::shared_ptr<Settings> settings;
std::shared_ptr<loader::Loader> loader; std::shared_ptr<loader::Loader> loader;
std::shared_ptr<nce::NCE> nce;
std::shared_ptr<kernel::type::KProcess> process{}; std::shared_ptr<kernel::type::KProcess> process{};
static thread_local inline std::shared_ptr<kernel::type::KThread> thread{}; //!< The KThread of the thread which accesses this object static thread_local inline std::shared_ptr<kernel::type::KThread> thread{}; //!< The KThread of the thread which accesses this object
static thread_local inline nce::ThreadContext *ctx{}; //!< The context of the guest thread for the corresponding host thread static thread_local inline nce::ThreadContext *ctx{}; //!< The context of the guest thread for the corresponding host thread
std::shared_ptr<gpu::GPU> gpu; std::shared_ptr<gpu::GPU> gpu;
std::shared_ptr<soc::SOC> soc; std::shared_ptr<soc::SOC> soc;
std::shared_ptr<audio::Audio> audio; std::shared_ptr<audio::Audio> audio;
std::shared_ptr<nce::NCE> nce;
std::shared_ptr<kernel::Scheduler> scheduler; std::shared_ptr<kernel::Scheduler> scheduler;
std::shared_ptr<input::Input> input; std::shared_ptr<input::Input> input;
}; };

View File

@ -118,7 +118,7 @@ namespace skyline::nce {
} }
} }
static NCE* staticNce{nullptr}; //!< A static instance of NCE for use in the signal handler static NCE *staticNce{nullptr}; //!< A static instance of NCE for use in the signal handler
void NCE::HostSignalHandler(int signal, siginfo *info, ucontext *ctx) { void NCE::HostSignalHandler(int signal, siginfo *info, ucontext *ctx) {
if (signal == SIGSEGV) { if (signal == SIGSEGV) {
@ -168,6 +168,10 @@ namespace skyline::nce {
staticNce = this; staticNce = this;
} }
NCE::~NCE() {
staticNce = nullptr;
}
constexpr u8 MainSvcTrampolineSize{17}; // Size of the main SVC trampoline function in u32 units constexpr u8 MainSvcTrampolineSize{17}; // Size of the main SVC trampoline function in u32 units
constexpr u32 TpidrEl0{0x5E82}; // ID of TPIDR_EL0 in MRS constexpr u32 TpidrEl0{0x5E82}; // ID of TPIDR_EL0 in MRS
constexpr u32 TpidrroEl0{0x5E83}; // ID of TPIDRRO_EL0 in MRS constexpr u32 TpidrroEl0{0x5E83}; // ID of TPIDRRO_EL0 in MRS

View File

@ -75,6 +75,8 @@ namespace skyline::nce {
*/ */
NCE(const DeviceState &state); NCE(const DeviceState &state);
~NCE();
struct PatchData { struct PatchData {
size_t size; //!< Size of the .patch section size_t size; //!< Size of the .patch section
std::vector<size_t> offsets; //!< Offsets in .text of instructions that need to be patched std::vector<size_t> offsets; //!< Offsets in .text of instructions that need to be patched