Merge pull request #2294 from lioncash/fatal
service/am: Implement EnterFatalSection/LeaveFatalSection
This commit is contained in:
commit
a6d5ff05dc
2 changed files with 86 additions and 59 deletions
|
@ -239,8 +239,8 @@ ISelfController::ISelfController(std::shared_ptr<NVFlinger::NVFlinger> nvflinger
|
||||||
{0, nullptr, "Exit"},
|
{0, nullptr, "Exit"},
|
||||||
{1, &ISelfController::LockExit, "LockExit"},
|
{1, &ISelfController::LockExit, "LockExit"},
|
||||||
{2, &ISelfController::UnlockExit, "UnlockExit"},
|
{2, &ISelfController::UnlockExit, "UnlockExit"},
|
||||||
{3, nullptr, "EnterFatalSection"},
|
{3, &ISelfController::EnterFatalSection, "EnterFatalSection"},
|
||||||
{4, nullptr, "LeaveFatalSection"},
|
{4, &ISelfController::LeaveFatalSection, "LeaveFatalSection"},
|
||||||
{9, &ISelfController::GetLibraryAppletLaunchableEvent, "GetLibraryAppletLaunchableEvent"},
|
{9, &ISelfController::GetLibraryAppletLaunchableEvent, "GetLibraryAppletLaunchableEvent"},
|
||||||
{10, &ISelfController::SetScreenShotPermission, "SetScreenShotPermission"},
|
{10, &ISelfController::SetScreenShotPermission, "SetScreenShotPermission"},
|
||||||
{11, &ISelfController::SetOperationModeChangedNotification, "SetOperationModeChangedNotification"},
|
{11, &ISelfController::SetOperationModeChangedNotification, "SetOperationModeChangedNotification"},
|
||||||
|
@ -285,6 +285,81 @@ ISelfController::ISelfController(std::shared_ptr<NVFlinger::NVFlinger> nvflinger
|
||||||
|
|
||||||
ISelfController::~ISelfController() = default;
|
ISelfController::~ISelfController() = default;
|
||||||
|
|
||||||
|
void ISelfController::LockExit(Kernel::HLERequestContext& ctx) {
|
||||||
|
LOG_WARNING(Service_AM, "(STUBBED) called");
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 2};
|
||||||
|
rb.Push(RESULT_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ISelfController::UnlockExit(Kernel::HLERequestContext& ctx) {
|
||||||
|
LOG_WARNING(Service_AM, "(STUBBED) called");
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 2};
|
||||||
|
rb.Push(RESULT_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ISelfController::EnterFatalSection(Kernel::HLERequestContext& ctx) {
|
||||||
|
++num_fatal_sections_entered;
|
||||||
|
LOG_DEBUG(Service_AM, "called. Num fatal sections entered: {}", num_fatal_sections_entered);
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 2};
|
||||||
|
rb.Push(RESULT_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ISelfController::LeaveFatalSection(Kernel::HLERequestContext& ctx) {
|
||||||
|
LOG_DEBUG(Service_AM, "called.");
|
||||||
|
|
||||||
|
// Entry and exit of fatal sections must be balanced.
|
||||||
|
if (num_fatal_sections_entered == 0) {
|
||||||
|
IPC::ResponseBuilder rb{ctx, 2};
|
||||||
|
rb.Push(ResultCode{ErrorModule::AM, 512});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
--num_fatal_sections_entered;
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 2};
|
||||||
|
rb.Push(RESULT_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ISelfController::GetLibraryAppletLaunchableEvent(Kernel::HLERequestContext& ctx) {
|
||||||
|
LOG_WARNING(Service_AM, "(STUBBED) called");
|
||||||
|
|
||||||
|
launchable_event.writable->Signal();
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 2, 1};
|
||||||
|
rb.Push(RESULT_SUCCESS);
|
||||||
|
rb.PushCopyObjects(launchable_event.readable);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ISelfController::SetScreenShotPermission(Kernel::HLERequestContext& ctx) {
|
||||||
|
LOG_WARNING(Service_AM, "(STUBBED) called");
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 2};
|
||||||
|
rb.Push(RESULT_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ISelfController::SetOperationModeChangedNotification(Kernel::HLERequestContext& ctx) {
|
||||||
|
IPC::RequestParser rp{ctx};
|
||||||
|
|
||||||
|
bool flag = rp.Pop<bool>();
|
||||||
|
LOG_WARNING(Service_AM, "(STUBBED) called flag={}", flag);
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 2};
|
||||||
|
rb.Push(RESULT_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ISelfController::SetPerformanceModeChangedNotification(Kernel::HLERequestContext& ctx) {
|
||||||
|
IPC::RequestParser rp{ctx};
|
||||||
|
|
||||||
|
bool flag = rp.Pop<bool>();
|
||||||
|
LOG_WARNING(Service_AM, "(STUBBED) called flag={}", flag);
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 2};
|
||||||
|
rb.Push(RESULT_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
void ISelfController::SetFocusHandlingMode(Kernel::HLERequestContext& ctx) {
|
void ISelfController::SetFocusHandlingMode(Kernel::HLERequestContext& ctx) {
|
||||||
// Takes 3 input u8s with each field located immediately after the previous
|
// Takes 3 input u8s with each field located immediately after the previous
|
||||||
// u8, these are bool flags. No output.
|
// u8, these are bool flags. No output.
|
||||||
|
@ -310,33 +385,6 @@ void ISelfController::SetRestartMessageEnabled(Kernel::HLERequestContext& ctx) {
|
||||||
rb.Push(RESULT_SUCCESS);
|
rb.Push(RESULT_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ISelfController::SetPerformanceModeChangedNotification(Kernel::HLERequestContext& ctx) {
|
|
||||||
IPC::RequestParser rp{ctx};
|
|
||||||
|
|
||||||
bool flag = rp.Pop<bool>();
|
|
||||||
LOG_WARNING(Service_AM, "(STUBBED) called flag={}", flag);
|
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 2};
|
|
||||||
rb.Push(RESULT_SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ISelfController::SetScreenShotPermission(Kernel::HLERequestContext& ctx) {
|
|
||||||
LOG_WARNING(Service_AM, "(STUBBED) called");
|
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 2};
|
|
||||||
rb.Push(RESULT_SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ISelfController::SetOperationModeChangedNotification(Kernel::HLERequestContext& ctx) {
|
|
||||||
IPC::RequestParser rp{ctx};
|
|
||||||
|
|
||||||
bool flag = rp.Pop<bool>();
|
|
||||||
LOG_WARNING(Service_AM, "(STUBBED) called flag={}", flag);
|
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 2};
|
|
||||||
rb.Push(RESULT_SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ISelfController::SetOutOfFocusSuspendingEnabled(Kernel::HLERequestContext& ctx) {
|
void ISelfController::SetOutOfFocusSuspendingEnabled(Kernel::HLERequestContext& ctx) {
|
||||||
// Takes 3 input u8s with each field located immediately after the previous
|
// Takes 3 input u8s with each field located immediately after the previous
|
||||||
// u8, these are bool flags. No output.
|
// u8, these are bool flags. No output.
|
||||||
|
@ -349,30 +397,6 @@ void ISelfController::SetOutOfFocusSuspendingEnabled(Kernel::HLERequestContext&
|
||||||
rb.Push(RESULT_SUCCESS);
|
rb.Push(RESULT_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ISelfController::LockExit(Kernel::HLERequestContext& ctx) {
|
|
||||||
LOG_WARNING(Service_AM, "(STUBBED) called");
|
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 2};
|
|
||||||
rb.Push(RESULT_SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ISelfController::UnlockExit(Kernel::HLERequestContext& ctx) {
|
|
||||||
LOG_WARNING(Service_AM, "(STUBBED) called");
|
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 2};
|
|
||||||
rb.Push(RESULT_SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ISelfController::GetLibraryAppletLaunchableEvent(Kernel::HLERequestContext& ctx) {
|
|
||||||
LOG_WARNING(Service_AM, "(STUBBED) called");
|
|
||||||
|
|
||||||
launchable_event.writable->Signal();
|
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 2, 1};
|
|
||||||
rb.Push(RESULT_SUCCESS);
|
|
||||||
rb.PushCopyObjects(launchable_event.readable);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ISelfController::SetScreenShotImageOrientation(Kernel::HLERequestContext& ctx) {
|
void ISelfController::SetScreenShotImageOrientation(Kernel::HLERequestContext& ctx) {
|
||||||
LOG_WARNING(Service_AM, "(STUBBED) called");
|
LOG_WARNING(Service_AM, "(STUBBED) called");
|
||||||
|
|
||||||
|
|
|
@ -117,17 +117,19 @@ public:
|
||||||
~ISelfController() override;
|
~ISelfController() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void SetFocusHandlingMode(Kernel::HLERequestContext& ctx);
|
|
||||||
void SetRestartMessageEnabled(Kernel::HLERequestContext& ctx);
|
|
||||||
void SetPerformanceModeChangedNotification(Kernel::HLERequestContext& ctx);
|
|
||||||
void SetOperationModeChangedNotification(Kernel::HLERequestContext& ctx);
|
|
||||||
void SetOutOfFocusSuspendingEnabled(Kernel::HLERequestContext& ctx);
|
|
||||||
void LockExit(Kernel::HLERequestContext& ctx);
|
void LockExit(Kernel::HLERequestContext& ctx);
|
||||||
void UnlockExit(Kernel::HLERequestContext& ctx);
|
void UnlockExit(Kernel::HLERequestContext& ctx);
|
||||||
|
void EnterFatalSection(Kernel::HLERequestContext& ctx);
|
||||||
|
void LeaveFatalSection(Kernel::HLERequestContext& ctx);
|
||||||
void GetLibraryAppletLaunchableEvent(Kernel::HLERequestContext& ctx);
|
void GetLibraryAppletLaunchableEvent(Kernel::HLERequestContext& ctx);
|
||||||
|
void SetScreenShotPermission(Kernel::HLERequestContext& ctx);
|
||||||
|
void SetOperationModeChangedNotification(Kernel::HLERequestContext& ctx);
|
||||||
|
void SetPerformanceModeChangedNotification(Kernel::HLERequestContext& ctx);
|
||||||
|
void SetFocusHandlingMode(Kernel::HLERequestContext& ctx);
|
||||||
|
void SetRestartMessageEnabled(Kernel::HLERequestContext& ctx);
|
||||||
|
void SetOutOfFocusSuspendingEnabled(Kernel::HLERequestContext& ctx);
|
||||||
void SetScreenShotImageOrientation(Kernel::HLERequestContext& ctx);
|
void SetScreenShotImageOrientation(Kernel::HLERequestContext& ctx);
|
||||||
void CreateManagedDisplayLayer(Kernel::HLERequestContext& ctx);
|
void CreateManagedDisplayLayer(Kernel::HLERequestContext& ctx);
|
||||||
void SetScreenShotPermission(Kernel::HLERequestContext& ctx);
|
|
||||||
void SetHandlesRequestToDisplay(Kernel::HLERequestContext& ctx);
|
void SetHandlesRequestToDisplay(Kernel::HLERequestContext& ctx);
|
||||||
void SetIdleTimeDetectionExtension(Kernel::HLERequestContext& ctx);
|
void SetIdleTimeDetectionExtension(Kernel::HLERequestContext& ctx);
|
||||||
void GetIdleTimeDetectionExtension(Kernel::HLERequestContext& ctx);
|
void GetIdleTimeDetectionExtension(Kernel::HLERequestContext& ctx);
|
||||||
|
@ -135,6 +137,7 @@ private:
|
||||||
std::shared_ptr<NVFlinger::NVFlinger> nvflinger;
|
std::shared_ptr<NVFlinger::NVFlinger> nvflinger;
|
||||||
Kernel::EventPair launchable_event;
|
Kernel::EventPair launchable_event;
|
||||||
u32 idle_time_detection_extension = 0;
|
u32 idle_time_detection_extension = 0;
|
||||||
|
u64 num_fatal_sections_entered = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
class ICommonStateGetter final : public ServiceFramework<ICommonStateGetter> {
|
class ICommonStateGetter final : public ServiceFramework<ICommonStateGetter> {
|
||||||
|
|
Loading…
Reference in a new issue