From f7effe86ae255e6a89648314d14b53f5861fb477 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=97=B1=20PixelyIon?= Date: Fri, 27 Sep 2019 21:39:48 +0530 Subject: [PATCH] libNX Applet Manager Initalization This commit completes the 'am' initialization for libNX --- app/CMakeLists.txt | 1 + app/src/main/cpp/main.cpp | 3 +- app/src/main/cpp/skyline/kernel/ipc.cpp | 2 +- .../skyline/kernel/services/am/appletOE.cpp | 74 ++++++++++- .../cpp/skyline/kernel/services/am/appletOE.h | 116 ++++++++++++++++++ .../skyline/kernel/services/base_service.h | 29 ++++- .../skyline/kernel/services/fatal/fatal.cpp | 11 ++ .../cpp/skyline/kernel/services/fatal/fatal.h | 19 +++ .../skyline/kernel/services/serviceman.cpp | 13 ++ .../main/cpp/skyline/kernel/types/KEvent.h | 18 +++ .../main/cpp/skyline/kernel/types/KObject.h | 2 +- .../cpp/skyline/kernel/types/KSyncObject.cpp | 3 +- app/src/main/ic_launcher-web.png | Bin 50414 -> 0 bytes app/src/main/res/values/strings.xml | 16 ++- app/src/main/res/xml/preferences.xml | 10 ++ 15 files changed, 301 insertions(+), 16 deletions(-) create mode 100644 app/src/main/cpp/skyline/kernel/services/fatal/fatal.cpp create mode 100644 app/src/main/cpp/skyline/kernel/services/fatal/fatal.h create mode 100644 app/src/main/cpp/skyline/kernel/types/KEvent.h delete mode 100644 app/src/main/ic_launcher-web.png diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index edc831d5..2f8c5ff7 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -31,6 +31,7 @@ add_library(skyline SHARED ${source_DIR}/skyline/kernel/services/set/sys.cpp ${source_DIR}/skyline/kernel/services/apm/apm.cpp ${source_DIR}/skyline/kernel/services/am/appletOE.cpp + ${source_DIR}/skyline/kernel/services/fatal/fatal.cpp ) target_link_libraries(skyline fmt tinyxml2) target_compile_options(skyline PRIVATE -Wno-c++17-extensions) diff --git a/app/src/main/cpp/main.cpp b/app/src/main/cpp/main.cpp index a8d0acbe..e223c6f5 100644 --- a/app/src/main/cpp/main.cpp +++ b/app/src/main/cpp/main.cpp @@ -1,5 +1,4 @@ #include -#include #include #include #include @@ -12,7 +11,7 @@ bool Halt = false; void ThreadMain(const std::string romPath, const std::string prefPath, const std::string logPath) { auto logger = std::make_shared(logPath); auto settings = std::make_shared(prefPath); - //settings->List(log); // (Uncomment when you want to print out all settings strings) + //settings->List(logger); // (Uncomment when you want to print out all settings strings) auto start = std::chrono::steady_clock::now(); try { skyline::kernel::OS os(logger, settings); diff --git a/app/src/main/cpp/skyline/kernel/ipc.cpp b/app/src/main/cpp/skyline/kernel/ipc.cpp index 63d2d028..ff7038e2 100644 --- a/app/src/main/cpp/skyline/kernel/ipc.cpp +++ b/app/src/main/cpp/skyline/kernel/ipc.cpp @@ -71,7 +71,7 @@ namespace skyline::kernel::ipc { } if (payload->magic != constant::SfciMagic) - state.logger->Write(Logger::Warn, "Unexpected Magic in PayloadHeader: 0x{:X}", u32(payload->magic)); + state.logger->Write(Logger::Debug, "Unexpected Magic in PayloadHeader: 0x{:X}", u32(payload->magic)); if (header->c_flag == static_cast(BufferCFlag::SingleDescriptor)) { vecBufC.push_back(reinterpret_cast(currPtr)); diff --git a/app/src/main/cpp/skyline/kernel/services/am/appletOE.cpp b/app/src/main/cpp/skyline/kernel/services/am/appletOE.cpp index feb5e18c..92ae7f70 100644 --- a/app/src/main/cpp/skyline/kernel/services/am/appletOE.cpp +++ b/app/src/main/cpp/skyline/kernel/services/am/appletOE.cpp @@ -13,8 +13,11 @@ namespace skyline::kernel::service::am { {0x0, SFunc(IApplicationProxy::GetCommonStateGetter)}, {0x1, SFunc(IApplicationProxy::GetSelfController)}, {0x2, SFunc(IApplicationProxy::GetWindowController)}, + {0x3, SFunc(IApplicationProxy::GetAudioController)}, + {0x4, SFunc(IApplicationProxy::GetDisplayController)}, {0xB, SFunc(IApplicationProxy::GetLibraryAppletCreator)}, - {0x14, SFunc(IApplicationProxy::GetApplicationFunctions)} + {0x14, SFunc(IApplicationProxy::GetApplicationFunctions)}, + {0x3E8, SFunc(IApplicationProxy::GetDisplayController)} }) {} void IApplicationProxy::GetCommonStateGetter(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) { @@ -29,6 +32,14 @@ namespace skyline::kernel::service::am { manager.NewService(Service::am_IWindowController, session, response); } + void IApplicationProxy::GetAudioController(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) { + manager.NewService(Service::am_IAudioController, session, response); + } + + void IApplicationProxy::GetDisplayController(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) { + manager.NewService(Service::am_IDisplayController, session, response); + } + void IApplicationProxy::GetLibraryAppletCreator(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) { manager.NewService(Service::am_ILibraryAppletCreator, session, response); } @@ -37,18 +48,77 @@ namespace skyline::kernel::service::am { manager.NewService(Service::am_IApplicationFunctions, session, response); } + void IApplicationProxy::IDebugFunctions(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) { + manager.NewService(Service::am_IDebugFunctions, session, response); + } + ICommonStateGetter::ICommonStateGetter(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, false, Service::am_ICommonStateGetter, { - }) {} + {0x0, SFunc(ICommonStateGetter::GetEventHandle)}, + {0x9, SFunc(ICommonStateGetter::GetCurrentFocusState)}, + {0x5, SFunc(ICommonStateGetter::GetOperationMode)}, + {0x6, SFunc(ICommonStateGetter::GetPerformanceMode)} + }) { + operationMode = static_cast(state.settings->GetBool("operation_mode")); + state.logger->Write(Logger::Info, "Switch on mode: {}", static_cast(operationMode) ? "Docked" : "Handheld"); + } + + void ICommonStateGetter::GetEventHandle(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) { + messageEvent = state.thisProcess->NewHandle(); + response.copyHandles.push_back(messageEvent->handle); + } + + void ICommonStateGetter::GetCurrentFocusState(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) { + response.WriteValue(static_cast(ApplicationStatus::InFocus)); + } + + void ICommonStateGetter::GetOperationMode(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) { + response.WriteValue(static_cast(operationMode)); + } + + void ICommonStateGetter::GetPerformanceMode(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) { + response.WriteValue(static_cast(operationMode)); + } ISelfController::ISelfController(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, false, Service::am_ISelfController, { + {0xB, SFunc(ISelfController::SetOperationModeChangedNotification)}, + {0xC, SFunc(ISelfController::SetPerformanceModeChangedNotification)}, + {0xD, SFunc(ISelfController::SetFocusHandlingMode)} }) {} + void ISelfController::SetFocusHandlingMode(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) {} + + void ISelfController::SetOperationModeChangedNotification(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) {} + + void ISelfController::SetPerformanceModeChangedNotification(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) {} + IWindowController::IWindowController(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, false, Service::am_IWindowController, { + {0x1, SFunc(IWindowController::GetAppletResourceUserId)}, + {0xA, SFunc(IWindowController::AcquireForegroundRights)} + }) {} + + void IWindowController::GetAppletResourceUserId(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) { + response.WriteValue(static_cast(state.thisProcess->mainThread)); + } + + void IWindowController::AcquireForegroundRights(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) {} + + IAudioController::IAudioController(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, false, Service::am_IAudioController, { + }) {} + + IDisplayController::IDisplayController(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, false, Service::am_IDisplayController, { }) {} ILibraryAppletCreator::ILibraryAppletCreator(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, false, Service::am_ILibraryAppletCreator, { }) {} IApplicationFunctions::IApplicationFunctions(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, false, Service::am_IApplicationFunctions, { + {0x28, SFunc(IApplicationFunctions::NotifyRunning)} + }) {} + + void IApplicationFunctions::NotifyRunning(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) { + response.WriteValue(1); + } + + IDebugFunctions::IDebugFunctions(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, false, Service::am_IDebugFunctions, { }) {} } diff --git a/app/src/main/cpp/skyline/kernel/services/am/appletOE.h b/app/src/main/cpp/skyline/kernel/services/am/appletOE.h index c80236f4..adbf6830 100644 --- a/app/src/main/cpp/skyline/kernel/services/am/appletOE.h +++ b/app/src/main/cpp/skyline/kernel/services/am/appletOE.h @@ -2,6 +2,8 @@ #include "../base_service.h" #include "../serviceman.h" +#include "../../types/KProcess.h" +#include "../../types/KEvent.h" namespace skyline::kernel::service::am { /** @@ -39,6 +41,16 @@ namespace skyline::kernel::service::am { */ void GetWindowController(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response); + /** + * @brief This returns #IAudioController (https://switchbrew.org/wiki/Applet_Manager_services#IAudioController) + */ + void GetAudioController(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response); + + /** + * @brief This returns #IDisplayController (https://switchbrew.org/wiki/Applet_Manager_services#IDisplayController) + */ + void GetDisplayController(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response); + /** * @brief This returns #ILibraryAppletCreator (https://switchbrew.org/wiki/Applet_Manager_services#ILibraryAppletCreator) */ @@ -48,30 +60,134 @@ namespace skyline::kernel::service::am { * @brief This returns #IApplicationFunctions (https://switchbrew.org/wiki/Applet_Manager_services#IApplicationFunctions) */ void GetApplicationFunctions(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response); + + /** + * @brief This returns #IDebugFunctions (https://switchbrew.org/wiki/Applet_Manager_services#IDebugFunctions) + */ + void IDebugFunctions(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response); }; + /** + * @brief https://switchbrew.org/wiki/Applet_Manager_services#ICommonStateGetter + */ class ICommonStateGetter : public BaseService { + private: + std::shared_ptr messageEvent{}; + + enum class ApplicationStatus : u8 { + InFocus = 1, OutOfFocus = 2 + }; + + enum class OperationMode : u8 { + Handheld = 0, Docked = 1 + } operationMode; public: ICommonStateGetter(const DeviceState &state, ServiceManager &manager); + + /** + * @brief This returns the handle to a KEvent object that is signalled whenever RecieveMessage has a message (https://switchbrew.org/wiki/Applet_Manager_services#GetEventHandle) + */ + void GetEventHandle(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response); + + /** + * @brief This returns if an application is in focus or not. It always returns in focus on the emulator (https://switchbrew.org/wiki/Applet_Manager_services#GetCurrentFocusState) + */ + void GetCurrentFocusState(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response); + + /** + * @brief This returns the current OperationMode (https://switchbrew.org/wiki/Applet_Manager_services#GetOperationMode) + */ + void GetOperationMode(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response); + + /** + * @brief This returns the current PerformanceMode (Same as operationMode but u32) (https://switchbrew.org/wiki/Applet_Manager_services#GetPerformanceMode) + */ + void GetPerformanceMode(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response); }; + /** + * @brief https://switchbrew.org/wiki/Applet_Manager_services#ISelfController + */ class ISelfController : public BaseService { public: ISelfController(const DeviceState &state, ServiceManager &manager); + + /** + * @brief This function inputs a u8 bool flag and no output (Stubbed) (https://switchbrew.org/wiki/Applet_Manager_services#SetOperationModeChangedNotification) + */ + void SetOperationModeChangedNotification(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response); + + /** + * @brief This function inputs a u8 bool flag and no output (Stubbed) (https://switchbrew.org/wiki/Applet_Manager_services#SetPerformanceModeChangedNotification) + */ + void SetPerformanceModeChangedNotification(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response); + + /** + * @brief This function inputs 3 unknown u8 values and has no output (Stubbed) (https://switchbrew.org/wiki/Applet_Manager_services#GetCurrentFocusState) + */ + void SetFocusHandlingMode(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response); }; + /** + * @brief https://switchbrew.org/wiki/Applet_Manager_services#IWindowController + */ class IWindowController : public BaseService { public: IWindowController(const DeviceState &state, ServiceManager &manager); + + /** + * @brief This returns the PID of the current application (https://switchbrew.org/wiki/Applet_Manager_services#GetAppletResourceUserId) + */ + void GetAppletResourceUserId(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response); + + /** + * @brief This function has mo inputs or outputs (Stubbed) (https://switchbrew.org/wiki/Applet_Manager_services#AcquireForegroundRights) + */ + void AcquireForegroundRights(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response); }; + /** + * @brief https://switchbrew.org/wiki/Applet_Manager_services#IAudioController + */ + class IAudioController : public BaseService { + public: + IAudioController(const DeviceState &state, ServiceManager &manager); + }; + + /** + * @brief https://switchbrew.org/wiki/Applet_Manager_services#IDisplayController + */ + class IDisplayController : public BaseService { + public: + IDisplayController(const DeviceState &state, ServiceManager &manager); + }; + + /** + * @brief https://switchbrew.org/wiki/Applet_Manager_services#ILibraryAppletCreator + */ class ILibraryAppletCreator : public BaseService { public: ILibraryAppletCreator(const DeviceState &state, ServiceManager &manager); }; + /** + * @brief https://switchbrew.org/wiki/Applet_Manager_services#IApplicationFunctions + */ class IApplicationFunctions : public BaseService { public: IApplicationFunctions(const DeviceState &state, ServiceManager &manager); + + /** + * @brief This just returns 1 regardless of input (https://switchbrew.org/wiki/Applet_Manager_services#NotifyRunning) + */ + void NotifyRunning(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response); + }; + + /** + * @brief https://switchbrew.org/wiki/Applet_Manager_services#IDebugFunctions + */ + class IDebugFunctions : public BaseService { + public: + IDebugFunctions(const DeviceState &state, ServiceManager &manager); }; } diff --git a/app/src/main/cpp/skyline/kernel/services/base_service.h b/app/src/main/cpp/skyline/kernel/services/base_service.h index 22b163ab..0799296c 100644 --- a/app/src/main/cpp/skyline/kernel/services/base_service.h +++ b/app/src/main/cpp/skyline/kernel/services/base_service.h @@ -14,7 +14,21 @@ namespace skyline::kernel::service { * @brief This contains an enum for every service that's present */ enum class Service { - sm, set_sys, apm, apm_ISession, am_appletOE, am_IApplicationProxy, am_ICommonStateGetter, am_IApplicationFunctions, am_ISelfController, am_IWindowController, am_ILibraryAppletCreator + sm, + fatal_u, + set_sys, + apm, + apm_ISession, + am_appletOE, + am_IApplicationProxy, + am_ICommonStateGetter, + am_IApplicationFunctions, + am_ISelfController, + am_IWindowController, + am_IAudioController, + am_IDisplayController, + am_ILibraryAppletCreator, + am_IDebugFunctions, }; /** @@ -22,6 +36,7 @@ namespace skyline::kernel::service { */ const static std::unordered_map ServiceString = { {"sm:", Service::sm}, + {"fatal:u", Service::fatal_u}, {"set:sys", Service::set_sys}, {"apm", Service::apm}, {"apm:ISession", Service::apm_ISession}, @@ -30,8 +45,11 @@ namespace skyline::kernel::service { {"am:ICommonStateGetter", Service::am_ICommonStateGetter}, {"am:ISelfController", Service::am_ISelfController}, {"am:IWindowController", Service::am_IWindowController}, + {"am:IAudioController", Service::am_IAudioController}, + {"am:IDisplayController", Service::am_IDisplayController}, {"am:ILibraryAppletCreator", Service::am_ILibraryAppletCreator}, {"am:IApplicationFunctions", Service::am_IApplicationFunctions}, + {"am:IDebugFunctions", Service::am_IDebugFunctions}, }; class ServiceManager; @@ -73,10 +91,17 @@ namespace skyline::kernel::service { * @param response The corresponding IpcResponse object */ void HandleRequest(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) { + std::function function; try { - vTable.at(request.payload->value)(session, request, response); + function = vTable.at(request.payload->value); } catch (std::out_of_range&) { state.logger->Write(Logger::Warn, "Cannot find function in service '{0}' (Type: {1}): 0x{2:X} ({2})", getName(), serviceType, u32(request.payload->value)); + return; + } + try { + function(session, request, response); + } catch (std::exception& e) { + throw exception(e.what()); } }; diff --git a/app/src/main/cpp/skyline/kernel/services/fatal/fatal.cpp b/app/src/main/cpp/skyline/kernel/services/fatal/fatal.cpp new file mode 100644 index 00000000..5d1b3ca4 --- /dev/null +++ b/app/src/main/cpp/skyline/kernel/services/fatal/fatal.cpp @@ -0,0 +1,11 @@ +#include "fatal.h" + +namespace skyline::kernel::service::fatal { + fatalU::fatalU(const DeviceState &state, ServiceManager& manager) : BaseService(state, manager, false, Service::fatal_u, { + {0x0, SFunc(fatalU::ThrowFatal)} + }) {} + + void fatalU::ThrowFatal(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) { + throw exception("A fatal error has caused emulation to stop"); + } +} diff --git a/app/src/main/cpp/skyline/kernel/services/fatal/fatal.h b/app/src/main/cpp/skyline/kernel/services/fatal/fatal.h new file mode 100644 index 00000000..2af9ae0c --- /dev/null +++ b/app/src/main/cpp/skyline/kernel/services/fatal/fatal.h @@ -0,0 +1,19 @@ +#pragma once + +#include "../base_service.h" +#include "../serviceman.h" + +namespace skyline::kernel::service::fatal { + /** + * @brief fatal_u is used by applications to throw errors (https://switchbrew.org/wiki/Fatal_services#fatal:u) + */ + class fatalU : public BaseService { + public: + fatalU(const DeviceState &state, ServiceManager& manager); + + /** + * @brief This throws an exception so that emulation will quit + */ + void ThrowFatal(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response); + }; +} diff --git a/app/src/main/cpp/skyline/kernel/services/serviceman.cpp b/app/src/main/cpp/skyline/kernel/services/serviceman.cpp index ca64ef6e..e4cfe3df 100644 --- a/app/src/main/cpp/skyline/kernel/services/serviceman.cpp +++ b/app/src/main/cpp/skyline/kernel/services/serviceman.cpp @@ -4,6 +4,7 @@ #include "set/sys.h" #include "apm/apm.h" #include "am/appletOE.h" +#include "fatal/fatal.h" namespace skyline::kernel::service { ServiceManager::ServiceManager(const DeviceState &state) : state(state) {} @@ -15,6 +16,9 @@ namespace skyline::kernel::service { case Service::sm: serviceMap[serviceType] = std::make_shared(state, *this); break; + case Service::fatal_u: + serviceMap[serviceType] = std::make_shared(state, *this); + break; case Service::set_sys: serviceMap[serviceType] = std::make_shared(state, *this); break; @@ -36,6 +40,12 @@ namespace skyline::kernel::service { case Service::am_IWindowController: serviceMap[serviceType] = std::make_shared(state, *this); break; + case Service::am_IAudioController: + serviceMap[serviceType] = std::make_shared(state, *this); + break; + case Service::am_IDisplayController: + serviceMap[serviceType] = std::make_shared(state, *this); + break; case Service::am_ISelfController: serviceMap[serviceType] = std::make_shared(state, *this); break; @@ -45,6 +55,9 @@ namespace skyline::kernel::service { case Service::am_IApplicationFunctions: serviceMap[serviceType] = std::make_shared(state, *this); break; + case Service::am_IDebugFunctions: + serviceMap[serviceType] = std::make_shared(state, *this); + break; } serviceObj = serviceMap[serviceType]; } else diff --git a/app/src/main/cpp/skyline/kernel/types/KEvent.h b/app/src/main/cpp/skyline/kernel/types/KEvent.h new file mode 100644 index 00000000..9f73af9a --- /dev/null +++ b/app/src/main/cpp/skyline/kernel/types/KEvent.h @@ -0,0 +1,18 @@ +#pragma once + +#include "KSyncObject.h" + +namespace skyline::kernel::type { + /** + * @brief KEvent is an object that's signalled on an repeatable event occurring (https://switchbrew.org/wiki/Kernel_objects#KEvent) + */ + class KEvent : public KSyncObject { + public: + /** + * @param handle The handle of the object in the handle table + * @param pid The PID of the main thread + * @param state The state of the device + */ + KEvent(skyline::handle_t handle, pid_t pid, const DeviceState &state) : KSyncObject(handle, pid, state, KType::KEvent) {} + }; +} diff --git a/app/src/main/cpp/skyline/kernel/types/KObject.h b/app/src/main/cpp/skyline/kernel/types/KObject.h index 6178544b..38c5eeb7 100644 --- a/app/src/main/cpp/skyline/kernel/types/KObject.h +++ b/app/src/main/cpp/skyline/kernel/types/KObject.h @@ -7,7 +7,7 @@ namespace skyline::kernel::type { * @brief These types are used to perform runtime evaluation of a kernel object's type when converting from base class */ enum class KType { - KThread, KProcess, KSharedMemory, KPrivateMemory, KSession + KThread, KProcess, KSharedMemory, KPrivateMemory, KSession, KEvent }; /** diff --git a/app/src/main/cpp/skyline/kernel/types/KSyncObject.cpp b/app/src/main/cpp/skyline/kernel/types/KSyncObject.cpp index 27fbc729..f920f06a 100644 --- a/app/src/main/cpp/skyline/kernel/types/KSyncObject.cpp +++ b/app/src/main/cpp/skyline/kernel/types/KSyncObject.cpp @@ -5,8 +5,7 @@ namespace skyline::kernel::type { KSyncObject::KSyncObject(skyline::handle_t handle, pid_t pid, const skyline::DeviceState &state, skyline::kernel::type::KType type) : KObject(handle, pid, state, type) {} void KSyncObject::Signal() { - for (auto&[tid, process] : state.os->threadMap) { - auto &thread = process->threadMap.at(tid); + for (auto&[tid, thread] : state.os->threadMap.at(ownerPid)->threadMap) { if (thread->status == type::KThread::ThreadStatus::Waiting) { for (auto &waitHandle : thread->waitHandles) { if (handle == waitHandle) { diff --git a/app/src/main/ic_launcher-web.png b/app/src/main/ic_launcher-web.png deleted file mode 100644 index b89447a9074cb52f71a374a8efb855b3eb1c43c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50414 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 sO?>k`0Kk9Fj_X$!tYV$~e~O~RrvLx| diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c175316d..401daad1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -14,12 +14,6 @@ Cannot find any ROMs NROs NSOs - - Search Location - Logging - Log Level - Localization - Language Clear Share @@ -28,4 +22,14 @@ An I/O error has occurred An error has occurred while sharing The logs have been cleared + + Search Location + Logging + Log Level + Localization + Language + System + Use Docked Mode + The system will emulate being in handheld mode + The system will emulate being in docked mode diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 50964da7..84740a1e 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -36,6 +36,16 @@ app:title="@string/log_level" app:useSimpleSummaryProvider="true" /> + + +