First Commit

This commit is contained in:
2025-02-06 22:24:29 +08:00
parent ed7df4c81e
commit 7539e6a53c
18116 changed files with 6181499 additions and 0 deletions

View File

@@ -0,0 +1,249 @@
// Copyright 2014 Citra Emulator Project
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
#include "common/archives.h"
#include "core/core.h"
#include "core/hle/ipc_helpers.h"
#include "core/hle/service/ndm/ndm_u.h"
SERIALIZE_EXPORT_IMPL(Service::NDM::NDM_U)
namespace Service::NDM {
void NDM_U::EnterExclusiveState(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp(ctx);
exclusive_state = rp.PopEnum<ExclusiveState>();
rp.PopPID();
IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
rb.Push(ResultSuccess);
LOG_WARNING(Service_NDM, "(STUBBED) exclusive_state=0x{:08X}", exclusive_state);
}
void NDM_U::LeaveExclusiveState(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp(ctx);
rp.PopPID();
IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
rb.Push(ResultSuccess);
LOG_WARNING(Service_NDM, "(STUBBED)");
}
void NDM_U::QueryExclusiveMode(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp(ctx);
IPC::RequestBuilder rb = rp.MakeBuilder(2, 0);
rb.Push(ResultSuccess);
rb.PushEnum(exclusive_state);
LOG_WARNING(Service_NDM, "(STUBBED)");
}
void NDM_U::LockState(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp(ctx);
rp.PopPID();
daemon_lock_enabled = true;
IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
rb.Push(ResultSuccess);
LOG_WARNING(Service_NDM, "(STUBBED)");
}
void NDM_U::UnlockState(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp(ctx);
rp.PopPID();
daemon_lock_enabled = false;
IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
rb.Push(ResultSuccess);
LOG_WARNING(Service_NDM, "(STUBBED)");
}
void NDM_U::SuspendDaemons(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp(ctx);
u32 bit_mask = rp.Pop<u32>() & 0xF;
daemon_bit_mask =
static_cast<DaemonMask>(static_cast<u32>(default_daemon_bit_mask) & ~bit_mask);
for (std::size_t index = 0; index < daemon_status.size(); ++index) {
if (bit_mask & (1 << index)) {
daemon_status[index] = DaemonStatus::Suspended;
}
}
IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
rb.Push(ResultSuccess);
LOG_WARNING(Service_NDM, "(STUBBED) bit_mask=0x{:08X}", bit_mask);
}
void NDM_U::ResumeDaemons(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp(ctx);
u32 bit_mask = rp.Pop<u32>() & 0xF;
daemon_bit_mask = static_cast<DaemonMask>(static_cast<u32>(daemon_bit_mask) & ~bit_mask);
for (std::size_t index = 0; index < daemon_status.size(); ++index) {
if (bit_mask & (1 << index)) {
daemon_status[index] = DaemonStatus::Idle;
}
}
IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
rb.Push(ResultSuccess);
LOG_WARNING(Service_NDM, "(STUBBED) bit_mask=0x{:08X}", bit_mask);
}
void NDM_U::SuspendScheduler(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp(ctx);
bool perform_in_background = rp.Pop<bool>();
IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
rb.Push(ResultSuccess);
LOG_WARNING(Service_NDM, "(STUBBED) perform_in_background={}", perform_in_background);
}
void NDM_U::ResumeScheduler(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp(ctx);
IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
rb.Push(ResultSuccess);
LOG_WARNING(Service_NDM, "(STUBBED)");
}
void NDM_U::QueryStatus(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp(ctx);
u8 daemon = rp.Pop<u8>();
IPC::RequestBuilder rb = rp.MakeBuilder(2, 0);
rb.Push(ResultSuccess);
rb.PushEnum(daemon_status.at(daemon));
LOG_WARNING(Service_NDM, "(STUBBED) daemon=0x{:02X}", daemon);
}
void NDM_U::GetDaemonDisableCount(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp(ctx);
u8 daemon = rp.Pop<u8>();
IPC::RequestBuilder rb = rp.MakeBuilder(3, 0);
rb.Push(ResultSuccess);
rb.Push<u32>(0); // current process disable count
rb.Push<u32>(0); // total disable count
LOG_WARNING(Service_NDM, "(STUBBED) daemon=0x{:02X}", daemon);
}
void NDM_U::GetSchedulerDisableCount(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp(ctx);
IPC::RequestBuilder rb = rp.MakeBuilder(3, 0);
rb.Push(ResultSuccess);
rb.Push<u32>(0); // current process disable count
rb.Push<u32>(0); // total disable count
LOG_WARNING(Service_NDM, "(STUBBED)");
}
void NDM_U::SetScanInterval(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp(ctx);
scan_interval = rp.Pop<u32>();
IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
rb.Push(ResultSuccess);
LOG_WARNING(Service_NDM, "(STUBBED) scan_interval=0x{:08X}", scan_interval);
}
void NDM_U::GetScanInterval(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp(ctx);
IPC::RequestBuilder rb = rp.MakeBuilder(2, 0);
rb.Push(ResultSuccess);
rb.Push(scan_interval);
LOG_WARNING(Service_NDM, "(STUBBED)");
}
void NDM_U::SetRetryInterval(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp(ctx);
retry_interval = rp.Pop<u32>();
IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
rb.Push(ResultSuccess);
LOG_WARNING(Service_NDM, "(STUBBED) retry_interval=0x{:08X}", retry_interval);
}
void NDM_U::GetRetryInterval(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp(ctx);
IPC::RequestBuilder rb = rp.MakeBuilder(2, 0);
rb.Push(ResultSuccess);
rb.Push(retry_interval);
LOG_WARNING(Service_NDM, "(STUBBED)");
}
void NDM_U::OverrideDefaultDaemons(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp(ctx);
u32 bit_mask = rp.Pop<u32>() & 0xF;
default_daemon_bit_mask = static_cast<DaemonMask>(bit_mask);
daemon_bit_mask = default_daemon_bit_mask;
for (std::size_t index = 0; index < daemon_status.size(); ++index) {
if (bit_mask & (1 << index)) {
daemon_status[index] = DaemonStatus::Idle;
}
}
IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
rb.Push(ResultSuccess);
LOG_WARNING(Service_NDM, "(STUBBED) bit_mask=0x{:08X}", bit_mask);
}
void NDM_U::ResetDefaultDaemons(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp(ctx);
default_daemon_bit_mask = DaemonMask::Default;
IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
rb.Push(ResultSuccess);
LOG_WARNING(Service_NDM, "(STUBBED)");
}
void NDM_U::GetDefaultDaemons(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp(ctx);
IPC::RequestBuilder rb = rp.MakeBuilder(2, 0);
rb.Push(ResultSuccess);
rb.PushEnum(default_daemon_bit_mask);
LOG_WARNING(Service_NDM, "(STUBBED)");
}
void NDM_U::ClearHalfAwakeMacFilter(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp(ctx);
IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
rb.Push(ResultSuccess);
LOG_WARNING(Service_NDM, "(STUBBED)");
}
NDM_U::NDM_U() : ServiceFramework("ndm:u", 6) {
static const FunctionInfo functions[] = {
// clang-format off
{0x0001, &NDM_U::EnterExclusiveState, "EnterExclusiveState"},
{0x0002, &NDM_U::LeaveExclusiveState, "LeaveExclusiveState"},
{0x0003, &NDM_U::QueryExclusiveMode, "QueryExclusiveMode"},
{0x0004, &NDM_U::LockState, "LockState"},
{0x0005, &NDM_U::UnlockState, "UnlockState"},
{0x0006, &NDM_U::SuspendDaemons, "SuspendDaemons"},
{0x0007, &NDM_U::ResumeDaemons, "ResumeDaemons"},
{0x0008, &NDM_U::SuspendScheduler, "SuspendScheduler"},
{0x0009, &NDM_U::ResumeScheduler, "ResumeScheduler"},
{0x000A, nullptr, "GetCurrentState"},
{0x000B, nullptr, "GetTargetState"},
{0x000C, nullptr, "<Stubbed>"},
{0x000D, &NDM_U::QueryStatus, "QueryStatus"},
{0x000E, &NDM_U::GetDaemonDisableCount, "GetDaemonDisableCount"},
{0x000F, &NDM_U::GetSchedulerDisableCount, "GetSchedulerDisableCount"},
{0x0010, &NDM_U::SetScanInterval, "SetScanInterval"},
{0x0011, &NDM_U::GetScanInterval, "GetScanInterval"},
{0x0012, &NDM_U::SetRetryInterval, "SetRetryInterval"},
{0x0013, &NDM_U::GetRetryInterval, "GetRetryInterval"},
{0x0014, &NDM_U::OverrideDefaultDaemons, "OverrideDefaultDaemons"},
{0x0015, &NDM_U::ResetDefaultDaemons, "ResetDefaultDaemons"},
{0x0016, &NDM_U::GetDefaultDaemons, "GetDefaultDaemons"},
{0x0017, &NDM_U::ClearHalfAwakeMacFilter, "ClearHalfAwakeMacFilter"},
// clang-format on
};
RegisterHandlers(functions);
}
void InstallInterfaces(Core::System& system) {
auto& service_manager = system.ServiceManager();
std::make_shared<NDM_U>()->InstallAsService(service_manager);
}
} // namespace Service::NDM

View File

@@ -0,0 +1,293 @@
// Copyright 2014 Citra Emulator Project
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
#pragma once
#include <array>
#include <boost/serialization/array.hpp>
#include "core/hle/service/service.h"
namespace Core {
class System;
}
namespace Service::NDM {
class NDM_U final : public ServiceFramework<NDM_U> {
public:
NDM_U();
private:
/**
* NDM::EnterExclusiveState service function
* Inputs:
* 0 : Header code [0x00010042]
* 1 : Exclusive State
* 2 : 0x20
* Outputs:
* 1 : Result, 0 on success, otherwise error code
*/
void EnterExclusiveState(Kernel::HLERequestContext& ctx);
/**
* NDM::LeaveExclusiveState service function
* Inputs:
* 0 : Header code [0x00020002]
* 1 : 0x20
* Outputs:
* 1 : Result, 0 on success, otherwise error code
*/
void LeaveExclusiveState(Kernel::HLERequestContext& ctx);
/**
* NDM::QueryExclusiveMode service function
* Inputs:
* 0 : Header code [0x00030000]
* Outputs:
* 1 : Result, 0 on success, otherwise error code
* 2 : Current Exclusive State
*/
void QueryExclusiveMode(Kernel::HLERequestContext& ctx);
/**
* NDM::LockState service function
* Inputs:
* 0 : Header code [0x00040002]
* Outputs:
* 1 : Result, 0 on success, otherwise error code
*/
void LockState(Kernel::HLERequestContext& ctx);
/**
* NDM::UnlockState service function
* Inputs:
* 0 : Header code [0x00050002]
* Outputs:
* 1 : Result, 0 on success, otherwise error code
*/
void UnlockState(Kernel::HLERequestContext& ctx);
/**
* NDM::SuspendDaemons service function
* Inputs:
* 0 : Header code [0x00060040]
* 1 : Daemon bit mask
* Outputs:
* 1 : Result, 0 on success, otherwise error code
*/
void SuspendDaemons(Kernel::HLERequestContext& ctx);
/**
* NDM::ResumeDaemons service function
* Inputs:
* 0 : Header code [0x00070040]
* 1 : Daemon bit mask
* Outputs:
* 1 : Result, 0 on success, otherwise error code
*/
void ResumeDaemons(Kernel::HLERequestContext& ctx);
/**
* NDM::SuspendScheduler service function
* Inputs:
* 0 : Header code [0x00080040]
* 1 : (u8/bool) 0 = Wait for completion, 1 = Perform in background
* Outputs:
* 1 : Result, 0 on success, otherwise error code
*/
void SuspendScheduler(Kernel::HLERequestContext& ctx);
/**
* NDM::ResumeScheduler service function
* Inputs:
* 0 : Header code [0x00090000]
* Outputs:
* 1 : Result, 0 on success, otherwise error code
*/
void ResumeScheduler(Kernel::HLERequestContext& ctx);
/**
* NDM::QueryStatus service function
* Inputs:
* 0 : Header code [0x000D0040]
* 1 : Daemon
* Outputs:
* 1 : Result, 0 on success, otherwise error code
* 2 : Daemon status
*/
void QueryStatus(Kernel::HLERequestContext& ctx);
/**
* NDM::GetDaemonDisableCount service function
* Inputs:
* 0 : Header code [0x000E0040]
* 1 : Daemon
* Outputs:
* 1 : Result, 0 on success, otherwise error code
* 2 : Current process disable count
* 3 : Total disable count
*/
void GetDaemonDisableCount(Kernel::HLERequestContext& ctx);
/**
* NDM::GetSchedulerDisableCount service function
* Inputs:
* 0 : Header code [0x000F0000]
* Outputs:
* 1 : Result, 0 on success, otherwise error code
* 2 : Current process disable count
* 3 : Total disable count
*/
void GetSchedulerDisableCount(Kernel::HLERequestContext& ctx);
/**
* NDM::SetScanInterval service function
* Inputs:
* 0 : Header code [0x00100040]
* 1 : Interval (default = 30)
* Outputs:
* 1 : Result, 0 on success, otherwise error code
*/
void SetScanInterval(Kernel::HLERequestContext& ctx);
/**
* NDM::GetScanInterval service function
* Inputs:
* 0 : Header code [0x00110000]
* Outputs:
* 1 : Result, 0 on success, otherwise error code
* 2 : Interval (default = 30)
*/
void GetScanInterval(Kernel::HLERequestContext& ctx);
/**
* NDM::SetRetryInterval service function
* Inputs:
* 0 : Header code [0x00120040]
* 1 : Interval (default = 10)
* Outputs:
* 1 : Result, 0 on success, otherwise error code
*/
void SetRetryInterval(Kernel::HLERequestContext& ctx);
/**
* NDM::GetRetryInterval service function
* Inputs:
* 0 : Header code [0x00130000]
* Outputs:
* 1 : Result, 0 on success, otherwise error code
* 2 : Interval (default = 10)
*/
void GetRetryInterval(Kernel::HLERequestContext& ctx);
/**
* NDM::OverrideDefaultDaemons service function
* Inputs:
* 0 : Header code [0x00140040]
* 1 : Daemon bit mask
* Outputs:
* 1 : Result, 0 on success, otherwise error code
*/
void OverrideDefaultDaemons(Kernel::HLERequestContext& ctx);
/**
* NDM::ResetDefaultDaemons service function
* Inputs:
* 0 : Header code [0x00150000]
* Outputs:
* 1 : Result, 0 on success, otherwise error code
*/
void ResetDefaultDaemons(Kernel::HLERequestContext& ctx);
/**
* NDM::GetDefaultDaemons service function
* Inputs:
* 0 : Header code [0x00160000]
* Outputs:
* 1 : Result, 0 on success, otherwise error code
* 2 : Daemon bit mask
* Note:
* Gets the current default daemon bit mask. The default value is (DAEMONMASK_CEC |
* DAEMONMASK_FRIENDS)
*/
void GetDefaultDaemons(Kernel::HLERequestContext& ctx);
/**
* NDM::ClearHalfAwakeMacFilter service function
* Inputs:
* 0 : Header code [0x00170000]
* Outputs:
* 1 : Result, 0 on success, otherwise error code
*/
void ClearHalfAwakeMacFilter(Kernel::HLERequestContext& ctx);
enum class Daemon : u32 {
Cec = 0,
Boss = 1,
Nim = 2,
Friend = 3,
};
enum class DaemonMask : u32 {
None = 0,
Cec = (1 << static_cast<u32>(Daemon::Cec)),
Boss = (1 << static_cast<u32>(Daemon::Boss)),
Nim = (1 << static_cast<u32>(Daemon::Nim)),
Friend = (1 << static_cast<u32>(Daemon::Friend)),
Default = Cec | Friend,
All = Cec | Boss | Nim | Friend,
};
enum class DaemonStatus : u32 {
Busy = 0,
Idle = 1,
Suspending = 2,
Suspended = 3,
};
enum class ExclusiveState : u32 {
None = 0,
Infrastructure = 1,
LocalCommunications = 2,
Streetpass = 3,
StreetpassData = 4,
};
enum : u32 {
DEFAULT_RETRY_INTERVAL = 10,
DEFAULT_SCAN_INTERVAL = 30,
};
DaemonMask daemon_bit_mask = DaemonMask::Default;
DaemonMask default_daemon_bit_mask = DaemonMask::Default;
std::array<DaemonStatus, 4> daemon_status = {
DaemonStatus::Idle,
DaemonStatus::Idle,
DaemonStatus::Idle,
DaemonStatus::Idle,
};
ExclusiveState exclusive_state = ExclusiveState::None;
u32 scan_interval = DEFAULT_SCAN_INTERVAL;
u32 retry_interval = DEFAULT_RETRY_INTERVAL;
bool daemon_lock_enabled = false;
template <class Archive>
void serialize(Archive& ar, const unsigned int) {
ar& boost::serialization::base_object<Kernel::SessionRequestHandler>(*this);
ar& daemon_bit_mask;
ar& default_daemon_bit_mask;
ar& daemon_status;
ar& exclusive_state;
ar& scan_interval;
ar& retry_interval;
ar& daemon_lock_enabled;
}
friend class boost::serialization::access;
};
void InstallInterfaces(Core::System& system);
} // namespace Service::NDM
BOOST_CLASS_EXPORT_KEY(Service::NDM::NDM_U)