summaryrefslogtreecommitdiffstats
path: root/src/core/hle/service/pm
diff options
context:
space:
mode:
authortech-ticks <techticksdev@gmail.com>2022-02-03 20:36:13 +0100
committertech-ticks <techticksdev@gmail.com>2022-02-04 01:41:36 +0100
commit16bf50e61093dd2b852d9f101582485004c7ca8b (patch)
tree06f5a3ee02f7256f15c69b61a723257b0165a2a6 /src/core/hle/service/pm
parentMerge pull request #7811 from german77/analog-mod (diff)
downloadyuzu-16bf50e61093dd2b852d9f101582485004c7ca8b.tar
yuzu-16bf50e61093dd2b852d9f101582485004c7ca8b.tar.gz
yuzu-16bf50e61093dd2b852d9f101582485004c7ca8b.tar.bz2
yuzu-16bf50e61093dd2b852d9f101582485004c7ca8b.tar.lz
yuzu-16bf50e61093dd2b852d9f101582485004c7ca8b.tar.xz
yuzu-16bf50e61093dd2b852d9f101582485004c7ca8b.tar.zst
yuzu-16bf50e61093dd2b852d9f101582485004c7ca8b.zip
Diffstat (limited to 'src/core/hle/service/pm')
-rw-r--r--src/core/hle/service/pm/pm.cpp45
1 files changed, 45 insertions, 0 deletions
diff --git a/src/core/hle/service/pm/pm.cpp b/src/core/hle/service/pm/pm.cpp
index 277abc17a..057666021 100644
--- a/src/core/hle/service/pm/pm.cpp
+++ b/src/core/hle/service/pm/pm.cpp
@@ -91,6 +91,8 @@ public:
{4, &DebugMonitor::GetApplicationProcessId, "GetApplicationProcessId"},
{5, nullptr, "HookToCreateApplicationProgress"},
{6, nullptr, "ClearHook"},
+ {65000, &DebugMonitor::AtmosphereGetProcessInfo, "AtmosphereGetProcessInfo"},
+ {65001, nullptr, "AtmosphereGetCurrentLimitInfo"},
};
// clang-format on
@@ -125,6 +127,49 @@ private:
GetApplicationPidGeneric(ctx, kernel.GetProcessList());
}
+ void AtmosphereGetProcessInfo(Kernel::HLERequestContext& ctx) {
+ // https://github.com/Atmosphere-NX/Atmosphere/blob/master/stratosphere/pm/source/impl/pm_process_manager.cpp#L614
+ // This implementation is incomplete; only a handle to the process is returned.
+ IPC::RequestParser rp{ctx};
+ const auto pid = rp.PopRaw<u64>();
+
+ LOG_WARNING(Service_PM, "(Partial Implementation) called, pid={:016X}", pid);
+
+ const auto process = SearchProcessList(kernel.GetProcessList(), [pid](const auto& proc) {
+ return proc->GetProcessID() == pid;
+ });
+
+ if (!process.has_value()) {
+ IPC::ResponseBuilder rb{ctx, 2};
+ rb.Push(ResultProcessNotFound);
+ return;
+ }
+
+ struct ProgramLocation {
+ u64 program_id;
+ u8 storage_id;
+ };
+ static_assert(sizeof(ProgramLocation) == 0x10, "ProgramLocation has an invalid size");
+
+ struct OverrideStatus {
+ u64 keys_held;
+ u64 flags;
+ };
+ static_assert(sizeof(OverrideStatus) == 0x10, "OverrideStatus has an invalid size");
+
+ OverrideStatus override_status{};
+ ProgramLocation program_location{
+ .program_id = (*process)->GetProgramID(),
+ .storage_id = 0,
+ };
+
+ IPC::ResponseBuilder rb{ctx, 10, 1};
+ rb.Push(ResultSuccess);
+ rb.PushCopyObjects(*process);
+ rb.PushRaw(program_location);
+ rb.PushRaw(override_status);
+ }
+
const Kernel::KernelCore& kernel;
};