mirror of
https://git.eden-emu.dev/eden-emu/eden.git
synced 2026-09-25 18:55:57 +00:00
Compare commits
16 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 411dc2054b | |||
| f0190a1643 | |||
| f232a351cb | |||
| a1fd05e855 | |||
| 33a6f339a2 | |||
| 1f784d5541 | |||
| 9375aeaacf | |||
| 9e59b4132a | |||
| bebc19da32 | |||
| 99bf8cf51a | |||
| dbeb73ee01 | |||
| cb73a4dcc7 | |||
| 278f411dad | |||
| 3d37a816c6 | |||
| a25e32676f | |||
| 38df54edfe |
@@ -1,6 +1,6 @@
|
||||
# Design Overview
|
||||
|
||||
Modern game consoles require heavy power to be emulated appropriately. This is why the emulator uses an approach known as HLE (High-Level-Emulation), in a nutshell: Instead of accurately emulating every subsystem that forms part of a component, emulate the resulting visible I/O interface instead.
|
||||
Modern game consoles require heavy power to emulate. This is why the emulator uses an approach known as HLE (High-Level-Emulation), in a nutshell: Instead of accurately emulating every subsystem that forms part of a component, emulate the resulting visible output of said interface instead.
|
||||
|
||||
For example, take a disk write, instead of emulating a proper SD card we instead use the C++ standard library for I/O. Additionally we use the abstractions provided by the `fs` service to "lie" to programs about certain SD card properties. Notably this includes making up sizes for the fake SD card, giving "realistic" values or expected outputs for a given card, and so on. And instead of writing to an actual SD card, the emulator simply writes to a file.
|
||||
|
||||
|
||||
+1
-1
@@ -21,7 +21,7 @@ This contains documentation created by developers, build instructions, guideline
|
||||
- Subsystems:
|
||||
- **[Design Overview](./DesignOverview.md)**
|
||||
- **[Dynarmic](./dynarmic/README.md)**
|
||||
- **[HOS Kernel](./HosKernel.md)**
|
||||
- **[Subsystem: HLE](./SubsystemHLE.md)**
|
||||
- **[Settings](./Settings.md)**
|
||||
|
||||
## Policies
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
# HOS Kernel
|
||||
# Subsystem: HLE
|
||||
|
||||
## HOS Kernel
|
||||
|
||||
In brief, the HOS kernel is a microkernel, all services and programs run in userspace, the primary way to do communication between these is via `HIPC` (not covered here); otherwise most of the primitives reside in the forms of syscalls invoked via `svc #imm`. The kernel supports both 32-bit and 64-bit programs, and has the capacity to use 32, 36 and 39 bits of address space for spawned processes. Most of the networking stack is based off FreeBSD's network stack.
|
||||
|
||||
@@ -29,3 +31,42 @@ Every process keeps it's own tracking of the following structures:
|
||||
The emulator willingly restricts itself to only use 4 threads (to emulate 4 cores), this is because most existing applications do not benefit greatly from the added core count, and in fact can be detrimental due to extra contention. This translates equitatively to about 4 `ArmInterface` slots for each process, these are then redirected to whatever is the last `pc` of the last thread running on the core is meant to be; proceed to run it, then when returning (due to halt or interruption), proceed to reschedule the thread.
|
||||
|
||||
The scheduler as-is isn't 100% faithful to the original (for example the original is cooperative and not preemptive), and has great timing variance (especially due to the fact the emulator can run in systems with wildly different timings).
|
||||
|
||||
## Services
|
||||
|
||||
Consult [SwitchBrew](https://switchbrew.org/) for per-service methods, and implementation details.
|
||||
|
||||
All services are instatiated implicitly using `ServiceFramework`. To register a new interface or service, you can inherit from said class, providing additionally a template parameter that references `Self`, for example:
|
||||
|
||||
```c++
|
||||
// Follows as:
|
||||
// class MyInterface [final] : public ServiceFramework<MyInterface> { ... };
|
||||
// [final] is optional, but should be used whenever there is no intention of this class itself being inherited.
|
||||
class IFloatingRegistrationRequest final : public ServiceFramework<IFloatingRegistrationRequest> {
|
||||
public:
|
||||
// ctor, you can pass extra parameters here (if so required)
|
||||
explicit IFloatingRegistrationRequest(Core::System& system_)
|
||||
: ServiceFramework{system_, "IFloatingRegistrationRequest"}
|
||||
{}
|
||||
|
||||
// Define here your functions and methods, please order them.
|
||||
// Use FindRequestTipc for TIPC handlers.
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, nullptr, "GetSessionId"},
|
||||
FunctionInfo{12, nullptr, "GetAccountId"},
|
||||
FunctionInfo{13, nullptr, "GetLinkedNintendoAccountId"},
|
||||
FunctionInfo{14, nullptr, "GetNickname"},
|
||||
FunctionInfo{15, nullptr, "GetProfileImage"},
|
||||
FunctionInfo{16, nullptr, "GetProfileLargeImage", MakeVersionGate({18,0,0})},
|
||||
FunctionInfo{21, nullptr, "LoadIdTokenCache"},
|
||||
FunctionInfo{100, nullptr, "RegisterUser"},
|
||||
FunctionInfo{101, nullptr, "RegisterUserWithUid"},
|
||||
FunctionInfo{102, nullptr, "RegisterNetworkServiceAccountAsync", MakeVersionGate({4,0,0})},
|
||||
FunctionInfo{103, nullptr, "RegisterNetworkServiceAccountWithUidAsync", MakeVersionGate({4,0,0})},
|
||||
FunctionInfo{110, nullptr, "SetSystemProgramIdentification"},
|
||||
FunctionInfo{111, nullptr, "EnsureIdTokenCacheAsync"}
|
||||
);
|
||||
}
|
||||
};
|
||||
```
|
||||
+33
-21
@@ -1,32 +1,44 @@
|
||||
# User Handbook - Command Line
|
||||
|
||||
There are two main applications, an SDL-based app (`eden-cli`) and a Qt based app (`eden`); both accept command line arguments.
|
||||
|
||||
## eden
|
||||
There are two main applications, an SDL-based app (`eden-cli`) and a Qt based app (`eden`); both accept the same command line arguments.
|
||||
|
||||
- `./eden <path>`: Running with a single argument and nothing else, will make the emulator look for the given file and load it, this behavior is similar to `eden-cli`; allows dragging and dropping games into the application.
|
||||
- `-g <path>`: Alternate way to specify what to load, overrides. However let it be noted that arguments that use `-` will be treated as options/ignored, if your game, for some reason, starts with `-`, in order to safely handle it you may need to specify it as an argument.
|
||||
- `-f`: Use fullscreen.
|
||||
- `-u <number>`: Select the index of the user to load as.
|
||||
- `-input-profile <name>`: Specifies input profile name to use (for player #0 only).
|
||||
- `--debug/-d`: Enter debug mode, allow gdb stub at port `1234`
|
||||
- `--config/-c`: Specify alternate configuration file.
|
||||
- `--fullscreen/-f`: Use fullscreen.
|
||||
- `--help/-h`: Display help.
|
||||
- `--game/-g <path>`: Alternate way to specify what to load, overrides. However let it be noted that arguments that use `-` will be treated as options/ignored, if your game, for some reason, starts with `-`, in order to safely handle it you may need to specify it as an argument.
|
||||
- `--multiplayer/-m`: Specify multiplayer options.
|
||||
- `--program/-p`: Specify the program arguments to pass (optional).
|
||||
- `--user/-u <number>`: Specify the user index.
|
||||
- `--version/-v`: Display version and quit.
|
||||
- `--input-profile/-i <name>`: Specifies input profile name to use (for player #0 only).
|
||||
- `--null-render/-n`: Forces the usage of the "Null" render backend irrespective of settings.
|
||||
- `--filter/-x`: Sets the debug log filter irrespective of settings.
|
||||
- `--singlecore/-s`: Forces single-core regardless of settings.
|
||||
|
||||
Only the Qt frontend supports the following arguments:
|
||||
|
||||
- `-qlaunch`: Launch QLaunch.
|
||||
- `-hlaunch`: Launch homebrew launcher `nx-hbloader`.
|
||||
- Requires a copy of Atmosphere to be extracted onto `sdmc`.
|
||||
- This is a shorthand for `<eden folder>/sdmc/atmosphere/hbl.nsp`.
|
||||
- `-setup`: Launch setup applet.
|
||||
|
||||
## eden-cli
|
||||
`eden` (provided with `--room`), and `eden-room` supports the following options as well:
|
||||
|
||||
- `--debug/-d`: Enter debug mode, allow gdb stub at port `1234`
|
||||
- `--config/-c`: Specify alternate configuration file.
|
||||
- `--fullscreen/-f`: Set fullscreen.
|
||||
- `--help/-h`: Display help.
|
||||
- `--game/-g`: Specify the game to run.
|
||||
- `--multiplayer/-m`: Specify multiplayer options.
|
||||
- `--program/-p`: Specify the program arguments to pass (optional).
|
||||
- `--user/-u`: Specify the user index.
|
||||
- `--version/-v`: Display version and quit.
|
||||
- `--input-profile/-i`: Specifies input profile name to use (for player #0 only).
|
||||
- `--null-render/-n`: Forces the usage of the "Null" render backend irrespective of settings.
|
||||
- `--filter/-x`: Sets the debug log filter irrespective of settings.
|
||||
- `--singlecore/-s`: Forces single-core regardless of settings.
|
||||
- `-n/--room-name`: The name of the room.
|
||||
- `-d/--room-description`: The room description.
|
||||
- `-s/--bind-address`: The bind address for the room.
|
||||
- `-p/--port`: The port used for the room.
|
||||
- `-m/--max-members`: The maximum number of players for this room.
|
||||
- `-w/--password`: The password for the room.
|
||||
- `-g/--preferred-game`: The preferred game for this room.
|
||||
- `-i/--preferred-game-id`: The preferred game-id for this room.
|
||||
- `-u/--username`: The username used for announce.
|
||||
- `-t/--token`: The token used for announce.
|
||||
- `-a/--web-api-url`: yuzu Web API url.
|
||||
- `-b/--ban-list-file`: The file for storing the room ban list.
|
||||
- `-l/--log-file`: The file for storing the room log.
|
||||
- `-h/--help`: Display this help and exit.
|
||||
- `-v/--version`: Output version information and exit.
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
||||
@@ -19,11 +19,6 @@ ADSP::ADSP(Core::System& system, Sink::Sink& sink) {
|
||||
}
|
||||
}
|
||||
|
||||
void ADSP::Shutdown() {
|
||||
audio_renderer->Stop();
|
||||
opus_decoder->Shutdown();
|
||||
}
|
||||
|
||||
AudioRenderer::AudioRenderer& ADSP::AudioRenderer() {
|
||||
return *audio_renderer;
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
||||
@@ -45,7 +45,6 @@ public:
|
||||
explicit ADSP(Core::System& system, Sink::Sink& sink);
|
||||
~ADSP() = default;
|
||||
|
||||
void Shutdown();
|
||||
AudioRenderer::AudioRenderer& AudioRenderer();
|
||||
OpusDecoder::OpusDecoder& OpusDecoder();
|
||||
|
||||
|
||||
@@ -34,19 +34,26 @@ void AudioRenderer::Start() {
|
||||
|
||||
mailbox.Send(Direction::DSP, Message::InitializeOK);
|
||||
if (mailbox.Receive(Direction::Host) != Message::InitializeOK) {
|
||||
LOG_ERROR(Service_Audio, "Host Audio Renderer -- Failed to receive shutdown message response from ADSP!");
|
||||
LOG_ERROR(Service_Audio, "Host Audio Renderer -- Failed to receive shutdown "
|
||||
"message response from ADSP!");
|
||||
return;
|
||||
}
|
||||
running = true;
|
||||
}
|
||||
|
||||
void AudioRenderer::Stop() {
|
||||
if (main_thread.joinable()) {
|
||||
main_thread.request_stop();
|
||||
mailbox.Send(Direction::DSP, Message::Shutdown);
|
||||
if (mailbox.Receive(Direction::Host, main_thread.get_stop_token()) != Message::Shutdown) {
|
||||
LOG_ERROR(Service_Audio, "Host Audio Renderer -- Failed to receive shutdown message response from ADSP!");
|
||||
}
|
||||
main_thread.join();
|
||||
if (!running) {
|
||||
return;
|
||||
}
|
||||
|
||||
mailbox.Send(Direction::DSP, Message::Shutdown);
|
||||
if (mailbox.Receive(Direction::Host) != Message::Shutdown) {
|
||||
LOG_ERROR(Service_Audio, "Host Audio Renderer -- Failed to receive shutdown "
|
||||
"message response from ADSP!");
|
||||
}
|
||||
main_thread.request_stop();
|
||||
main_thread.join();
|
||||
|
||||
for (auto& stream : streams) {
|
||||
if (stream) {
|
||||
stream->Stop();
|
||||
@@ -54,6 +61,7 @@ void AudioRenderer::Stop() {
|
||||
stream = nullptr;
|
||||
}
|
||||
}
|
||||
running = false;
|
||||
}
|
||||
|
||||
void AudioRenderer::Signal() {
|
||||
@@ -61,12 +69,13 @@ void AudioRenderer::Signal() {
|
||||
Send(Direction::DSP, Message::Render);
|
||||
}
|
||||
|
||||
void AudioRenderer::Wait(std::stop_token stop_token) {
|
||||
auto msg = mailbox.Receive(Direction::Host, stop_token);
|
||||
void AudioRenderer::Wait() {
|
||||
auto msg = Receive(Direction::Host);
|
||||
if (msg != Message::RenderResponse) {
|
||||
LOG_ERROR(Service_Audio,
|
||||
"Did not receive the expected render response from the AudioRenderer! Expected "
|
||||
"{}, got {}", Message::RenderResponse, msg);
|
||||
"Did not receive the expected render response from the AudioRenderer! Expected "
|
||||
"{}, got {}",
|
||||
Message::RenderResponse, msg);
|
||||
}
|
||||
PostDSPClearCommandBuffer();
|
||||
}
|
||||
@@ -138,9 +147,7 @@ void AudioRenderer::Main(std::stop_token stop_token) {
|
||||
constexpr u64 max_process_time{2'304'000ULL};
|
||||
|
||||
while (!stop_token.stop_requested()) {
|
||||
auto msg = mailbox.Receive(Direction::DSP, stop_token);
|
||||
if (stop_token.stop_requested())
|
||||
break;
|
||||
auto msg{mailbox.Receive(Direction::DSP)};
|
||||
switch (msg) {
|
||||
case Message::Shutdown:
|
||||
mailbox.Send(Direction::Host, Message::Shutdown);
|
||||
|
||||
@@ -63,15 +63,13 @@ public:
|
||||
*/
|
||||
void Start();
|
||||
|
||||
void NotifyShutdown();
|
||||
|
||||
/**
|
||||
* Stop the AudioRenderer.
|
||||
*/
|
||||
void Stop();
|
||||
|
||||
void Signal();
|
||||
void Wait(std::stop_token stop_token);
|
||||
void Wait();
|
||||
|
||||
void Send(Direction dir, u32 message);
|
||||
u32 Receive(Direction dir);
|
||||
@@ -104,6 +102,8 @@ private:
|
||||
Mailbox mailbox;
|
||||
/// Main thread
|
||||
std::jthread main_thread{};
|
||||
/// The current state
|
||||
std::atomic<bool> running{};
|
||||
/// Shared memory of input command buffers, set by host, read by DSP
|
||||
std::array<CommandBuffer, MaxRendererSessions> command_buffers{};
|
||||
/// The command lists to process
|
||||
|
||||
@@ -41,16 +41,19 @@ OpusDecoder::OpusDecoder(Core::System& system_) : system{system_} {
|
||||
}
|
||||
|
||||
OpusDecoder::~OpusDecoder() {
|
||||
if (main_thread.joinable()) {
|
||||
// Shutdown the thread
|
||||
Send(Direction::DSP, Message::Shutdown);
|
||||
main_thread.request_stop();
|
||||
auto msg = Receive(Direction::Host, main_thread.get_stop_token());
|
||||
ASSERT_MSG(msg == Message::ShutdownOK, "Expected Opus shutdown code {}, got {}", Message::ShutdownOK, msg);
|
||||
main_thread.join();
|
||||
} else {
|
||||
if (!running) {
|
||||
init_thread.request_stop();
|
||||
return;
|
||||
}
|
||||
|
||||
// Shutdown the thread
|
||||
Send(Direction::DSP, Message::Shutdown);
|
||||
auto msg = Receive(Direction::Host);
|
||||
ASSERT_MSG(msg == Message::ShutdownOK, "Expected Opus shutdown code {}, got {}",
|
||||
Message::ShutdownOK, msg);
|
||||
main_thread.request_stop();
|
||||
main_thread.join();
|
||||
running = false;
|
||||
}
|
||||
|
||||
void OpusDecoder::Send(Direction dir, u32 message) {
|
||||
@@ -70,6 +73,7 @@ void OpusDecoder::Init(std::stop_token stop_token) {
|
||||
return;
|
||||
}
|
||||
main_thread = std::jthread([this](std::stop_token st) { Main(st); });
|
||||
running = true;
|
||||
Send(Direction::Host, Message::StartOK);
|
||||
}
|
||||
|
||||
@@ -78,15 +82,12 @@ void OpusDecoder::Main(std::stop_token stop_token) {
|
||||
|
||||
while (!stop_token.stop_requested()) {
|
||||
auto msg = Receive(Direction::DSP, stop_token);
|
||||
if (stop_token.stop_requested())
|
||||
break;
|
||||
|
||||
switch (msg) {
|
||||
case Message::Shutdown:
|
||||
case Shutdown:
|
||||
Send(Direction::Host, Message::ShutdownOK);
|
||||
return;
|
||||
|
||||
case Message::GetWorkBufferSize: {
|
||||
case GetWorkBufferSize: {
|
||||
auto channel_count = static_cast<s32>(shared_memory->host_send_data[0]);
|
||||
|
||||
ASSERT(IsValidChannelCount(channel_count));
|
||||
@@ -95,7 +96,7 @@ void OpusDecoder::Main(std::stop_token stop_token) {
|
||||
Send(Direction::Host, Message::GetWorkBufferSizeOK);
|
||||
} break;
|
||||
|
||||
case Message::InitializeDecodeObject: {
|
||||
case InitializeDecodeObject: {
|
||||
auto buffer = shared_memory->host_send_data[0];
|
||||
auto buffer_size = shared_memory->host_send_data[1];
|
||||
auto sample_rate = static_cast<s32>(shared_memory->host_send_data[2]);
|
||||
@@ -112,7 +113,7 @@ void OpusDecoder::Main(std::stop_token stop_token) {
|
||||
Send(Direction::Host, Message::InitializeDecodeObjectOK);
|
||||
} break;
|
||||
|
||||
case Message::ShutdownDecodeObject: {
|
||||
case ShutdownDecodeObject: {
|
||||
auto buffer = shared_memory->host_send_data[0];
|
||||
[[maybe_unused]] auto buffer_size = shared_memory->host_send_data[1];
|
||||
|
||||
@@ -122,7 +123,7 @@ void OpusDecoder::Main(std::stop_token stop_token) {
|
||||
Send(Direction::Host, Message::ShutdownDecodeObjectOK);
|
||||
} break;
|
||||
|
||||
case Message::DecodeInterleaved: {
|
||||
case DecodeInterleaved: {
|
||||
auto start_time = system.CoreTiming().GetGlobalTimeUs();
|
||||
|
||||
auto buffer = shared_memory->host_send_data[0];
|
||||
@@ -160,19 +161,19 @@ void OpusDecoder::Main(std::stop_token stop_token) {
|
||||
Send(Direction::Host, Message::DecodeInterleavedOK);
|
||||
} break;
|
||||
|
||||
case Message::MapMemory: {
|
||||
case MapMemory: {
|
||||
[[maybe_unused]] auto buffer = shared_memory->host_send_data[0];
|
||||
[[maybe_unused]] auto buffer_size = shared_memory->host_send_data[1];
|
||||
Send(Direction::Host, Message::MapMemoryOK);
|
||||
} break;
|
||||
|
||||
case Message::UnmapMemory: {
|
||||
case UnmapMemory: {
|
||||
[[maybe_unused]] auto buffer = shared_memory->host_send_data[0];
|
||||
[[maybe_unused]] auto buffer_size = shared_memory->host_send_data[1];
|
||||
Send(Direction::Host, Message::UnmapMemoryOK);
|
||||
} break;
|
||||
|
||||
case Message::GetWorkBufferSizeForMultiStream: {
|
||||
case GetWorkBufferSizeForMultiStream: {
|
||||
auto total_stream_count = static_cast<s32>(shared_memory->host_send_data[0]);
|
||||
auto stereo_stream_count = static_cast<s32>(shared_memory->host_send_data[1]);
|
||||
|
||||
@@ -183,7 +184,7 @@ void OpusDecoder::Main(std::stop_token stop_token) {
|
||||
Send(Direction::Host, Message::GetWorkBufferSizeForMultiStreamOK);
|
||||
} break;
|
||||
|
||||
case Message::InitializeMultiStreamDecodeObject: {
|
||||
case InitializeMultiStreamDecodeObject: {
|
||||
auto buffer = shared_memory->host_send_data[0];
|
||||
auto buffer_size = shared_memory->host_send_data[1];
|
||||
auto sample_rate = static_cast<s32>(shared_memory->host_send_data[2]);
|
||||
@@ -210,7 +211,7 @@ void OpusDecoder::Main(std::stop_token stop_token) {
|
||||
Send(Direction::Host, Message::InitializeMultiStreamDecodeObjectOK);
|
||||
} break;
|
||||
|
||||
case Message::ShutdownMultiStreamDecodeObject: {
|
||||
case ShutdownMultiStreamDecodeObject: {
|
||||
auto buffer = shared_memory->host_send_data[0];
|
||||
[[maybe_unused]] auto buffer_size = shared_memory->host_send_data[1];
|
||||
|
||||
@@ -220,7 +221,7 @@ void OpusDecoder::Main(std::stop_token stop_token) {
|
||||
Send(Direction::Host, Message::ShutdownMultiStreamDecodeObjectOK);
|
||||
} break;
|
||||
|
||||
case Message::DecodeInterleavedForMultiStream: {
|
||||
case DecodeInterleavedForMultiStream: {
|
||||
auto start_time = system.CoreTiming().GetGlobalTimeUs();
|
||||
|
||||
auto buffer = shared_memory->host_send_data[0];
|
||||
@@ -265,15 +266,4 @@ void OpusDecoder::Main(std::stop_token stop_token) {
|
||||
}
|
||||
}
|
||||
|
||||
void OpusDecoder::Shutdown() {
|
||||
if (init_thread.joinable()) {
|
||||
init_thread.request_stop();
|
||||
init_thread.join(); //must explicitly wait for init to join
|
||||
}
|
||||
if (main_thread.joinable()) {
|
||||
main_thread.request_stop();
|
||||
Send(Direction::DSP, Message::Shutdown);
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace AudioCore::ADSP::OpusDecoder
|
||||
|
||||
@@ -57,7 +57,7 @@ public:
|
||||
~OpusDecoder();
|
||||
|
||||
bool IsRunning() const noexcept {
|
||||
return main_thread.joinable();
|
||||
return running;
|
||||
}
|
||||
|
||||
void Send(Direction dir, u32 message);
|
||||
@@ -67,8 +67,6 @@ public:
|
||||
shared_memory = &shared_memory_;
|
||||
}
|
||||
|
||||
void Shutdown();
|
||||
|
||||
private:
|
||||
/**
|
||||
* Initializing thread, launched at audio_core boot to avoid blocking the main emu boot thread.
|
||||
@@ -87,6 +85,8 @@ private:
|
||||
std::jthread init_thread{};
|
||||
/// Main thread
|
||||
std::jthread main_thread{};
|
||||
/// The current state
|
||||
bool running{};
|
||||
/// Structure shared with the host, input data set by the host before sending a mailbox message,
|
||||
/// and the responses are written back by the OpusDecoder.
|
||||
SharedMemory* shared_memory{};
|
||||
|
||||
@@ -33,7 +33,6 @@ void AudioCore::CreateSinks() {
|
||||
|
||||
void AudioCore::Shutdown() {
|
||||
audio_manager->Shutdown();
|
||||
adsp->Shutdown();
|
||||
}
|
||||
|
||||
AudioManager& AudioCore::GetAudioManager() {
|
||||
|
||||
@@ -17,7 +17,7 @@ AudioManager::AudioManager() {
|
||||
std::unique_lock l{events.GetAudioEventLock()};
|
||||
events.ClearEvents();
|
||||
while (!stop_token.stop_requested()) {
|
||||
const auto timed_out = events.Wait(l, std::chrono::seconds{2});
|
||||
const auto timed_out{events.Wait(l, std::chrono::seconds(2))};
|
||||
if (events.CheckAudioEventSet(Event::Type::Max)) {
|
||||
break;
|
||||
}
|
||||
@@ -35,9 +35,9 @@ AudioManager::AudioManager() {
|
||||
}
|
||||
|
||||
void AudioManager::Shutdown() {
|
||||
events.SetAudioEvent(Event::Type::Max, true);
|
||||
if (thread.joinable()) {
|
||||
thread.request_stop();
|
||||
events.SetAudioEvent(Event::Type::Max, true);
|
||||
thread.join();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -39,7 +39,9 @@ class AudioManager {
|
||||
public:
|
||||
explicit AudioManager();
|
||||
|
||||
/// @brief Shutdown the audio manager.
|
||||
/**
|
||||
* Shutdown the audio manager.
|
||||
*/
|
||||
void Shutdown();
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,6 +1,3 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
@@ -38,7 +35,7 @@ void CircularBufferSinkInfo::Update(BehaviorInfo::ErrorInfo& error_info, OutStat
|
||||
auto current_params{reinterpret_cast<CircularBufferInParameter*>(parameter.data())};
|
||||
auto current_state{reinterpret_cast<CircularBufferState*>(state.data())};
|
||||
|
||||
if (in_use == bool(buffer_params->in_use) && !buffer_unmapped) {
|
||||
if (in_use == buffer_params->in_use && !buffer_unmapped) {
|
||||
error_info.error_code = ResultSuccess;
|
||||
error_info.address = CpuAddr(0);
|
||||
out_status.writeOffset = current_state->last_pos2;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
|
||||
@@ -31,10 +31,10 @@ public:
|
||||
};
|
||||
|
||||
struct DeviceInParameter {
|
||||
/* 0x000 */ u8 name[0x100];
|
||||
/* 0x000 */ char name[0x100];
|
||||
/* 0x100 */ u32 input_count;
|
||||
/* 0x104 */ std::array<s8, MaxChannels> inputs;
|
||||
/* 0x10A */ u8 unk10A[0x1];
|
||||
/* 0x10A */ char unk10A[0x1];
|
||||
/* 0x10B */ bool downmix_enabled;
|
||||
/* 0x10C */ std::array<f32, 4> downmix_coeff;
|
||||
};
|
||||
@@ -43,7 +43,7 @@ public:
|
||||
struct DeviceState {
|
||||
/* 0x00 */ UpsamplerInfo* upsampler_info;
|
||||
/* 0x08 */ std::array<Common::FixedPoint<16, 16>, 4> downmix_coeff;
|
||||
/* 0x18 */ u8 unk18[0x18];
|
||||
/* 0x18 */ char unk18[0x18];
|
||||
};
|
||||
static_assert(sizeof(DeviceState) == 0x30, "DeviceState has the wrong size!");
|
||||
|
||||
@@ -55,8 +55,8 @@ public:
|
||||
/* 0x14 */ u32 previous_pos;
|
||||
/* 0x18 */ SampleFormat format;
|
||||
/* 0x1C */ std::array<s8, MaxChannels> inputs;
|
||||
/* 0x22 */ u8 in_use;
|
||||
/* 0x23 */ u8 unk23[0x5];
|
||||
/* 0x22 */ bool in_use;
|
||||
/* 0x23 */ char unk23[0x5];
|
||||
};
|
||||
static_assert(sizeof(CircularBufferInParameter) == 0x28,
|
||||
"CircularBufferInParameter has the wrong size!");
|
||||
@@ -65,16 +65,16 @@ public:
|
||||
/* 0x00 */ u32 last_pos2;
|
||||
/* 0x04 */ s32 current_pos;
|
||||
/* 0x08 */ u32 last_pos;
|
||||
/* 0x0C */ u8 unk0C[0x4];
|
||||
/* 0x0C */ char unk0C[0x4];
|
||||
/* 0x10 */ AddressInfo address_info;
|
||||
};
|
||||
static_assert(sizeof(CircularBufferState) == 0x30, "CircularBufferState has the wrong size!");
|
||||
|
||||
struct InParameter {
|
||||
/* 0x000 */ Type type;
|
||||
/* 0x001 */ u8 in_use;
|
||||
/* 0x001 */ bool in_use;
|
||||
/* 0x004 */ u32 node_id;
|
||||
/* 0x008 */ u8 unk08[0x18];
|
||||
/* 0x008 */ char unk08[0x18];
|
||||
union {
|
||||
/* 0x020 */ DeviceInParameter device;
|
||||
/* 0x020 */ CircularBufferInParameter circular_buffer;
|
||||
@@ -84,7 +84,7 @@ public:
|
||||
|
||||
struct OutStatus {
|
||||
/* 0x00 */ u32 writeOffset;
|
||||
/* 0x04 */ u8 unk04[0x1C];
|
||||
/* 0x04 */ char unk04[0x1C];
|
||||
}; // size == 0x20
|
||||
static_assert(sizeof(OutStatus) == 0x20, "SinkInfoBase::OutStatus has the wrong size!");
|
||||
|
||||
@@ -162,18 +162,19 @@ public:
|
||||
u8* GetParameter();
|
||||
|
||||
protected:
|
||||
/// Type of this sink
|
||||
Type type{Type::Invalid};
|
||||
/// Is this sink in use?
|
||||
bool in_use{};
|
||||
/// Is this sink's buffer unmapped? Circular only
|
||||
bool buffer_unmapped{};
|
||||
/// Node id for this sink
|
||||
u32 node_id{};
|
||||
/// State buffer for this sink
|
||||
std::array<u8, (std::max)(sizeof(DeviceState), sizeof(CircularBufferState))> state{};
|
||||
/// Parameter buffer for this sink
|
||||
std::array<u8, (std::max)(sizeof(DeviceInParameter), sizeof(CircularBufferInParameter))> parameter{};
|
||||
/// Type of this sink
|
||||
Type type{Type::Invalid};
|
||||
/// Node id for this sink
|
||||
u32 node_id{};
|
||||
/// Is this sink in use?
|
||||
bool in_use : 1 = false;
|
||||
/// Is this sink's buffer unmapped? Circular only
|
||||
bool buffer_unmapped : 1 = false;
|
||||
std::array<u8, (std::max)(sizeof(DeviceInParameter), sizeof(CircularBufferInParameter))>
|
||||
parameter{};
|
||||
};
|
||||
|
||||
} // namespace AudioCore::Renderer
|
||||
|
||||
@@ -100,9 +100,8 @@ u64 System::GetWorkBufferSize(const AudioRendererParameterInternal& params) {
|
||||
}
|
||||
|
||||
System::System(Core::System& core_, Kernel::KEvent* adsp_rendered_event_)
|
||||
: core{core_}
|
||||
, adsp_rendered_event{adsp_rendered_event_}
|
||||
{}
|
||||
: core{core_}, audio_renderer{core.AudioCore().ADSP().AudioRenderer()},
|
||||
adsp_rendered_event{adsp_rendered_event_} {}
|
||||
|
||||
Result System::Initialize(const AudioRendererParameterInternal& params,
|
||||
Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size,
|
||||
@@ -407,7 +406,7 @@ void System::Finalize() {
|
||||
return;
|
||||
}
|
||||
|
||||
if (IsActive()) {
|
||||
if (active) {
|
||||
Stop();
|
||||
}
|
||||
|
||||
@@ -434,12 +433,14 @@ void System::Start() {
|
||||
std::scoped_lock l{lock};
|
||||
frames_elapsed = 0;
|
||||
state = State::Started;
|
||||
active = true;
|
||||
}
|
||||
|
||||
void System::Stop() {
|
||||
{
|
||||
std::scoped_lock l{lock};
|
||||
state = State::Stopped;
|
||||
active = false;
|
||||
}
|
||||
|
||||
if (execution_mode == ExecutionMode::Auto) {
|
||||
@@ -479,7 +480,7 @@ Result System::Update(std::span<const u8> input, std::span<u8> performance, std:
|
||||
return result;
|
||||
}
|
||||
|
||||
result = info_updater.UpdateEffects(effect_context, IsActive(), memory_pool_workbuffer,
|
||||
result = info_updater.UpdateEffects(effect_context, active, memory_pool_workbuffer,
|
||||
memory_pool_count);
|
||||
if (result.IsError()) {
|
||||
LOG_ERROR(Service_Audio, "Failed to update Effects!");
|
||||
@@ -581,16 +582,16 @@ u32 System::GetRenderingDevice() const {
|
||||
}
|
||||
|
||||
bool System::IsActive() const {
|
||||
return state == State::Started;
|
||||
return active;
|
||||
}
|
||||
|
||||
void System::SendCommandToDsp() {
|
||||
std::scoped_lock l{lock};
|
||||
|
||||
if (initialized) {
|
||||
if (IsActive()) {
|
||||
if (active) {
|
||||
terminate_event.Reset();
|
||||
const auto remaining_command_count = core.AudioCore().ADSP().AudioRenderer().GetRemainCommandCount(session_id);
|
||||
const auto remaining_command_count{audio_renderer.GetRemainCommandCount(session_id)};
|
||||
u64 command_size{0};
|
||||
|
||||
if (remaining_command_count) {
|
||||
@@ -617,17 +618,16 @@ void System::SendCommandToDsp() {
|
||||
auto time_limit{
|
||||
static_cast<u64>((time_limit_percent / 100) * 2'880'000.0 *
|
||||
(static_cast<f32>(render_time_limit_percent) / 100.0f))};
|
||||
core.AudioCore().ADSP().AudioRenderer().SetCommandBuffer(session_id,
|
||||
translated_addr, command_size,
|
||||
time_limit, applet_resource_user_id,
|
||||
process_handle, reset_command_buffers);
|
||||
audio_renderer.SetCommandBuffer(session_id, translated_addr, command_size, time_limit,
|
||||
applet_resource_user_id, process_handle,
|
||||
reset_command_buffers);
|
||||
reset_command_buffers = false;
|
||||
command_buffer_size = command_size;
|
||||
if (remaining_command_count == 0) {
|
||||
adsp_rendered_event->Signal(core.Kernel());
|
||||
}
|
||||
} else {
|
||||
core.AudioCore().ADSP().AudioRenderer().ClearRemainCommandCount(session_id);
|
||||
audio_renderer.ClearRemainCommandCount(session_id);
|
||||
terminate_event.Set();
|
||||
}
|
||||
}
|
||||
@@ -738,7 +738,7 @@ u64 System::GenerateCommand(std::span<u8> in_command_buffer,
|
||||
const auto end_time{core.CoreTiming().GetGlobalTimeNs().count()};
|
||||
total_ticks_elapsed += end_time - start_time;
|
||||
num_command_lists_generated++;
|
||||
render_start_tick = core.AudioCore().ADSP().AudioRenderer().GetRenderingStartTick(session_id);
|
||||
render_start_tick = audio_renderer.GetRenderingStartTick(session_id);
|
||||
frames_elapsed++;
|
||||
|
||||
return command_buffer.size;
|
||||
|
||||
@@ -219,6 +219,8 @@ public:
|
||||
private:
|
||||
/// Core system
|
||||
Core::System& core;
|
||||
/// Reference to the ADSP's AudioRenderer for communication
|
||||
::AudioCore::ADSP::AudioRenderer::AudioRenderer& audio_renderer;
|
||||
/// Is this system initialized?
|
||||
bool initialized{};
|
||||
/// Is this system currently active?
|
||||
|
||||
@@ -11,70 +11,73 @@
|
||||
#include "audio_core/renderer/system_manager.h"
|
||||
#include "common/thread.h"
|
||||
#include "core/core.h"
|
||||
#include "core/hle/kernel/kernel.h"
|
||||
#include "core/hle/kernel/k_scheduler.h"
|
||||
#include "core/core_timing.h"
|
||||
|
||||
namespace AudioCore::Renderer {
|
||||
|
||||
SystemManager::SystemManager(Core::System& core_)
|
||||
: core{core_}
|
||||
{
|
||||
}
|
||||
: core{core_}, audio_renderer{core.AudioCore().ADSP().AudioRenderer()} {}
|
||||
|
||||
SystemManager::~SystemManager() {
|
||||
Stop();
|
||||
}
|
||||
|
||||
void SystemManager::InitializeUnsafe() {
|
||||
if (!thread.joinable()) {
|
||||
core.AudioCore().ADSP().AudioRenderer().Start();
|
||||
thread = core.Kernel().RunOnHostCoreThread("AudioRenderSystemManager", [this]() {
|
||||
auto& audio_renderer = core.AudioCore().ADSP().AudioRenderer();
|
||||
auto const stop_token = thread.get_stop_token();
|
||||
while (!stop_token.stop_requested()) {
|
||||
if (!active) {
|
||||
active = true;
|
||||
audio_renderer.Start();
|
||||
thread = std::jthread([this](std::stop_token stop_token) {
|
||||
Common::SetCurrentThreadName("AudioRenderSystemManager");
|
||||
Common::SetCurrentThreadPriority(Common::ThreadPriority::High);
|
||||
while (active && !stop_token.stop_requested()) {
|
||||
{
|
||||
std::scoped_lock lk{mutex};
|
||||
std::scoped_lock l{mutex1};
|
||||
for (auto system : systems)
|
||||
system->SendCommandToDsp();
|
||||
}
|
||||
audio_renderer.Signal();
|
||||
audio_renderer.Wait(stop_token);
|
||||
audio_renderer.Wait();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
void SystemManager::Stop() {
|
||||
core.AudioCore().ADSP().AudioRenderer().Stop();
|
||||
if (thread.joinable()) {
|
||||
if (active) {
|
||||
active = false;
|
||||
thread.request_stop();
|
||||
thread.join();
|
||||
audio_renderer.Stop();
|
||||
}
|
||||
}
|
||||
|
||||
bool SystemManager::Add(System& system_) {
|
||||
std::scoped_lock lk{mutex};
|
||||
if (systems.size() >= MaxRendererSessions) {
|
||||
std::scoped_lock l2{mutex2};
|
||||
if (systems.size() + 1 > MaxRendererSessions) {
|
||||
LOG_ERROR(Service_Audio, "Maximum AudioRenderer Systems active, cannot add more!");
|
||||
return false;
|
||||
}
|
||||
systems.push_back(&system_);
|
||||
if (!systems.empty()) {
|
||||
InitializeUnsafe();
|
||||
{
|
||||
std::scoped_lock l{mutex1};
|
||||
if (systems.empty())
|
||||
InitializeUnsafe();
|
||||
}
|
||||
systems.push_back(&system_);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool SystemManager::Remove(System& system_) {
|
||||
std::scoped_lock lk{mutex};
|
||||
if (systems.remove(&system_) == 0) {
|
||||
LOG_ERROR(Service_Audio, "Failed to remove a render system, it was not found in the list!");
|
||||
return false;
|
||||
std::scoped_lock l2{mutex2};
|
||||
{
|
||||
std::scoped_lock l{mutex1};
|
||||
if (systems.remove(&system_) == 0) {
|
||||
LOG_ERROR(Service_Audio, "Failed to remove a render system, it was not found in the list!");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (systems.empty()) {
|
||||
|
||||
if (systems.empty())
|
||||
Stop();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -75,8 +75,14 @@ private:
|
||||
std::list<System*> systems{};
|
||||
/// Main worker thread for generating command lists
|
||||
std::jthread thread;
|
||||
/// Mutex for the reading and adding/removing systems
|
||||
std::mutex mutex{};
|
||||
/// Mutex for the systems
|
||||
std::mutex mutex1{};
|
||||
/// Mutex for adding/removing systems
|
||||
std::mutex mutex2{};
|
||||
/// Is the system manager thread active?
|
||||
std::atomic<bool> active{};
|
||||
/// Reference to the ADSP's AudioRenderer for communication
|
||||
::AudioCore::ADSP::AudioRenderer::AudioRenderer& audio_renderer;
|
||||
};
|
||||
|
||||
} // namespace AudioCore::Renderer
|
||||
|
||||
@@ -76,7 +76,6 @@ add_library(
|
||||
logging.h
|
||||
lz4_compression.cpp
|
||||
lz4_compression.h
|
||||
make_unique_for_overwrite.h
|
||||
math_util.h
|
||||
memory_detect.cpp
|
||||
memory_detect.h
|
||||
|
||||
@@ -109,6 +109,12 @@ private:
|
||||
if (read_index == producer.index.load(std::memory_order::acquire)) {
|
||||
return false;
|
||||
}
|
||||
} else if constexpr (Mode == PopMode::Wait) {
|
||||
// Wait until the queue is not empty.
|
||||
std::unique_lock lock{consumer.cv_mutex};
|
||||
consumer.cv.wait(lock, [this, read_index] {
|
||||
return read_index != producer.index.load(std::memory_order::acquire);
|
||||
});
|
||||
} else if constexpr (Mode == PopMode::WaitWithStopToken) {
|
||||
// Wait until the queue is not empty.
|
||||
std::unique_lock lock{consumer.cv_mutex};
|
||||
@@ -118,12 +124,6 @@ private:
|
||||
if (stop_token.stop_requested()) {
|
||||
return false;
|
||||
}
|
||||
} else if constexpr (Mode == PopMode::Wait) {
|
||||
// Wait until the queue is not empty.
|
||||
std::unique_lock lock{consumer.cv_mutex};
|
||||
consumer.cv.wait(lock, [this, read_index] {
|
||||
return read_index != producer.index.load(std::memory_order::acquire);
|
||||
});
|
||||
} else {
|
||||
static_assert(Mode < PopMode::Count, "Invalid PopMode.");
|
||||
}
|
||||
|
||||
@@ -1,27 +0,0 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <memory>
|
||||
#include <type_traits>
|
||||
|
||||
namespace Common {
|
||||
|
||||
template <class T>
|
||||
requires(!std::is_array_v<T>)
|
||||
std::unique_ptr<T> make_unique_for_overwrite() {
|
||||
return std::unique_ptr<T>(new T);
|
||||
}
|
||||
|
||||
template <class T>
|
||||
requires std::is_unbounded_array_v<T>
|
||||
std::unique_ptr<T> make_unique_for_overwrite(std::size_t n) {
|
||||
return std::unique_ptr<T>(new std::remove_extent_t<T>[n]);
|
||||
}
|
||||
|
||||
template <class T, class... Args>
|
||||
requires std::is_bounded_array_v<T>
|
||||
void make_unique_for_overwrite(Args&&...) = delete;
|
||||
|
||||
} // namespace Common
|
||||
@@ -8,8 +8,7 @@
|
||||
|
||||
#include <iterator>
|
||||
#include <cstring>
|
||||
|
||||
#include "common/make_unique_for_overwrite.h"
|
||||
#include <memory>
|
||||
|
||||
namespace Common {
|
||||
|
||||
@@ -38,8 +37,9 @@ public:
|
||||
ScratchBuffer() = default;
|
||||
|
||||
explicit ScratchBuffer(size_type initial_capacity)
|
||||
: last_requested_size{initial_capacity}, buffer_capacity{initial_capacity},
|
||||
buffer{Common::make_unique_for_overwrite<T[]>(initial_capacity)} {}
|
||||
: last_requested_size{initial_capacity}
|
||||
, buffer_capacity{initial_capacity}
|
||||
, buffer{std::make_unique_for_overwrite<T[]>(initial_capacity)} {}
|
||||
|
||||
~ScratchBuffer() = default;
|
||||
ScratchBuffer(const ScratchBuffer&) = delete;
|
||||
@@ -64,7 +64,7 @@ public:
|
||||
/// The previously held data will remain intact.
|
||||
void resize(size_type size) {
|
||||
if (size > buffer_capacity) {
|
||||
auto new_buffer = Common::make_unique_for_overwrite<T[]>(size);
|
||||
auto new_buffer = std::make_unique_for_overwrite<T[]>(size);
|
||||
std::memcpy(new_buffer.get(), buffer.get(), buffer_capacity * sizeof(T));
|
||||
buffer = std::move(new_buffer);
|
||||
buffer_capacity = size;
|
||||
@@ -77,7 +77,7 @@ public:
|
||||
void resize_destructive(size_type size) {
|
||||
if (size > buffer_capacity) {
|
||||
buffer_capacity = size;
|
||||
buffer = Common::make_unique_for_overwrite<T[]>(buffer_capacity);
|
||||
buffer = std::make_unique_for_overwrite<T[]>(buffer_capacity);
|
||||
}
|
||||
last_requested_size = size;
|
||||
}
|
||||
|
||||
@@ -96,6 +96,21 @@ bool CommitVectorPage(uintptr_t addr, bool write) noexcept {
|
||||
#ifndef MAP_NOCORE
|
||||
#define MAP_NOCORE 0
|
||||
#endif
|
||||
#ifndef MADV_FREE
|
||||
#define MADV_FREE MADV_DONTNEED
|
||||
#endif
|
||||
|
||||
void DecommitVectorPage(uintptr_t base) noexcept {
|
||||
#if defined(_WIN32)
|
||||
VirtualFree(reinterpret_cast<LPVOID>(base), HostPageSize, MEM_DECOMMIT);
|
||||
#elif defined(__linux__)
|
||||
// Linux's MADV_DONTNEED zeros out pages for us
|
||||
madvise(reinterpret_cast<void*>(base), HostPageSize, MADV_DONTNEED);
|
||||
#else
|
||||
madvise(reinterpret_cast<void*>(base), HostPageSize, MADV_FREE);
|
||||
std::memset(reinterpret_cast<void*>(base), 0, HostPageSize);
|
||||
#endif
|
||||
}
|
||||
|
||||
void* AllocateMemoryPages(std::size_t size) noexcept {
|
||||
if (auto page = HostPageSize; size % page != 0) {
|
||||
|
||||
@@ -35,6 +35,7 @@ const u64 HostPageMask = ~(HostPageSize - 1);
|
||||
|
||||
void* AllocateMemoryPages(std::size_t size) noexcept;
|
||||
void FreeMemoryPages(void* base, std::size_t size) noexcept;
|
||||
void DecommitVectorPage(uintptr_t base) noexcept;
|
||||
|
||||
/// A large page-aligned buffer that has optimized memory usage for zero-writes.
|
||||
template <typename T>
|
||||
@@ -114,7 +115,7 @@ public:
|
||||
const u64 end_page = AlignUp(base, HostPageSize);
|
||||
const u64 first_size = (std::min)(end_page, end) - base;
|
||||
|
||||
if (IsCommittedPage(start / sizeof(T))) {
|
||||
if (IsCommittedPage(start)) {
|
||||
std::memset(reinterpret_cast<void*>(base), 0, first_size);
|
||||
}
|
||||
|
||||
@@ -124,11 +125,16 @@ public:
|
||||
base = end_page;
|
||||
|
||||
for (u64 page = base; page < end; page += HostPageSize) {
|
||||
if (!IsCommittedPage((page - reinterpret_cast<u64>(base_ptr)) / sizeof(T))) {
|
||||
auto index = (page - reinterpret_cast<u64>(base_ptr)) / sizeof(T);
|
||||
if (!IsCommittedPage(index)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
std::memset(reinterpret_cast<void*>(page), 0, (std::min)( HostPageSize, end - page));
|
||||
if (end - page >= HostPageSize) {
|
||||
DecommitPage(index);
|
||||
} else {
|
||||
std::memset(reinterpret_cast<void*>(page), 0, end - page);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -183,6 +189,14 @@ private:
|
||||
committed_pages[page_index >> 6].fetch_or(1ULL << (page_index & 63), std::memory_order_release);
|
||||
}
|
||||
|
||||
constexpr void DecommitPage(std::size_t index) noexcept {
|
||||
auto page_index = (index * sizeof(T)) >> HostPageBits;
|
||||
auto page = reinterpret_cast<uintptr_t>(base_ptr + index) & HostPageMask;
|
||||
|
||||
committed_pages[page_index >> 6].fetch_and(~(1ULL << (page_index & 63)), std::memory_order_release);
|
||||
DecommitVectorPage(page);
|
||||
}
|
||||
|
||||
std::size_t alloc_size{};
|
||||
T* base_ptr{};
|
||||
|
||||
|
||||
@@ -23,6 +23,8 @@ add_library(core STATIC
|
||||
core_timing.h
|
||||
cpu_manager.cpp
|
||||
cpu_manager.h
|
||||
launch_params.cpp
|
||||
launch_params.h
|
||||
crypto/aes_util.cpp
|
||||
crypto/aes_util.h
|
||||
crypto/ctr_encryption_layer.cpp
|
||||
@@ -1203,6 +1205,9 @@ endif()
|
||||
|
||||
target_include_directories(core PRIVATE ${OPUS_INCLUDE_DIRS})
|
||||
target_link_libraries(core PUBLIC common PRIVATE audio_core hid_core network video_core nx_tzdb tz)
|
||||
if (MSVC)
|
||||
target_link_libraries(core PRIVATE getopt)
|
||||
endif()
|
||||
|
||||
if (BOOST_NO_HEADERS)
|
||||
target_link_libraries(core PUBLIC Boost::container Boost::heap Boost::asio Boost::process Boost::crc)
|
||||
@@ -1217,7 +1222,7 @@ target_link_libraries(core PRIVATE
|
||||
RenderDoc::API
|
||||
ZLIB::ZLIB)
|
||||
|
||||
target_link_libraries(core PUBLIC httplib::httplib zstd::zstd)
|
||||
target_link_libraries(core PUBLIC httplib::httplib zstd::zstd frozen::frozen-headers)
|
||||
|
||||
if (ENABLE_WEB_SERVICE)
|
||||
target_compile_definitions(core PUBLIC ENABLE_WEB_SERVICE)
|
||||
|
||||
+23
-45
@@ -110,13 +110,8 @@ FileSys::VirtualFile GetGameFileFromPath(const FileSys::VirtualFilesystem& vfs,
|
||||
|
||||
struct System::Impl {
|
||||
explicit Impl(System& system)
|
||||
: kernel{system}
|
||||
, fs_controller{system}
|
||||
, hid_core{kernel}
|
||||
, cpu_manager{system}
|
||||
, reporter{system}
|
||||
, profile_manager{}
|
||||
{}
|
||||
: kernel{system}, fs_controller{system}, hid_core{kernel}, cpu_manager{system},
|
||||
reporter{system}, applet_manager{system}, frontend_applets{system}, profile_manager{} {}
|
||||
|
||||
u64 program_id;
|
||||
|
||||
@@ -129,12 +124,6 @@ struct System::Impl {
|
||||
core_timing.SetMulticore(is_multicore);
|
||||
core_timing.Initialize([&system]() { system.RegisterHostThread(); });
|
||||
|
||||
applet_manager.emplace(system);
|
||||
frontend_applets.emplace(system);
|
||||
apm_controller.emplace(core_timing);
|
||||
arp_manager.emplace();
|
||||
profile_manager.emplace();
|
||||
|
||||
// Create a default fs if one doesn't already exist.
|
||||
if (virtual_filesystem == nullptr) {
|
||||
virtual_filesystem = std::make_shared<FileSys::RealVfsFilesystem>();
|
||||
@@ -144,7 +133,7 @@ struct System::Impl {
|
||||
}
|
||||
|
||||
// Create default implementations of applets if one is not provided.
|
||||
frontend_applets->SetDefaultAppletsIfMissing();
|
||||
frontend_applets.SetDefaultAppletsIfMissing();
|
||||
|
||||
auto const is_async_gpu = Settings::values.use_asynchronous_gpu_emulation.GetValue();
|
||||
|
||||
@@ -387,7 +376,7 @@ struct System::Impl {
|
||||
|
||||
// Register with applet manager
|
||||
// All threads are started, begin main process execution, now that we're in the clear
|
||||
applet_manager->CreateAndInsertByFrontendAppletParameters(std::move(process), params);
|
||||
applet_manager.CreateAndInsertByFrontendAppletParameters(std::move(process), params);
|
||||
|
||||
if (Settings::values.gamecard_inserted) {
|
||||
if (Settings::values.gamecard_current_game) {
|
||||
@@ -439,27 +428,13 @@ struct System::Impl {
|
||||
core_timing.SyncPause(false);
|
||||
Network::CancelPendingSocketOperations();
|
||||
kernel.SuspendEmulation(true);
|
||||
kernel.ShutdownCores();
|
||||
|
||||
// Notify services helpers of shutdown
|
||||
audio_core->Shutdown();
|
||||
|
||||
// Wait for threads/services to join
|
||||
kernel.CloseServices();
|
||||
|
||||
// service shutdown
|
||||
kernel.ShutdownCores();
|
||||
services.reset();
|
||||
service_manager.reset();
|
||||
frontend_applets.reset();
|
||||
applet_manager.reset();
|
||||
apm_controller.reset();
|
||||
arp_manager.reset();
|
||||
profile_manager.reset();
|
||||
|
||||
fs_controller.Reset();
|
||||
cheat_engine.reset();
|
||||
core_timing.ClearPendingEvents();
|
||||
core_timing.Reset();
|
||||
app_loader.reset();
|
||||
audio_core.reset();
|
||||
gpu_core.reset();
|
||||
@@ -476,6 +451,9 @@ struct System::Impl {
|
||||
room_member->SendGameInfo(game_info);
|
||||
}
|
||||
|
||||
// Reset all glue registrations
|
||||
arp_manager.ResetAll();
|
||||
|
||||
LOG_DEBUG(Core, "Shutdown OK");
|
||||
}
|
||||
|
||||
@@ -504,13 +482,13 @@ struct System::Impl {
|
||||
CpuManager cpu_manager;
|
||||
Reporter reporter;
|
||||
/// Applets
|
||||
std::optional<Service::AM::AppletManager> applet_manager;
|
||||
std::optional<Service::AM::Frontend::FrontendAppletHolder> frontend_applets;
|
||||
Service::AM::AppletManager applet_manager;
|
||||
Service::AM::Frontend::FrontendAppletHolder frontend_applets;
|
||||
/// APM (Performance) services
|
||||
std::optional<Service::APM::Controller> apm_controller;
|
||||
Service::APM::Controller apm_controller{core_timing};
|
||||
/// Service State
|
||||
std::optional<Service::Glue::ARPManager> arp_manager;
|
||||
std::optional<Service::Account::ProfileManager> profile_manager;
|
||||
Service::Glue::ARPManager arp_manager;
|
||||
Service::Account::ProfileManager profile_manager;
|
||||
/// Network instance
|
||||
Network::NetworkInstance network_instance;
|
||||
Core::SpeedLimiter speed_limiter;
|
||||
@@ -837,19 +815,19 @@ void System::RegisterCheatList(const std::vector<Memory::CheatEntry>& list,
|
||||
}
|
||||
|
||||
void System::SetFrontendAppletSet(Service::AM::Frontend::FrontendAppletSet&& set) {
|
||||
impl->frontend_applets->SetFrontendAppletSet(std::move(set));
|
||||
impl->frontend_applets.SetFrontendAppletSet(std::move(set));
|
||||
}
|
||||
|
||||
Service::AM::Frontend::FrontendAppletHolder& System::GetFrontendAppletHolder() {
|
||||
return *impl->frontend_applets;
|
||||
return impl->frontend_applets;
|
||||
}
|
||||
|
||||
const Service::AM::Frontend::FrontendAppletHolder& System::GetFrontendAppletHolder() const {
|
||||
return *impl->frontend_applets;
|
||||
return impl->frontend_applets;
|
||||
}
|
||||
|
||||
Service::AM::AppletManager& System::GetAppletManager() {
|
||||
return *impl->applet_manager;
|
||||
return impl->applet_manager;
|
||||
}
|
||||
|
||||
void System::SetContentProvider(std::unique_ptr<FileSys::ContentProviderUnion> provider) {
|
||||
@@ -890,27 +868,27 @@ const Reporter& System::GetReporter() const {
|
||||
}
|
||||
|
||||
Service::Glue::ARPManager& System::GetARPManager() {
|
||||
return *impl->arp_manager;
|
||||
return impl->arp_manager;
|
||||
}
|
||||
|
||||
const Service::Glue::ARPManager& System::GetARPManager() const {
|
||||
return *impl->arp_manager;
|
||||
return impl->arp_manager;
|
||||
}
|
||||
|
||||
Service::APM::Controller& System::GetAPMController() {
|
||||
return *impl->apm_controller;
|
||||
return impl->apm_controller;
|
||||
}
|
||||
|
||||
const Service::APM::Controller& System::GetAPMController() const {
|
||||
return *impl->apm_controller;
|
||||
return impl->apm_controller;
|
||||
}
|
||||
|
||||
Service::Account::ProfileManager& System::GetProfileManager() {
|
||||
return *impl->profile_manager;
|
||||
return impl->profile_manager;
|
||||
}
|
||||
|
||||
const Service::Account::ProfileManager& System::GetProfileManager() const {
|
||||
return *impl->profile_manager;
|
||||
return impl->profile_manager;
|
||||
}
|
||||
|
||||
void System::SetExitLocked(bool locked) {
|
||||
|
||||
@@ -304,10 +304,10 @@ std::optional<s64> CoreTiming::Advance() {
|
||||
|
||||
void CoreTiming::Reset() {
|
||||
paused = true;
|
||||
pause_event.Set();
|
||||
event.Set();
|
||||
if (timer_thread.joinable()) {
|
||||
timer_thread.request_stop();
|
||||
pause_event.Set();
|
||||
event.Set();
|
||||
timer_thread.join();
|
||||
}
|
||||
has_started = false;
|
||||
|
||||
@@ -109,8 +109,7 @@ VirtualFile RealVfsFilesystem::OpenFileFromEntry(std::string_view path_, std::op
|
||||
auto reference = std::make_unique<FileReference>();
|
||||
this->InsertReferenceIntoListLocked(*reference);
|
||||
|
||||
auto file = std::shared_ptr<RealVfsFile>(
|
||||
new RealVfsFile(*this, std::move(reference), path, perms, size, std::move(parent_path)));
|
||||
auto file = std::make_shared<RealVfsFile>(*this, std::move(reference), path, perms, size, std::move(parent_path));
|
||||
cache[path] = file;
|
||||
|
||||
return file;
|
||||
@@ -177,7 +176,7 @@ bool RealVfsFilesystem::DeleteFile(std::string_view path_) {
|
||||
|
||||
VirtualDir RealVfsFilesystem::OpenDirectory(std::string_view path_, OpenMode perms) {
|
||||
const auto path = FS::SanitizePath(path_, FS::DirectorySeparator::PlatformDefault);
|
||||
return std::shared_ptr<RealVfsDirectory>(new RealVfsDirectory(*this, path, perms));
|
||||
return std::make_shared<RealVfsDirectory>(*this, path, perms);
|
||||
}
|
||||
|
||||
VirtualDir RealVfsFilesystem::CreateDirectory(std::string_view path_, OpenMode perms) {
|
||||
@@ -185,7 +184,7 @@ VirtualDir RealVfsFilesystem::CreateDirectory(std::string_view path_, OpenMode p
|
||||
if (!FS::CreateDirs(path)) {
|
||||
return nullptr;
|
||||
}
|
||||
return std::shared_ptr<RealVfsDirectory>(new RealVfsDirectory(*this, path, perms));
|
||||
return std::make_shared<RealVfsDirectory>(*this, path, perms);
|
||||
}
|
||||
|
||||
VirtualDir RealVfsFilesystem::CopyDirectory(std::string_view old_path_,
|
||||
|
||||
@@ -82,6 +82,9 @@ class RealVfsFile : public VfsFile {
|
||||
friend class RealVfsFilesystem;
|
||||
|
||||
public:
|
||||
RealVfsFile(RealVfsFilesystem& base, std::unique_ptr<FileReference> reference,
|
||||
const std::string& path, OpenMode perms = OpenMode::Read,
|
||||
std::optional<u64> size = {}, std::optional<std::string> parent_path = {});
|
||||
~RealVfsFile() override;
|
||||
|
||||
std::string GetName() const override;
|
||||
@@ -95,9 +98,6 @@ public:
|
||||
bool Rename(std::string_view name) override;
|
||||
|
||||
private:
|
||||
RealVfsFile(RealVfsFilesystem& base, std::unique_ptr<FileReference> reference,
|
||||
const std::string& path, OpenMode perms = OpenMode::Read,
|
||||
std::optional<u64> size = {}, std::optional<std::string> parent_path = {});
|
||||
|
||||
RealVfsFilesystem& base;
|
||||
std::unique_ptr<FileReference> reference;
|
||||
@@ -113,6 +113,8 @@ class RealVfsDirectory : public VfsDirectory {
|
||||
friend class RealVfsFilesystem;
|
||||
|
||||
public:
|
||||
RealVfsDirectory(RealVfsFilesystem& base, const std::string& path,
|
||||
OpenMode perms = OpenMode::Read);
|
||||
~RealVfsDirectory() override;
|
||||
|
||||
VirtualFile GetFileRelative(std::string_view relative_path) const override;
|
||||
@@ -138,9 +140,6 @@ public:
|
||||
std::map<std::string, VfsEntryType, std::less<>> GetEntries() const override;
|
||||
|
||||
private:
|
||||
RealVfsDirectory(RealVfsFilesystem& base, const std::string& path,
|
||||
OpenMode perms = OpenMode::Read);
|
||||
|
||||
template <typename T, typename R>
|
||||
std::vector<std::shared_ptr<R>> IterateEntries() const;
|
||||
|
||||
|
||||
@@ -72,9 +72,11 @@ void GlobalSchedulerContext::UnregisterDummyThreadForWakeup(KThread* thread) noe
|
||||
|
||||
void GlobalSchedulerContext::WakeupWaitingDummyThreads(KernelCore& kernel) noexcept {
|
||||
ASSERT(this->IsLocked());
|
||||
for (auto* thread : m_woken_dummy_threads)
|
||||
thread->DummyThreadEndWait(kernel);
|
||||
m_woken_dummy_threads.clear();
|
||||
if (m_woken_dummy_threads.size() > 0) {
|
||||
for (auto* thread : m_woken_dummy_threads)
|
||||
thread->DummyThreadEndWait(kernel);
|
||||
m_woken_dummy_threads.clear();
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace Kernel
|
||||
|
||||
@@ -59,6 +59,7 @@ Result TerminateChildren(KernelCore& kernel, KProcess* process, const KThread* t
|
||||
KThread* cur_child = nullptr;
|
||||
{
|
||||
KScopedLightLock proc_lk(process->GetListLock());
|
||||
|
||||
auto& thread_list = process->GetThreadList();
|
||||
for (auto it = thread_list.begin(); it != thread_list.end(); ++it) {
|
||||
if (KThread* thread = std::addressof(*it); thread != thread_to_not_terminate) {
|
||||
|
||||
@@ -1236,13 +1236,18 @@ namespace Kernel {
|
||||
KScopedSchedulerLock sl{kernel};
|
||||
|
||||
// Determine if this is the first termination request.
|
||||
// Perform an atomic compare-and-swap from false to true.
|
||||
bool expected = false;
|
||||
const bool first_request = [&]() -> bool {
|
||||
// Perform an atomic compare-and-swap from false to true.
|
||||
bool expected = false;
|
||||
return m_termination_requested.compare_exchange_strong(expected, true);
|
||||
}();
|
||||
|
||||
// If this is the first request, start termination procedure.
|
||||
if (m_termination_requested.compare_exchange_strong(expected, true)) {
|
||||
if (first_request) {
|
||||
// If the thread is in initialized state, just change state to terminated.
|
||||
if (this->GetState() == ThreadState::Initialized) {
|
||||
return m_thread_state = ThreadState::Terminated;
|
||||
m_thread_state = ThreadState::Terminated;
|
||||
return ThreadState::Terminated;
|
||||
}
|
||||
|
||||
// Register the terminating dpc.
|
||||
@@ -1276,6 +1281,7 @@ namespace Kernel {
|
||||
m_wait_queue->CancelWait(kernel, this, ResultTerminationRequested, true);
|
||||
}
|
||||
}
|
||||
|
||||
return this->GetState();
|
||||
}
|
||||
|
||||
|
||||
@@ -4,9 +4,7 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#include <thread>
|
||||
#include "common/assert.h"
|
||||
#include "common/thread.h"
|
||||
#include "core/hle/kernel/k_process.h"
|
||||
#include "core/hle/kernel/k_thread.h"
|
||||
#include "core/hle/kernel/k_worker_task.h"
|
||||
@@ -28,33 +26,7 @@ void KWorkerTask::DoWorkerTask(KernelCore& kernel) {
|
||||
}
|
||||
}
|
||||
|
||||
KWorkerTaskManager::KWorkerTaskManager(KernelCore& kernel) {
|
||||
m_waiting_thread = std::jthread([&kernel, this](std::stop_token stop_token) {
|
||||
Common::SetCurrentThreadName("KWorkerManager");
|
||||
while (!stop_token.stop_requested()) {
|
||||
KWorkerTask* t;
|
||||
{
|
||||
std::unique_lock lk{m_task_mutex};
|
||||
m_task_cv.wait(lk, m_waiting_thread.get_stop_token(), [&]() {
|
||||
return !m_task_queue.empty();
|
||||
});
|
||||
if (stop_token.stop_requested())
|
||||
break;
|
||||
t = m_task_queue.back();
|
||||
m_task_queue.pop_back();
|
||||
}
|
||||
t->DoWorkerTask(kernel);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
KWorkerTaskManager::~KWorkerTaskManager() {
|
||||
if (m_waiting_thread.joinable()) {
|
||||
m_waiting_thread.request_stop();
|
||||
m_task_cv.notify_one();
|
||||
m_waiting_thread.join();
|
||||
}
|
||||
}
|
||||
KWorkerTaskManager::KWorkerTaskManager() : m_waiting_thread(1, "KWorkerTaskManager") {}
|
||||
|
||||
void KWorkerTaskManager::AddTask(KernelCore& kernel, WorkerType type, KWorkerTask* task) {
|
||||
ASSERT(type <= WorkerType::Count);
|
||||
@@ -63,11 +35,10 @@ void KWorkerTaskManager::AddTask(KernelCore& kernel, WorkerType type, KWorkerTas
|
||||
|
||||
void KWorkerTaskManager::AddTask(KernelCore& kernel, KWorkerTask* task) {
|
||||
KScopedSchedulerLock sl(kernel);
|
||||
{
|
||||
std::scoped_lock lk{m_task_mutex};
|
||||
m_task_queue.emplace_back(task);
|
||||
}
|
||||
m_task_cv.notify_one();
|
||||
m_waiting_thread.QueueWork([&kernel, task]() {
|
||||
// Do the task.
|
||||
task->DoWorkerTask(kernel);
|
||||
});
|
||||
}
|
||||
|
||||
} // namespace Kernel
|
||||
|
||||
@@ -1,13 +1,8 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <condition_variable>
|
||||
#include <thread>
|
||||
#include "common/common_types.h"
|
||||
#include "common/thread_worker.h"
|
||||
|
||||
@@ -23,17 +18,15 @@ public:
|
||||
Count,
|
||||
};
|
||||
|
||||
KWorkerTaskManager(KernelCore& kernel);
|
||||
~KWorkerTaskManager();
|
||||
KWorkerTaskManager();
|
||||
|
||||
static void AddTask(KernelCore& kernel, WorkerType type, KWorkerTask* task);
|
||||
|
||||
private:
|
||||
void AddTask(KernelCore& kernel, KWorkerTask* task);
|
||||
std::jthread m_waiting_thread;
|
||||
|
||||
std::mutex m_task_mutex;
|
||||
std::condition_variable_any m_task_cv;
|
||||
std::vector<KWorkerTask*> m_task_queue;
|
||||
private:
|
||||
Common::ThreadWorker m_waiting_thread;
|
||||
};
|
||||
|
||||
} // namespace Kernel
|
||||
|
||||
@@ -80,10 +80,7 @@ struct KernelCore::Impl {
|
||||
// so it will be statically given a TLS slot anyways.
|
||||
static inline thread_local ThreadLocalData tls_data = {};
|
||||
|
||||
explicit Impl(Core::System& system_, KernelCore& kernel_)
|
||||
: worker_task_manager{kernel_}
|
||||
, system{system_}
|
||||
{
|
||||
explicit Impl(Core::System& system_, KernelCore& kernel_) : system{system_} {
|
||||
tls_data.lock = true;
|
||||
}
|
||||
|
||||
@@ -970,16 +967,12 @@ Kernel::KHardwareTimer& KernelCore::HardwareTimer() {
|
||||
return *impl->hardware_timer;
|
||||
}
|
||||
|
||||
KAutoObjectWithListContainer* KernelCore::ObjectListContainer() {
|
||||
if (!impl->global_object_list_container)
|
||||
return nullptr;
|
||||
return std::addressof(*impl->global_object_list_container);
|
||||
KAutoObjectWithListContainer& KernelCore::ObjectListContainer() {
|
||||
return *impl->global_object_list_container;
|
||||
}
|
||||
|
||||
const KAutoObjectWithListContainer* KernelCore::ObjectListContainer() const {
|
||||
if (!impl->global_object_list_container)
|
||||
return nullptr;
|
||||
return std::addressof(*impl->global_object_list_container);
|
||||
const KAutoObjectWithListContainer& KernelCore::ObjectListContainer() const {
|
||||
return *impl->global_object_list_container;
|
||||
}
|
||||
|
||||
void KernelCore::PrepareReschedule(std::size_t id) {
|
||||
@@ -1008,10 +1001,16 @@ void KernelCore::UnregisterInUseObject(KAutoObject* object) {
|
||||
|
||||
void KernelCore::RunServer(std::unique_ptr<Service::ServerManager>&& server_manager) {
|
||||
auto* manager = server_manager.get();
|
||||
if (!impl->is_shutting_down) {
|
||||
|
||||
{
|
||||
std::scoped_lock lk{impl->server_lock};
|
||||
if (impl->is_shutting_down) {
|
||||
return;
|
||||
}
|
||||
|
||||
impl->server_managers.emplace_back(std::move(server_manager));
|
||||
}
|
||||
|
||||
manager->LoopProcess();
|
||||
}
|
||||
|
||||
@@ -1256,10 +1255,6 @@ void KernelCore::SuspendEmulation(bool suspended) {
|
||||
}
|
||||
|
||||
void KernelCore::ShutdownCores() {
|
||||
// Notify shutdown (pre-emptively)
|
||||
for (auto& sm : impl->server_managers) {
|
||||
sm->NotifyShutdown();
|
||||
}
|
||||
impl->TerminateAllProcesses();
|
||||
KScopedSchedulerLock lk{*this};
|
||||
for (auto* thread : impl->shutdown_threads)
|
||||
|
||||
@@ -175,8 +175,9 @@ public:
|
||||
/// Stops execution of 'id' core, in order to reschedule a new thread.
|
||||
void PrepareReschedule(std::size_t id);
|
||||
|
||||
KAutoObjectWithListContainer* ObjectListContainer();
|
||||
const KAutoObjectWithListContainer* ObjectListContainer() const;
|
||||
KAutoObjectWithListContainer& ObjectListContainer();
|
||||
|
||||
const KAutoObjectWithListContainer& ObjectListContainer() const;
|
||||
|
||||
/// Registers all kernel objects with the global emulation state, this is purely for tracking
|
||||
/// leaks after emulation has been shutdown.
|
||||
|
||||
@@ -151,8 +151,7 @@ public:
|
||||
const bool is_initialized = this->IsInitialized();
|
||||
uintptr_t arg = 0;
|
||||
if (is_initialized) {
|
||||
if (auto const olc = kernel.ObjectListContainer(); olc)
|
||||
olc->Unregister(this);
|
||||
kernel.ObjectListContainer().Unregister(this);
|
||||
arg = this->GetPostDestroyArgument();
|
||||
this->Finalize(kernel);
|
||||
}
|
||||
@@ -176,7 +175,7 @@ public:
|
||||
public:
|
||||
static void InitializeSlabHeap(KernelCore& kernel, void* memory, size_t memory_size) {
|
||||
kernel.SlabHeap<Derived>().Initialize(memory, memory_size);
|
||||
kernel.ObjectListContainer()->Initialize();
|
||||
kernel.ObjectListContainer().Initialize();
|
||||
}
|
||||
|
||||
static Derived* Create(KernelCore& kernel) {
|
||||
@@ -187,7 +186,7 @@ public:
|
||||
}
|
||||
|
||||
static void Register(KernelCore& kernel, Derived* obj) {
|
||||
return kernel.ObjectListContainer()->Register(obj);
|
||||
return kernel.ObjectListContainer().Register(obj);
|
||||
}
|
||||
|
||||
static size_t GetObjectSize(KernelCore& kernel) {
|
||||
|
||||
+591
-629
File diff suppressed because it is too large
Load Diff
@@ -15,9 +15,13 @@ void LoopProcess(Core::System& system) {
|
||||
WindowSystem window_system(system);
|
||||
ButtonPoller button_poller(system, window_system);
|
||||
EventObserver event_observer(system, window_system);
|
||||
|
||||
auto server_manager = std::make_unique<ServerManager>(system);
|
||||
server_manager->RegisterNamedService("appletAE", std::make_shared<IAllSystemAppletProxiesService>(system, window_system));
|
||||
server_manager->RegisterNamedService("appletOE", std::make_shared<IApplicationProxyService>(system, window_system));
|
||||
|
||||
server_manager->RegisterNamedService(
|
||||
"appletAE", std::make_shared<IAllSystemAppletProxiesService>(system, window_system));
|
||||
server_manager->RegisterNamedService(
|
||||
"appletOE", std::make_shared<IApplicationProxyService>(system, window_system));
|
||||
ServerManager::RunServer(std::move(server_manager));
|
||||
}
|
||||
|
||||
|
||||
@@ -26,25 +26,24 @@ EventObserver::EventObserver(Core::System& system, WindowSystem& window_system)
|
||||
m_window_system.SetEventObserver(this);
|
||||
m_wakeup_holder.SetUserData(static_cast<uintptr_t>(UserDataTag::WakeupEvent));
|
||||
m_wakeup_holder.LinkToMultiWait(std::addressof(m_multi_wait));
|
||||
system.Kernel().RunOnGuestCoreProcess("am:EventObserver", [this]() {
|
||||
auto const stop_token = m_stop_source.get_token();
|
||||
m_thread = std::jthread([this](std::stop_token stop_token) {
|
||||
Common::SetCurrentThreadName("am:EventObserver");
|
||||
while (!stop_token.stop_requested()) {
|
||||
auto* signaled_holder = this->WaitSignaled(stop_token);
|
||||
if (stop_token.stop_requested() || !signaled_holder)
|
||||
if (!signaled_holder)
|
||||
break;
|
||||
this->Process(signaled_holder);
|
||||
}
|
||||
m_process_cv.notify_one();
|
||||
});
|
||||
}
|
||||
|
||||
EventObserver::~EventObserver() {
|
||||
// Signal thread and wait for processing to finish.
|
||||
m_stop_source.request_stop();
|
||||
m_wakeup_event.Signal(m_system.Kernel());
|
||||
{
|
||||
std::unique_lock lk{m_process_mutex};
|
||||
m_process_cv.wait(lk);
|
||||
if (m_thread.joinable()) {
|
||||
// Signal thread and wait for processing to finish.
|
||||
m_thread.request_stop();
|
||||
m_wakeup_event.Signal(m_system.Kernel());
|
||||
m_thread.join();
|
||||
}
|
||||
|
||||
// Free remaining owned sessions.
|
||||
|
||||
@@ -6,8 +6,6 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <condition_variable>
|
||||
#include <stop_token>
|
||||
#include "common/polyfill_thread.h"
|
||||
#include "common/thread.h"
|
||||
#include "core/hle/service/kernel_helpers.h"
|
||||
@@ -64,9 +62,7 @@ private:
|
||||
MultiWait m_deferred_wait_list;
|
||||
|
||||
// Processing thread.
|
||||
std::stop_source m_stop_source{};
|
||||
std::mutex m_process_mutex;
|
||||
std::condition_variable m_process_cv{};
|
||||
std::jthread m_thread{};
|
||||
};
|
||||
|
||||
} // namespace Service::AM
|
||||
|
||||
@@ -517,7 +517,7 @@ void WindowSystem::UpdateAppletStateLocked(Applet* applet, bool is_foreground, b
|
||||
// Layer ordering. Composition sorts back-to-front. Now with enums for calrity.
|
||||
s32 z_index = Background;
|
||||
if (is_overlay) {
|
||||
z_index = Overlay;
|
||||
z_index = this->IsOverlayOpenLocked(*applet) ? Overlay : Background;
|
||||
} else if (inherited_foreground) {
|
||||
z_index = is_obscured ? Foreground : ForegroundVisible;
|
||||
}
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
@@ -13,11 +16,11 @@ IPurchaseEventManager::IPurchaseEventManager(Core::System& system_)
|
||||
"IPurchaseEventManager"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, D<&IPurchaseEventManager::SetDefaultDeliveryTarget>, "SetDefaultDeliveryTarget"},
|
||||
{1, D<&IPurchaseEventManager::SetDeliveryTarget>, "SetDeliveryTarget"},
|
||||
{2, D<&IPurchaseEventManager::GetPurchasedEvent>, "GetPurchasedEvent"},
|
||||
{3, D<&IPurchaseEventManager::PopPurchasedProductInfo>, "PopPurchasedProductInfo"},
|
||||
{4, D<&IPurchaseEventManager::PopPurchasedProductInfoWithUid>, "PopPurchasedProductInfoWithUid"},
|
||||
FunctionInfo{0, D<&IPurchaseEventManager::SetDefaultDeliveryTarget>, "SetDefaultDeliveryTarget"},
|
||||
FunctionInfo{1, D<&IPurchaseEventManager::SetDeliveryTarget>, "SetDeliveryTarget"},
|
||||
FunctionInfo{2, D<&IPurchaseEventManager::GetPurchasedEvent>, "GetPurchasedEvent"},
|
||||
FunctionInfo{3, D<&IPurchaseEventManager::PopPurchasedProductInfo>, "PopPurchasedProductInfo"},
|
||||
FunctionInfo{4, D<&IPurchaseEventManager::PopPurchasedProductInfoWithUid>, "PopPurchasedProductInfoWithUid"}
|
||||
};
|
||||
// clang-format on
|
||||
|
||||
|
||||
@@ -17,9 +17,9 @@ public:
|
||||
explicit ISession(Core::System& system_, Controller& controller_)
|
||||
: ServiceFramework{system_, "ISession"}, controller{controller_} {
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, &ISession::SetPerformanceConfiguration, "SetPerformanceConfiguration"},
|
||||
{1, &ISession::GetPerformanceConfiguration, "GetPerformanceConfiguration"},
|
||||
{2, &ISession::SetCpuOverclockEnabled, "SetCpuOverclockEnabled"},
|
||||
FunctionInfo{0, &ISession::SetPerformanceConfiguration, "SetPerformanceConfiguration"},
|
||||
FunctionInfo{1, &ISession::GetPerformanceConfiguration, "GetPerformanceConfiguration"},
|
||||
FunctionInfo{2, &ISession::SetCpuOverclockEnabled, "SetCpuOverclockEnabled"}
|
||||
};
|
||||
RegisterHandlers(functions);
|
||||
}
|
||||
|
||||
@@ -21,164 +21,154 @@ namespace Service::Audio {
|
||||
class IAudioOutManagerForApplet final : public ServiceFramework<IAudioOutManagerForApplet> {
|
||||
public:
|
||||
explicit IAudioOutManagerForApplet(Core::System& system_)
|
||||
: ServiceFramework{system_, "audout:a"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "RequestSuspend"},
|
||||
{1, nullptr, "RequestResume"},
|
||||
{2, nullptr, "GetProcessMasterVolume"},
|
||||
{3, nullptr, "SetProcessMasterVolume"},
|
||||
{4, nullptr, "GetProcessRecordVolume"},
|
||||
{5, nullptr, "SetProcessRecordVolume"},
|
||||
};
|
||||
// clang-format on
|
||||
RegisterHandlers(functions);
|
||||
: ServiceFramework{system_, "audout:a"} {}
|
||||
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, nullptr, "RequestSuspend"},
|
||||
FunctionInfo{1, nullptr, "RequestResume"},
|
||||
FunctionInfo{2, nullptr, "GetProcessMasterVolume"},
|
||||
FunctionInfo{3, nullptr, "SetProcessMasterVolume"},
|
||||
FunctionInfo{4, nullptr, "GetProcessRecordVolume"},
|
||||
FunctionInfo{5, nullptr, "SetProcessRecordVolume"}
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
class IAudioSnoopManager final : public ServiceFramework<IAudioSnoopManager> {
|
||||
public:
|
||||
explicit IAudioSnoopManager(Core::System& system_)
|
||||
: ServiceFramework{system_, "auddev"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "GetDspStatistics"},
|
||||
{1, nullptr, "GetAppletStateSummaries"},
|
||||
{2, nullptr, "SetDspStatisticsParameter"},
|
||||
{3, nullptr, "GetDspStatisticsParameter"},
|
||||
{6, nullptr, "GetDspUsage"},
|
||||
};
|
||||
// clang-format on
|
||||
RegisterHandlers(functions);
|
||||
: ServiceFramework{system_, "auddev"} {}
|
||||
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, nullptr, "GetDspStatistics"},
|
||||
FunctionInfo{1, nullptr, "GetAppletStateSummaries"},
|
||||
FunctionInfo{2, nullptr, "SetDspStatisticsParameter"},
|
||||
FunctionInfo{3, nullptr, "GetDspStatisticsParameter"},
|
||||
FunctionInfo{6, nullptr, "GetDspUsage"}
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
class IAudioInManagerForApplet final : public ServiceFramework<IAudioInManagerForApplet> {
|
||||
public:
|
||||
explicit IAudioInManagerForApplet(Core::System& system_)
|
||||
: ServiceFramework{system_, "audin:a"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "RequestSuspend"},
|
||||
{1, nullptr, "RequestResume"},
|
||||
{2, nullptr, "GetProcessMasterVolume"},
|
||||
{3, nullptr, "SetProcessMasterVolume"},
|
||||
};
|
||||
// clang-format on
|
||||
RegisterHandlers(functions);
|
||||
: ServiceFramework{system_, "audin:a"} {}
|
||||
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, nullptr, "RequestSuspend"},
|
||||
FunctionInfo{1, nullptr, "RequestResume"},
|
||||
FunctionInfo{2, nullptr, "GetProcessMasterVolume"},
|
||||
FunctionInfo{3, nullptr, "SetProcessMasterVolume"}
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
class IAudioRendererManagerForApplet final : public ServiceFramework<IAudioRendererManagerForApplet> {
|
||||
public:
|
||||
explicit IAudioRendererManagerForApplet(Core::System& system_)
|
||||
: ServiceFramework{system_, "audren:a"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "RequestSuspend"},
|
||||
{1, nullptr, "RequestResume"},
|
||||
{2, nullptr, "GetProcessMasterVolume"},
|
||||
{3, nullptr, "SetProcessMasterVolume"},
|
||||
{4, nullptr, "RegisterAppletResourceUserId"},
|
||||
{5, nullptr, "UnregisterAppletResourceUserId"},
|
||||
{6, nullptr, "GetProcessRecordVolume"},
|
||||
{7, nullptr, "SetProcessRecordVolume"},
|
||||
};
|
||||
// clang-format on
|
||||
RegisterHandlers(functions);
|
||||
: ServiceFramework{system_, "audren:a"} {}
|
||||
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, nullptr, "RequestSuspend"},
|
||||
FunctionInfo{1, nullptr, "RequestResume"},
|
||||
FunctionInfo{2, nullptr, "GetProcessMasterVolume"},
|
||||
FunctionInfo{3, nullptr, "SetProcessMasterVolume"},
|
||||
FunctionInfo{4, nullptr, "RegisterAppletResourceUserId"},
|
||||
FunctionInfo{5, nullptr, "UnregisterAppletResourceUserId"},
|
||||
FunctionInfo{6, nullptr, "GetProcessRecordVolume"},
|
||||
FunctionInfo{7, nullptr, "SetProcessRecordVolume"}
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
class IAudioOutManagerForDebugger final : public ServiceFramework<IAudioOutManagerForDebugger> {
|
||||
public:
|
||||
explicit IAudioOutManagerForDebugger(Core::System& system_)
|
||||
: ServiceFramework{system_, "audout:d"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "RequestSuspend"},
|
||||
{1, nullptr, "RequestResume"},
|
||||
};
|
||||
// clang-format on
|
||||
RegisterHandlers(functions);
|
||||
: ServiceFramework{system_, "audout:d"} {}
|
||||
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, nullptr, "RequestSuspend"},
|
||||
FunctionInfo{1, nullptr, "RequestResume"}
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
class IAudioInManagerForDebugger final : public ServiceFramework<IAudioInManagerForDebugger> {
|
||||
public:
|
||||
explicit IAudioInManagerForDebugger(Core::System& system_)
|
||||
: ServiceFramework{system_, "audin:d"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "RequestSuspend"},
|
||||
{1, nullptr, "RequestResume"},
|
||||
};
|
||||
// clang-format on
|
||||
RegisterHandlers(functions);
|
||||
: ServiceFramework{system_, "audin:d"} {}
|
||||
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, nullptr, "RequestSuspend"},
|
||||
FunctionInfo{1, nullptr, "RequestResume"}
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
class IFinalOutputRecorderManagerForDebugger final : public ServiceFramework<IFinalOutputRecorderManagerForDebugger> {
|
||||
public:
|
||||
explicit IFinalOutputRecorderManagerForDebugger(Core::System& system_)
|
||||
: ServiceFramework{system_, "audrec:d"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "RequestSuspend"},
|
||||
{1, nullptr, "RequestResume"},
|
||||
};
|
||||
// clang-format on
|
||||
RegisterHandlers(functions);
|
||||
: ServiceFramework{system_, "audrec:d"} {}
|
||||
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, nullptr, "RequestSuspend"},
|
||||
FunctionInfo{1, nullptr, "RequestResume"}
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
class IAudioRendererManagerForDebugger final : public ServiceFramework<IAudioRendererManagerForDebugger> {
|
||||
public:
|
||||
explicit IAudioRendererManagerForDebugger(Core::System& system_)
|
||||
: ServiceFramework{system_, "audren:d"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "RequestSuspend"},
|
||||
{1, nullptr, "RequestResume"},
|
||||
};
|
||||
// clang-format on
|
||||
RegisterHandlers(functions);
|
||||
: ServiceFramework{system_, "audren:d"} {}
|
||||
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, nullptr, "RequestSuspend"},
|
||||
FunctionInfo{1, nullptr, "RequestResume"}
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
class IAudioSystemManagerForApplet final : public ServiceFramework<IAudioSystemManagerForApplet> {
|
||||
public:
|
||||
explicit IAudioSystemManagerForApplet(Core::System& system_)
|
||||
: ServiceFramework{system_, "aud:a"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "RegisterAppletResourceUserId"},
|
||||
{1, nullptr, "UnregisterAppletResourceUserId"},
|
||||
{2, nullptr, "RequestSuspendAudio"},
|
||||
{3, nullptr, "RequestResumeAudio"},
|
||||
{4, nullptr, "GetAudioOutputProcessMasterVolume"},
|
||||
{5, nullptr, "SetAudioOutputProcessMasterVolume"},
|
||||
{6, nullptr, "GetAudioInputProcessMasterVolume"},
|
||||
{7, nullptr, "SetAudioInputProcessMasterVolume"},
|
||||
{8, nullptr, "GetAudioOutputProcessRecordVolume"},
|
||||
{9, nullptr, "SetAudioOutputProcessRecordVolume"},
|
||||
{10, nullptr, "GetAppletStateSummaries"},
|
||||
};
|
||||
// clang-format on
|
||||
RegisterHandlers(functions);
|
||||
: ServiceFramework{system_, "aud:a"} {}
|
||||
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, nullptr, "RegisterAppletResourceUserId"},
|
||||
FunctionInfo{1, nullptr, "UnregisterAppletResourceUserId"},
|
||||
FunctionInfo{2, nullptr, "RequestSuspendAudio"},
|
||||
FunctionInfo{3, nullptr, "RequestResumeAudio"},
|
||||
FunctionInfo{4, nullptr, "GetAudioOutputProcessMasterVolume"},
|
||||
FunctionInfo{5, nullptr, "SetAudioOutputProcessMasterVolume"},
|
||||
FunctionInfo{6, nullptr, "GetAudioInputProcessMasterVolume"},
|
||||
FunctionInfo{7, nullptr, "SetAudioInputProcessMasterVolume"},
|
||||
FunctionInfo{8, nullptr, "GetAudioOutputProcessRecordVolume"},
|
||||
FunctionInfo{9, nullptr, "SetAudioOutputProcessRecordVolume"},
|
||||
FunctionInfo{10, nullptr, "GetAppletStateSummaries"}
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
class IAudioSystemManagerForDebugger final : public ServiceFramework<IAudioSystemManagerForDebugger> {
|
||||
public:
|
||||
explicit IAudioSystemManagerForDebugger(Core::System& system_)
|
||||
: ServiceFramework{system_, "aud:d"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "RequestSuspendAudioForDebug"},
|
||||
{1, nullptr, "RequestResumeAudioForDebug"},
|
||||
};
|
||||
// clang-format on
|
||||
RegisterHandlers(functions);
|
||||
: ServiceFramework{system_, "aud:d"} {}
|
||||
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, nullptr, "RequestSuspendAudioForDebug"},
|
||||
FunctionInfo{1, nullptr, "RequestResumeAudioForDebug"}
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
@@ -8,25 +11,23 @@ namespace Service::Audio {
|
||||
class IFinalOutputRecorder final : public ServiceFramework<IFinalOutputRecorder> {
|
||||
public:
|
||||
explicit IFinalOutputRecorder(Core::System& system_)
|
||||
: ServiceFramework{system_, "IFinalOutputRecorder"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "GetFinalOutputRecorderState"},
|
||||
{1, nullptr, "Start"},
|
||||
{2, nullptr, "Stop"},
|
||||
{3, nullptr, "AppendFinalOutputRecorderBuffer"},
|
||||
{4, nullptr, "RegisterBufferEvent"},
|
||||
{5, nullptr, "GetReleasedFinalOutputRecorderBuffers"},
|
||||
{6, nullptr, "ContainsFinalOutputRecorderBuffer"},
|
||||
{7, nullptr, "GetFinalOutputRecorderBufferEndTime"},
|
||||
{8, nullptr, "AppendFinalOutputRecorderBufferAuto"},
|
||||
{9, nullptr, "GetReleasedFinalOutputRecorderBufferAuto"},
|
||||
{10, nullptr, "FlushFinalOutputRecorderBuffers"},
|
||||
{11, nullptr, "AttachWorkBuffer"},
|
||||
};
|
||||
// clang-format on
|
||||
: ServiceFramework{system_, "IFinalOutputRecorder"} {}
|
||||
|
||||
RegisterHandlers(functions);
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, nullptr, "GetFinalOutputRecorderState"},
|
||||
FunctionInfo{1, nullptr, "Start"},
|
||||
FunctionInfo{2, nullptr, "Stop"},
|
||||
FunctionInfo{3, nullptr, "AppendFinalOutputRecorderBuffer"},
|
||||
FunctionInfo{4, nullptr, "RegisterBufferEvent"},
|
||||
FunctionInfo{5, nullptr, "GetReleasedFinalOutputRecorderBuffers"},
|
||||
FunctionInfo{6, nullptr, "ContainsFinalOutputRecorderBuffer"},
|
||||
FunctionInfo{7, nullptr, "GetFinalOutputRecorderBufferEndTime"},
|
||||
FunctionInfo{8, nullptr, "AppendFinalOutputRecorderBufferAuto"},
|
||||
FunctionInfo{9, nullptr, "GetReleasedFinalOutputRecorderBufferAuto"},
|
||||
FunctionInfo{10, nullptr, "FlushFinalOutputRecorderBuffers"},
|
||||
FunctionInfo{11, nullptr, "AttachWorkBuffer"}
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -32,32 +32,32 @@ IBcatService::IBcatService(Core::System& system_, BcatBackend& backend_, u64 pro
|
||||
}} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{10100, D<&IBcatService::RequestSyncDeliveryCache>, "RequestSyncDeliveryCache"},
|
||||
{10101, D<&IBcatService::RequestSyncDeliveryCacheWithDirectoryName>, "RequestSyncDeliveryCacheWithDirectoryName"},
|
||||
{10200, nullptr, "CancelSyncDeliveryCacheRequest"},
|
||||
{20100, nullptr, "RequestSyncDeliveryCacheWithApplicationId"},
|
||||
{20101, nullptr, "RequestSyncDeliveryCacheWithApplicationIdAndDirectoryName"},
|
||||
{20300, nullptr, "GetDeliveryCacheStorageUpdateNotifier"},
|
||||
{20301, nullptr, "RequestSuspendDeliveryTask"},
|
||||
{20400, nullptr, "RegisterSystemApplicationDeliveryTask"},
|
||||
{20401, nullptr, "UnregisterSystemApplicationDeliveryTask"},
|
||||
{20410, nullptr, "SetSystemApplicationDeliveryTaskTimer"},
|
||||
{30100, D<&IBcatService::SetPassphrase>, "SetPassphrase"},
|
||||
{30101, nullptr, "Unknown30101"}, //2.0.0-2.3.0
|
||||
{30102, nullptr, "Unknown30102"}, //2.0.0-2.3.0
|
||||
{30200, nullptr, "RegisterBackgroundDeliveryTask"},
|
||||
{30201, nullptr, "UnregisterBackgroundDeliveryTask"},
|
||||
{30202, nullptr, "BlockDeliveryTask"},
|
||||
{30203, nullptr, "UnblockDeliveryTask"},
|
||||
{30210, nullptr, "SetDeliveryTaskTimer"},
|
||||
{30300, D<&IBcatService::RegisterSystemApplicationDeliveryTasks>, "RegisterSystemApplicationDeliveryTasks"},
|
||||
{90100, nullptr, "GetDeliveryTaskList"},
|
||||
{90101, nullptr, "GetDeliveryTaskListForSystem"}, //11.0.0+
|
||||
{90200, nullptr, "GetDeliveryList"},
|
||||
{90201, D<&IBcatService::ClearDeliveryCacheStorage>, "ClearDeliveryCacheStorage"},
|
||||
{90202, nullptr, "ClearDeliveryTaskSubscriptionStatus"},
|
||||
{90300, nullptr, "GetPushNotificationLog"},
|
||||
{90301, nullptr, "GetDeliveryCacheStorageUsage"}, //11.0.0+
|
||||
FunctionInfo{10100, D<&IBcatService::RequestSyncDeliveryCache>, "RequestSyncDeliveryCache"},
|
||||
FunctionInfo{10101, D<&IBcatService::RequestSyncDeliveryCacheWithDirectoryName>, "RequestSyncDeliveryCacheWithDirectoryName"},
|
||||
FunctionInfo{10200, nullptr, "CancelSyncDeliveryCacheRequest"},
|
||||
FunctionInfo{20100, nullptr, "RequestSyncDeliveryCacheWithApplicationId"},
|
||||
FunctionInfo{20101, nullptr, "RequestSyncDeliveryCacheWithApplicationIdAndDirectoryName"},
|
||||
FunctionInfo{20300, nullptr, "GetDeliveryCacheStorageUpdateNotifier"},
|
||||
FunctionInfo{20301, nullptr, "RequestSuspendDeliveryTask"},
|
||||
FunctionInfo{20400, nullptr, "RegisterSystemApplicationDeliveryTask"},
|
||||
FunctionInfo{20401, nullptr, "UnregisterSystemApplicationDeliveryTask"},
|
||||
FunctionInfo{20410, nullptr, "SetSystemApplicationDeliveryTaskTimer"},
|
||||
FunctionInfo{30100, D<&IBcatService::SetPassphrase>, "SetPassphrase"},
|
||||
FunctionInfo{30101, nullptr, "Unknown30101"}, //2.0.0-2.3.0
|
||||
FunctionInfo{30102, nullptr, "Unknown30102"}, //2.0.0-2.3.0
|
||||
FunctionInfo{30200, nullptr, "RegisterBackgroundDeliveryTask"},
|
||||
FunctionInfo{30201, nullptr, "UnregisterBackgroundDeliveryTask"},
|
||||
FunctionInfo{30202, nullptr, "BlockDeliveryTask"},
|
||||
FunctionInfo{30203, nullptr, "UnblockDeliveryTask"},
|
||||
FunctionInfo{30210, nullptr, "SetDeliveryTaskTimer"},
|
||||
FunctionInfo{30300, D<&IBcatService::RegisterSystemApplicationDeliveryTasks>, "RegisterSystemApplicationDeliveryTasks"},
|
||||
FunctionInfo{90100, nullptr, "GetDeliveryTaskList"},
|
||||
FunctionInfo{90101, nullptr, "GetDeliveryTaskListForSystem"}, //11.0.0+
|
||||
FunctionInfo{90200, nullptr, "GetDeliveryList"},
|
||||
FunctionInfo{90201, D<&IBcatService::ClearDeliveryCacheStorage>, "ClearDeliveryCacheStorage"},
|
||||
FunctionInfo{90202, nullptr, "ClearDeliveryTaskSubscriptionStatus"},
|
||||
FunctionInfo{90300, nullptr, "GetPushNotificationLog"},
|
||||
FunctionInfo{90301, nullptr, "GetDeliveryCacheStorageUsage"}, //11.0.0+
|
||||
};
|
||||
// clang-format on
|
||||
RegisterHandlers(functions);
|
||||
|
||||
@@ -14,103 +14,95 @@ namespace Service::BPC {
|
||||
|
||||
class BPC final : public ServiceFramework<BPC> {
|
||||
public:
|
||||
explicit BPC(Core::System& system_) : ServiceFramework{system_, "bpc"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "ShutdownSystem"},
|
||||
{1, nullptr, "RebootSystem"},
|
||||
{2, nullptr, "GetWakeupReason"},
|
||||
{3, nullptr, "GetShutdownReason"},
|
||||
{4, nullptr, "GetAcOk"},
|
||||
{5, nullptr, "GetBoardPowerControlEvent"},
|
||||
{6, nullptr, "GetSleepButtonState"},
|
||||
{7, nullptr, "GetPowerEvent"},
|
||||
{8, nullptr, "CreateWakeupTimer"},
|
||||
{9, nullptr, "CancelWakeupTimer"},
|
||||
{10, nullptr, "EnableWakeupTimerOnDevice"},
|
||||
{11, nullptr, "CreateWakeupTimerEx"},
|
||||
{12, nullptr, "GetLastEnabledWakeupTimerType"},
|
||||
{13, nullptr, "CleanAllWakeupTimers"},
|
||||
{14, nullptr, "GetPowerButton"},
|
||||
{15, nullptr, "SetEnableWakeupTimer"},
|
||||
};
|
||||
// clang-format on
|
||||
explicit BPC(Core::System& system_) : ServiceFramework{system_, "bpc"} {}
|
||||
|
||||
RegisterHandlers(functions);
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, nullptr, "ShutdownSystem"},
|
||||
FunctionInfo{1, nullptr, "RebootSystem"},
|
||||
FunctionInfo{2, nullptr, "GetWakeupReason"},
|
||||
FunctionInfo{3, nullptr, "GetShutdownReason"},
|
||||
FunctionInfo{4, nullptr, "GetAcOk"},
|
||||
FunctionInfo{5, nullptr, "GetBoardPowerControlEvent"},
|
||||
FunctionInfo{6, nullptr, "GetSleepButtonState"},
|
||||
FunctionInfo{7, nullptr, "GetPowerEvent"},
|
||||
FunctionInfo{8, nullptr, "CreateWakeupTimer"},
|
||||
FunctionInfo{9, nullptr, "CancelWakeupTimer"},
|
||||
FunctionInfo{10, nullptr, "EnableWakeupTimerOnDevice"},
|
||||
FunctionInfo{11, nullptr, "CreateWakeupTimerEx"},
|
||||
FunctionInfo{12, nullptr, "GetLastEnabledWakeupTimerType"},
|
||||
FunctionInfo{13, nullptr, "CleanAllWakeupTimers"},
|
||||
FunctionInfo{14, nullptr, "GetPowerButton"},
|
||||
FunctionInfo{15, nullptr, "SetEnableWakeupTimer"}
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
class BPC_R final : public ServiceFramework<BPC_R> {
|
||||
public:
|
||||
explicit BPC_R(Core::System& system_) : ServiceFramework{system_, "bpc:r"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "GetRtcTime"},
|
||||
{1, nullptr, "SetRtcTime"},
|
||||
{2, nullptr, "GetRtcResetDetected"},
|
||||
{3, nullptr, "ClearRtcResetDetected"},
|
||||
{4, nullptr, "SetUpRtcResetOnShutdown"},
|
||||
};
|
||||
// clang-format on
|
||||
explicit BPC_R(Core::System& system_) : ServiceFramework{system_, "bpc:r"} {}
|
||||
|
||||
RegisterHandlers(functions);
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, nullptr, "GetRtcTime"},
|
||||
FunctionInfo{1, nullptr, "SetRtcTime"},
|
||||
FunctionInfo{2, nullptr, "GetRtcResetDetected"},
|
||||
FunctionInfo{3, nullptr, "ClearRtcResetDetected"},
|
||||
FunctionInfo{4, nullptr, "SetUpRtcResetOnShutdown"}
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
class BPC_C final : public ServiceFramework<BPC_C> {
|
||||
public:
|
||||
explicit BPC_C(Core::System& system_) : ServiceFramework{system_, "bpc:c"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "ShutdownSystem"},
|
||||
{1, nullptr, "RebootSystem"},
|
||||
{2, nullptr, "GetWakeupReason"},
|
||||
{3, nullptr, "GetShutdownReason"},
|
||||
{4, nullptr, "GetAcOk"},
|
||||
{5, nullptr, "GetPowerEvent"},
|
||||
};
|
||||
// clang-format on
|
||||
RegisterHandlers(functions);
|
||||
explicit BPC_C(Core::System& system_) : ServiceFramework{system_, "bpc:c"} {}
|
||||
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, nullptr, "ShutdownSystem"},
|
||||
FunctionInfo{1, nullptr, "RebootSystem"},
|
||||
FunctionInfo{2, nullptr, "GetWakeupReason"},
|
||||
FunctionInfo{3, nullptr, "GetShutdownReason"},
|
||||
FunctionInfo{4, nullptr, "GetAcOk"},
|
||||
FunctionInfo{5, nullptr, "GetPowerEvent"}
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
class BPC_B final : public ServiceFramework<BPC_B> {
|
||||
public:
|
||||
explicit BPC_B(Core::System& system_) : ServiceFramework{system_, "bpc:b"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "GetSleepButtonState"},
|
||||
{1, nullptr, "GetPowerButtonEvent"},
|
||||
};
|
||||
// clang-format on
|
||||
RegisterHandlers(functions);
|
||||
explicit BPC_B(Core::System& system_) : ServiceFramework{system_, "bpc:b"} {}
|
||||
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, nullptr, "GetSleepButtonState"},
|
||||
FunctionInfo{1, nullptr, "GetPowerButtonEvent"}
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
class BPC_W final : public ServiceFramework<BPC_W> {
|
||||
public:
|
||||
explicit BPC_W(Core::System& system_) : ServiceFramework{system_, "bpc:w"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "CreateWakeupTimer"},
|
||||
{1, nullptr, "CancelWakeupTimer"},
|
||||
{2, nullptr, "EnableWakeupTimerOnDevice"},
|
||||
};
|
||||
// clang-format on
|
||||
RegisterHandlers(functions);
|
||||
explicit BPC_W(Core::System& system_) : ServiceFramework{system_, "bpc:w"} {}
|
||||
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, nullptr, "CreateWakeupTimer"},
|
||||
FunctionInfo{1, nullptr, "CancelWakeupTimer"},
|
||||
FunctionInfo{2, nullptr, "EnableWakeupTimerOnDevice"}
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
class BPC_AMS final : public ServiceFramework<BPC_AMS> {
|
||||
public:
|
||||
explicit BPC_AMS(Core::System& system_) : ServiceFramework{system_, "bpc:ams"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{65000, nullptr, "RebootToFatalError"},
|
||||
{65001, nullptr, "SetRebootPayload"},
|
||||
};
|
||||
// clang-format on
|
||||
RegisterHandlers(functions);
|
||||
explicit BPC_AMS(Core::System& system_) : ServiceFramework{system_, "bpc:ams"} {}
|
||||
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{65000, nullptr, "RebootToFatalError"},
|
||||
FunctionInfo{65001, nullptr, "SetRebootPayload"}
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -20,26 +20,26 @@ namespace Service::BtDrv {
|
||||
class IBluetoothUser final : public ServiceFramework<IBluetoothUser> {
|
||||
public:
|
||||
explicit IBluetoothUser(Core::System& system_)
|
||||
: ServiceFramework{system_, "bt"}, service_context{system_, "bt"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "LeClientReadCharacteristic"},
|
||||
{1, nullptr, "LeClientReadDescriptor"},
|
||||
{2, nullptr, "LeClientWriteCharacteristic"},
|
||||
{3, nullptr, "LeClientWriteDescriptor"},
|
||||
{4, nullptr, "LeClientRegisterNotification"},
|
||||
{5, nullptr, "LeClientDeregisterNotification"},
|
||||
{6, nullptr, "SetLeResponse"},
|
||||
{7, nullptr, "LeSendIndication"},
|
||||
{8, nullptr, "GetLeEventInfo"},
|
||||
{9, C<&IBluetoothUser::RegisterBleEvent>, "RegisterBleEvent"},
|
||||
};
|
||||
// clang-format on
|
||||
RegisterHandlers(functions);
|
||||
|
||||
: ServiceFramework{system_, "bt"}
|
||||
, service_context{system_, "bt"} {
|
||||
register_event = service_context.CreateEvent("BT:RegisterEvent");
|
||||
}
|
||||
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, nullptr, "LeClientReadCharacteristic"},
|
||||
FunctionInfo{1, nullptr, "LeClientReadDescriptor"},
|
||||
FunctionInfo{2, nullptr, "LeClientWriteCharacteristic"},
|
||||
FunctionInfo{3, nullptr, "LeClientWriteDescriptor"},
|
||||
FunctionInfo{4, nullptr, "LeClientRegisterNotification"},
|
||||
FunctionInfo{5, nullptr, "LeClientDeregisterNotification"},
|
||||
FunctionInfo{6, nullptr, "SetLeResponse"},
|
||||
FunctionInfo{7, nullptr, "LeSendIndication"},
|
||||
FunctionInfo{8, nullptr, "GetLeEventInfo"},
|
||||
FunctionInfo{9, C<&IBluetoothUser::RegisterBleEvent>, "RegisterBleEvent"}
|
||||
);
|
||||
}
|
||||
|
||||
~IBluetoothUser() override {
|
||||
service_context.CloseEvent(register_event);
|
||||
}
|
||||
@@ -59,144 +59,142 @@ private:
|
||||
|
||||
class IBluetoothDriver final : public ServiceFramework<IBluetoothDriver> {
|
||||
public:
|
||||
explicit IBluetoothDriver(Core::System& system_) : ServiceFramework{system_, "btdrv"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "InitializeBluetoothDriver"},
|
||||
{1, nullptr, "InitializeBluetooth"},
|
||||
{2, nullptr, "EnableBluetooth"},
|
||||
{3, nullptr, "DisableBluetooth"},
|
||||
{4, nullptr, "FinalizeBluetooth"},
|
||||
{5, nullptr, "GetAdapterProperties"},
|
||||
{6, nullptr, "GetAdapterProperty"},
|
||||
{7, nullptr, "SetAdapterProperty"},
|
||||
{8, nullptr, "StartInquiry"},
|
||||
{9, nullptr, "StopInquiry"},
|
||||
{10, nullptr, "CreateBond"},
|
||||
{11, nullptr, "RemoveBond"},
|
||||
{12, nullptr, "CancelBond"},
|
||||
{13, nullptr, "RespondToPinRequest"},
|
||||
{14, nullptr, "RespondToSspRequest"},
|
||||
{15, nullptr, "GetEventInfo"},
|
||||
{16, nullptr, "InitializeHid"},
|
||||
{17, nullptr, "OpenHidConnection"},
|
||||
{18, nullptr, "CloseHidConnection"},
|
||||
{19, nullptr, "WriteHidData"},
|
||||
{20, nullptr, "WriteHidData2"},
|
||||
{21, nullptr, "SetHidReport"},
|
||||
{22, nullptr, "GetHidReport"},
|
||||
{23, nullptr, "TriggerConnection"},
|
||||
{24, nullptr, "AddPairedDeviceInfo"},
|
||||
{25, nullptr, "GetPairedDeviceInfo"},
|
||||
{26, nullptr, "FinalizeHid"},
|
||||
{27, nullptr, "GetHidEventInfo"},
|
||||
{28, nullptr, "SetTsi"},
|
||||
{29, nullptr, "EnableBurstMode"},
|
||||
{30, nullptr, "SetZeroRetransmission"},
|
||||
{31, nullptr, "EnableMcMode"},
|
||||
{32, nullptr, "EnableLlrScan"},
|
||||
{33, nullptr, "DisableLlrScan"},
|
||||
{34, C<&IBluetoothDriver::EnableRadio>, "EnableRadio"},
|
||||
{35, nullptr, "SetVisibility"},
|
||||
{36, nullptr, "EnableTbfcScan"},
|
||||
{37, nullptr, "RegisterHidReportEvent"},
|
||||
{38, nullptr, "GetHidReportEventInfo"},
|
||||
{39, nullptr, "GetLatestPlr"},
|
||||
{40, nullptr, "GetPendingConnections"},
|
||||
{41, nullptr, "GetChannelMap"},
|
||||
{42, nullptr, "EnableTxPowerBoostSetting"},
|
||||
{43, nullptr, "IsTxPowerBoostSettingEnabled"},
|
||||
{44, nullptr, "EnableAfhSetting"},
|
||||
{45, nullptr, "IsAfhSettingEnabled"},
|
||||
{46, nullptr, "InitializeBle"},
|
||||
{47, nullptr, "EnableBle"},
|
||||
{48, nullptr, "DisableBle"},
|
||||
{49, nullptr, "FinalizeBle"},
|
||||
{50, nullptr, "SetBleVisibility"},
|
||||
{51, nullptr, "SetBleConnectionParameter"},
|
||||
{52, nullptr, "SetBleDefaultConnectionParameter"},
|
||||
{53, nullptr, "SetBleAdvertiseData"},
|
||||
{54, nullptr, "SetBleAdvertiseParameter"},
|
||||
{55, nullptr, "StartBleScan"},
|
||||
{56, nullptr, "StopBleScan"},
|
||||
{57, nullptr, "AddBleScanFilterCondition"},
|
||||
{58, nullptr, "DeleteBleScanFilterCondition"},
|
||||
{59, nullptr, "DeleteBleScanFilter"},
|
||||
{60, nullptr, "ClearBleScanFilters"},
|
||||
{61, nullptr, "EnableBleScanFilter"},
|
||||
{62, nullptr, "RegisterGattClient"},
|
||||
{63, nullptr, "UnregisterGattClient"},
|
||||
{64, nullptr, "UnregisterAllGattClients"},
|
||||
{65, nullptr, "ConnectGattServer"},
|
||||
{66, nullptr, "CancelConnectGattServer"},
|
||||
{67, nullptr, "DisconnectGattServer"},
|
||||
{68, nullptr, "GetGattAttribute"},
|
||||
{69, nullptr, "GetGattService"},
|
||||
{70, nullptr, "ConfigureAttMtu"},
|
||||
{71, nullptr, "RegisterGattServer"},
|
||||
{72, nullptr, "UnregisterGattServer"},
|
||||
{73, nullptr, "ConnectGattClient"},
|
||||
{74, nullptr, "DisconnectGattClient"},
|
||||
{75, nullptr, "AddGattService"},
|
||||
{76, nullptr, "EnableGattService"},
|
||||
{77, nullptr, "AddGattCharacteristic"},
|
||||
{78, nullptr, "AddGattDescriptor"},
|
||||
{79, nullptr, "GetBleManagedEventInfo"},
|
||||
{80, nullptr, "GetGattFirstCharacteristic"},
|
||||
{81, nullptr, "GetGattNextCharacteristic"},
|
||||
{82, nullptr, "GetGattFirstDescriptor"},
|
||||
{83, nullptr, "GetGattNextDescriptor"},
|
||||
{84, nullptr, "RegisterGattManagedDataPath"},
|
||||
{85, nullptr, "UnregisterGattManagedDataPath"},
|
||||
{86, nullptr, "RegisterGattHidDataPath"},
|
||||
{87, nullptr, "UnregisterGattHidDataPath"},
|
||||
{88, nullptr, "RegisterGattDataPath"},
|
||||
{89, nullptr, "UnregisterGattDataPath"},
|
||||
{90, nullptr, "ReadGattCharacteristic"},
|
||||
{91, nullptr, "ReadGattDescriptor"},
|
||||
{92, nullptr, "WriteGattCharacteristic"},
|
||||
{93, nullptr, "WriteGattDescriptor"},
|
||||
{94, nullptr, "RegisterGattNotification"},
|
||||
{95, nullptr, "UnregisterGattNotification"},
|
||||
{96, nullptr, "GetLeHidEventInfo"},
|
||||
{97, nullptr, "RegisterBleHidEvent"},
|
||||
{98, nullptr, "SetBleScanParameter"},
|
||||
{99, nullptr, "MoveToSecondaryPiconet"},
|
||||
{100, nullptr, "IsBluetoothEnabled"},
|
||||
{128, nullptr, "AcquireAudioEvent"},
|
||||
{129, nullptr, "GetAudioEventInfo"},
|
||||
{130, nullptr, "OpenAudioConnection"},
|
||||
{131, nullptr, "CloseAudioConnection"},
|
||||
{132, nullptr, "OpenAudioOut"},
|
||||
{133, nullptr, "CloseAudioOut"},
|
||||
{134, nullptr, "AcquireAudioOutStateChangedEvent"},
|
||||
{135, nullptr, "StartAudioOut"},
|
||||
{136, nullptr, "StopAudioOut"},
|
||||
{137, nullptr, "GetAudioOutState"},
|
||||
{138, nullptr, "GetAudioOutFeedingCodec"},
|
||||
{139, nullptr, "GetAudioOutFeedingParameter"},
|
||||
{140, nullptr, "AcquireAudioOutBufferAvailableEvent"},
|
||||
{141, nullptr, "SendAudioData"},
|
||||
{142, nullptr, "AcquireAudioControlInputStateChangedEvent"},
|
||||
{143, nullptr, "GetAudioControlInputState"},
|
||||
{144, nullptr, "AcquireAudioConnectionStateChangedEvent"},
|
||||
{145, nullptr, "GetConnectedAudioDevice"},
|
||||
{146, nullptr, "CloseAudioControlInput"},
|
||||
{147, nullptr, "RegisterAudioControlNotification"},
|
||||
{148, nullptr, "SendAudioControlPassthroughCommand"},
|
||||
{149, nullptr, "SendAudioControlSetAbsoluteVolumeCommand"},
|
||||
{150, nullptr, "AcquireAudioSinkVolumeLocallyChangedEvent"},
|
||||
{151, nullptr, "AcquireAudioSinkVolumeUpdateRequestCompletedEvent"},
|
||||
{152, nullptr, "GetAudioSinkVolume"},
|
||||
{153, nullptr, "RequestUpdateAudioSinkVolume"},
|
||||
{154, nullptr, "IsAudioSinkVolumeSupported"},
|
||||
{256, nullptr, "IsManufacturingMode"},
|
||||
{257, nullptr, "EmulateBluetoothCrash"},
|
||||
{258, nullptr, "GetBleChannelMap"},
|
||||
};
|
||||
// clang-format on
|
||||
explicit IBluetoothDriver(Core::System& system_) : ServiceFramework{system_, "btdrv"} {}
|
||||
|
||||
RegisterHandlers(functions);
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, nullptr, "InitializeBluetoothDriver"},
|
||||
FunctionInfo{1, nullptr, "InitializeBluetooth"},
|
||||
FunctionInfo{2, nullptr, "EnableBluetooth"},
|
||||
FunctionInfo{3, nullptr, "DisableBluetooth"},
|
||||
FunctionInfo{4, nullptr, "FinalizeBluetooth"},
|
||||
FunctionInfo{5, nullptr, "GetAdapterProperties"},
|
||||
FunctionInfo{6, nullptr, "GetAdapterProperty"},
|
||||
FunctionInfo{7, nullptr, "SetAdapterProperty"},
|
||||
FunctionInfo{8, nullptr, "StartInquiry"},
|
||||
FunctionInfo{9, nullptr, "StopInquiry"},
|
||||
FunctionInfo{10, nullptr, "CreateBond"},
|
||||
FunctionInfo{11, nullptr, "RemoveBond"},
|
||||
FunctionInfo{12, nullptr, "CancelBond"},
|
||||
FunctionInfo{13, nullptr, "RespondToPinRequest"},
|
||||
FunctionInfo{14, nullptr, "RespondToSspRequest"},
|
||||
FunctionInfo{15, nullptr, "GetEventInfo"},
|
||||
FunctionInfo{16, nullptr, "InitializeHid"},
|
||||
FunctionInfo{17, nullptr, "OpenHidConnection"},
|
||||
FunctionInfo{18, nullptr, "CloseHidConnection"},
|
||||
FunctionInfo{19, nullptr, "WriteHidData"},
|
||||
FunctionInfo{20, nullptr, "WriteHidData2"},
|
||||
FunctionInfo{21, nullptr, "SetHidReport"},
|
||||
FunctionInfo{22, nullptr, "GetHidReport"},
|
||||
FunctionInfo{23, nullptr, "TriggerConnection"},
|
||||
FunctionInfo{24, nullptr, "AddPairedDeviceInfo"},
|
||||
FunctionInfo{25, nullptr, "GetPairedDeviceInfo"},
|
||||
FunctionInfo{26, nullptr, "FinalizeHid"},
|
||||
FunctionInfo{27, nullptr, "GetHidEventInfo"},
|
||||
FunctionInfo{28, nullptr, "SetTsi"},
|
||||
FunctionInfo{29, nullptr, "EnableBurstMode"},
|
||||
FunctionInfo{30, nullptr, "SetZeroRetransmission"},
|
||||
FunctionInfo{31, nullptr, "EnableMcMode"},
|
||||
FunctionInfo{32, nullptr, "EnableLlrScan"},
|
||||
FunctionInfo{33, nullptr, "DisableLlrScan"},
|
||||
FunctionInfo{34, C<&IBluetoothDriver::EnableRadio>, "EnableRadio"},
|
||||
FunctionInfo{35, nullptr, "SetVisibility"},
|
||||
FunctionInfo{36, nullptr, "EnableTbfcScan"},
|
||||
FunctionInfo{37, nullptr, "RegisterHidReportEvent"},
|
||||
FunctionInfo{38, nullptr, "GetHidReportEventInfo"},
|
||||
FunctionInfo{39, nullptr, "GetLatestPlr"},
|
||||
FunctionInfo{40, nullptr, "GetPendingConnections"},
|
||||
FunctionInfo{41, nullptr, "GetChannelMap"},
|
||||
FunctionInfo{42, nullptr, "EnableTxPowerBoostSetting"},
|
||||
FunctionInfo{43, nullptr, "IsTxPowerBoostSettingEnabled"},
|
||||
FunctionInfo{44, nullptr, "EnableAfhSetting"},
|
||||
FunctionInfo{45, nullptr, "IsAfhSettingEnabled"},
|
||||
FunctionInfo{46, nullptr, "InitializeBle"},
|
||||
FunctionInfo{47, nullptr, "EnableBle"},
|
||||
FunctionInfo{48, nullptr, "DisableBle"},
|
||||
FunctionInfo{49, nullptr, "FinalizeBle"},
|
||||
FunctionInfo{50, nullptr, "SetBleVisibility"},
|
||||
FunctionInfo{51, nullptr, "SetBleConnectionParameter"},
|
||||
FunctionInfo{52, nullptr, "SetBleDefaultConnectionParameter"},
|
||||
FunctionInfo{53, nullptr, "SetBleAdvertiseData"},
|
||||
FunctionInfo{54, nullptr, "SetBleAdvertiseParameter"},
|
||||
FunctionInfo{55, nullptr, "StartBleScan"},
|
||||
FunctionInfo{56, nullptr, "StopBleScan"},
|
||||
FunctionInfo{57, nullptr, "AddBleScanFilterCondition"},
|
||||
FunctionInfo{58, nullptr, "DeleteBleScanFilterCondition"},
|
||||
FunctionInfo{59, nullptr, "DeleteBleScanFilter"},
|
||||
FunctionInfo{60, nullptr, "ClearBleScanFilters"},
|
||||
FunctionInfo{61, nullptr, "EnableBleScanFilter"},
|
||||
FunctionInfo{62, nullptr, "RegisterGattClient"},
|
||||
FunctionInfo{63, nullptr, "UnregisterGattClient"},
|
||||
FunctionInfo{64, nullptr, "UnregisterAllGattClients"},
|
||||
FunctionInfo{65, nullptr, "ConnectGattServer"},
|
||||
FunctionInfo{66, nullptr, "CancelConnectGattServer"},
|
||||
FunctionInfo{67, nullptr, "DisconnectGattServer"},
|
||||
FunctionInfo{68, nullptr, "GetGattAttribute"},
|
||||
FunctionInfo{69, nullptr, "GetGattService"},
|
||||
FunctionInfo{70, nullptr, "ConfigureAttMtu"},
|
||||
FunctionInfo{71, nullptr, "RegisterGattServer"},
|
||||
FunctionInfo{72, nullptr, "UnregisterGattServer"},
|
||||
FunctionInfo{73, nullptr, "ConnectGattClient"},
|
||||
FunctionInfo{74, nullptr, "DisconnectGattClient"},
|
||||
FunctionInfo{75, nullptr, "AddGattService"},
|
||||
FunctionInfo{76, nullptr, "EnableGattService"},
|
||||
FunctionInfo{77, nullptr, "AddGattCharacteristic"},
|
||||
FunctionInfo{78, nullptr, "AddGattDescriptor"},
|
||||
FunctionInfo{79, nullptr, "GetBleManagedEventInfo"},
|
||||
FunctionInfo{80, nullptr, "GetGattFirstCharacteristic"},
|
||||
FunctionInfo{81, nullptr, "GetGattNextCharacteristic"},
|
||||
FunctionInfo{82, nullptr, "GetGattFirstDescriptor"},
|
||||
FunctionInfo{83, nullptr, "GetGattNextDescriptor"},
|
||||
FunctionInfo{84, nullptr, "RegisterGattManagedDataPath"},
|
||||
FunctionInfo{85, nullptr, "UnregisterGattManagedDataPath"},
|
||||
FunctionInfo{86, nullptr, "RegisterGattHidDataPath"},
|
||||
FunctionInfo{87, nullptr, "UnregisterGattHidDataPath"},
|
||||
FunctionInfo{88, nullptr, "RegisterGattDataPath"},
|
||||
FunctionInfo{89, nullptr, "UnregisterGattDataPath"},
|
||||
FunctionInfo{90, nullptr, "ReadGattCharacteristic"},
|
||||
FunctionInfo{91, nullptr, "ReadGattDescriptor"},
|
||||
FunctionInfo{92, nullptr, "WriteGattCharacteristic"},
|
||||
FunctionInfo{93, nullptr, "WriteGattDescriptor"},
|
||||
FunctionInfo{94, nullptr, "RegisterGattNotification"},
|
||||
FunctionInfo{95, nullptr, "UnregisterGattNotification"},
|
||||
FunctionInfo{96, nullptr, "GetLeHidEventInfo"},
|
||||
FunctionInfo{97, nullptr, "RegisterBleHidEvent"},
|
||||
FunctionInfo{98, nullptr, "SetBleScanParameter"},
|
||||
FunctionInfo{99, nullptr, "MoveToSecondaryPiconet"},
|
||||
FunctionInfo{100, nullptr, "IsBluetoothEnabled"},
|
||||
FunctionInfo{128, nullptr, "AcquireAudioEvent"},
|
||||
FunctionInfo{129, nullptr, "GetAudioEventInfo"},
|
||||
FunctionInfo{130, nullptr, "OpenAudioConnection"},
|
||||
FunctionInfo{131, nullptr, "CloseAudioConnection"},
|
||||
FunctionInfo{132, nullptr, "OpenAudioOut"},
|
||||
FunctionInfo{133, nullptr, "CloseAudioOut"},
|
||||
FunctionInfo{134, nullptr, "AcquireAudioOutStateChangedEvent"},
|
||||
FunctionInfo{135, nullptr, "StartAudioOut"},
|
||||
FunctionInfo{136, nullptr, "StopAudioOut"},
|
||||
FunctionInfo{137, nullptr, "GetAudioOutState"},
|
||||
FunctionInfo{138, nullptr, "GetAudioOutFeedingCodec"},
|
||||
FunctionInfo{139, nullptr, "GetAudioOutFeedingParameter"},
|
||||
FunctionInfo{140, nullptr, "AcquireAudioOutBufferAvailableEvent"},
|
||||
FunctionInfo{141, nullptr, "SendAudioData"},
|
||||
FunctionInfo{142, nullptr, "AcquireAudioControlInputStateChangedEvent"},
|
||||
FunctionInfo{143, nullptr, "GetAudioControlInputState"},
|
||||
FunctionInfo{144, nullptr, "AcquireAudioConnectionStateChangedEvent"},
|
||||
FunctionInfo{145, nullptr, "GetConnectedAudioDevice"},
|
||||
FunctionInfo{146, nullptr, "CloseAudioControlInput"},
|
||||
FunctionInfo{147, nullptr, "RegisterAudioControlNotification"},
|
||||
FunctionInfo{148, nullptr, "SendAudioControlPassthroughCommand"},
|
||||
FunctionInfo{149, nullptr, "SendAudioControlSetAbsoluteVolumeCommand"},
|
||||
FunctionInfo{150, nullptr, "AcquireAudioSinkVolumeLocallyChangedEvent"},
|
||||
FunctionInfo{151, nullptr, "AcquireAudioSinkVolumeUpdateRequestCompletedEvent"},
|
||||
FunctionInfo{152, nullptr, "GetAudioSinkVolume"},
|
||||
FunctionInfo{153, nullptr, "RequestUpdateAudioSinkVolume"},
|
||||
FunctionInfo{154, nullptr, "IsAudioSinkVolumeSupported"},
|
||||
FunctionInfo{256, nullptr, "IsManufacturingMode"},
|
||||
FunctionInfo{257, nullptr, "EmulateBluetoothCrash"},
|
||||
FunctionInfo{258, nullptr, "GetBleChannelMap"}
|
||||
);
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
|
||||
@@ -17,100 +17,98 @@ namespace Service::BTM {
|
||||
|
||||
class IBtm final : public ServiceFramework<IBtm> {
|
||||
public:
|
||||
explicit IBtm(Core::System& system_) : ServiceFramework{system_, "btm"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "GetState"},
|
||||
{1, nullptr, "GetHostDeviceProperty"},
|
||||
{2, nullptr, "AcquireDeviceConditionEvent"},
|
||||
{3, nullptr, "GetDeviceCondition"},
|
||||
{4, nullptr, "SetBurstMode"},
|
||||
{5, nullptr, "SetSlotMode"},
|
||||
{6, nullptr, "SetBluetoothMode"},
|
||||
{7, nullptr, "SetWlanMode"},
|
||||
{8, nullptr, "AcquireDeviceInfoEvent"},
|
||||
{9, nullptr, "GetDeviceInfo"},
|
||||
{10, nullptr, "AddDeviceInfo"},
|
||||
{11, nullptr, "RemoveDeviceInfo"},
|
||||
{12, nullptr, "IncreaseDeviceInfoOrder"},
|
||||
{13, nullptr, "LlrNotify"},
|
||||
{14, nullptr, "EnableRadio"},
|
||||
{15, nullptr, "DisableRadio"},
|
||||
{16, nullptr, "HidDisconnect"},
|
||||
{17, nullptr, "HidSetRetransmissionMode"},
|
||||
{18, nullptr, "AcquireAwakeReqEvent"},
|
||||
{19, nullptr, "AcquireLlrStateEvent"},
|
||||
{20, nullptr, "IsLlrStarted"},
|
||||
{21, nullptr, "EnableSlotSaving"},
|
||||
{22, nullptr, "ProtectDeviceInfo"},
|
||||
{23, nullptr, "AcquireBleScanEvent"},
|
||||
{24, nullptr, "GetBleScanParameterGeneral"},
|
||||
{25, nullptr, "GetBleScanParameterSmartDevice"},
|
||||
{26, nullptr, "StartBleScanForGeneral"},
|
||||
{27, nullptr, "StopBleScanForGeneral"},
|
||||
{28, nullptr, "GetBleScanResultsForGeneral"},
|
||||
{29, nullptr, "StartBleScanForPairedDevice"},
|
||||
{30, nullptr, "StopBleScanForPairedDevice"},
|
||||
{31, nullptr, "StartBleScanForSmartDevice"},
|
||||
{32, nullptr, "StopBleScanForSmartDevice"},
|
||||
{33, nullptr, "GetBleScanResultsForSmartDevice"},
|
||||
{34, nullptr, "AcquireBleConnectionEvent"},
|
||||
{35, nullptr, "BleConnect"},
|
||||
{36, nullptr, "BleOverrideConnection"},
|
||||
{37, nullptr, "BleDisconnect"},
|
||||
{38, nullptr, "BleGetConnectionState"},
|
||||
{39, nullptr, "BleGetGattClientConditionList"},
|
||||
{40, nullptr, "AcquireBlePairingEvent"},
|
||||
{41, nullptr, "BlePairDevice"},
|
||||
{42, nullptr, "BleUnpairDeviceOnBoth"},
|
||||
{43, nullptr, "BleUnpairDevice"},
|
||||
{44, nullptr, "BleGetPairedAddresses"},
|
||||
{45, nullptr, "AcquireBleServiceDiscoveryEvent"},
|
||||
{46, nullptr, "GetGattServices"},
|
||||
{47, nullptr, "GetGattService"},
|
||||
{48, nullptr, "GetGattIncludedServices"},
|
||||
{49, nullptr, "GetBelongingService"},
|
||||
{50, nullptr, "GetGattCharacteristics"},
|
||||
{51, nullptr, "GetGattDescriptors"},
|
||||
{52, nullptr, "AcquireBleMtuConfigEvent"},
|
||||
{53, nullptr, "ConfigureBleMtu"},
|
||||
{54, nullptr, "GetBleMtu"},
|
||||
{55, nullptr, "RegisterBleGattDataPath"},
|
||||
{56, nullptr, "UnregisterBleGattDataPath"},
|
||||
{57, nullptr, "RegisterAppletResourceUserId"},
|
||||
{58, nullptr, "UnregisterAppletResourceUserId"},
|
||||
{59, nullptr, "SetAppletResourceUserId"},
|
||||
{60, nullptr, "AcquireBleConnectionParameterUpdateEvent"}, //8.0.0+
|
||||
{61, nullptr, "SetCeLength"}, //8.0.0+
|
||||
{62, nullptr, "EnsureSlotExpansion"}, //9.0.0+
|
||||
{63, nullptr, "IsSlotExpansionEnsured"}, //9.0.0+
|
||||
{64, nullptr, "CancelConnectionTrigger"}, //10.0.0+
|
||||
{65, nullptr, "GetConnectionCapacity"}, //13.0.0+
|
||||
{66, nullptr, "GetWlanMode"}, //13.0.0+
|
||||
{67, nullptr, "IsSlotSavingEnabled"}, //13.0.0+
|
||||
{68, nullptr, "IsSlotSavingForPairingEnabled"}, //13.0.0+
|
||||
{69, nullptr, "AcquireAudioDeviceConnectionEvent"}, //13.0.0+
|
||||
{70, nullptr, "GetConnectedAudioDevices"}, //13.0.0+
|
||||
{71, nullptr, "SetAudioSourceVolume"}, //13.0.0+
|
||||
{72, nullptr, "GetAudioSourceVolume"}, //13.0.0+
|
||||
{73, nullptr, "RequestAudioDeviceConnectionRejection"}, //13.0.0+
|
||||
{74, nullptr, "CancelAudioDeviceConnectionRejection"}, //13.0.0+
|
||||
{75, nullptr, "GetPairedAudioDevices"}, //13.0.0+
|
||||
{76, nullptr, "SetWlanModeWithOption"}, //13.1.0+
|
||||
{100, nullptr, "AcquireConnectionDisallowedEvent"}, //13.0.0+
|
||||
{101, nullptr, "GetUsecaseViolationFactor"}, //13.0.0+
|
||||
{110, nullptr, "GetShortenedDeviceInfo"}, //13.0.0+
|
||||
{111, nullptr, "AcquirePairingCountUpdateEvent"},//13.0.0+
|
||||
{112, nullptr, "Unknown112"}, //14.0.0-14.1.2
|
||||
{113, nullptr, "Unknown113"}, //14.0.0-14.1.2
|
||||
{114, nullptr, "IsFirstAudioControlConnection"}, //14.0.0+
|
||||
{115, nullptr, "GetShortenedDeviceCondition"}, //14.0.0+
|
||||
{116, nullptr, "SetAudioSinkVolume"}, //15.0.0+
|
||||
{117, nullptr, "GetAudioSinkVolume"}, //15.0.0+
|
||||
};
|
||||
// clang-format on
|
||||
explicit IBtm(Core::System& system_) : ServiceFramework{system_, "btm"} {}
|
||||
|
||||
RegisterHandlers(functions);
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, nullptr, "GetState"},
|
||||
FunctionInfo{1, nullptr, "GetHostDeviceProperty"},
|
||||
FunctionInfo{2, nullptr, "AcquireDeviceConditionEvent"},
|
||||
FunctionInfo{3, nullptr, "GetDeviceCondition"},
|
||||
FunctionInfo{4, nullptr, "SetBurstMode"},
|
||||
FunctionInfo{5, nullptr, "SetSlotMode"},
|
||||
FunctionInfo{6, nullptr, "SetBluetoothMode"},
|
||||
FunctionInfo{7, nullptr, "SetWlanMode"},
|
||||
FunctionInfo{8, nullptr, "AcquireDeviceInfoEvent"},
|
||||
FunctionInfo{9, nullptr, "GetDeviceInfo"},
|
||||
FunctionInfo{10, nullptr, "AddDeviceInfo"},
|
||||
FunctionInfo{11, nullptr, "RemoveDeviceInfo"},
|
||||
FunctionInfo{12, nullptr, "IncreaseDeviceInfoOrder"},
|
||||
FunctionInfo{13, nullptr, "LlrNotify"},
|
||||
FunctionInfo{14, nullptr, "EnableRadio"},
|
||||
FunctionInfo{15, nullptr, "DisableRadio"},
|
||||
FunctionInfo{16, nullptr, "HidDisconnect"},
|
||||
FunctionInfo{17, nullptr, "HidSetRetransmissionMode"},
|
||||
FunctionInfo{18, nullptr, "AcquireAwakeReqEvent"},
|
||||
FunctionInfo{19, nullptr, "AcquireLlrStateEvent"},
|
||||
FunctionInfo{20, nullptr, "IsLlrStarted"},
|
||||
FunctionInfo{21, nullptr, "EnableSlotSaving"},
|
||||
FunctionInfo{22, nullptr, "ProtectDeviceInfo"},
|
||||
FunctionInfo{23, nullptr, "AcquireBleScanEvent"},
|
||||
FunctionInfo{24, nullptr, "GetBleScanParameterGeneral"},
|
||||
FunctionInfo{25, nullptr, "GetBleScanParameterSmartDevice"},
|
||||
FunctionInfo{26, nullptr, "StartBleScanForGeneral"},
|
||||
FunctionInfo{27, nullptr, "StopBleScanForGeneral"},
|
||||
FunctionInfo{28, nullptr, "GetBleScanResultsForGeneral"},
|
||||
FunctionInfo{29, nullptr, "StartBleScanForPairedDevice"},
|
||||
FunctionInfo{30, nullptr, "StopBleScanForPairedDevice"},
|
||||
FunctionInfo{31, nullptr, "StartBleScanForSmartDevice"},
|
||||
FunctionInfo{32, nullptr, "StopBleScanForSmartDevice"},
|
||||
FunctionInfo{33, nullptr, "GetBleScanResultsForSmartDevice"},
|
||||
FunctionInfo{34, nullptr, "AcquireBleConnectionEvent"},
|
||||
FunctionInfo{35, nullptr, "BleConnect"},
|
||||
FunctionInfo{36, nullptr, "BleOverrideConnection"},
|
||||
FunctionInfo{37, nullptr, "BleDisconnect"},
|
||||
FunctionInfo{38, nullptr, "BleGetConnectionState"},
|
||||
FunctionInfo{39, nullptr, "BleGetGattClientConditionList"},
|
||||
FunctionInfo{40, nullptr, "AcquireBlePairingEvent"},
|
||||
FunctionInfo{41, nullptr, "BlePairDevice"},
|
||||
FunctionInfo{42, nullptr, "BleUnpairDeviceOnBoth"},
|
||||
FunctionInfo{43, nullptr, "BleUnpairDevice"},
|
||||
FunctionInfo{44, nullptr, "BleGetPairedAddresses"},
|
||||
FunctionInfo{45, nullptr, "AcquireBleServiceDiscoveryEvent"},
|
||||
FunctionInfo{46, nullptr, "GetGattServices"},
|
||||
FunctionInfo{47, nullptr, "GetGattService"},
|
||||
FunctionInfo{48, nullptr, "GetGattIncludedServices"},
|
||||
FunctionInfo{49, nullptr, "GetBelongingService"},
|
||||
FunctionInfo{50, nullptr, "GetGattCharacteristics"},
|
||||
FunctionInfo{51, nullptr, "GetGattDescriptors"},
|
||||
FunctionInfo{52, nullptr, "AcquireBleMtuConfigEvent"},
|
||||
FunctionInfo{53, nullptr, "ConfigureBleMtu"},
|
||||
FunctionInfo{54, nullptr, "GetBleMtu"},
|
||||
FunctionInfo{55, nullptr, "RegisterBleGattDataPath"},
|
||||
FunctionInfo{56, nullptr, "UnregisterBleGattDataPath"},
|
||||
FunctionInfo{57, nullptr, "RegisterAppletResourceUserId"},
|
||||
FunctionInfo{58, nullptr, "UnregisterAppletResourceUserId"},
|
||||
FunctionInfo{59, nullptr, "SetAppletResourceUserId"},
|
||||
FunctionInfo{60, nullptr, "AcquireBleConnectionParameterUpdateEvent"}, //8.0.0+
|
||||
FunctionInfo{61, nullptr, "SetCeLength"}, //8.0.0+
|
||||
FunctionInfo{62, nullptr, "EnsureSlotExpansion"}, //9.0.0+
|
||||
FunctionInfo{63, nullptr, "IsSlotExpansionEnsured"}, //9.0.0+
|
||||
FunctionInfo{64, nullptr, "CancelConnectionTrigger"}, //10.0.0+
|
||||
FunctionInfo{65, nullptr, "GetConnectionCapacity"}, //13.0.0+
|
||||
FunctionInfo{66, nullptr, "GetWlanMode"}, //13.0.0+
|
||||
FunctionInfo{67, nullptr, "IsSlotSavingEnabled"}, //13.0.0+
|
||||
FunctionInfo{68, nullptr, "IsSlotSavingForPairingEnabled"}, //13.0.0+
|
||||
FunctionInfo{69, nullptr, "AcquireAudioDeviceConnectionEvent"}, //13.0.0+
|
||||
FunctionInfo{70, nullptr, "GetConnectedAudioDevices"}, //13.0.0+
|
||||
FunctionInfo{71, nullptr, "SetAudioSourceVolume"}, //13.0.0+
|
||||
FunctionInfo{72, nullptr, "GetAudioSourceVolume"}, //13.0.0+
|
||||
FunctionInfo{73, nullptr, "RequestAudioDeviceConnectionRejection"}, //13.0.0+
|
||||
FunctionInfo{74, nullptr, "CancelAudioDeviceConnectionRejection"}, //13.0.0+
|
||||
FunctionInfo{75, nullptr, "GetPairedAudioDevices"}, //13.0.0+
|
||||
FunctionInfo{76, nullptr, "SetWlanModeWithOption"}, //13.1.0+
|
||||
FunctionInfo{100, nullptr, "AcquireConnectionDisallowedEvent"}, //13.0.0+
|
||||
FunctionInfo{101, nullptr, "GetUsecaseViolationFactor"}, //13.0.0+
|
||||
FunctionInfo{110, nullptr, "GetShortenedDeviceInfo"}, //13.0.0+
|
||||
FunctionInfo{111, nullptr, "AcquirePairingCountUpdateEvent"},//13.0.0+
|
||||
FunctionInfo{112, nullptr, "Unknown112"}, //14.0.0-14.1.2
|
||||
FunctionInfo{113, nullptr, "Unknown113"}, //14.0.0-14.1.2
|
||||
FunctionInfo{114, nullptr, "IsFirstAudioControlConnection"}, //14.0.0+
|
||||
FunctionInfo{115, nullptr, "GetShortenedDeviceCondition"}, //14.0.0+
|
||||
FunctionInfo{116, nullptr, "SetAudioSinkVolume"}, //15.0.0+
|
||||
FunctionInfo{117, nullptr, "GetAudioSinkVolume"} //15.0.0+
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -20,15 +20,14 @@ namespace Service::Capture {
|
||||
|
||||
class IDecoderControlService final : public ServiceFramework<IDecoderControlService> {
|
||||
public:
|
||||
explicit IDecoderControlService(Core::System& system_) : ServiceFramework{system_, "grc:d"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{3001, nullptr, "DecodeJpeg"},
|
||||
{4001, nullptr, "ShrinkJpeg"},
|
||||
{4002, nullptr, "ShrinkJpegEx"},
|
||||
};
|
||||
// clang-format on
|
||||
RegisterHandlers(functions);
|
||||
explicit IDecoderControlService(Core::System& system_) : ServiceFramework{system_, "grc:d"} {}
|
||||
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{3001, nullptr, "DecodeJpeg"},
|
||||
FunctionInfo{4001, nullptr, "ShrinkJpeg"},
|
||||
FunctionInfo{4002, nullptr, "ShrinkJpegEx"}
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -17,30 +17,28 @@ namespace Service::ERPT {
|
||||
|
||||
class ErrorReportContext final : public ServiceFramework<ErrorReportContext> {
|
||||
public:
|
||||
explicit ErrorReportContext(Core::System& system_) : ServiceFramework{system_, "erpt:c"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, C<&ErrorReportContext::SubmitContext>, "SubmitContext"},
|
||||
{1, C<&ErrorReportContext::CreateReportV0>, "CreateReportV0"},
|
||||
{2, nullptr, "SetInitialLaunchSettingsCompletionTime"},
|
||||
{3, nullptr, "ClearInitialLaunchSettingsCompletionTime"},
|
||||
{4, nullptr, "UpdatePowerOnTime"},
|
||||
{5, D<&ErrorReportContext::UpdateAwakeTime>, "UpdateAwakeTime"},
|
||||
{6, nullptr, "SubmitMultipleCategoryContext"},
|
||||
{7, nullptr, "UpdateApplicationLaunchTime"},
|
||||
{8, nullptr, "ClearApplicationLaunchTime"},
|
||||
{9, nullptr, "SubmitAttachment"},
|
||||
{10, nullptr, "CreateReportWithAttachments"},
|
||||
{11, C<&ErrorReportContext::CreateReportV1>, "CreateReportV1"},
|
||||
{12, C<&ErrorReportContext::CreateReport>, "CreateReport"},
|
||||
{20, nullptr, "RegisterRunningApplet"},
|
||||
{21, nullptr, "UnregisterRunningApplet"},
|
||||
{22, nullptr, "UpdateAppletSuspendedDuration"},
|
||||
{30, nullptr, "InvalidateForcedShutdownDetection"},
|
||||
};
|
||||
// clang-format on
|
||||
explicit ErrorReportContext(Core::System& system_) : ServiceFramework{system_, "erpt:c"} {}
|
||||
|
||||
RegisterHandlers(functions);
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, C<&ErrorReportContext::SubmitContext>, "SubmitContext"},
|
||||
FunctionInfo{1, C<&ErrorReportContext::CreateReportV0>, "CreateReportV0"},
|
||||
FunctionInfo{2, nullptr, "SetInitialLaunchSettingsCompletionTime"},
|
||||
FunctionInfo{3, nullptr, "ClearInitialLaunchSettingsCompletionTime"},
|
||||
FunctionInfo{4, nullptr, "UpdatePowerOnTime"},
|
||||
FunctionInfo{5, D<&ErrorReportContext::UpdateAwakeTime>, "UpdateAwakeTime"},
|
||||
FunctionInfo{6, nullptr, "SubmitMultipleCategoryContext"},
|
||||
FunctionInfo{7, nullptr, "UpdateApplicationLaunchTime"},
|
||||
FunctionInfo{8, nullptr, "ClearApplicationLaunchTime"},
|
||||
FunctionInfo{9, nullptr, "SubmitAttachment"},
|
||||
FunctionInfo{10, nullptr, "CreateReportWithAttachments"},
|
||||
FunctionInfo{11, C<&ErrorReportContext::CreateReportV1>, "CreateReportV1"},
|
||||
FunctionInfo{12, C<&ErrorReportContext::CreateReport>, "CreateReport"},
|
||||
FunctionInfo{20, nullptr, "RegisterRunningApplet"},
|
||||
FunctionInfo{21, nullptr, "UnregisterRunningApplet"},
|
||||
FunctionInfo{22, nullptr, "UpdateAppletSuspendedDuration"},
|
||||
FunctionInfo{30, nullptr, "InvalidateForcedShutdownDetection"}
|
||||
);
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -89,16 +87,14 @@ private:
|
||||
|
||||
class ErrorReportSession final : public ServiceFramework<ErrorReportSession> {
|
||||
public:
|
||||
explicit ErrorReportSession(Core::System& system_) : ServiceFramework{system_, "erpt:r"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "OpenReport"},
|
||||
{1, nullptr, "OpenManager"},
|
||||
{2, nullptr, "OpenAttachment"},
|
||||
};
|
||||
// clang-format on
|
||||
explicit ErrorReportSession(Core::System& system_) : ServiceFramework{system_, "erpt:r"} {}
|
||||
|
||||
RegisterHandlers(functions);
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, nullptr, "OpenReport"},
|
||||
FunctionInfo{1, nullptr, "OpenManager"},
|
||||
FunctionInfo{2, nullptr, "OpenAttachment"}
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
+168
-171
@@ -19,110 +19,109 @@ constexpr Result ERROR_INVALID_RIGHTS_ID{ErrorModule::ETicket, 3};
|
||||
class ETicket final : public ServiceFramework<ETicket> {
|
||||
public:
|
||||
explicit ETicket(Core::System& system_) : ServiceFramework{system_, "es"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{1, &ETicket::ImportTicket, "ImportTicket"},
|
||||
{2, nullptr, "ImportTicketCertificateSet"},
|
||||
{3, nullptr, "DeleteTicket"},
|
||||
{4, nullptr, "DeletePersonalizedTicket"},
|
||||
{5, nullptr, "DeleteAllCommonTicket"},
|
||||
{6, nullptr, "DeleteAllPersonalizedTicket"},
|
||||
{7, nullptr, "DeleteAllPersonalizedTicketEx"},
|
||||
{8, &ETicket::GetTitleKey, "GetTitleKey"},
|
||||
{9, &ETicket::CountCommonTicket, "CountCommonTicket"},
|
||||
{10, &ETicket::CountPersonalizedTicket, "CountPersonalizedTicket"},
|
||||
{11, &ETicket::ListCommonTicketRightsIds, "ListCommonTicketRightsIds"},
|
||||
{12, &ETicket::ListPersonalizedTicketRightsIds, "ListPersonalizedTicketRightsIds"},
|
||||
{13, nullptr, "ListMissingPersonalizedTicket"},
|
||||
{14, &ETicket::GetCommonTicketSize, "GetCommonTicketSize"},
|
||||
{15, &ETicket::GetPersonalizedTicketSize, "GetPersonalizedTicketSize"},
|
||||
{16, &ETicket::GetCommonTicketData, "GetCommonTicketData"},
|
||||
{17, &ETicket::GetPersonalizedTicketData, "GetPersonalizedTicketData"},
|
||||
{18, nullptr, "OwnTicket"},
|
||||
{19, nullptr, "GetTicketInfo"},
|
||||
{20, nullptr, "ListLightTicketInfo"},
|
||||
{21, nullptr, "SignData"},
|
||||
{22, nullptr, "GetCommonTicketAndCertificateSize"},
|
||||
{23, nullptr, "GetCommonTicketAndCertificateData"},
|
||||
{24, nullptr, "ImportPrepurchaseRecord"},
|
||||
{25, nullptr, "DeletePrepurchaseRecord"},
|
||||
{26, nullptr, "DeleteAllPrepurchaseRecord"},
|
||||
{27, nullptr, "CountPrepurchaseRecord"},
|
||||
{28, nullptr, "ListPrepurchaseRecordRightsIds"},
|
||||
{29, nullptr, "ListPrepurchaseRecordInfo"},
|
||||
{30, nullptr, "CountTicket"},
|
||||
{31, nullptr, "ListTicketRightsIds"},
|
||||
{32, nullptr, "CountPrepurchaseRecordEx"},
|
||||
{33, nullptr, "ListPrepurchaseRecordRightsIdsEx"},
|
||||
{34, nullptr, "GetEncryptedTicketSize"},
|
||||
{35, nullptr, "GetEncryptedTicketData"},
|
||||
{36, nullptr, "DeleteAllInactiveELicenseRequiredPersonalizedTicket"},
|
||||
{37, nullptr, "OwnTicket2"},
|
||||
{38, nullptr, "OwnTicket3"},
|
||||
{39, nullptr, "DeleteAllInactivePersonalizedTicket"},
|
||||
{40, nullptr, "DeletePrepurchaseRecordByNintendoAccountId"},
|
||||
{101, nullptr, "Unknown101"}, //18.0.0+
|
||||
{102, nullptr, "Unknown102"}, //18.0.0+
|
||||
{103, nullptr, "Unknown103"}, //18.0.0+
|
||||
{104, nullptr, "Unknown104"}, //18.0.0+
|
||||
{105, nullptr, "Unknown105"}, //20.0.0+
|
||||
{201, nullptr, "Unknown201"}, //18.0.0+
|
||||
{202, nullptr, "Unknown202"}, //18.0.0+
|
||||
{203, nullptr, "Unknown203"}, //18.0.0+
|
||||
{204, nullptr, "Unknown204"}, //18.0.0+
|
||||
{205, nullptr, "Unknown205"}, //18.0.0+
|
||||
{501, nullptr, "Unknown501"},
|
||||
{502, nullptr, "Unknown502"},
|
||||
{503, nullptr, "GetTitleKey"},
|
||||
{504, nullptr, "Unknown504"},
|
||||
{508, nullptr, "Unknown508"},
|
||||
{509, nullptr, "Unknown509"},
|
||||
{510, nullptr, "Unknown510"},
|
||||
{511, nullptr, "Unknown511"},
|
||||
{1001, nullptr, "Unknown1001"},
|
||||
{1002, nullptr, "Unknown1001"},
|
||||
{1003, nullptr, "Unknown1003"},
|
||||
{1004, nullptr, "Unknown1004"},
|
||||
{1005, nullptr, "Unknown1005"},
|
||||
{1006, nullptr, "Unknown1006"},
|
||||
{1007, nullptr, "Unknown1007"},
|
||||
{1009, nullptr, "Unknown1009"},
|
||||
{1010, nullptr, "Unknown1010"},
|
||||
{1011, nullptr, "Unknown1011"},
|
||||
{1012, nullptr, "Unknown1012"},
|
||||
{1013, nullptr, "Unknown1013"},
|
||||
{1014, nullptr, "Unknown1014"},
|
||||
{1015, nullptr, "Unknown1015"},
|
||||
{1016, nullptr, "Unknown1016"},
|
||||
{1017, nullptr, "Unknown1017"},
|
||||
{1018, nullptr, "Unknown1018"},
|
||||
{1019, nullptr, "Unknown1019"},
|
||||
{1020, nullptr, "Unknown1020"},
|
||||
{1021, nullptr, "Unknown1021"},
|
||||
{1501, nullptr, "Unknown1501"},
|
||||
{1502, nullptr, "Unknown1502"},
|
||||
{1503, nullptr, "Unknown1503"},
|
||||
{1504, nullptr, "Unknown1504"},
|
||||
{1505, nullptr, "Unknown1505"},
|
||||
{1506, nullptr, "Unknown1506"},
|
||||
{2000, nullptr, "Unknown2000"},
|
||||
{2001, nullptr, "Unknown2001"},
|
||||
{2002, nullptr, "Unknown2002"},
|
||||
{2003, nullptr, "Unknown2003"},
|
||||
{2100, nullptr, "Unknown2100"},
|
||||
{2501, nullptr, "Unknown2501"},
|
||||
{2502, nullptr, "Unknown2502"},
|
||||
{2601, nullptr, "Unknown2601"},
|
||||
{3001, nullptr, "Unknown3001"},
|
||||
{3002, nullptr, "Unknown3002"},
|
||||
};
|
||||
// clang-format on
|
||||
RegisterHandlers(functions);
|
||||
|
||||
keys.PopulateTickets();
|
||||
keys.SynthesizeTickets();
|
||||
}
|
||||
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{1, &ETicket::ImportTicket, "ImportTicket"},
|
||||
FunctionInfo{2, nullptr, "ImportTicketCertificateSet"},
|
||||
FunctionInfo{3, nullptr, "DeleteTicket"},
|
||||
FunctionInfo{4, nullptr, "DeletePersonalizedTicket"},
|
||||
FunctionInfo{5, nullptr, "DeleteAllCommonTicket"},
|
||||
FunctionInfo{6, nullptr, "DeleteAllPersonalizedTicket"},
|
||||
FunctionInfo{7, nullptr, "DeleteAllPersonalizedTicketEx"},
|
||||
FunctionInfo{8, &ETicket::GetTitleKey, "GetTitleKey"},
|
||||
FunctionInfo{9, &ETicket::CountCommonTicket, "CountCommonTicket"},
|
||||
FunctionInfo{10, &ETicket::CountPersonalizedTicket, "CountPersonalizedTicket"},
|
||||
FunctionInfo{11, &ETicket::ListCommonTicketRightsIds, "ListCommonTicketRightsIds"},
|
||||
FunctionInfo{12, &ETicket::ListPersonalizedTicketRightsIds, "ListPersonalizedTicketRightsIds"},
|
||||
FunctionInfo{13, nullptr, "ListMissingPersonalizedTicket"},
|
||||
FunctionInfo{14, &ETicket::GetCommonTicketSize, "GetCommonTicketSize"},
|
||||
FunctionInfo{15, &ETicket::GetPersonalizedTicketSize, "GetPersonalizedTicketSize"},
|
||||
FunctionInfo{16, &ETicket::GetCommonTicketData, "GetCommonTicketData"},
|
||||
FunctionInfo{17, &ETicket::GetPersonalizedTicketData, "GetPersonalizedTicketData"},
|
||||
FunctionInfo{18, nullptr, "OwnTicket"},
|
||||
FunctionInfo{19, nullptr, "GetTicketInfo"},
|
||||
FunctionInfo{20, nullptr, "ListLightTicketInfo"},
|
||||
FunctionInfo{21, nullptr, "SignData"},
|
||||
FunctionInfo{22, nullptr, "GetCommonTicketAndCertificateSize"},
|
||||
FunctionInfo{23, nullptr, "GetCommonTicketAndCertificateData"},
|
||||
FunctionInfo{24, nullptr, "ImportPrepurchaseRecord"},
|
||||
FunctionInfo{25, nullptr, "DeletePrepurchaseRecord"},
|
||||
FunctionInfo{26, nullptr, "DeleteAllPrepurchaseRecord"},
|
||||
FunctionInfo{27, nullptr, "CountPrepurchaseRecord"},
|
||||
FunctionInfo{28, nullptr, "ListPrepurchaseRecordRightsIds"},
|
||||
FunctionInfo{29, nullptr, "ListPrepurchaseRecordInfo"},
|
||||
FunctionInfo{30, nullptr, "CountTicket"},
|
||||
FunctionInfo{31, nullptr, "ListTicketRightsIds"},
|
||||
FunctionInfo{32, nullptr, "CountPrepurchaseRecordEx"},
|
||||
FunctionInfo{33, nullptr, "ListPrepurchaseRecordRightsIdsEx"},
|
||||
FunctionInfo{34, nullptr, "GetEncryptedTicketSize"},
|
||||
FunctionInfo{35, nullptr, "GetEncryptedTicketData"},
|
||||
FunctionInfo{36, nullptr, "DeleteAllInactiveELicenseRequiredPersonalizedTicket"},
|
||||
FunctionInfo{37, nullptr, "OwnTicket2"},
|
||||
FunctionInfo{38, nullptr, "OwnTicket3"},
|
||||
FunctionInfo{39, nullptr, "DeleteAllInactivePersonalizedTicket"},
|
||||
FunctionInfo{40, nullptr, "DeletePrepurchaseRecordByNintendoAccountId"},
|
||||
FunctionInfo{101, nullptr, "Unknown101"}, //18.0.0+
|
||||
FunctionInfo{102, nullptr, "Unknown102"}, //18.0.0+
|
||||
FunctionInfo{103, nullptr, "Unknown103"}, //18.0.0+
|
||||
FunctionInfo{104, nullptr, "Unknown104"}, //18.0.0+
|
||||
FunctionInfo{105, nullptr, "Unknown105"}, //20.0.0+
|
||||
FunctionInfo{201, nullptr, "Unknown201"}, //18.0.0+
|
||||
FunctionInfo{202, nullptr, "Unknown202"}, //18.0.0+
|
||||
FunctionInfo{203, nullptr, "Unknown203"}, //18.0.0+
|
||||
FunctionInfo{204, nullptr, "Unknown204"}, //18.0.0+
|
||||
FunctionInfo{205, nullptr, "Unknown205"}, //18.0.0+
|
||||
FunctionInfo{501, nullptr, "Unknown501"},
|
||||
FunctionInfo{502, nullptr, "Unknown502"},
|
||||
FunctionInfo{503, nullptr, "GetTitleKey"},
|
||||
FunctionInfo{504, nullptr, "Unknown504"},
|
||||
FunctionInfo{508, nullptr, "Unknown508"},
|
||||
FunctionInfo{509, nullptr, "Unknown509"},
|
||||
FunctionInfo{510, nullptr, "Unknown510"},
|
||||
FunctionInfo{511, nullptr, "Unknown511"},
|
||||
FunctionInfo{1001, nullptr, "Unknown1001"},
|
||||
FunctionInfo{1002, nullptr, "Unknown1001"},
|
||||
FunctionInfo{1003, nullptr, "Unknown1003"},
|
||||
FunctionInfo{1004, nullptr, "Unknown1004"},
|
||||
FunctionInfo{1005, nullptr, "Unknown1005"},
|
||||
FunctionInfo{1006, nullptr, "Unknown1006"},
|
||||
FunctionInfo{1007, nullptr, "Unknown1007"},
|
||||
FunctionInfo{1009, nullptr, "Unknown1009"},
|
||||
FunctionInfo{1010, nullptr, "Unknown1010"},
|
||||
FunctionInfo{1011, nullptr, "Unknown1011"},
|
||||
FunctionInfo{1012, nullptr, "Unknown1012"},
|
||||
FunctionInfo{1013, nullptr, "Unknown1013"},
|
||||
FunctionInfo{1014, nullptr, "Unknown1014"},
|
||||
FunctionInfo{1015, nullptr, "Unknown1015"},
|
||||
FunctionInfo{1016, nullptr, "Unknown1016"},
|
||||
FunctionInfo{1017, nullptr, "Unknown1017"},
|
||||
FunctionInfo{1018, nullptr, "Unknown1018"},
|
||||
FunctionInfo{1019, nullptr, "Unknown1019"},
|
||||
FunctionInfo{1020, nullptr, "Unknown1020"},
|
||||
FunctionInfo{1021, nullptr, "Unknown1021"},
|
||||
FunctionInfo{1501, nullptr, "Unknown1501"},
|
||||
FunctionInfo{1502, nullptr, "Unknown1502"},
|
||||
FunctionInfo{1503, nullptr, "Unknown1503"},
|
||||
FunctionInfo{1504, nullptr, "Unknown1504"},
|
||||
FunctionInfo{1505, nullptr, "Unknown1505"},
|
||||
FunctionInfo{1506, nullptr, "Unknown1506"},
|
||||
FunctionInfo{2000, nullptr, "Unknown2000"},
|
||||
FunctionInfo{2001, nullptr, "Unknown2001"},
|
||||
FunctionInfo{2002, nullptr, "Unknown2002"},
|
||||
FunctionInfo{2003, nullptr, "Unknown2003"},
|
||||
FunctionInfo{2100, nullptr, "Unknown2100"},
|
||||
FunctionInfo{2501, nullptr, "Unknown2501"},
|
||||
FunctionInfo{2502, nullptr, "Unknown2502"},
|
||||
FunctionInfo{2601, nullptr, "Unknown2601"},
|
||||
FunctionInfo{3001, nullptr, "Unknown3001"},
|
||||
FunctionInfo{3002, nullptr, "Unknown3002"}
|
||||
);
|
||||
}
|
||||
|
||||
private:
|
||||
bool CheckRightsId(HLERequestContext& ctx, const u128& rights_id) {
|
||||
if (rights_id == u128{}) {
|
||||
@@ -323,83 +322,81 @@ private:
|
||||
class NDRM_LU final : public ServiceFramework<NDRM_LU> {
|
||||
public:
|
||||
explicit NDRM_LU(Core::System& system_)
|
||||
: ServiceFramework{system_, "ndrm:lu"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{1, nullptr, "Cmd1"},
|
||||
{2, nullptr, "Cmd2"},
|
||||
{3, nullptr, "Cmd3"},
|
||||
{1000, nullptr, "Cmd1000"},
|
||||
{8000, nullptr, "Cmd8000"},
|
||||
};
|
||||
// clang-format on
|
||||
RegisterHandlers(functions);
|
||||
: ServiceFramework{system_, "ndrm:lu"} {}
|
||||
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{1, nullptr, "Cmd1"},
|
||||
FunctionInfo{2, nullptr, "Cmd2"},
|
||||
FunctionInfo{3, nullptr, "Cmd3"},
|
||||
FunctionInfo{1000, nullptr, "Cmd1000"},
|
||||
FunctionInfo{8000, nullptr, "Cmd8000"}
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
class NDRM_LA final : public ServiceFramework<NDRM_LA> {
|
||||
public:
|
||||
explicit NDRM_LA(Core::System& system_)
|
||||
: ServiceFramework{system_, "ndrm:la"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{1, nullptr, "Cmd1"},
|
||||
{2, nullptr, "Cmd2"},
|
||||
{3, nullptr, "Cmd3"},
|
||||
{4, nullptr, "Cmd4"},
|
||||
{5, nullptr, "Cmd5"},
|
||||
{6, nullptr, "Cmd6"},
|
||||
{7, nullptr, "Cmd7"},
|
||||
{8, nullptr, "Cmd8"},
|
||||
{9, nullptr, "Cmd9"},
|
||||
{10, nullptr, "Cmd10"},
|
||||
{11, nullptr, "Cmd11"},
|
||||
{12, nullptr, "Cmd12"},
|
||||
{13, nullptr, "Cmd13"},
|
||||
{14, nullptr, "Cmd14"},
|
||||
{15, nullptr, "Cmd15"},
|
||||
{16, nullptr, "Cmd16"},
|
||||
{17, nullptr, "Cmd17"},
|
||||
{18, nullptr, "Cmd18"},
|
||||
{19, nullptr, "Cmd19"},
|
||||
{20, nullptr, "Cmd20"},
|
||||
{21, nullptr, "Cmd21"},
|
||||
{22, nullptr, "Cmd22"},
|
||||
{23, nullptr, "Cmd23"},
|
||||
{24, nullptr, "Cmd24"},
|
||||
{25, nullptr, "Cmd25"},
|
||||
{26, nullptr, "Cmd26"},
|
||||
{27, nullptr, "Cmd27"},
|
||||
{28, nullptr, "Cmd28"},
|
||||
{29, nullptr, "Cmd29"},
|
||||
{30, nullptr, "Cmd30"},
|
||||
{31, nullptr, "Cmd31"},
|
||||
{32, nullptr, "Cmd32"},
|
||||
{33, nullptr, "Cmd33"},
|
||||
{34, nullptr, "Cmd34"},
|
||||
{35, nullptr, "Cmd35"},
|
||||
{36, nullptr, "Cmd36"},
|
||||
{37, nullptr, "Cmd37"},
|
||||
{38, nullptr, "Cmd38"},
|
||||
{39, nullptr, "Cmd39"},
|
||||
{40, nullptr, "Cmd40"},
|
||||
{42, nullptr, "Cmd42"},
|
||||
{43, nullptr, "Cmd43"},
|
||||
{44, nullptr, "Cmd44"},
|
||||
{45, nullptr, "Cmd45"},
|
||||
{46, nullptr, "Cmd46"},
|
||||
{47, nullptr, "Cmd47"},
|
||||
{48, nullptr, "Cmd48"},
|
||||
{49, nullptr, "Cmd49"},
|
||||
{50, nullptr, "Cmd50"},
|
||||
{51, nullptr, "Cmd51"},
|
||||
{8000, nullptr, "Cmd8000"},
|
||||
{8001, nullptr, "Cmd8001"},
|
||||
{8002, nullptr, "Cmd8002"},
|
||||
{8003, nullptr, "Cmd8003"},
|
||||
};
|
||||
// clang-format on
|
||||
RegisterHandlers(functions);
|
||||
: ServiceFramework{system_, "ndrm:la"} {}
|
||||
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{1, nullptr, "Cmd1"},
|
||||
FunctionInfo{2, nullptr, "Cmd2"},
|
||||
FunctionInfo{3, nullptr, "Cmd3"},
|
||||
FunctionInfo{4, nullptr, "Cmd4"},
|
||||
FunctionInfo{5, nullptr, "Cmd5"},
|
||||
FunctionInfo{6, nullptr, "Cmd6"},
|
||||
FunctionInfo{7, nullptr, "Cmd7"},
|
||||
FunctionInfo{8, nullptr, "Cmd8"},
|
||||
FunctionInfo{9, nullptr, "Cmd9"},
|
||||
FunctionInfo{10, nullptr, "Cmd10"},
|
||||
FunctionInfo{11, nullptr, "Cmd11"},
|
||||
FunctionInfo{12, nullptr, "Cmd12"},
|
||||
FunctionInfo{13, nullptr, "Cmd13"},
|
||||
FunctionInfo{14, nullptr, "Cmd14"},
|
||||
FunctionInfo{15, nullptr, "Cmd15"},
|
||||
FunctionInfo{16, nullptr, "Cmd16"},
|
||||
FunctionInfo{17, nullptr, "Cmd17"},
|
||||
FunctionInfo{18, nullptr, "Cmd18"},
|
||||
FunctionInfo{19, nullptr, "Cmd19"},
|
||||
FunctionInfo{20, nullptr, "Cmd20"},
|
||||
FunctionInfo{21, nullptr, "Cmd21"},
|
||||
FunctionInfo{22, nullptr, "Cmd22"},
|
||||
FunctionInfo{23, nullptr, "Cmd23"},
|
||||
FunctionInfo{24, nullptr, "Cmd24"},
|
||||
FunctionInfo{25, nullptr, "Cmd25"},
|
||||
FunctionInfo{26, nullptr, "Cmd26"},
|
||||
FunctionInfo{27, nullptr, "Cmd27"},
|
||||
FunctionInfo{28, nullptr, "Cmd28"},
|
||||
FunctionInfo{29, nullptr, "Cmd29"},
|
||||
FunctionInfo{30, nullptr, "Cmd30"},
|
||||
FunctionInfo{31, nullptr, "Cmd31"},
|
||||
FunctionInfo{32, nullptr, "Cmd32"},
|
||||
FunctionInfo{33, nullptr, "Cmd33"},
|
||||
FunctionInfo{34, nullptr, "Cmd34"},
|
||||
FunctionInfo{35, nullptr, "Cmd35"},
|
||||
FunctionInfo{36, nullptr, "Cmd36"},
|
||||
FunctionInfo{37, nullptr, "Cmd37"},
|
||||
FunctionInfo{38, nullptr, "Cmd38"},
|
||||
FunctionInfo{39, nullptr, "Cmd39"},
|
||||
FunctionInfo{40, nullptr, "Cmd40"},
|
||||
FunctionInfo{42, nullptr, "Cmd42"},
|
||||
FunctionInfo{43, nullptr, "Cmd43"},
|
||||
FunctionInfo{44, nullptr, "Cmd44"},
|
||||
FunctionInfo{45, nullptr, "Cmd45"},
|
||||
FunctionInfo{46, nullptr, "Cmd46"},
|
||||
FunctionInfo{47, nullptr, "Cmd47"},
|
||||
FunctionInfo{48, nullptr, "Cmd48"},
|
||||
FunctionInfo{49, nullptr, "Cmd49"},
|
||||
FunctionInfo{50, nullptr, "Cmd50"},
|
||||
FunctionInfo{51, nullptr, "Cmd51"},
|
||||
FunctionInfo{8000, nullptr, "Cmd8000"},
|
||||
FunctionInfo{8001, nullptr, "Cmd8001"},
|
||||
FunctionInfo{8002, nullptr, "Cmd8002"},
|
||||
FunctionInfo{8003, nullptr, "Cmd8003"}
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
@@ -11,36 +14,32 @@ namespace Service::EUPLD {
|
||||
|
||||
class ErrorUploadContext final : public ServiceFramework<ErrorUploadContext> {
|
||||
public:
|
||||
explicit ErrorUploadContext(Core::System& system_) : ServiceFramework{system_, "eupld:c"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "SetUrl"},
|
||||
{1, nullptr, "ImportCrt"},
|
||||
{2, nullptr, "ImportPki"},
|
||||
{3, nullptr, "SetAutoUpload"},
|
||||
{4, nullptr, "GetAutoUpload"},
|
||||
};
|
||||
// clang-format on
|
||||
explicit ErrorUploadContext(Core::System& system_) : ServiceFramework{system_, "eupld:c"} {}
|
||||
|
||||
RegisterHandlers(functions);
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, nullptr, "SetUrl"},
|
||||
FunctionInfo{1, nullptr, "ImportCrt"},
|
||||
FunctionInfo{2, nullptr, "ImportPki"},
|
||||
FunctionInfo{3, nullptr, "SetAutoUpload"},
|
||||
FunctionInfo{4, nullptr, "GetAutoUpload"}
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
class ErrorUploadRequest final : public ServiceFramework<ErrorUploadRequest> {
|
||||
public:
|
||||
explicit ErrorUploadRequest(Core::System& system_) : ServiceFramework{system_, "eupld:r"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "Initialize"},
|
||||
{1, nullptr, "UploadAll"},
|
||||
{2, nullptr, "UploadSelected"},
|
||||
{3, nullptr, "GetUploadStatus"},
|
||||
{4, nullptr, "CancelUpload"},
|
||||
{5, nullptr, "GetResult"},
|
||||
};
|
||||
// clang-format on
|
||||
explicit ErrorUploadRequest(Core::System& system_) : ServiceFramework{system_, "eupld:r"} {}
|
||||
|
||||
RegisterHandlers(functions);
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, nullptr, "Initialize"},
|
||||
FunctionInfo{1, nullptr, "UploadAll"},
|
||||
FunctionInfo{2, nullptr, "UploadSelected"},
|
||||
FunctionInfo{3, nullptr, "GetUploadStatus"},
|
||||
FunctionInfo{4, nullptr, "CancelUpload"},
|
||||
FunctionInfo{5, nullptr, "GetResult"}
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -16,30 +16,26 @@ namespace Service::FGM {
|
||||
|
||||
class IRequest final : public ServiceFramework<IRequest> {
|
||||
public:
|
||||
explicit IRequest(Core::System& system_) : ServiceFramework{system_, "IRequest"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "Initialize"},
|
||||
{1, nullptr, "Set"},
|
||||
{2, nullptr, "Get"},
|
||||
{3, nullptr, "Cancel"},
|
||||
};
|
||||
// clang-format on
|
||||
explicit IRequest(Core::System& system_) : ServiceFramework{system_, "IRequest"} {}
|
||||
|
||||
RegisterHandlers(functions);
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, nullptr, "Initialize"},
|
||||
FunctionInfo{1, nullptr, "Set"},
|
||||
FunctionInfo{2, nullptr, "Get"},
|
||||
FunctionInfo{3, nullptr, "Cancel"}
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
class FGM final : public ServiceFramework<FGM> {
|
||||
public:
|
||||
explicit FGM(Core::System& system_, const char* name) : ServiceFramework{system_, name} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, &FGM::Initialize, "Initialize"},
|
||||
};
|
||||
// clang-format on
|
||||
explicit FGM(Core::System& system_, const char* name) : ServiceFramework{system_, name} {}
|
||||
|
||||
RegisterHandlers(functions);
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, &FGM::Initialize, "Initialize"}
|
||||
);
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -54,16 +50,14 @@ private:
|
||||
|
||||
class FGM_DBG final : public ServiceFramework<FGM_DBG> {
|
||||
public:
|
||||
explicit FGM_DBG(Core::System& system_) : ServiceFramework{system_, "fgm:dbg"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "Initialize"},
|
||||
{1, nullptr, "Read"},
|
||||
{2, nullptr, "Cancel"},
|
||||
};
|
||||
// clang-format on
|
||||
explicit FGM_DBG(Core::System& system_) : ServiceFramework{system_, "fgm:dbg"} {}
|
||||
|
||||
RegisterHandlers(functions);
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, nullptr, "Initialize"},
|
||||
FunctionInfo{1, nullptr, "Read"},
|
||||
FunctionInfo{2, nullptr, "Cancel"}
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -22,128 +22,126 @@ class IFriendService final : public ServiceFramework<IFriendService> {
|
||||
public:
|
||||
explicit IFriendService(Core::System& system_)
|
||||
: ServiceFramework{system_, "IFriendService"}, service_context{system, "IFriendService"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, &IFriendService::GetCompletionEvent, "GetCompletionEvent"},
|
||||
{1, &IFriendService::Cancel, "Cancel"},
|
||||
{10100, nullptr, "GetFriendListIds"},
|
||||
{10101, &IFriendService::GetFriendList, "GetFriendList"},
|
||||
{10102, nullptr, "UpdateFriendInfo"},
|
||||
{10110, nullptr, "GetFriendProfileImage"},
|
||||
{10111, nullptr, "GetFriendProfileImageWithImageSize"}, // 18.0.0+
|
||||
{10120, &IFriendService::CheckFriendListAvailability, "CheckFriendListAvailability"},
|
||||
{10121, nullptr, "EnsureFriendListAvailable"},
|
||||
{10200, nullptr, "SendFriendRequestForApplication"},
|
||||
{10211, nullptr, "AddFacedFriendRequestForApplication"},
|
||||
{10400, &IFriendService::GetBlockedUserListIds, "GetBlockedUserListIds"},
|
||||
{10420, &IFriendService::CheckBlockedUserListAvailability, "CheckBlockedUserListAvailability"},
|
||||
{10421, nullptr, "EnsureBlockedUserListAvailable"},
|
||||
{10500, nullptr, "GetProfileList"},
|
||||
{10501, nullptr, "GetProfileListV2"}, // 18.0.0+
|
||||
{10600, nullptr, "DeclareOpenOnlinePlaySession"},
|
||||
{10601, &IFriendService::DeclareCloseOnlinePlaySession, "DeclareCloseOnlinePlaySession"},
|
||||
{10610, &IFriendService::UpdateUserPresence, "UpdateUserPresence"},
|
||||
{10700, &IFriendService::GetPlayHistoryRegistrationKey, "GetPlayHistoryRegistrationKey"},
|
||||
{10701, nullptr, "GetPlayHistoryRegistrationKeyWithNetworkServiceAccountId"},
|
||||
{10702, nullptr, "AddPlayHistory"},
|
||||
{11000, nullptr, "GetProfileImageUrl"},
|
||||
{11001, nullptr, "GetProfileImageUrlV2"}, // 18.0.0+
|
||||
{20100, &IFriendService::GetFriendCount, "GetFriendCount"},
|
||||
{20101, &IFriendService::GetNewlyFriendCount, "GetNewlyFriendCount"},
|
||||
{20102, nullptr, "GetFriendDetailedInfo"},
|
||||
{20103, nullptr, "SyncFriendList"},
|
||||
{20104, &IFriendService::RequestSyncFriendList, "RequestSyncFriendList"},
|
||||
{20105, &IFriendService::GetFriendListForViewer, "GetFriendListForViewerV1"},
|
||||
{20106, nullptr, "UpdateFriendInfoForViewerV1"},
|
||||
{20107, nullptr, "GetFriendDetailedInfoV2"}, // 20.0.0+
|
||||
{20108, &IFriendService::GetFriendListForViewer, "GetFriendListForViewerV2"}, // 22.0.0+
|
||||
{20109, nullptr, "UpdateFriendInfoForViewerV2"}, // 22.0.0+
|
||||
{20110, nullptr, "LoadFriendSettingV1"},
|
||||
{20111, nullptr, "LoadFriendSettingV2"}, // 22.0.0+
|
||||
{20200, &IFriendService::GetReceivedFriendRequestCount, "GetReceivedFriendRequestCount"},
|
||||
{20201, nullptr, "GetFriendRequestListV1"},
|
||||
{20202, nullptr, "GetFriendRequestListV2"}, // 20.0.0+
|
||||
{20203, nullptr, "GetFriendRequestReceivedNotificationCount"}, // 22.0.0+
|
||||
{20300, nullptr, "GetFriendCandidateList"},
|
||||
{20301, nullptr, "GetNintendoNetworkIdInfo"},
|
||||
{20302, nullptr, "GetSnsAccountLinkage"}, // 5.0.0-19.0.1
|
||||
{20303, nullptr, "GetSnsAccountProfile"}, // 5.0.0-19.0.1
|
||||
{20304, nullptr, "GetSnsAccountFriendList"}, // 5.0.0-19.0.1
|
||||
{20400, nullptr, "GetBlockedUserListV1"},
|
||||
{20401, nullptr, "SyncBlockedUserList"},
|
||||
{20402, nullptr, "GetBlockedUserListV2"}, // 20.0.0+
|
||||
{20500, nullptr, "GetProfileExtraListV1"},
|
||||
{20501, nullptr, "GetRelationship"},
|
||||
{20502, nullptr, "GetProfileExtraListV2"}, // 19.0.0+
|
||||
{20600, &IFriendService::GetUserPresenceView, "GetUserPresenceViewV1"},
|
||||
{20601, &IFriendService::GetUserPresenceView, "GetUserPresenceViewV2"}, // 19.0.0+
|
||||
{20700, nullptr, "GetPlayHistoryListV1"},
|
||||
{20701, &IFriendService::GetPlayHistoryStatistics, "GetPlayHistoryStatistics"},
|
||||
{20702, nullptr, "GetPlayHistoryListV2"}, // 19.0.0+
|
||||
{20800, &IFriendService::LoadUserSetting, "LoadUserSettingV1"},
|
||||
{20801, nullptr, "SyncUserSetting"},
|
||||
{20802, &IFriendService::LoadUserSetting, "LoadUserSettingV2"}, // 19.0.0+
|
||||
{20900, &IFriendService::RequestListSummaryOverlayNotification, "RequestListSummaryOverlayNotification"},
|
||||
{21000, nullptr, "GetExternalApplicationCatalog"},
|
||||
{22000, nullptr, "GetReceivedFriendInvitationListV1"},
|
||||
{22001, nullptr, "GetReceivedFriendInvitationDetailedInfoV1"},
|
||||
{22002, nullptr, "GetReceivedFriendInvitationListV2"}, // 19.0.0+
|
||||
{22003, nullptr, "GetReceivedFriendInvitationDetailedInfoV2"}, // 19.0.0+
|
||||
{22010, &IFriendService::GetReceivedFriendInvitationCountCache, "GetReceivedFriendInvitationCountCache"},
|
||||
{30100, nullptr, "DropFriendNewlyFlags"},
|
||||
{30101, nullptr, "DeleteFriend"},
|
||||
{30110, nullptr, "DropFriendNewlyFlag"},
|
||||
{30120, nullptr, "ChangeFriendFavoriteFlag"},
|
||||
{30121, nullptr, "ChangeFriendOnlineNotificationFlag"},
|
||||
{30130, nullptr, "SetFriendNote"}, // 22.0.0+
|
||||
{30131, nullptr, "RequestUploadPendingNote"}, // 22.0.0+
|
||||
{30190, nullptr, "RequestSyncLocalUpdates"}, // 22.0.0+
|
||||
{30200, nullptr, "SendFriendRequest"},
|
||||
{30201, nullptr, "SendFriendRequestWithApplicationInfoV1"},
|
||||
{30202, nullptr, "CancelFriendRequest"},
|
||||
{30203, nullptr, "AcceptFriendRequest"},
|
||||
{30204, nullptr, "RejectFriendRequest"},
|
||||
{30205, nullptr, "ReadFriendRequest"},
|
||||
{30210, nullptr, "GetFacedFriendRequestRegistrationKey"},
|
||||
{30211, nullptr, "AddFacedFriendRequest"},
|
||||
{30212, nullptr, "CancelFacedFriendRequest"},
|
||||
{30213, nullptr, "GetFacedFriendRequestProfileImage"},
|
||||
{30214, nullptr, "GetFacedFriendRequestProfileImageFromPath"},
|
||||
{30215, nullptr, "SendFriendRequestWithExternalApplicationCatalogId"},
|
||||
{30216, nullptr, "ResendFacedFriendRequest"},
|
||||
{30217, nullptr, "SendFriendRequestWithNintendoNetworkIdInfo"},
|
||||
{30218, nullptr, "SendFriendRequestWithApplicationInfoV2"}, // 20.0.0+
|
||||
{30300, nullptr, "GetSnsAccountLinkPageUrl"}, // 5.0.0-19.0.1
|
||||
{30301, nullptr, "UnlinkSnsAccount"}, // 5.0.0-19.0.1
|
||||
{30400, nullptr, "BlockUser"},
|
||||
{30401, nullptr, "BlockUserWithApplicationInfoV1"},
|
||||
{30402, nullptr, "UnblockUser"},
|
||||
{30403, nullptr, "BlockUserWithApplicationInfoV2"}, // 20.0.0+
|
||||
{30500, nullptr, "GetProfileExtraFromFriendCodeV1"},
|
||||
{30501, nullptr, "GetProfileExtraFromFriendCodeV2"}, // 19.0.0+
|
||||
{30700, nullptr, "DeletePlayHistory"},
|
||||
{30701, nullptr, "AddPlayHistoryWithApplication"}, // 19.0.0+
|
||||
{30810, nullptr, "ChangePresencePermission"},
|
||||
{30811, nullptr, "ChangeFriendRequestReception"},
|
||||
{30812, nullptr, "ChangePlayLogPermission"},
|
||||
{30820, nullptr, "IssueFriendCode"},
|
||||
{30830, nullptr, "ClearPlayLog"},
|
||||
{30900, nullptr, "SendFriendInvitationV1"},
|
||||
{30901, nullptr, "SendFriendInvitationV2"}, // 19.0.0+
|
||||
{30910, nullptr, "ReadFriendInvitation"},
|
||||
{30911, nullptr, "ReadAllFriendInvitations"},
|
||||
{31000, nullptr, "OpenUser"}, // 19.0.0+
|
||||
{40100, nullptr, "DeleteFriendListCache"},
|
||||
{40400, nullptr, "DeleteBlockedUserListCache"},
|
||||
{49900, nullptr, "DeleteNetworkServiceAccountCache"},
|
||||
};
|
||||
// clang-format on
|
||||
|
||||
RegisterHandlers(functions);
|
||||
|
||||
completion_event = service_context.CreateEvent("IFriendService:CompletionEvent");
|
||||
}
|
||||
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, &IFriendService::GetCompletionEvent, "GetCompletionEvent"},
|
||||
FunctionInfo{1, &IFriendService::Cancel, "Cancel"},
|
||||
FunctionInfo{10100, nullptr, "GetFriendListIds"},
|
||||
FunctionInfo{10101, &IFriendService::GetFriendList, "GetFriendList"},
|
||||
FunctionInfo{10102, nullptr, "UpdateFriendInfo"},
|
||||
FunctionInfo{10110, nullptr, "GetFriendProfileImage"},
|
||||
FunctionInfo{10111, nullptr, "GetFriendProfileImageWithImageSize"}, // 18.0.0+
|
||||
FunctionInfo{10120, &IFriendService::CheckFriendListAvailability, "CheckFriendListAvailability"},
|
||||
FunctionInfo{10121, nullptr, "EnsureFriendListAvailable"},
|
||||
FunctionInfo{10200, nullptr, "SendFriendRequestForApplication"},
|
||||
FunctionInfo{10211, nullptr, "AddFacedFriendRequestForApplication"},
|
||||
FunctionInfo{10400, &IFriendService::GetBlockedUserListIds, "GetBlockedUserListIds"},
|
||||
FunctionInfo{10420, &IFriendService::CheckBlockedUserListAvailability, "CheckBlockedUserListAvailability"},
|
||||
FunctionInfo{10421, nullptr, "EnsureBlockedUserListAvailable"},
|
||||
FunctionInfo{10500, nullptr, "GetProfileList"},
|
||||
FunctionInfo{10501, nullptr, "GetProfileListV2"}, // 18.0.0+
|
||||
FunctionInfo{10600, nullptr, "DeclareOpenOnlinePlaySession"},
|
||||
FunctionInfo{10601, &IFriendService::DeclareCloseOnlinePlaySession, "DeclareCloseOnlinePlaySession"},
|
||||
FunctionInfo{10610, &IFriendService::UpdateUserPresence, "UpdateUserPresence"},
|
||||
FunctionInfo{10700, &IFriendService::GetPlayHistoryRegistrationKey, "GetPlayHistoryRegistrationKey"},
|
||||
FunctionInfo{10701, nullptr, "GetPlayHistoryRegistrationKeyWithNetworkServiceAccountId"},
|
||||
FunctionInfo{10702, nullptr, "AddPlayHistory"},
|
||||
FunctionInfo{11000, nullptr, "GetProfileImageUrl"},
|
||||
FunctionInfo{11001, nullptr, "GetProfileImageUrlV2"}, // 18.0.0+
|
||||
FunctionInfo{20100, &IFriendService::GetFriendCount, "GetFriendCount"},
|
||||
FunctionInfo{20101, &IFriendService::GetNewlyFriendCount, "GetNewlyFriendCount"},
|
||||
FunctionInfo{20102, nullptr, "GetFriendDetailedInfo"},
|
||||
FunctionInfo{20103, nullptr, "SyncFriendList"},
|
||||
FunctionInfo{20104, &IFriendService::RequestSyncFriendList, "RequestSyncFriendList"},
|
||||
FunctionInfo{20105, &IFriendService::GetFriendListForViewer, "GetFriendListForViewerV1"},
|
||||
FunctionInfo{20106, nullptr, "UpdateFriendInfoForViewerV1"},
|
||||
FunctionInfo{20107, nullptr, "GetFriendDetailedInfoV2"}, // 20.0.0+
|
||||
FunctionInfo{20108, &IFriendService::GetFriendListForViewer, "GetFriendListForViewerV2"}, // 22.0.0+
|
||||
FunctionInfo{20109, nullptr, "UpdateFriendInfoForViewerV2"}, // 22.0.0+
|
||||
FunctionInfo{20110, nullptr, "LoadFriendSettingV1"},
|
||||
FunctionInfo{20111, nullptr, "LoadFriendSettingV2"}, // 22.0.0+
|
||||
FunctionInfo{20200, &IFriendService::GetReceivedFriendRequestCount, "GetReceivedFriendRequestCount"},
|
||||
FunctionInfo{20201, nullptr, "GetFriendRequestListV1"},
|
||||
FunctionInfo{20202, nullptr, "GetFriendRequestListV2"}, // 20.0.0+
|
||||
FunctionInfo{20203, nullptr, "GetFriendRequestReceivedNotificationCount"}, // 22.0.0+
|
||||
FunctionInfo{20300, nullptr, "GetFriendCandidateList"},
|
||||
FunctionInfo{20301, nullptr, "GetNintendoNetworkIdInfo"},
|
||||
FunctionInfo{20302, nullptr, "GetSnsAccountLinkage"}, // 5.0.0-19.0.1
|
||||
FunctionInfo{20303, nullptr, "GetSnsAccountProfile"}, // 5.0.0-19.0.1
|
||||
FunctionInfo{20304, nullptr, "GetSnsAccountFriendList"}, // 5.0.0-19.0.1
|
||||
FunctionInfo{20400, nullptr, "GetBlockedUserListV1"},
|
||||
FunctionInfo{20401, nullptr, "SyncBlockedUserList"},
|
||||
FunctionInfo{20402, nullptr, "GetBlockedUserListV2"}, // 20.0.0+
|
||||
FunctionInfo{20500, nullptr, "GetProfileExtraListV1"},
|
||||
FunctionInfo{20501, nullptr, "GetRelationship"},
|
||||
FunctionInfo{20502, nullptr, "GetProfileExtraListV2"}, // 19.0.0+
|
||||
FunctionInfo{20600, &IFriendService::GetUserPresenceView, "GetUserPresenceViewV1"},
|
||||
FunctionInfo{20601, &IFriendService::GetUserPresenceView, "GetUserPresenceViewV2"}, // 19.0.0+
|
||||
FunctionInfo{20700, nullptr, "GetPlayHistoryListV1"},
|
||||
FunctionInfo{20701, &IFriendService::GetPlayHistoryStatistics, "GetPlayHistoryStatistics"},
|
||||
FunctionInfo{20702, nullptr, "GetPlayHistoryListV2"}, // 19.0.0+
|
||||
FunctionInfo{20800, &IFriendService::LoadUserSetting, "LoadUserSettingV1"},
|
||||
FunctionInfo{20801, nullptr, "SyncUserSetting"},
|
||||
FunctionInfo{20802, &IFriendService::LoadUserSetting, "LoadUserSettingV2"}, // 19.0.0+
|
||||
FunctionInfo{20900, &IFriendService::RequestListSummaryOverlayNotification, "RequestListSummaryOverlayNotification"},
|
||||
FunctionInfo{21000, nullptr, "GetExternalApplicationCatalog"},
|
||||
FunctionInfo{22000, nullptr, "GetReceivedFriendInvitationListV1"},
|
||||
FunctionInfo{22001, nullptr, "GetReceivedFriendInvitationDetailedInfoV1"},
|
||||
FunctionInfo{22002, nullptr, "GetReceivedFriendInvitationListV2"}, // 19.0.0+
|
||||
FunctionInfo{22003, nullptr, "GetReceivedFriendInvitationDetailedInfoV2"}, // 19.0.0+
|
||||
FunctionInfo{22010, &IFriendService::GetReceivedFriendInvitationCountCache, "GetReceivedFriendInvitationCountCache"},
|
||||
FunctionInfo{30100, nullptr, "DropFriendNewlyFlags"},
|
||||
FunctionInfo{30101, nullptr, "DeleteFriend"},
|
||||
FunctionInfo{30110, nullptr, "DropFriendNewlyFlag"},
|
||||
FunctionInfo{30120, nullptr, "ChangeFriendFavoriteFlag"},
|
||||
FunctionInfo{30121, nullptr, "ChangeFriendOnlineNotificationFlag"},
|
||||
FunctionInfo{30130, nullptr, "SetFriendNote"}, // 22.0.0+
|
||||
FunctionInfo{30131, nullptr, "RequestUploadPendingNote"}, // 22.0.0+
|
||||
FunctionInfo{30190, nullptr, "RequestSyncLocalUpdates"}, // 22.0.0+
|
||||
FunctionInfo{30200, nullptr, "SendFriendRequest"},
|
||||
FunctionInfo{30201, nullptr, "SendFriendRequestWithApplicationInfoV1"},
|
||||
FunctionInfo{30202, nullptr, "CancelFriendRequest"},
|
||||
FunctionInfo{30203, nullptr, "AcceptFriendRequest"},
|
||||
FunctionInfo{30204, nullptr, "RejectFriendRequest"},
|
||||
FunctionInfo{30205, nullptr, "ReadFriendRequest"},
|
||||
FunctionInfo{30210, nullptr, "GetFacedFriendRequestRegistrationKey"},
|
||||
FunctionInfo{30211, nullptr, "AddFacedFriendRequest"},
|
||||
FunctionInfo{30212, nullptr, "CancelFacedFriendRequest"},
|
||||
FunctionInfo{30213, nullptr, "GetFacedFriendRequestProfileImage"},
|
||||
FunctionInfo{30214, nullptr, "GetFacedFriendRequestProfileImageFromPath"},
|
||||
FunctionInfo{30215, nullptr, "SendFriendRequestWithExternalApplicationCatalogId"},
|
||||
FunctionInfo{30216, nullptr, "ResendFacedFriendRequest"},
|
||||
FunctionInfo{30217, nullptr, "SendFriendRequestWithNintendoNetworkIdInfo"},
|
||||
FunctionInfo{30218, nullptr, "SendFriendRequestWithApplicationInfoV2"}, // 20.0.0+
|
||||
FunctionInfo{30300, nullptr, "GetSnsAccountLinkPageUrl"}, // 5.0.0-19.0.1
|
||||
FunctionInfo{30301, nullptr, "UnlinkSnsAccount"}, // 5.0.0-19.0.1
|
||||
FunctionInfo{30400, nullptr, "BlockUser"},
|
||||
FunctionInfo{30401, nullptr, "BlockUserWithApplicationInfoV1"},
|
||||
FunctionInfo{30402, nullptr, "UnblockUser"},
|
||||
FunctionInfo{30403, nullptr, "BlockUserWithApplicationInfoV2"}, // 20.0.0+
|
||||
FunctionInfo{30500, nullptr, "GetProfileExtraFromFriendCodeV1"},
|
||||
FunctionInfo{30501, nullptr, "GetProfileExtraFromFriendCodeV2"}, // 19.0.0+
|
||||
FunctionInfo{30700, nullptr, "DeletePlayHistory"},
|
||||
FunctionInfo{30701, nullptr, "AddPlayHistoryWithApplication"}, // 19.0.0+
|
||||
FunctionInfo{30810, nullptr, "ChangePresencePermission"},
|
||||
FunctionInfo{30811, nullptr, "ChangeFriendRequestReception"},
|
||||
FunctionInfo{30812, nullptr, "ChangePlayLogPermission"},
|
||||
FunctionInfo{30820, nullptr, "IssueFriendCode"},
|
||||
FunctionInfo{30830, nullptr, "ClearPlayLog"},
|
||||
FunctionInfo{30900, nullptr, "SendFriendInvitationV1"},
|
||||
FunctionInfo{30901, nullptr, "SendFriendInvitationV2"}, // 19.0.0+
|
||||
FunctionInfo{30910, nullptr, "ReadFriendInvitation"},
|
||||
FunctionInfo{30911, nullptr, "ReadAllFriendInvitations"},
|
||||
FunctionInfo{31000, nullptr, "OpenUser"}, // 19.0.0+
|
||||
FunctionInfo{40100, nullptr, "DeleteFriendListCache"},
|
||||
FunctionInfo{40400, nullptr, "DeleteBlockedUserListCache"},
|
||||
FunctionInfo{49900, nullptr, "DeleteNetworkServiceAccountCache"}
|
||||
);
|
||||
}
|
||||
|
||||
~IFriendService() override {
|
||||
service_context.CloseEvent(completion_event);
|
||||
}
|
||||
@@ -375,21 +373,19 @@ private:
|
||||
class INotificationService final : public ServiceFramework<INotificationService> {
|
||||
public:
|
||||
explicit INotificationService(Core::System& system_, Common::UUID uuid_)
|
||||
: ServiceFramework{system_, "INotificationService"}, uuid{uuid_},
|
||||
service_context{system_, "INotificationService"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, &INotificationService::GetEvent, "GetEvent"},
|
||||
{1, &INotificationService::Clear, "Clear"},
|
||||
{2, &INotificationService::Pop, "Pop"}
|
||||
};
|
||||
// clang-format on
|
||||
|
||||
RegisterHandlers(functions);
|
||||
|
||||
: ServiceFramework{system_, "INotificationService"}, uuid{uuid_}
|
||||
, service_context{system_, "INotificationService"} {
|
||||
notification_event = service_context.CreateEvent("INotificationService:NotifyEvent");
|
||||
}
|
||||
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, &INotificationService::GetEvent, "GetEvent"},
|
||||
FunctionInfo{1, &INotificationService::Clear, "Clear"},
|
||||
FunctionInfo{2, &INotificationService::Pop, "Pop"}
|
||||
);
|
||||
}
|
||||
|
||||
~INotificationService() override {
|
||||
service_context.CloseEvent(notification_event);
|
||||
}
|
||||
@@ -501,12 +497,13 @@ class IServiceForApplication final : public ServiceFramework<IServiceForApplicat
|
||||
public:
|
||||
explicit IServiceForApplication(Core::System& system_)
|
||||
: ServiceFramework{system_, "nd:app"}
|
||||
{
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "GetReceivableNeighborInfoCountMax"},
|
||||
{10, nullptr, "IsNeighborDetectionEnabled"},
|
||||
};
|
||||
RegisterHandlers(functions);
|
||||
{}
|
||||
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, nullptr, "GetReceivableNeighborInfoCountMax"},
|
||||
FunctionInfo{10, nullptr, "IsNeighborDetectionEnabled"}
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -514,47 +511,48 @@ class IServiceForSystem final : public ServiceFramework<IServiceForSystem> {
|
||||
public:
|
||||
explicit IServiceForSystem(Core::System& system_)
|
||||
: ServiceFramework{system_, "nd:sys"}
|
||||
{
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "GetReceivableNeighborInfoCountMax"},
|
||||
{10, nullptr, "IsNeighborDetectionEnabled"},
|
||||
{200, nullptr, "SetSystemData"},
|
||||
{201, nullptr, "ClearSystemData"},
|
||||
{203, nullptr, "GetReceivableNeighborInfoCountForSystem"},
|
||||
{204, nullptr, "ReceiveNeighborInfoForSystem"},
|
||||
{205, nullptr, "SetSender"},
|
||||
{206, nullptr, "GetSender"},
|
||||
{207, nullptr, "CreateScannerForSystem"},
|
||||
{208, nullptr, "CreateReceiveEventHolderForSystem"},
|
||||
{223, nullptr, "EnableNeighborDetection"},
|
||||
{224, nullptr, "DisableNeighborDetection"},
|
||||
{226, nullptr, "EnablePowerSave"},
|
||||
{227, nullptr, "DisablePowerSave"},
|
||||
{228, nullptr, "IsPowerSaveEnabled"},
|
||||
{232, nullptr, "ClearBlockedUsers"},
|
||||
{233, nullptr, "GetBlockedUserCount"},
|
||||
{234, nullptr, "BlockUserByLocalUserId"},
|
||||
{235, nullptr, "BlockUserByNetworkUserId"},
|
||||
{236, nullptr, "UnblockUserByLocalUserId"},
|
||||
{237, nullptr, "UnblockUserByNetworkUserId"},
|
||||
{240, nullptr, "DeleteApplication"},
|
||||
{250, nullptr, "InitializeApplicationInfo"},
|
||||
{260, nullptr, "CreateAccountSystemSaveDataAccessSuppressor"},
|
||||
{300, nullptr, "AddReceivedNeighborInfoForSystemForDebug"},
|
||||
{301, nullptr, "GetSendDataForDebug"},
|
||||
{302, nullptr, "ClearReceiveCounterForDebug"},
|
||||
{303, nullptr, "GetNextReceiveCounterForDebug"},
|
||||
{304, nullptr, "ListBlockedUsersForDebug"},
|
||||
{305, nullptr, "RefreshSendDataIdForDebug"},
|
||||
{306, nullptr, "ReloadFwdbgSettingsForDebug"},
|
||||
{307, nullptr, "EnableApplicationForDebug"},
|
||||
{308, nullptr, "GetNextReceiveCountersForDebug"},
|
||||
{309, nullptr, "ListApplicationInfoForDebug"},
|
||||
{310, nullptr, "SetApplicationDataForDebug"},
|
||||
{400, nullptr, "GetNetworkUserId"},
|
||||
{401, nullptr, "DeleteNetworkUserId"},
|
||||
};
|
||||
RegisterHandlers(functions);
|
||||
{}
|
||||
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, nullptr, "GetReceivableNeighborInfoCountMax"},
|
||||
FunctionInfo{10, nullptr, "IsNeighborDetectionEnabled"},
|
||||
FunctionInfo{200, nullptr, "SetSystemData"},
|
||||
FunctionInfo{201, nullptr, "ClearSystemData"},
|
||||
FunctionInfo{203, nullptr, "GetReceivableNeighborInfoCountForSystem"},
|
||||
FunctionInfo{204, nullptr, "ReceiveNeighborInfoForSystem"},
|
||||
FunctionInfo{205, nullptr, "SetSender"},
|
||||
FunctionInfo{206, nullptr, "GetSender"},
|
||||
FunctionInfo{207, nullptr, "CreateScannerForSystem"},
|
||||
FunctionInfo{208, nullptr, "CreateReceiveEventHolderForSystem"},
|
||||
FunctionInfo{223, nullptr, "EnableNeighborDetection"},
|
||||
FunctionInfo{224, nullptr, "DisableNeighborDetection"},
|
||||
FunctionInfo{226, nullptr, "EnablePowerSave"},
|
||||
FunctionInfo{227, nullptr, "DisablePowerSave"},
|
||||
FunctionInfo{228, nullptr, "IsPowerSaveEnabled"},
|
||||
FunctionInfo{232, nullptr, "ClearBlockedUsers"},
|
||||
FunctionInfo{233, nullptr, "GetBlockedUserCount"},
|
||||
FunctionInfo{234, nullptr, "BlockUserByLocalUserId"},
|
||||
FunctionInfo{235, nullptr, "BlockUserByNetworkUserId"},
|
||||
FunctionInfo{236, nullptr, "UnblockUserByLocalUserId"},
|
||||
FunctionInfo{237, nullptr, "UnblockUserByNetworkUserId"},
|
||||
FunctionInfo{240, nullptr, "DeleteApplication"},
|
||||
FunctionInfo{250, nullptr, "InitializeApplicationInfo"},
|
||||
FunctionInfo{260, nullptr, "CreateAccountSystemSaveDataAccessSuppressor"},
|
||||
FunctionInfo{300, nullptr, "AddReceivedNeighborInfoForSystemForDebug"},
|
||||
FunctionInfo{301, nullptr, "GetSendDataForDebug"},
|
||||
FunctionInfo{302, nullptr, "ClearReceiveCounterForDebug"},
|
||||
FunctionInfo{303, nullptr, "GetNextReceiveCounterForDebug"},
|
||||
FunctionInfo{304, nullptr, "ListBlockedUsersForDebug"},
|
||||
FunctionInfo{305, nullptr, "RefreshSendDataIdForDebug"},
|
||||
FunctionInfo{306, nullptr, "ReloadFwdbgSettingsForDebug"},
|
||||
FunctionInfo{307, nullptr, "EnableApplicationForDebug"},
|
||||
FunctionInfo{308, nullptr, "GetNextReceiveCountersForDebug"},
|
||||
FunctionInfo{309, nullptr, "ListApplicationInfoForDebug"},
|
||||
FunctionInfo{310, nullptr, "SetApplicationDataForDebug"},
|
||||
FunctionInfo{400, nullptr, "GetNetworkUserId"},
|
||||
FunctionInfo{401, nullptr, "DeleteNetworkUserId"}
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -164,16 +164,14 @@ public:
|
||||
using IssuerFn = std::function<Result(u64, ApplicationLaunchProperty, std::vector<u8>)>;
|
||||
|
||||
explicit IRegistrar(Core::System& system_, IssuerFn&& issuer)
|
||||
: ServiceFramework{system_, "IRegistrar"}, issue_process_id{std::move(issuer)} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, &IRegistrar::Issue, "Issue"},
|
||||
{1, &IRegistrar::SetApplicationLaunchProperty, "SetApplicationLaunchProperty"},
|
||||
{2, &IRegistrar::SetApplicationControlProperty, "SetApplicationControlProperty"},
|
||||
};
|
||||
// clang-format on
|
||||
: ServiceFramework{system_, "IRegistrar"}, issue_process_id{std::move(issuer)} {}
|
||||
|
||||
RegisterHandlers(functions);
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, &IRegistrar::Issue, "Issue"},
|
||||
FunctionInfo{1, &IRegistrar::SetApplicationLaunchProperty, "SetApplicationLaunchProperty"},
|
||||
FunctionInfo{2, &IRegistrar::SetApplicationControlProperty, "SetApplicationControlProperty"}
|
||||
);
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -248,9 +246,9 @@ ARP_W::ARP_W(Core::System& system_, ARPManager& manager_)
|
||||
: ServiceFramework{system_, "arp:w"}, manager{manager_} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, &ARP_W::AcquireRegistrar, "AcquireRegistrar"},
|
||||
{1, &ARP_W::UnregisterApplicationInstance , "UnregisterApplicationInstance "},
|
||||
{2, nullptr, "AcquireUpdater"},
|
||||
FunctionInfo{0, &ARP_W::AcquireRegistrar, "AcquireRegistrar"},
|
||||
FunctionInfo{1, &ARP_W::UnregisterApplicationInstance , "UnregisterApplicationInstance "},
|
||||
FunctionInfo{2, nullptr, "AcquireUpdater"}
|
||||
};
|
||||
// clang-format on
|
||||
|
||||
|
||||
@@ -12,14 +12,12 @@ namespace Service::Glue {
|
||||
// This is nn::err::context::IContextRegistrar
|
||||
class IContextRegistrar : public ServiceFramework<IContextRegistrar> {
|
||||
public:
|
||||
IContextRegistrar(Core::System& system_) : ServiceFramework{system_, "IContextRegistrar"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, &IContextRegistrar::Complete, "Complete"},
|
||||
};
|
||||
// clang-format on
|
||||
IContextRegistrar(Core::System& system_) : ServiceFramework{system_, "IContextRegistrar"} {}
|
||||
|
||||
RegisterHandlers(functions);
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, &IContextRegistrar::Complete, "Complete"}
|
||||
);
|
||||
}
|
||||
|
||||
~IContextRegistrar() override = default;
|
||||
|
||||
@@ -178,18 +178,15 @@ class INotificationSystemEventAccessor final
|
||||
: public ServiceFramework<INotificationSystemEventAccessor> {
|
||||
public:
|
||||
explicit INotificationSystemEventAccessor(Core::System& system_)
|
||||
: ServiceFramework{system_, "INotificationSystemEventAccessor"},
|
||||
service_context{system_, "INotificationSystemEventAccessor"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, D<&INotificationSystemEventAccessor::GetSystemEvent>, "GetSystemEvent"},
|
||||
};
|
||||
// clang-format on
|
||||
: ServiceFramework{system_, "INotificationSystemEventAccessor"}
|
||||
, service_context{system_, "INotificationSystemEventAccessor"} {
|
||||
notification_event = service_context.CreateEvent("INotificationSystemEventAccessor:NotificationEvent");
|
||||
}
|
||||
|
||||
RegisterHandlers(functions);
|
||||
|
||||
notification_event =
|
||||
service_context.CreateEvent("INotificationSystemEventAccessor:NotificationEvent");
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, D<&INotificationSystemEventAccessor::GetSystemEvent>, "GetSystemEvent"}
|
||||
);
|
||||
}
|
||||
|
||||
~INotificationSystemEventAccessor() {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
||||
@@ -90,9 +90,10 @@ static Service::PSC::Time::LocationName GetTimeZoneString(
|
||||
}
|
||||
|
||||
TimeManager::TimeManager(Core::System& system)
|
||||
: m_steady_clock_resource{system}, m_time_zone_binary{system}
|
||||
, m_worker{system, m_steady_clock_resource, m_file_timestamp_worker}
|
||||
{
|
||||
: m_steady_clock_resource{system}, m_time_zone_binary{system}, m_worker{
|
||||
system,
|
||||
m_steady_clock_resource,
|
||||
m_file_timestamp_worker} {
|
||||
m_time_m =
|
||||
system.ServiceManager().GetService<Service::PSC::Time::ServiceManager>("time:m", true);
|
||||
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
@@ -31,25 +34,25 @@ StaticService::StaticService(Core::System& system_,
|
||||
m_time_zone_binary{time->m_time_zone_binary} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, D<&StaticService::GetStandardUserSystemClock>, "GetStandardUserSystemClock"},
|
||||
{1, D<&StaticService::GetStandardNetworkSystemClock>, "GetStandardNetworkSystemClock"},
|
||||
{2, D<&StaticService::GetStandardSteadyClock>, "GetStandardSteadyClock"},
|
||||
{3, D<&StaticService::GetTimeZoneService>, "GetTimeZoneService"},
|
||||
{4, D<&StaticService::GetStandardLocalSystemClock>, "GetStandardLocalSystemClock"},
|
||||
{5, D<&StaticService::GetEphemeralNetworkSystemClock>, "GetEphemeralNetworkSystemClock"},
|
||||
{20, D<&StaticService::GetSharedMemoryNativeHandle>, "GetSharedMemoryNativeHandle"},
|
||||
{50, D<&StaticService::SetStandardSteadyClockInternalOffset>, "SetStandardSteadyClockInternalOffset"},
|
||||
{51, D<&StaticService::GetStandardSteadyClockRtcValue>, "GetStandardSteadyClockRtcValue"},
|
||||
{100, D<&StaticService::IsStandardUserSystemClockAutomaticCorrectionEnabled>, "IsStandardUserSystemClockAutomaticCorrectionEnabled"},
|
||||
{101, D<&StaticService::SetStandardUserSystemClockAutomaticCorrectionEnabled>, "SetStandardUserSystemClockAutomaticCorrectionEnabled"},
|
||||
{102, D<&StaticService::GetStandardUserSystemClockInitialYear>, "GetStandardUserSystemClockInitialYear"},
|
||||
{200, D<&StaticService::IsStandardNetworkSystemClockAccuracySufficient>, "IsStandardNetworkSystemClockAccuracySufficient"},
|
||||
{201, D<&StaticService::GetStandardUserSystemClockAutomaticCorrectionUpdatedTime>, "GetStandardUserSystemClockAutomaticCorrectionUpdatedTime"},
|
||||
{300, D<&StaticService::CalculateMonotonicSystemClockBaseTimePoint>, "CalculateMonotonicSystemClockBaseTimePoint"},
|
||||
{400, D<&StaticService::GetClockSnapshot>, "GetClockSnapshot"},
|
||||
{401, D<&StaticService::GetClockSnapshotFromSystemClockContext>, "GetClockSnapshotFromSystemClockContext"},
|
||||
{500, D<&StaticService::CalculateStandardUserSystemClockDifferenceByUser>, "CalculateStandardUserSystemClockDifferenceByUser"},
|
||||
{501, D<&StaticService::CalculateSpanBetween>, "CalculateSpanBetween"},
|
||||
FunctionInfo{0, D<&StaticService::GetStandardUserSystemClock>, "GetStandardUserSystemClock"},
|
||||
FunctionInfo{1, D<&StaticService::GetStandardNetworkSystemClock>, "GetStandardNetworkSystemClock"},
|
||||
FunctionInfo{2, D<&StaticService::GetStandardSteadyClock>, "GetStandardSteadyClock"},
|
||||
FunctionInfo{3, D<&StaticService::GetTimeZoneService>, "GetTimeZoneService"},
|
||||
FunctionInfo{4, D<&StaticService::GetStandardLocalSystemClock>, "GetStandardLocalSystemClock"},
|
||||
FunctionInfo{5, D<&StaticService::GetEphemeralNetworkSystemClock>, "GetEphemeralNetworkSystemClock"},
|
||||
FunctionInfo{20, D<&StaticService::GetSharedMemoryNativeHandle>, "GetSharedMemoryNativeHandle"},
|
||||
FunctionInfo{50, D<&StaticService::SetStandardSteadyClockInternalOffset>, "SetStandardSteadyClockInternalOffset"},
|
||||
FunctionInfo{51, D<&StaticService::GetStandardSteadyClockRtcValue>, "GetStandardSteadyClockRtcValue"},
|
||||
FunctionInfo{100, D<&StaticService::IsStandardUserSystemClockAutomaticCorrectionEnabled>, "IsStandardUserSystemClockAutomaticCorrectionEnabled"},
|
||||
FunctionInfo{101, D<&StaticService::SetStandardUserSystemClockAutomaticCorrectionEnabled>, "SetStandardUserSystemClockAutomaticCorrectionEnabled"},
|
||||
FunctionInfo{102, D<&StaticService::GetStandardUserSystemClockInitialYear>, "GetStandardUserSystemClockInitialYear"},
|
||||
FunctionInfo{200, D<&StaticService::IsStandardNetworkSystemClockAccuracySufficient>, "IsStandardNetworkSystemClockAccuracySufficient"},
|
||||
FunctionInfo{201, D<&StaticService::GetStandardUserSystemClockAutomaticCorrectionUpdatedTime>, "GetStandardUserSystemClockAutomaticCorrectionUpdatedTime"},
|
||||
FunctionInfo{300, D<&StaticService::CalculateMonotonicSystemClockBaseTimePoint>, "CalculateMonotonicSystemClockBaseTimePoint"},
|
||||
FunctionInfo{400, D<&StaticService::GetClockSnapshot>, "GetClockSnapshot"},
|
||||
FunctionInfo{401, D<&StaticService::GetClockSnapshotFromSystemClockContext>, "GetClockSnapshotFromSystemClockContext"},
|
||||
FunctionInfo{500, D<&StaticService::CalculateStandardUserSystemClockDifferenceByUser>, "CalculateStandardUserSystemClockDifferenceByUser"},
|
||||
FunctionInfo{501, D<&StaticService::CalculateSpanBetween>, "CalculateSpanBetween"}
|
||||
};
|
||||
// clang-format on
|
||||
|
||||
|
||||
@@ -20,17 +20,15 @@
|
||||
|
||||
namespace Service::Glue::Time {
|
||||
|
||||
TimeWorker::TimeWorker(Core::System& system, StandardSteadyClockResource& steady_clock_resource, FileTimestampWorker& file_timestamp_worker)
|
||||
: m_system{system}
|
||||
, m_ctx{m_system, "Glue:TimeWorker"}
|
||||
, m_event{m_ctx.CreateEvent("Glue:TimeWorker:Event")}
|
||||
, m_steady_clock_resource{steady_clock_resource}
|
||||
, m_file_timestamp_worker{file_timestamp_worker}
|
||||
, m_timer_steady_clock{m_ctx.CreateEvent("Glue:TimeWorker:SteadyClockTimerEvent")}
|
||||
, m_timer_file_system{m_ctx.CreateEvent("Glue:TimeWorker:FileTimeTimerEvent")}
|
||||
, m_alarm_worker{m_system, m_steady_clock_resource}
|
||||
, m_pm_state_change_handler{m_alarm_worker}
|
||||
{
|
||||
TimeWorker::TimeWorker(Core::System& system, StandardSteadyClockResource& steady_clock_resource,
|
||||
FileTimestampWorker& file_timestamp_worker)
|
||||
: m_system{system}, m_ctx{m_system, "Glue:TimeWorker"}, m_event{m_ctx.CreateEvent(
|
||||
"Glue:TimeWorker:Event")},
|
||||
m_steady_clock_resource{steady_clock_resource},
|
||||
m_file_timestamp_worker{file_timestamp_worker}, m_timer_steady_clock{m_ctx.CreateEvent(
|
||||
"Glue:TimeWorker:SteadyClockTimerEvent")},
|
||||
m_timer_file_system{m_ctx.CreateEvent("Glue:TimeWorker:FileTimeTimerEvent")},
|
||||
m_alarm_worker{m_system, m_steady_clock_resource}, m_pm_state_change_handler{m_alarm_worker} {
|
||||
m_timer_steady_clock_timing_event = Core::Timing::CreateEvent(
|
||||
"Time::SteadyClockEvent",
|
||||
[this](s64 time,
|
||||
@@ -49,16 +47,14 @@ TimeWorker::TimeWorker(Core::System& system, StandardSteadyClockResource& steady
|
||||
}
|
||||
|
||||
TimeWorker::~TimeWorker() {
|
||||
// Wait for processing to stop
|
||||
m_stop_source.request_stop();
|
||||
m_local_clock_event->Signal(m_system.Kernel());
|
||||
m_network_clock_event->Signal(m_system.Kernel());
|
||||
m_ephemeral_clock_event->Signal(m_system.Kernel());
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(16));
|
||||
|
||||
m_thread.request_stop();
|
||||
m_event->Signal(m_system.Kernel());
|
||||
{
|
||||
std::unique_lock lk{m_process_mutex};
|
||||
m_process_cv.wait(lk);
|
||||
}
|
||||
m_thread.join();
|
||||
|
||||
m_ctx.CloseEvent(m_event);
|
||||
m_system.CoreTiming().UnscheduleEvent(m_timer_steady_clock_timing_event);
|
||||
@@ -126,162 +122,166 @@ void TimeWorker::Initialize(std::shared_ptr<Service::PSC::Time::StaticService> t
|
||||
}
|
||||
|
||||
void TimeWorker::StartThread() {
|
||||
m_system.Kernel().RunOnGuestCoreProcess("TimeWorker", [this]() {
|
||||
auto const stop_token = m_stop_source.get_token();
|
||||
while (!stop_token.stop_requested()) {
|
||||
enum class EventType : s32 {
|
||||
Exit = 0,
|
||||
PowerStateChange = 1,
|
||||
SignalAlarms = 2,
|
||||
UpdateLocalSystemClock = 3,
|
||||
UpdateNetworkSystemClock = 4,
|
||||
UpdateEphemeralSystemClock = 5,
|
||||
UpdateSteadyClock = 6,
|
||||
UpdateFileTimestamp = 7,
|
||||
AutoCorrect = 8,
|
||||
};
|
||||
s32 index{};
|
||||
if (m_pm_state_change_handler.m_priority != 0) {
|
||||
// TODO: gIPmModuleService::GetEvent() 1
|
||||
index = WaitAny(
|
||||
m_system.Kernel(),
|
||||
&m_event->GetReadableEvent(), // 0
|
||||
&m_alarm_worker.GetEvent() // 1
|
||||
);
|
||||
} else {
|
||||
// TODO: gIPmModuleService::GetEvent() 1
|
||||
index = WaitAny(
|
||||
m_system.Kernel(),
|
||||
&m_event->GetReadableEvent(), // 0
|
||||
&m_alarm_worker.GetEvent(), // 1
|
||||
&m_alarm_worker.GetTimerEvent().GetReadableEvent(), // 2
|
||||
m_local_clock_event, // 3
|
||||
m_network_clock_event, // 4
|
||||
m_ephemeral_clock_event, // 5
|
||||
&m_timer_steady_clock->GetReadableEvent(), // 6
|
||||
&m_timer_file_system->GetReadableEvent(), // 7
|
||||
m_standard_user_auto_correct_clock_event // 8
|
||||
);
|
||||
}
|
||||
m_thread = std::jthread(std::bind_front(&TimeWorker::ThreadFunc, this));
|
||||
}
|
||||
|
||||
if (stop_token.stop_requested())
|
||||
break;
|
||||
void TimeWorker::ThreadFunc(std::stop_token stop_token) {
|
||||
Common::SetCurrentThreadName("TimeWorker");
|
||||
Common::SetCurrentThreadPriority(Common::ThreadPriority::Low);
|
||||
|
||||
switch (EventType(index)) {
|
||||
case EventType::Exit:
|
||||
return;
|
||||
while (!stop_token.stop_requested()) {
|
||||
enum class EventType : s32 {
|
||||
Exit = 0,
|
||||
PowerStateChange = 1,
|
||||
SignalAlarms = 2,
|
||||
UpdateLocalSystemClock = 3,
|
||||
UpdateNetworkSystemClock = 4,
|
||||
UpdateEphemeralSystemClock = 5,
|
||||
UpdateSteadyClock = 6,
|
||||
UpdateFileTimestamp = 7,
|
||||
AutoCorrect = 8,
|
||||
};
|
||||
|
||||
case EventType::PowerStateChange:
|
||||
m_alarm_worker.GetEvent().Clear(m_system.Kernel());
|
||||
if (m_pm_state_change_handler.m_priority <= 1) {
|
||||
m_alarm_worker.OnPowerStateChanged();
|
||||
}
|
||||
break;
|
||||
s32 index{};
|
||||
|
||||
case EventType::SignalAlarms:
|
||||
m_alarm_worker.GetTimerEvent().Clear(m_system.Kernel());
|
||||
m_time_m->CheckAndSignalAlarms();
|
||||
break;
|
||||
|
||||
case EventType::UpdateLocalSystemClock: {
|
||||
m_local_clock_event->Clear(m_system.Kernel());
|
||||
|
||||
Service::PSC::Time::SystemClockContext context{};
|
||||
R_ASSERT(m_local_clock->GetSystemClockContext(&context));
|
||||
|
||||
m_set_sys->SetUserSystemClockContext(context);
|
||||
m_file_timestamp_worker.SetFilesystemPosixTime();
|
||||
break;
|
||||
}
|
||||
|
||||
case EventType::UpdateNetworkSystemClock: {
|
||||
m_network_clock_event->Clear(m_system.Kernel());
|
||||
|
||||
Service::PSC::Time::SystemClockContext context{};
|
||||
R_ASSERT(m_network_clock->GetSystemClockContext(&context));
|
||||
|
||||
m_set_sys->SetNetworkSystemClockContext(context);
|
||||
|
||||
s64 time{};
|
||||
if (m_network_clock->GetCurrentTime(&time) != ResultSuccess) {
|
||||
break;
|
||||
}
|
||||
|
||||
[[maybe_unused]] auto offset_before{
|
||||
m_ig_report_network_clock_context_set ? m_report_network_clock_context.offset : 0};
|
||||
// TODO system report "standard_netclock_operation"
|
||||
// "clock_time" = time
|
||||
// "context_offset_before" = offset_before
|
||||
// "context_offset_after" = context.offset
|
||||
m_report_network_clock_context = context;
|
||||
if (!m_ig_report_network_clock_context_set) {
|
||||
m_ig_report_network_clock_context_set = true;
|
||||
}
|
||||
|
||||
m_file_timestamp_worker.SetFilesystemPosixTime();
|
||||
break;
|
||||
}
|
||||
|
||||
case EventType::UpdateEphemeralSystemClock: {
|
||||
m_ephemeral_clock_event->Clear(m_system.Kernel());
|
||||
|
||||
Service::PSC::Time::SystemClockContext context{};
|
||||
auto res = m_ephemeral_clock->GetSystemClockContext(&context);
|
||||
if (res != ResultSuccess) {
|
||||
break;
|
||||
}
|
||||
|
||||
s64 time{};
|
||||
res = m_ephemeral_clock->GetCurrentTime(&time);
|
||||
if (res != ResultSuccess) {
|
||||
break;
|
||||
}
|
||||
|
||||
[[maybe_unused]] auto offset_before{m_ig_report_ephemeral_clock_context_set
|
||||
? m_report_ephemeral_clock_context.offset
|
||||
: 0};
|
||||
// TODO system report "ephemeral_netclock_operation"
|
||||
// "clock_time" = time
|
||||
// "context_offset_before" = offset_before
|
||||
// "context_offset_after" = context.offset
|
||||
m_report_ephemeral_clock_context = context;
|
||||
if (!m_ig_report_ephemeral_clock_context_set) {
|
||||
m_ig_report_ephemeral_clock_context_set = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case EventType::UpdateSteadyClock:
|
||||
m_timer_steady_clock->Clear(m_system.Kernel());
|
||||
|
||||
m_steady_clock_resource.UpdateTime();
|
||||
m_time_m->SetStandardSteadyClockBaseTime(m_steady_clock_resource.GetTime());
|
||||
break;
|
||||
|
||||
case EventType::UpdateFileTimestamp:
|
||||
m_timer_file_system->Clear(m_system.Kernel());
|
||||
m_file_timestamp_worker.SetFilesystemPosixTime();
|
||||
break;
|
||||
|
||||
case EventType::AutoCorrect: {
|
||||
m_standard_user_auto_correct_clock_event->Clear(m_system.Kernel());
|
||||
|
||||
bool automatic_correction{};
|
||||
R_ASSERT(m_time_sm->IsStandardUserSystemClockAutomaticCorrectionEnabled(&automatic_correction));
|
||||
|
||||
Service::PSC::Time::SteadyClockTimePoint time_point{};
|
||||
R_ASSERT(m_time_sm->GetStandardUserSystemClockAutomaticCorrectionUpdatedTime(&time_point));
|
||||
|
||||
m_set_sys->SetUserSystemClockAutomaticCorrectionEnabled(automatic_correction);
|
||||
m_set_sys->SetUserSystemClockAutomaticCorrectionUpdatedTime(time_point);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
UNREACHABLE();
|
||||
}
|
||||
if (m_pm_state_change_handler.m_priority != 0) {
|
||||
// TODO: gIPmModuleService::GetEvent() 1
|
||||
index = WaitAny(m_system.Kernel(),
|
||||
&m_event->GetReadableEvent(), // 0
|
||||
&m_alarm_worker.GetEvent() // 1
|
||||
);
|
||||
} else {
|
||||
// TODO: gIPmModuleService::GetEvent() 1
|
||||
index = WaitAny(m_system.Kernel(),
|
||||
&m_event->GetReadableEvent(), // 0
|
||||
&m_alarm_worker.GetEvent(), // 1
|
||||
&m_alarm_worker.GetTimerEvent().GetReadableEvent(), // 2
|
||||
m_local_clock_event, // 3
|
||||
m_network_clock_event, // 4
|
||||
m_ephemeral_clock_event, // 5
|
||||
&m_timer_steady_clock->GetReadableEvent(), // 6
|
||||
&m_timer_file_system->GetReadableEvent(), // 7
|
||||
m_standard_user_auto_correct_clock_event // 8
|
||||
);
|
||||
}
|
||||
m_process_cv.notify_one();
|
||||
});
|
||||
|
||||
switch (static_cast<EventType>(index)) {
|
||||
case EventType::Exit:
|
||||
return;
|
||||
|
||||
case EventType::PowerStateChange:
|
||||
m_alarm_worker.GetEvent().Clear(m_system.Kernel());
|
||||
if (m_pm_state_change_handler.m_priority <= 1) {
|
||||
m_alarm_worker.OnPowerStateChanged();
|
||||
}
|
||||
break;
|
||||
|
||||
case EventType::SignalAlarms:
|
||||
m_alarm_worker.GetTimerEvent().Clear(m_system.Kernel());
|
||||
m_time_m->CheckAndSignalAlarms();
|
||||
break;
|
||||
|
||||
case EventType::UpdateLocalSystemClock: {
|
||||
m_local_clock_event->Clear(m_system.Kernel());
|
||||
|
||||
Service::PSC::Time::SystemClockContext context{};
|
||||
R_ASSERT(m_local_clock->GetSystemClockContext(&context));
|
||||
|
||||
m_set_sys->SetUserSystemClockContext(context);
|
||||
m_file_timestamp_worker.SetFilesystemPosixTime();
|
||||
break;
|
||||
}
|
||||
|
||||
case EventType::UpdateNetworkSystemClock: {
|
||||
m_network_clock_event->Clear(m_system.Kernel());
|
||||
|
||||
Service::PSC::Time::SystemClockContext context{};
|
||||
R_ASSERT(m_network_clock->GetSystemClockContext(&context));
|
||||
|
||||
m_set_sys->SetNetworkSystemClockContext(context);
|
||||
|
||||
s64 time{};
|
||||
if (m_network_clock->GetCurrentTime(&time) != ResultSuccess) {
|
||||
break;
|
||||
}
|
||||
|
||||
[[maybe_unused]] auto offset_before{
|
||||
m_ig_report_network_clock_context_set ? m_report_network_clock_context.offset : 0};
|
||||
// TODO system report "standard_netclock_operation"
|
||||
// "clock_time" = time
|
||||
// "context_offset_before" = offset_before
|
||||
// "context_offset_after" = context.offset
|
||||
m_report_network_clock_context = context;
|
||||
if (!m_ig_report_network_clock_context_set) {
|
||||
m_ig_report_network_clock_context_set = true;
|
||||
}
|
||||
|
||||
m_file_timestamp_worker.SetFilesystemPosixTime();
|
||||
break;
|
||||
}
|
||||
|
||||
case EventType::UpdateEphemeralSystemClock: {
|
||||
m_ephemeral_clock_event->Clear(m_system.Kernel());
|
||||
|
||||
Service::PSC::Time::SystemClockContext context{};
|
||||
auto res = m_ephemeral_clock->GetSystemClockContext(&context);
|
||||
if (res != ResultSuccess) {
|
||||
break;
|
||||
}
|
||||
|
||||
s64 time{};
|
||||
res = m_ephemeral_clock->GetCurrentTime(&time);
|
||||
if (res != ResultSuccess) {
|
||||
break;
|
||||
}
|
||||
|
||||
[[maybe_unused]] auto offset_before{m_ig_report_ephemeral_clock_context_set
|
||||
? m_report_ephemeral_clock_context.offset
|
||||
: 0};
|
||||
// TODO system report "ephemeral_netclock_operation"
|
||||
// "clock_time" = time
|
||||
// "context_offset_before" = offset_before
|
||||
// "context_offset_after" = context.offset
|
||||
m_report_ephemeral_clock_context = context;
|
||||
if (!m_ig_report_ephemeral_clock_context_set) {
|
||||
m_ig_report_ephemeral_clock_context_set = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case EventType::UpdateSteadyClock:
|
||||
m_timer_steady_clock->Clear(m_system.Kernel());
|
||||
|
||||
m_steady_clock_resource.UpdateTime();
|
||||
m_time_m->SetStandardSteadyClockBaseTime(m_steady_clock_resource.GetTime());
|
||||
break;
|
||||
|
||||
case EventType::UpdateFileTimestamp:
|
||||
m_timer_file_system->Clear(m_system.Kernel());
|
||||
|
||||
m_file_timestamp_worker.SetFilesystemPosixTime();
|
||||
break;
|
||||
|
||||
case EventType::AutoCorrect: {
|
||||
m_standard_user_auto_correct_clock_event->Clear(m_system.Kernel());
|
||||
|
||||
bool automatic_correction{};
|
||||
R_ASSERT(m_time_sm->IsStandardUserSystemClockAutomaticCorrectionEnabled(
|
||||
&automatic_correction));
|
||||
|
||||
Service::PSC::Time::SteadyClockTimePoint time_point{};
|
||||
R_ASSERT(
|
||||
m_time_sm->GetStandardUserSystemClockAutomaticCorrectionUpdatedTime(&time_point));
|
||||
|
||||
m_set_sys->SetUserSystemClockAutomaticCorrectionEnabled(automatic_correction);
|
||||
m_set_sys->SetUserSystemClockAutomaticCorrectionUpdatedTime(time_point);
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
UNREACHABLE();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace Service::Glue::Time
|
||||
|
||||
@@ -1,12 +1,8 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <condition_variable>
|
||||
#include "common/common_types.h"
|
||||
#include "core/hle/kernel/k_event.h"
|
||||
#include "core/hle/service/glue/time/alarm_worker.h"
|
||||
@@ -37,17 +33,17 @@ public:
|
||||
|
||||
void StartThread();
|
||||
|
||||
private:
|
||||
template <typename T>
|
||||
T GetSettingsItemValue(const std::string& category, const std::string& name);
|
||||
|
||||
void ThreadFunc(std::stop_token stop_token);
|
||||
|
||||
Core::System& m_system;
|
||||
KernelHelpers::ServiceContext m_ctx;
|
||||
std::shared_ptr<Service::Set::ISystemSettingsServer> m_set_sys;
|
||||
|
||||
std::mutex m_process_mutex;
|
||||
std::condition_variable m_process_cv;
|
||||
std::stop_source m_stop_source;
|
||||
|
||||
std::jthread m_thread;
|
||||
Kernel::KEvent* m_event{};
|
||||
std::shared_ptr<Service::PSC::Time::ServiceManager> m_time_m;
|
||||
std::shared_ptr<Service::PSC::Time::StaticService> m_time_sm;
|
||||
|
||||
@@ -17,7 +17,7 @@ public:
|
||||
: ServiceFramework{system_, "gpio"}
|
||||
{
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "Cmd0"},
|
||||
FunctionInfo{0, nullptr, "Cmd0"}
|
||||
};
|
||||
RegisterHandlers(functions);
|
||||
}
|
||||
|
||||
@@ -14,32 +14,29 @@ namespace Service::GRC {
|
||||
|
||||
class GRC final : public ServiceFramework<GRC> {
|
||||
public:
|
||||
explicit GRC(Core::System& system_) : ServiceFramework{system_, "grc:c"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{1, nullptr, "OpenContinuousRecorder"},
|
||||
{2, nullptr, "OpenGameMovieTrimmer"},
|
||||
{3, nullptr, "OpenOffscreenRecorder"},
|
||||
{101, nullptr, "CreateMovieMaker"},
|
||||
{9903, nullptr, "SetOffscreenRecordingMarker"}
|
||||
};
|
||||
// clang-format on
|
||||
explicit GRC(Core::System& system_) : ServiceFramework{system_, "grc:c"} {}
|
||||
|
||||
RegisterHandlers(functions);
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{1, nullptr, "OpenContinuousRecorder"},
|
||||
FunctionInfo{2, nullptr, "OpenGameMovieTrimmer"},
|
||||
FunctionInfo{3, nullptr, "OpenOffscreenRecorder"},
|
||||
FunctionInfo{101, nullptr, "CreateMovieMaker"},
|
||||
FunctionInfo{9903, nullptr, "SetOffscreenRecordingMarker"}
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
class GRC_D final : public ServiceFramework<GRC_D> {
|
||||
public:
|
||||
explicit GRC_D(Core::System& system_) : ServiceFramework{system_, "grc:d"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{1, nullptr, "Initialize"},
|
||||
{2, nullptr, "Transfer"},
|
||||
{3, nullptr, "Cmd3"},
|
||||
};
|
||||
// clang-format on
|
||||
RegisterHandlers(functions);
|
||||
explicit GRC_D(Core::System& system_) : ServiceFramework{system_, "grc:d"} {}
|
||||
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{1, nullptr, "Initialize"},
|
||||
FunctionInfo{2, nullptr, "Transfer"},
|
||||
FunctionInfo{3, nullptr, "Cmd3"}
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ IActiveVibrationDeviceList::IActiveVibrationDeviceList(Core::System& system_,
|
||||
: ServiceFramework{system_, "IActiveVibrationDeviceList"}, resource_manager(resource) {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, C<&IActiveVibrationDeviceList::ActivateVibrationDevice>, "ActivateVibrationDevice"},
|
||||
FunctionInfo{0, C<&IActiveVibrationDeviceList::ActivateVibrationDevice>, "ActivateVibrationDevice"}
|
||||
};
|
||||
// clang-format on
|
||||
|
||||
|
||||
@@ -22,13 +22,12 @@ namespace Service::HID {
|
||||
class IHidTemporaryServer final : public ServiceFramework<IHidTemporaryServer> {
|
||||
public:
|
||||
explicit IHidTemporaryServer(Core::System& system_)
|
||||
: ServiceFramework{system_, "hid:tmp"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "GetConsoleSixAxisSensorCalibrationValues"},
|
||||
};
|
||||
// clang-format on
|
||||
RegisterHandlers(functions);
|
||||
: ServiceFramework{system_, "hid:tmp"} {}
|
||||
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, nullptr, "GetConsoleSixAxisSensorCalibrationValues"}
|
||||
);
|
||||
}
|
||||
~IHidTemporaryServer() override = default;
|
||||
};
|
||||
@@ -36,17 +35,16 @@ public:
|
||||
class AHID_CD final : public ServiceFramework<AHID_CD> {
|
||||
public:
|
||||
explicit AHID_CD(Core::System& system_)
|
||||
: ServiceFramework{system_, "ahid:cd"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "AcquireDevice"},
|
||||
{1, nullptr, "ReleaseDevice"},
|
||||
{2, nullptr, "GetCtrlSession"},
|
||||
{3, nullptr, "GetReadSession"},
|
||||
{4, nullptr, "GetWriteSession"},
|
||||
};
|
||||
// clang-format on
|
||||
RegisterHandlers(functions);
|
||||
: ServiceFramework{system_, "ahid:cd"} {}
|
||||
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, nullptr, "AcquireDevice"},
|
||||
FunctionInfo{1, nullptr, "ReleaseDevice"},
|
||||
FunctionInfo{2, nullptr, "GetCtrlSession"},
|
||||
FunctionInfo{3, nullptr, "GetReadSession"},
|
||||
FunctionInfo{4, nullptr, "GetWriteSession"}
|
||||
);
|
||||
}
|
||||
~AHID_CD() override = default;
|
||||
};
|
||||
@@ -54,18 +52,17 @@ public:
|
||||
class AHID_HDR final : public ServiceFramework<AHID_HDR> {
|
||||
public:
|
||||
explicit AHID_HDR(Core::System& system_)
|
||||
: ServiceFramework{system_, "ahid:hdr"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "GetDeviceEntries"},
|
||||
{1, nullptr, "GetDeviceList"},
|
||||
{2, nullptr, "GetDeviceParameters"},
|
||||
{3, nullptr, "AttachDevice"},
|
||||
{4, nullptr, "DetachDevice"},
|
||||
{5, nullptr, "SetDeviceFilter"},
|
||||
};
|
||||
// clang-format on
|
||||
RegisterHandlers(functions);
|
||||
: ServiceFramework{system_, "ahid:hdr"} {}
|
||||
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, nullptr, "GetDeviceEntries"},
|
||||
FunctionInfo{1, nullptr, "GetDeviceList"},
|
||||
FunctionInfo{2, nullptr, "GetDeviceParameters"},
|
||||
FunctionInfo{3, nullptr, "AttachDevice"},
|
||||
FunctionInfo{4, nullptr, "DetachDevice"},
|
||||
FunctionInfo{5, nullptr, "SetDeviceFilter"}
|
||||
);
|
||||
}
|
||||
~AHID_HDR() override = default;
|
||||
};
|
||||
|
||||
@@ -31,20 +31,20 @@ Hidbus::Hidbus(Core::System& system_)
|
||||
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{1, C<&Hidbus::GetBusHandle>, "GetBusHandle"},
|
||||
{2, C<&Hidbus::IsExternalDeviceConnected>, "IsExternalDeviceConnected"},
|
||||
{3, C<&Hidbus::Initialize>, "Initialize"},
|
||||
{4, C<&Hidbus::Finalize>, "Finalize"},
|
||||
{5, C<&Hidbus::EnableExternalDevice>, "EnableExternalDevice"},
|
||||
{6, C<&Hidbus::GetExternalDeviceId>, "GetExternalDeviceId"},
|
||||
{7, C<&Hidbus::SendCommandAsync>, "SendCommandAsync"},
|
||||
{8, C<&Hidbus::GetSendCommandAsynceResult>, "GetSendCommandAsynceResult"},
|
||||
{9, C<&Hidbus::SetEventForSendCommandAsycResult>, "SetEventForSendCommandAsycResult"},
|
||||
{10, C<&Hidbus::GetSharedMemoryHandle>, "GetSharedMemoryHandle"},
|
||||
{11, C<&Hidbus::EnableJoyPollingReceiveMode>, "EnableJoyPollingReceiveMode"},
|
||||
{12, C<&Hidbus::DisableJoyPollingReceiveMode>, "DisableJoyPollingReceiveMode"},
|
||||
{13, nullptr, "GetPollingData"},
|
||||
{14, C<&Hidbus::SetStatusManagerType>, "SetStatusManagerType"},
|
||||
FunctionInfo{1, C<&Hidbus::GetBusHandle>, "GetBusHandle"},
|
||||
FunctionInfo{2, C<&Hidbus::IsExternalDeviceConnected>, "IsExternalDeviceConnected"},
|
||||
FunctionInfo{3, C<&Hidbus::Initialize>, "Initialize"},
|
||||
FunctionInfo{4, C<&Hidbus::Finalize>, "Finalize"},
|
||||
FunctionInfo{5, C<&Hidbus::EnableExternalDevice>, "EnableExternalDevice"},
|
||||
FunctionInfo{6, C<&Hidbus::GetExternalDeviceId>, "GetExternalDeviceId"},
|
||||
FunctionInfo{7, C<&Hidbus::SendCommandAsync>, "SendCommandAsync"},
|
||||
FunctionInfo{8, C<&Hidbus::GetSendCommandAsynceResult>, "GetSendCommandAsynceResult"},
|
||||
FunctionInfo{9, C<&Hidbus::SetEventForSendCommandAsycResult>, "SetEventForSendCommandAsycResult"},
|
||||
FunctionInfo{10, C<&Hidbus::GetSharedMemoryHandle>, "GetSharedMemoryHandle"},
|
||||
FunctionInfo{11, C<&Hidbus::EnableJoyPollingReceiveMode>, "EnableJoyPollingReceiveMode"},
|
||||
FunctionInfo{12, C<&Hidbus::DisableJoyPollingReceiveMode>, "DisableJoyPollingReceiveMode"},
|
||||
FunctionInfo{13, nullptr, "GetPollingData"},
|
||||
FunctionInfo{14, C<&Hidbus::SetStatusManagerType>, "SetStatusManagerType"},
|
||||
};
|
||||
// clang-format on
|
||||
|
||||
|
||||
@@ -21,13 +21,13 @@ public:
|
||||
: ServiceFramework{system_, "I2CSession"}
|
||||
{
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "SendOld"},
|
||||
{1, nullptr, "ReceiveOld"},
|
||||
{2, nullptr, "ExecuteCommandListOld"},
|
||||
{10, C<&I2CSession::Send>, "Send"},
|
||||
{11, nullptr, "Receive"},
|
||||
{12, nullptr, "ExecuteCommandList"},
|
||||
{13, nullptr, "SetRetryPolicy"},
|
||||
FunctionInfo{0, nullptr, "SendOld"},
|
||||
FunctionInfo{1, nullptr, "ReceiveOld"},
|
||||
FunctionInfo{2, nullptr, "ExecuteCommandListOld"},
|
||||
FunctionInfo{10, C<&I2CSession::Send>, "Send"},
|
||||
FunctionInfo{11, nullptr, "Receive"},
|
||||
FunctionInfo{12, nullptr, "ExecuteCommandList"},
|
||||
FunctionInfo{13, nullptr, "SetRetryPolicy"}
|
||||
};
|
||||
RegisterHandlers(functions);
|
||||
}
|
||||
@@ -49,11 +49,11 @@ public:
|
||||
: ServiceFramework{system_, "i2c"}
|
||||
{
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, C<&I2C::OpenSessionForDev>, "OpenSessionForDev"},
|
||||
{1, C<&I2C::OpenSession>, "OpenSession"},
|
||||
{2, C<&I2C::HasDevice>, "HasDevice"},
|
||||
{3, C<&I2C::HasDeviceForDev>, "HasDeviceForDev"},
|
||||
{4, C<&I2C::OpenSession2>, "OpenSession2"},
|
||||
FunctionInfo{0, C<&I2C::OpenSessionForDev>, "OpenSessionForDev"},
|
||||
FunctionInfo{1, C<&I2C::OpenSession>, "OpenSession"},
|
||||
FunctionInfo{2, C<&I2C::HasDevice>, "HasDevice"},
|
||||
FunctionInfo{3, C<&I2C::HasDeviceForDev>, "HasDeviceForDev"},
|
||||
FunctionInfo{4, C<&I2C::OpenSession2>, "OpenSession2"}
|
||||
};
|
||||
RegisterHandlers(functions);
|
||||
}
|
||||
|
||||
@@ -37,18 +37,6 @@ public:
|
||||
, user_ro{std::move(user_ro_)}
|
||||
, context{process_->GetMemory()}
|
||||
{
|
||||
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, C<&IJitEnvironment::GenerateCode>, "GenerateCode"},
|
||||
{1, C<&IJitEnvironment::Control>, "Control"},
|
||||
{1000, C<&IJitEnvironment::LoadPlugin>, "LoadPlugin"},
|
||||
{1001, C<&IJitEnvironment::GetCodeAddress>, "GetCodeAddress"},
|
||||
};
|
||||
// clang-format on
|
||||
|
||||
RegisterHandlers(functions);
|
||||
|
||||
// Identity map user code range into sysmodule context
|
||||
configuration.user_rx_memory.size = user_rx.GetSize();
|
||||
configuration.user_rx_memory.offset = user_rx.GetAddress();
|
||||
@@ -59,6 +47,15 @@ public:
|
||||
configuration.sys_ro_memory = configuration.user_ro_memory;
|
||||
}
|
||||
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, C<&IJitEnvironment::GenerateCode>, "GenerateCode"},
|
||||
FunctionInfo{1, C<&IJitEnvironment::Control>, "Control"},
|
||||
FunctionInfo{1000, C<&IJitEnvironment::LoadPlugin>, "LoadPlugin"},
|
||||
FunctionInfo{1001, C<&IJitEnvironment::GetCodeAddress>, "GetCodeAddress"}
|
||||
);
|
||||
}
|
||||
|
||||
~IJitEnvironment() {
|
||||
user_rx.Finalize(system.Kernel());
|
||||
user_ro.Finalize(system.Kernel());
|
||||
@@ -258,14 +255,12 @@ private:
|
||||
|
||||
class JITU final : public ServiceFramework<JITU> {
|
||||
public:
|
||||
explicit JITU(Core::System& system_) : ServiceFramework{system_, "jit:u"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, C<&JITU::CreateJitEnvironment>, "CreateJitEnvironment"},
|
||||
};
|
||||
// clang-format on
|
||||
explicit JITU(Core::System& system_) : ServiceFramework{system_, "jit:u"} {}
|
||||
|
||||
RegisterHandlers(functions);
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, C<&JITU::CreateJitEnvironment>, "CreateJitEnvironment"}
|
||||
);
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
@@ -18,43 +18,41 @@ namespace Service::LBL {
|
||||
|
||||
class LBL final : public ServiceFramework<LBL> {
|
||||
public:
|
||||
explicit LBL(Core::System& system_) : ServiceFramework{system_, "lbl"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, &LBL::SaveCurrentSetting, "SaveCurrentSetting"},
|
||||
{1, &LBL::LoadCurrentSetting, "LoadCurrentSetting"},
|
||||
{2, &LBL::SetCurrentBrightnessSetting, "SetCurrentBrightnessSetting"},
|
||||
{3, &LBL::GetCurrentBrightnessSetting, "GetCurrentBrightnessSetting"},
|
||||
{4, nullptr, "ApplyCurrentBrightnessSettingToBacklight"},
|
||||
{5, nullptr, "GetBrightnessSettingAppliedToBacklight"},
|
||||
{6, &LBL::SwitchBacklightOn, "SwitchBacklightOn"},
|
||||
{7, &LBL::SwitchBacklightOff, "SwitchBacklightOff"},
|
||||
{8, &LBL::GetBacklightSwitchStatus, "GetBacklightSwitchStatus"},
|
||||
{9, &LBL::EnableDimming, "EnableDimming"},
|
||||
{10, &LBL::DisableDimming, "DisableDimming"},
|
||||
{11, &LBL::IsDimmingEnabled, "IsDimmingEnabled"},
|
||||
{12, &LBL::EnableAutoBrightnessControl, "EnableAutoBrightnessControl"},
|
||||
{13, &LBL::DisableAutoBrightnessControl, "DisableAutoBrightnessControl"},
|
||||
{14, &LBL::IsAutoBrightnessControlEnabled, "IsAutoBrightnessControlEnabled"},
|
||||
{15, &LBL::SetAmbientLightSensorValue, "SetAmbientLightSensorValue"},
|
||||
{16, &LBL::GetAmbientLightSensorValue, "GetAmbientLightSensorValue"},
|
||||
{17, &LBL::SetBrightnessReflectionDelayLevel, "SetBrightnessReflectionDelayLevel"},
|
||||
{18, &LBL::GetBrightnessReflectionDelayLevel, "GetBrightnessReflectionDelayLevel"},
|
||||
{19, &LBL::SetCurrentBrightnessMapping, "SetCurrentBrightnessMapping"},
|
||||
{20, &LBL::GetCurrentBrightnessMapping, "GetCurrentBrightnessMapping"},
|
||||
{21, &LBL::SetCurrentAmbientLightSensorMapping, "SetCurrentAmbientLightSensorMapping"},
|
||||
{22, &LBL::GetCurrentAmbientLightSensorMapping, "GetCurrentAmbientLightSensorMapping"},
|
||||
{23, &LBL::IsAmbientLightSensorAvailable, "IsAmbientLightSensorAvailable"},
|
||||
{24, &LBL::SetCurrentBrightnessSettingForVrMode, "SetCurrentBrightnessSettingForVrMode"},
|
||||
{25, &LBL::GetCurrentBrightnessSettingForVrMode, "GetCurrentBrightnessSettingForVrMode"},
|
||||
{26, &LBL::EnableVrMode, "EnableVrMode"},
|
||||
{27, &LBL::DisableVrMode, "DisableVrMode"},
|
||||
{28, &LBL::IsVrModeEnabled, "IsVrModeEnabled"},
|
||||
{29, &LBL::IsAutoBrightnessControlSupported, "IsAutoBrightnessControlSupported"},
|
||||
};
|
||||
// clang-format on
|
||||
explicit LBL(Core::System& system_) : ServiceFramework{system_, "lbl"} {}
|
||||
|
||||
RegisterHandlers(functions);
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, &LBL::SaveCurrentSetting, "SaveCurrentSetting"},
|
||||
FunctionInfo{1, &LBL::LoadCurrentSetting, "LoadCurrentSetting"},
|
||||
FunctionInfo{2, &LBL::SetCurrentBrightnessSetting, "SetCurrentBrightnessSetting"},
|
||||
FunctionInfo{3, &LBL::GetCurrentBrightnessSetting, "GetCurrentBrightnessSetting"},
|
||||
FunctionInfo{4, nullptr, "ApplyCurrentBrightnessSettingToBacklight"},
|
||||
FunctionInfo{5, nullptr, "GetBrightnessSettingAppliedToBacklight"},
|
||||
FunctionInfo{6, &LBL::SwitchBacklightOn, "SwitchBacklightOn"},
|
||||
FunctionInfo{7, &LBL::SwitchBacklightOff, "SwitchBacklightOff"},
|
||||
FunctionInfo{8, &LBL::GetBacklightSwitchStatus, "GetBacklightSwitchStatus"},
|
||||
FunctionInfo{9, &LBL::EnableDimming, "EnableDimming"},
|
||||
FunctionInfo{10, &LBL::DisableDimming, "DisableDimming"},
|
||||
FunctionInfo{11, &LBL::IsDimmingEnabled, "IsDimmingEnabled"},
|
||||
FunctionInfo{12, &LBL::EnableAutoBrightnessControl, "EnableAutoBrightnessControl"},
|
||||
FunctionInfo{13, &LBL::DisableAutoBrightnessControl, "DisableAutoBrightnessControl"},
|
||||
FunctionInfo{14, &LBL::IsAutoBrightnessControlEnabled, "IsAutoBrightnessControlEnabled"},
|
||||
FunctionInfo{15, &LBL::SetAmbientLightSensorValue, "SetAmbientLightSensorValue"},
|
||||
FunctionInfo{16, &LBL::GetAmbientLightSensorValue, "GetAmbientLightSensorValue"},
|
||||
FunctionInfo{17, &LBL::SetBrightnessReflectionDelayLevel, "SetBrightnessReflectionDelayLevel"},
|
||||
FunctionInfo{18, &LBL::GetBrightnessReflectionDelayLevel, "GetBrightnessReflectionDelayLevel"},
|
||||
FunctionInfo{19, &LBL::SetCurrentBrightnessMapping, "SetCurrentBrightnessMapping"},
|
||||
FunctionInfo{20, &LBL::GetCurrentBrightnessMapping, "GetCurrentBrightnessMapping"},
|
||||
FunctionInfo{21, &LBL::SetCurrentAmbientLightSensorMapping, "SetCurrentAmbientLightSensorMapping"},
|
||||
FunctionInfo{22, &LBL::GetCurrentAmbientLightSensorMapping, "GetCurrentAmbientLightSensorMapping"},
|
||||
FunctionInfo{23, &LBL::IsAmbientLightSensorAvailable, "IsAmbientLightSensorAvailable"},
|
||||
FunctionInfo{24, &LBL::SetCurrentBrightnessSettingForVrMode, "SetCurrentBrightnessSettingForVrMode"},
|
||||
FunctionInfo{25, &LBL::GetCurrentBrightnessSettingForVrMode, "GetCurrentBrightnessSettingForVrMode"},
|
||||
FunctionInfo{26, &LBL::EnableVrMode, "EnableVrMode"},
|
||||
FunctionInfo{27, &LBL::DisableVrMode, "DisableVrMode"},
|
||||
FunctionInfo{28, &LBL::IsVrModeEnabled, "IsVrModeEnabled"},
|
||||
FunctionInfo{29, &LBL::IsAutoBrightnessControlSupported, "IsAutoBrightnessControlSupported"}
|
||||
);
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
@@ -20,13 +20,12 @@ class IClientProcessMonitor final
|
||||
: public ServiceFramework<IClientProcessMonitor> {
|
||||
public:
|
||||
explicit IClientProcessMonitor(Core::System& system_)
|
||||
: ServiceFramework{system_, "IClientProcessMonitor"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, D<&IClientProcessMonitor::RegisterClient>, "RegisterClient"},
|
||||
};
|
||||
// clang-format on
|
||||
RegisterHandlers(functions);
|
||||
: ServiceFramework{system_, "IClientProcessMonitor"} {}
|
||||
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, D<&IClientProcessMonitor::RegisterClient>, "RegisterClient"}
|
||||
);
|
||||
}
|
||||
~IClientProcessMonitor() override = default;
|
||||
private:
|
||||
@@ -38,13 +37,12 @@ private:
|
||||
|
||||
class IMonitorServiceCreator final : public ServiceFramework<IMonitorServiceCreator> {
|
||||
public:
|
||||
explicit IMonitorServiceCreator(Core::System& system_) : ServiceFramework{system_, "ldn:m"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, C<&IMonitorServiceCreator::CreateMonitorService>, "CreateMonitorService"}
|
||||
};
|
||||
// clang-format on
|
||||
RegisterHandlers(functions);
|
||||
explicit IMonitorServiceCreator(Core::System& system_) : ServiceFramework{system_, "ldn:m"} {}
|
||||
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, C<&IMonitorServiceCreator::CreateMonitorService>, "CreateMonitorService"}
|
||||
);
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -58,15 +56,13 @@ private:
|
||||
|
||||
class ISystemServiceCreator final : public ServiceFramework<ISystemServiceCreator> {
|
||||
public:
|
||||
explicit ISystemServiceCreator(Core::System& system_) : ServiceFramework{system_, "ldn:s"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, C<&ISystemServiceCreator::CreateSystemLocalCommunicationService>, "CreateSystemLocalCommunicationService"},
|
||||
{1, C<&ISystemServiceCreator::CreateClientProcessMonitor>, "CreateClientProcessMonitor"} // 18.0.0+
|
||||
};
|
||||
// clang-format on
|
||||
explicit ISystemServiceCreator(Core::System& system_) : ServiceFramework{system_, "ldn:s"} {}
|
||||
|
||||
RegisterHandlers(functions);
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, C<&ISystemServiceCreator::CreateSystemLocalCommunicationService>, "CreateSystemLocalCommunicationService"},
|
||||
FunctionInfo{1, C<&ISystemServiceCreator::CreateClientProcessMonitor>, "CreateClientProcessMonitor"} // 18.0.0+
|
||||
);
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -89,15 +85,13 @@ private:
|
||||
|
||||
class IUserServiceCreator final : public ServiceFramework<IUserServiceCreator> {
|
||||
public:
|
||||
explicit IUserServiceCreator(Core::System& system_) : ServiceFramework{system_, "ldn:u"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, D<&IUserServiceCreator::CreateUserLocalCommunicationService>, "CreateUserLocalCommunicationService"},
|
||||
{1, D<&IUserServiceCreator::CreateClientProcessMonitor>, "CreateClientProcessMonitor"} // 18.0.0+
|
||||
};
|
||||
// clang-format on
|
||||
explicit IUserServiceCreator(Core::System& system_) : ServiceFramework{system_, "ldn:u"} {}
|
||||
|
||||
RegisterHandlers(functions);
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, D<&IUserServiceCreator::CreateUserLocalCommunicationService>, "CreateUserLocalCommunicationService"},
|
||||
FunctionInfo{1, D<&IUserServiceCreator::CreateClientProcessMonitor>, "CreateClientProcessMonitor"} // 18.0.0+
|
||||
);
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -121,15 +115,13 @@ private:
|
||||
class ISfServiceCreator final : public ServiceFramework<ISfServiceCreator> {
|
||||
public:
|
||||
explicit ISfServiceCreator(Core::System& system_, bool is_system_, const char* name_)
|
||||
: ServiceFramework{system_, name_}, is_system{is_system_} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, C<&ISfServiceCreator::CreateNetworkService>, "CreateNetworkService"},
|
||||
{8, C<&ISfServiceCreator::CreateNetworkServiceMonitor>, "CreateNetworkServiceMonitor"},
|
||||
};
|
||||
// clang-format on
|
||||
: ServiceFramework{system_, name_}, is_system{is_system_} {}
|
||||
|
||||
RegisterHandlers(functions);
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, C<&ISfServiceCreator::CreateNetworkService>, "CreateNetworkService"},
|
||||
FunctionInfo{8, C<&ISfServiceCreator::CreateNetworkServiceMonitor>, "CreateNetworkServiceMonitor"}
|
||||
);
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -155,14 +147,12 @@ private:
|
||||
|
||||
class ISfMonitorServiceCreator final : public ServiceFramework<ISfMonitorServiceCreator> {
|
||||
public:
|
||||
explicit ISfMonitorServiceCreator(Core::System& system_) : ServiceFramework{system_, "lp2p:m"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, C<&ISfMonitorServiceCreator::CreateMonitorService>, "CreateMonitorService"},
|
||||
};
|
||||
// clang-format on
|
||||
explicit ISfMonitorServiceCreator(Core::System& system_) : ServiceFramework{system_, "lp2p:m"} {}
|
||||
|
||||
RegisterHandlers(functions);
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, C<&ISfMonitorServiceCreator::CreateMonitorService>, "CreateMonitorService"}
|
||||
);
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
@@ -11,9 +14,9 @@ ISfMonitorService::ISfMonitorService(Core::System& system_)
|
||||
: ServiceFramework{system_, "ISfMonitorService"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, C<&ISfMonitorService::Initialize>, "Initialize"},
|
||||
{288, C<&ISfMonitorService::GetGroupInfo>, "GetGroupInfo"},
|
||||
{320, nullptr, "GetLinkLevel"},
|
||||
FunctionInfo{0, C<&ISfMonitorService::Initialize>, "Initialize"},
|
||||
FunctionInfo{288, C<&ISfMonitorService::GetGroupInfo>, "GetGroupInfo"},
|
||||
FunctionInfo{320, nullptr, "GetLinkLevel"}
|
||||
};
|
||||
// clang-format on
|
||||
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
@@ -8,24 +11,24 @@ namespace Service::LDN {
|
||||
ISfService::ISfService(Core::System& system_) : ServiceFramework{system_, "ISfService"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "Initialize"},
|
||||
{256, nullptr, "AttachNetworkInterfaceStateChangeEvent"},
|
||||
{264, nullptr, "GetNetworkInterfaceLastError"},
|
||||
{272, nullptr, "GetRole"},
|
||||
{280, nullptr, "GetAdvertiseData"},
|
||||
{288, nullptr, "GetGroupInfo"},
|
||||
{296, nullptr, "GetGroupInfo2"},
|
||||
{304, nullptr, "GetGroupOwner"},
|
||||
{312, nullptr, "GetIpConfig"},
|
||||
{320, nullptr, "GetLinkLevel"},
|
||||
{512, nullptr, "Scan"},
|
||||
{768, nullptr, "CreateGroup"},
|
||||
{776, nullptr, "DestroyGroup"},
|
||||
{784, nullptr, "SetAdvertiseData"},
|
||||
{1536, nullptr, "SendToOtherGroup"},
|
||||
{1544, nullptr, "RecvFromOtherGroup"},
|
||||
{1552, nullptr, "AddAcceptableGroupId"},
|
||||
{1560, nullptr, "ClearAcceptableGroupId"},
|
||||
FunctionInfo{0, nullptr, "Initialize"},
|
||||
FunctionInfo{256, nullptr, "AttachNetworkInterfaceStateChangeEvent"},
|
||||
FunctionInfo{264, nullptr, "GetNetworkInterfaceLastError"},
|
||||
FunctionInfo{272, nullptr, "GetRole"},
|
||||
FunctionInfo{280, nullptr, "GetAdvertiseData"},
|
||||
FunctionInfo{288, nullptr, "GetGroupInfo"},
|
||||
FunctionInfo{296, nullptr, "GetGroupInfo2"},
|
||||
FunctionInfo{304, nullptr, "GetGroupOwner"},
|
||||
FunctionInfo{312, nullptr, "GetIpConfig"},
|
||||
FunctionInfo{320, nullptr, "GetLinkLevel"},
|
||||
FunctionInfo{512, nullptr, "Scan"},
|
||||
FunctionInfo{768, nullptr, "CreateGroup"},
|
||||
FunctionInfo{776, nullptr, "DestroyGroup"},
|
||||
FunctionInfo{784, nullptr, "SetAdvertiseData"},
|
||||
FunctionInfo{1536, nullptr, "SendToOtherGroup"},
|
||||
FunctionInfo{1544, nullptr, "RecvFromOtherGroup"},
|
||||
FunctionInfo{1552, nullptr, "AddAcceptableGroupId"},
|
||||
FunctionInfo{1560, nullptr, "ClearAcceptableGroupId"},
|
||||
};
|
||||
// clang-format on
|
||||
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
@@ -11,19 +14,19 @@ ISfServiceMonitor::ISfServiceMonitor(Core::System& system_)
|
||||
: ServiceFramework{system_, "ISfServiceMonitor"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, C<&ISfServiceMonitor::Initialize>, "Initialize"},
|
||||
{256, nullptr, "AttachNetworkInterfaceStateChangeEvent"},
|
||||
{264, nullptr, "GetNetworkInterfaceLastError"},
|
||||
{272, nullptr, "GetRole"},
|
||||
{280, nullptr, "GetAdvertiseData"},
|
||||
{281, nullptr, "GetAdvertiseData2"},
|
||||
{288, C<&ISfServiceMonitor::GetGroupInfo>, "GetGroupInfo"},
|
||||
{296, nullptr, "GetGroupInfo2"},
|
||||
{304, nullptr, "GetGroupOwner"},
|
||||
{312, nullptr, "GetIpConfig"},
|
||||
{320, nullptr, "GetLinkLevel"},
|
||||
{328, nullptr, "AttachJoinEvent"},
|
||||
{336, nullptr, "GetMembers"},
|
||||
FunctionInfo{0, C<&ISfServiceMonitor::Initialize>, "Initialize"},
|
||||
FunctionInfo{256, nullptr, "AttachNetworkInterfaceStateChangeEvent"},
|
||||
FunctionInfo{264, nullptr, "GetNetworkInterfaceLastError"},
|
||||
FunctionInfo{272, nullptr, "GetRole"},
|
||||
FunctionInfo{280, nullptr, "GetAdvertiseData"},
|
||||
FunctionInfo{281, nullptr, "GetAdvertiseData2"},
|
||||
FunctionInfo{288, C<&ISfServiceMonitor::GetGroupInfo>, "GetGroupInfo"},
|
||||
FunctionInfo{296, nullptr, "GetGroupInfo2"},
|
||||
FunctionInfo{304, nullptr, "GetGroupOwner"},
|
||||
FunctionInfo{312, nullptr, "GetIpConfig"},
|
||||
FunctionInfo{320, nullptr, "GetLinkLevel"},
|
||||
FunctionInfo{328, nullptr, "AttachJoinEvent"},
|
||||
FunctionInfo{336, nullptr, "GetMembers"}
|
||||
};
|
||||
// clang-format on
|
||||
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
@@ -10,36 +13,36 @@ ISystemLocalCommunicationService::ISystemLocalCommunicationService(Core::System&
|
||||
: ServiceFramework{system_, "ISystemLocalCommunicationService"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "GetState"},
|
||||
{1, nullptr, "GetNetworkInfo"},
|
||||
{2, nullptr, "GetIpv4Address"},
|
||||
{3, nullptr, "GetDisconnectReason"},
|
||||
{4, nullptr, "GetSecurityParameter"},
|
||||
{5, nullptr, "GetNetworkConfig"},
|
||||
{100, nullptr, "AttachStateChangeEvent"},
|
||||
{101, nullptr, "GetNetworkInfoLatestUpdate"},
|
||||
{102, nullptr, "Scan"},
|
||||
{103, nullptr, "ScanPrivate"},
|
||||
{104, nullptr, "SetWirelessControllerRestriction"},
|
||||
{200, nullptr, "OpenAccessPoint"},
|
||||
{201, nullptr, "CloseAccessPoint"},
|
||||
{202, nullptr, "CreateNetwork"},
|
||||
{203, nullptr, "CreateNetworkPrivate"},
|
||||
{204, nullptr, "DestroyNetwork"},
|
||||
{205, nullptr, "Reject"},
|
||||
{206, nullptr, "SetAdvertiseData"},
|
||||
{207, nullptr, "SetStationAcceptPolicy"},
|
||||
{208, nullptr, "AddAcceptFilterEntry"},
|
||||
{209, nullptr, "ClearAcceptFilter"},
|
||||
{300, nullptr, "OpenStation"},
|
||||
{301, nullptr, "CloseStation"},
|
||||
{302, nullptr, "Connect"},
|
||||
{303, nullptr, "ConnectPrivate"},
|
||||
{304, nullptr, "Disconnect"},
|
||||
{400, nullptr, "InitializeSystem"},
|
||||
{401, nullptr, "FinalizeSystem"},
|
||||
{402, nullptr, "SetOperationMode"},
|
||||
{403, C<&ISystemLocalCommunicationService::InitializeSystem2>, "InitializeSystem2"},
|
||||
FunctionInfo{0, nullptr, "GetState"},
|
||||
FunctionInfo{1, nullptr, "GetNetworkInfo"},
|
||||
FunctionInfo{2, nullptr, "GetIpv4Address"},
|
||||
FunctionInfo{3, nullptr, "GetDisconnectReason"},
|
||||
FunctionInfo{4, nullptr, "GetSecurityParameter"},
|
||||
FunctionInfo{5, nullptr, "GetNetworkConfig"},
|
||||
FunctionInfo{100, nullptr, "AttachStateChangeEvent"},
|
||||
FunctionInfo{101, nullptr, "GetNetworkInfoLatestUpdate"},
|
||||
FunctionInfo{102, nullptr, "Scan"},
|
||||
FunctionInfo{103, nullptr, "ScanPrivate"},
|
||||
FunctionInfo{104, nullptr, "SetWirelessControllerRestriction"},
|
||||
FunctionInfo{200, nullptr, "OpenAccessPoint"},
|
||||
FunctionInfo{201, nullptr, "CloseAccessPoint"},
|
||||
FunctionInfo{202, nullptr, "CreateNetwork"},
|
||||
FunctionInfo{203, nullptr, "CreateNetworkPrivate"},
|
||||
FunctionInfo{204, nullptr, "DestroyNetwork"},
|
||||
FunctionInfo{205, nullptr, "Reject"},
|
||||
FunctionInfo{206, nullptr, "SetAdvertiseData"},
|
||||
FunctionInfo{207, nullptr, "SetStationAcceptPolicy"},
|
||||
FunctionInfo{208, nullptr, "AddAcceptFilterEntry"},
|
||||
FunctionInfo{209, nullptr, "ClearAcceptFilter"},
|
||||
FunctionInfo{300, nullptr, "OpenStation"},
|
||||
FunctionInfo{301, nullptr, "CloseStation"},
|
||||
FunctionInfo{302, nullptr, "Connect"},
|
||||
FunctionInfo{303, nullptr, "ConnectPrivate"},
|
||||
FunctionInfo{304, nullptr, "Disconnect"},
|
||||
FunctionInfo{400, nullptr, "InitializeSystem"},
|
||||
FunctionInfo{401, nullptr, "FinalizeSystem"},
|
||||
FunctionInfo{402, nullptr, "SetOperationMode"},
|
||||
FunctionInfo{403, C<&ISystemLocalCommunicationService::InitializeSystem2>, "InitializeSystem2"}
|
||||
};
|
||||
// clang-format on
|
||||
|
||||
|
||||
@@ -27,36 +27,36 @@ IUserLocalCommunicationService::IUserLocalCommunicationService(Core::System& sys
|
||||
lan_discovery{} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, D<&IUserLocalCommunicationService::GetState>, "GetState"},
|
||||
{1, D<&IUserLocalCommunicationService::GetNetworkInfo>, "GetNetworkInfo"},
|
||||
{2, D<&IUserLocalCommunicationService::GetIpv4Address>, "GetIpv4Address"},
|
||||
{3, D<&IUserLocalCommunicationService::GetDisconnectReason>, "GetDisconnectReason"},
|
||||
{4, D<&IUserLocalCommunicationService::GetSecurityParameter>, "GetSecurityParameter"},
|
||||
{5, D<&IUserLocalCommunicationService::GetNetworkConfig>, "GetNetworkConfig"},
|
||||
{100, D<&IUserLocalCommunicationService::AttachStateChangeEvent>, "AttachStateChangeEvent"},
|
||||
{101, D<&IUserLocalCommunicationService::GetNetworkInfoLatestUpdate>, "GetNetworkInfoLatestUpdate"},
|
||||
{102, D<&IUserLocalCommunicationService::Scan>, "Scan"},
|
||||
{103, D<&IUserLocalCommunicationService::ScanPrivate>, "ScanPrivate"},
|
||||
{104, D<&IUserLocalCommunicationService::SetWirelessControllerRestriction>, "SetWirelessControllerRestriction"},
|
||||
{ 106, D<&IUserLocalCommunicationService::SetProtocol>, "SetProtocol" },
|
||||
{200, D<&IUserLocalCommunicationService::OpenAccessPoint>, "OpenAccessPoint"},
|
||||
{201, D<&IUserLocalCommunicationService::CloseAccessPoint>, "CloseAccessPoint"},
|
||||
{202, D<&IUserLocalCommunicationService::CreateNetwork>, "CreateNetwork"},
|
||||
{203, D<&IUserLocalCommunicationService::CreateNetworkPrivate>, "CreateNetworkPrivate"},
|
||||
{204, D<&IUserLocalCommunicationService::DestroyNetwork>, "DestroyNetwork"},
|
||||
{205, nullptr, "Reject"},
|
||||
{206, D<&IUserLocalCommunicationService::SetAdvertiseData>, "SetAdvertiseData"},
|
||||
{207, D<&IUserLocalCommunicationService::SetStationAcceptPolicy>, "SetStationAcceptPolicy"},
|
||||
{208, D<&IUserLocalCommunicationService::AddAcceptFilterEntry>, "AddAcceptFilterEntry"},
|
||||
{209, nullptr, "ClearAcceptFilter"},
|
||||
{300, D<&IUserLocalCommunicationService::OpenStation>, "OpenStation"},
|
||||
{301, D<&IUserLocalCommunicationService::CloseStation>, "CloseStation"},
|
||||
{302, D<&IUserLocalCommunicationService::Connect>, "Connect"},
|
||||
{303, nullptr, "ConnectPrivate"},
|
||||
{304, D<&IUserLocalCommunicationService::Disconnect>, "Disconnect"},
|
||||
{400, D<&IUserLocalCommunicationService::Initialize>, "Initialize"},
|
||||
{401, D<&IUserLocalCommunicationService::Finalize>, "Finalize"},
|
||||
{402, D<&IUserLocalCommunicationService::Initialize2>, "Initialize2"},
|
||||
FunctionInfo{0, D<&IUserLocalCommunicationService::GetState>, "GetState"},
|
||||
FunctionInfo{1, D<&IUserLocalCommunicationService::GetNetworkInfo>, "GetNetworkInfo"},
|
||||
FunctionInfo{2, D<&IUserLocalCommunicationService::GetIpv4Address>, "GetIpv4Address"},
|
||||
FunctionInfo{3, D<&IUserLocalCommunicationService::GetDisconnectReason>, "GetDisconnectReason"},
|
||||
FunctionInfo{4, D<&IUserLocalCommunicationService::GetSecurityParameter>, "GetSecurityParameter"},
|
||||
FunctionInfo{5, D<&IUserLocalCommunicationService::GetNetworkConfig>, "GetNetworkConfig"},
|
||||
FunctionInfo{100, D<&IUserLocalCommunicationService::AttachStateChangeEvent>, "AttachStateChangeEvent"},
|
||||
FunctionInfo{101, D<&IUserLocalCommunicationService::GetNetworkInfoLatestUpdate>, "GetNetworkInfoLatestUpdate"},
|
||||
FunctionInfo{102, D<&IUserLocalCommunicationService::Scan>, "Scan"},
|
||||
FunctionInfo{103, D<&IUserLocalCommunicationService::ScanPrivate>, "ScanPrivate"},
|
||||
FunctionInfo{104, D<&IUserLocalCommunicationService::SetWirelessControllerRestriction>, "SetWirelessControllerRestriction"},
|
||||
FunctionInfo{106, D<&IUserLocalCommunicationService::SetProtocol>, "SetProtocol" },
|
||||
FunctionInfo{200, D<&IUserLocalCommunicationService::OpenAccessPoint>, "OpenAccessPoint"},
|
||||
FunctionInfo{201, D<&IUserLocalCommunicationService::CloseAccessPoint>, "CloseAccessPoint"},
|
||||
FunctionInfo{202, D<&IUserLocalCommunicationService::CreateNetwork>, "CreateNetwork"},
|
||||
FunctionInfo{203, D<&IUserLocalCommunicationService::CreateNetworkPrivate>, "CreateNetworkPrivate"},
|
||||
FunctionInfo{204, D<&IUserLocalCommunicationService::DestroyNetwork>, "DestroyNetwork"},
|
||||
FunctionInfo{205, nullptr, "Reject"},
|
||||
FunctionInfo{206, D<&IUserLocalCommunicationService::SetAdvertiseData>, "SetAdvertiseData"},
|
||||
FunctionInfo{207, D<&IUserLocalCommunicationService::SetStationAcceptPolicy>, "SetStationAcceptPolicy"},
|
||||
FunctionInfo{208, D<&IUserLocalCommunicationService::AddAcceptFilterEntry>, "AddAcceptFilterEntry"},
|
||||
FunctionInfo{209, nullptr, "ClearAcceptFilter"},
|
||||
FunctionInfo{300, D<&IUserLocalCommunicationService::OpenStation>, "OpenStation"},
|
||||
FunctionInfo{301, D<&IUserLocalCommunicationService::CloseStation>, "CloseStation"},
|
||||
FunctionInfo{302, D<&IUserLocalCommunicationService::Connect>, "Connect"},
|
||||
FunctionInfo{303, nullptr, "ConnectPrivate"},
|
||||
FunctionInfo{304, D<&IUserLocalCommunicationService::Disconnect>, "Disconnect"},
|
||||
FunctionInfo{400, D<&IUserLocalCommunicationService::Initialize>, "Initialize"},
|
||||
FunctionInfo{401, D<&IUserLocalCommunicationService::Finalize>, "Finalize"},
|
||||
FunctionInfo{402, D<&IUserLocalCommunicationService::Initialize2>, "Initialize2"}
|
||||
};
|
||||
// clang-format on
|
||||
|
||||
|
||||
@@ -12,47 +12,41 @@ namespace Service::LDR {
|
||||
|
||||
class DebugMonitor final : public ServiceFramework<DebugMonitor> {
|
||||
public:
|
||||
explicit DebugMonitor(Core::System& system_) : ServiceFramework{system_, "ldr:dmnt"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "SetProgramArgument"},
|
||||
{1, nullptr, "FlushArguments"},
|
||||
{2, nullptr, "GetProcessModuleInfo"},
|
||||
};
|
||||
// clang-format on
|
||||
explicit DebugMonitor(Core::System& system_) : ServiceFramework{system_, "ldr:dmnt"} {}
|
||||
|
||||
RegisterHandlers(functions);
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, nullptr, "SetProgramArgument"},
|
||||
FunctionInfo{1, nullptr, "FlushArguments"},
|
||||
FunctionInfo{2, nullptr, "GetProcessModuleInfo"}
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
class ProcessManager final : public ServiceFramework<ProcessManager> {
|
||||
public:
|
||||
explicit ProcessManager(Core::System& system_) : ServiceFramework{system_, "ldr:pm"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "CreateProcess"},
|
||||
{1, nullptr, "GetProgramInfo"},
|
||||
{2, nullptr, "PinProgram"},
|
||||
{3, nullptr, "UnpinProgram"},
|
||||
{4, nullptr, "SetEnabledProgramVerification"},
|
||||
};
|
||||
// clang-format on
|
||||
explicit ProcessManager(Core::System& system_) : ServiceFramework{system_, "ldr:pm"} {}
|
||||
|
||||
RegisterHandlers(functions);
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, nullptr, "CreateProcess"},
|
||||
FunctionInfo{1, nullptr, "GetProgramInfo"},
|
||||
FunctionInfo{2, nullptr, "PinProgram"},
|
||||
FunctionInfo{3, nullptr, "UnpinProgram"},
|
||||
FunctionInfo{4, nullptr, "SetEnabledProgramVerification"}
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
class Shell final : public ServiceFramework<Shell> {
|
||||
public:
|
||||
explicit Shell(Core::System& system_) : ServiceFramework{system_, "ldr:shel"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "SetProgramArgument"},
|
||||
{1, nullptr, "FlushArguments"},
|
||||
};
|
||||
// clang-format on
|
||||
explicit Shell(Core::System& system_) : ServiceFramework{system_, "ldr:shel"} {}
|
||||
|
||||
RegisterHandlers(functions);
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, nullptr, "SetProgramArgument"},
|
||||
FunctionInfo{1, nullptr, "FlushArguments"}
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -89,10 +89,10 @@ class ILogger final : public ServiceFramework<ILogger> {
|
||||
public:
|
||||
explicit ILogger(Core::System& system_) : ServiceFramework{system_, "ILogger"} {
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, &ILogger::Log, "Log"},
|
||||
{1, &ILogger::SetDestination, "SetDestination"},
|
||||
{2, nullptr, "TransmitHashedLog"}, //20.0.0+
|
||||
{3, nullptr, "DevNotify"}, //20.0.0+
|
||||
FunctionInfo{0, &ILogger::Log, "Log"},
|
||||
FunctionInfo{1, &ILogger::SetDestination, "SetDestination"},
|
||||
FunctionInfo{2, nullptr, "TransmitHashedLog"}, //20.0.0+
|
||||
FunctionInfo{3, nullptr, "DevNotify"}, //20.0.0+
|
||||
};
|
||||
RegisterHandlers(functions);
|
||||
}
|
||||
@@ -337,14 +337,12 @@ private:
|
||||
|
||||
class LM final : public ServiceFramework<LM> {
|
||||
public:
|
||||
explicit LM(Core::System& system_) : ServiceFramework{system_, "lm"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, &LM::OpenLogger, "OpenLogger"},
|
||||
};
|
||||
// clang-format on
|
||||
explicit LM(Core::System& system_) : ServiceFramework{system_, "lm"} {}
|
||||
|
||||
RegisterHandlers(functions);
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, &LM::OpenLogger, "OpenLogger"}
|
||||
);
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -363,10 +361,10 @@ public:
|
||||
: ServiceFramework{system_, "lm:get"}
|
||||
{
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "StartLogging"},
|
||||
{1, nullptr, "StopLogging"},
|
||||
{2, nullptr, "GetLog"},
|
||||
{100, nullptr, "CreateDevNotificationReceiver"},
|
||||
FunctionInfo{0, nullptr, "StartLogging"},
|
||||
FunctionInfo{1, nullptr, "StopLogging"},
|
||||
FunctionInfo{2, nullptr, "GetLog"},
|
||||
FunctionInfo{100, nullptr, "CreateDevNotificationReceiver"}
|
||||
};
|
||||
RegisterHandlers(functions);
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
|
||||
@@ -14,49 +14,47 @@ namespace Service::Migration {
|
||||
|
||||
class MIG_USR final : public ServiceFramework<MIG_USR> {
|
||||
public:
|
||||
explicit MIG_USR(Core::System& system_) : ServiceFramework{system_, "mig:usr"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "Unknown0"}, //19.0.0+
|
||||
{1, nullptr, "Unknown1"}, //20.0.0+
|
||||
{2, nullptr, "Unknown2"}, //20.0.0+
|
||||
{10, nullptr, "TryGetLastMigrationInfo"},
|
||||
{11, nullptr, "Unknown11"}, //20.0.0+
|
||||
{100, nullptr, "CreateUserMigrationServer"}, //7.0.0+
|
||||
{101, nullptr, "ResumeUserMigrationServer"}, //7.0.0+
|
||||
{200, nullptr, "CreateUserMigrationClient"}, //7.0.0+
|
||||
{201, nullptr, "ResumeUserMigrationClient"}, //7.0.0+
|
||||
{1001, nullptr, "GetSaveDataMigrationPolicyInfoAsync"}, //8.0.0-20.5.0
|
||||
{1010, nullptr, "TryGetLastSaveDataMigrationInfo"}, //7.0.0+
|
||||
{1100, nullptr, "CreateSaveDataMigrationServer"}, //7.0.0-19.0.1
|
||||
{1101, nullptr, "ResumeSaveDataMigrationServer"}, //7.0.0+
|
||||
{1110, nullptr, "Unknown1101"}, //17.0.0+
|
||||
{1200, nullptr, "CreateSaveDataMigrationClient"}, //7.0.0+
|
||||
{1201, nullptr, "ResumeSaveDataMigrationClient"}, //7.0.0+
|
||||
{2001, nullptr, "Unknown2001"}, //20.0.0+
|
||||
{2010, nullptr, "Unknown2010"}, //20.0.0+
|
||||
{2100, nullptr, "Unknown2100"}, //20.0.0+
|
||||
{2110, nullptr, "Unknown2110"}, //20.0.0+
|
||||
{2200, nullptr, "Unknown2200"}, //20.0.0+
|
||||
{2210, nullptr, "Unknown2210"}, //20.0.0+
|
||||
{2220, nullptr, "Unknown2220"}, //20.0.0+
|
||||
{2230, nullptr, "Unknown2230"}, //20.0.0+
|
||||
{2231, nullptr, "Unknown2231"}, //20.0.0+
|
||||
{2232, nullptr, "Unknown2232"}, //20.0.0+
|
||||
{2233, nullptr, "Unknown2233"}, //20.0.0+
|
||||
{2234, nullptr, "Unknown2234"}, //20.0.0+
|
||||
{2250, nullptr, "Unknown2250"}, //20.0.0+
|
||||
{2260, nullptr, "Unknown2260"}, //20.0.0+
|
||||
{2270, nullptr, "Unknown2270"}, //20.0.0+
|
||||
{2280, nullptr, "Unknown2280"}, //20.0.0+
|
||||
{2300, nullptr, "Unknown2300"}, //20.0.0+
|
||||
{2310, nullptr, "Unknown2310"}, //20.0.0+
|
||||
{2400, nullptr, "Unknown2400"}, //20.0.0+
|
||||
{2420, nullptr, "Unknown2420"}, //20.0.0+
|
||||
};
|
||||
// clang-format on
|
||||
explicit MIG_USR(Core::System& system_) : ServiceFramework{system_, "mig:usr"} {}
|
||||
|
||||
RegisterHandlers(functions);
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, nullptr, "Unknown0"}, //19.0.0+
|
||||
FunctionInfo{1, nullptr, "Unknown1"}, //20.0.0+
|
||||
FunctionInfo{2, nullptr, "Unknown2"}, //20.0.0+
|
||||
FunctionInfo{10, nullptr, "TryGetLastMigrationInfo"},
|
||||
FunctionInfo{11, nullptr, "Unknown11"}, //20.0.0+
|
||||
FunctionInfo{100, nullptr, "CreateUserMigrationServer"}, //7.0.0+
|
||||
FunctionInfo{101, nullptr, "ResumeUserMigrationServer"}, //7.0.0+
|
||||
FunctionInfo{200, nullptr, "CreateUserMigrationClient"}, //7.0.0+
|
||||
FunctionInfo{201, nullptr, "ResumeUserMigrationClient"}, //7.0.0+
|
||||
FunctionInfo{1001, nullptr, "GetSaveDataMigrationPolicyInfoAsync"}, //8.0.0-20.5.0
|
||||
FunctionInfo{1010, nullptr, "TryGetLastSaveDataMigrationInfo"}, //7.0.0+
|
||||
FunctionInfo{1100, nullptr, "CreateSaveDataMigrationServer"}, //7.0.0-19.0.1
|
||||
FunctionInfo{1101, nullptr, "ResumeSaveDataMigrationServer"}, //7.0.0+
|
||||
FunctionInfo{1110, nullptr, "Unknown1101"}, //17.0.0+
|
||||
FunctionInfo{1200, nullptr, "CreateSaveDataMigrationClient"}, //7.0.0+
|
||||
FunctionInfo{1201, nullptr, "ResumeSaveDataMigrationClient"}, //7.0.0+
|
||||
FunctionInfo{2001, nullptr, "Unknown2001"}, //20.0.0+
|
||||
FunctionInfo{2010, nullptr, "Unknown2010"}, //20.0.0+
|
||||
FunctionInfo{2100, nullptr, "Unknown2100"}, //20.0.0+
|
||||
FunctionInfo{2110, nullptr, "Unknown2110"}, //20.0.0+
|
||||
FunctionInfo{2200, nullptr, "Unknown2200"}, //20.0.0+
|
||||
FunctionInfo{2210, nullptr, "Unknown2210"}, //20.0.0+
|
||||
FunctionInfo{2220, nullptr, "Unknown2220"}, //20.0.0+
|
||||
FunctionInfo{2230, nullptr, "Unknown2230"}, //20.0.0+
|
||||
FunctionInfo{2231, nullptr, "Unknown2231"}, //20.0.0+
|
||||
FunctionInfo{2232, nullptr, "Unknown2232"}, //20.0.0+
|
||||
FunctionInfo{2233, nullptr, "Unknown2233"}, //20.0.0+
|
||||
FunctionInfo{2234, nullptr, "Unknown2234"}, //20.0.0+
|
||||
FunctionInfo{2250, nullptr, "Unknown2250"}, //20.0.0+
|
||||
FunctionInfo{2260, nullptr, "Unknown2260"}, //20.0.0+
|
||||
FunctionInfo{2270, nullptr, "Unknown2270"}, //20.0.0+
|
||||
FunctionInfo{2280, nullptr, "Unknown2280"}, //20.0.0+
|
||||
FunctionInfo{2300, nullptr, "Unknown2300"}, //20.0.0+
|
||||
FunctionInfo{2310, nullptr, "Unknown2310"}, //20.0.0+
|
||||
FunctionInfo{2400, nullptr, "Unknown2400"}, //20.0.0+
|
||||
FunctionInfo{2420, nullptr, "Unknown2420"} //20.0.0+
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -24,49 +24,46 @@ namespace Service::Mii {
|
||||
|
||||
class IDatabaseService final : public ServiceFramework<IDatabaseService> {
|
||||
public:
|
||||
explicit IDatabaseService(Core::System& system_, std::shared_ptr<MiiManager> mii_manager,
|
||||
bool is_system_)
|
||||
: ServiceFramework{system_, "IDatabaseService"}, manager{mii_manager}, is_system{
|
||||
is_system_} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, D<&IDatabaseService::IsUpdated>, "IsUpdated"},
|
||||
{1, D<&IDatabaseService::IsFullDatabase>, "IsFullDatabase"},
|
||||
{2, D<&IDatabaseService::GetCount>, "GetCount"},
|
||||
{3, D<&IDatabaseService::Get>, "Get"},
|
||||
{4, D<&IDatabaseService::Get1>, "Get1"},
|
||||
{5, D<&IDatabaseService::UpdateLatest>, "UpdateLatest"},
|
||||
{6, D<&IDatabaseService::BuildRandom>, "BuildRandom"},
|
||||
{7, D<&IDatabaseService::BuildDefault>, "BuildDefault"},
|
||||
{8, D<&IDatabaseService::Get2>, "Get2"},
|
||||
{9, D<&IDatabaseService::Get3>, "Get3"},
|
||||
{10, D<&IDatabaseService::UpdateLatest1>, "UpdateLatest1"},
|
||||
{11, D<&IDatabaseService::FindIndex>, "FindIndex"},
|
||||
{12, D<&IDatabaseService::Move>, "Move"},
|
||||
{13, D<&IDatabaseService::AddOrReplace>, "AddOrReplace"},
|
||||
{14, D<&IDatabaseService::Delete>, "Delete"},
|
||||
{15, D<&IDatabaseService::DestroyFile>, "DestroyFile"},
|
||||
{16, D<&IDatabaseService::DeleteFile>, "DeleteFile"},
|
||||
{17, D<&IDatabaseService::Format>, "Format"},
|
||||
{18, nullptr, "Import"},
|
||||
{19, nullptr, "Export"},
|
||||
{20, D<&IDatabaseService::IsBrokenDatabaseWithClearFlag>, "IsBrokenDatabaseWithClearFlag"},
|
||||
{21, D<&IDatabaseService::GetIndex>, "GetIndex"},
|
||||
{22, D<&IDatabaseService::SetInterfaceVersion>, "SetInterfaceVersion"},
|
||||
{23, D<&IDatabaseService::Convert>, "Convert"},
|
||||
{24, D<&IDatabaseService::ConvertCoreDataToCharInfo>, "ConvertCoreDataToCharInfo"},
|
||||
{25, D<&IDatabaseService::ConvertCharInfoToCoreData>, "ConvertCharInfoToCoreData"},
|
||||
{26, D<&IDatabaseService::Append>, "Append"},
|
||||
};
|
||||
// clang-format on
|
||||
|
||||
RegisterHandlers(functions);
|
||||
|
||||
m_set_sys = system.ServiceManager().GetService<Service::Set::ISystemSettingsServer>(
|
||||
"set:sys", true);
|
||||
explicit IDatabaseService(Core::System& system_, std::shared_ptr<MiiManager> mii_manager, bool is_system_)
|
||||
: ServiceFramework{system_, "IDatabaseService"}
|
||||
, manager{mii_manager}
|
||||
, is_system{is_system_} {
|
||||
m_set_sys = system.ServiceManager().GetService<Service::Set::ISystemSettingsServer>("set:sys", true);
|
||||
manager->Initialize(metadata);
|
||||
}
|
||||
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, D<&IDatabaseService::IsUpdated>, "IsUpdated"},
|
||||
FunctionInfo{1, D<&IDatabaseService::IsFullDatabase>, "IsFullDatabase"},
|
||||
FunctionInfo{2, D<&IDatabaseService::GetCount>, "GetCount"},
|
||||
FunctionInfo{3, D<&IDatabaseService::Get>, "Get"},
|
||||
FunctionInfo{4, D<&IDatabaseService::Get1>, "Get1"},
|
||||
FunctionInfo{5, D<&IDatabaseService::UpdateLatest>, "UpdateLatest"},
|
||||
FunctionInfo{6, D<&IDatabaseService::BuildRandom>, "BuildRandom"},
|
||||
FunctionInfo{7, D<&IDatabaseService::BuildDefault>, "BuildDefault"},
|
||||
FunctionInfo{8, D<&IDatabaseService::Get2>, "Get2"},
|
||||
FunctionInfo{9, D<&IDatabaseService::Get3>, "Get3"},
|
||||
FunctionInfo{10, D<&IDatabaseService::UpdateLatest1>, "UpdateLatest1"},
|
||||
FunctionInfo{11, D<&IDatabaseService::FindIndex>, "FindIndex"},
|
||||
FunctionInfo{12, D<&IDatabaseService::Move>, "Move"},
|
||||
FunctionInfo{13, D<&IDatabaseService::AddOrReplace>, "AddOrReplace"},
|
||||
FunctionInfo{14, D<&IDatabaseService::Delete>, "Delete"},
|
||||
FunctionInfo{15, D<&IDatabaseService::DestroyFile>, "DestroyFile"},
|
||||
FunctionInfo{16, D<&IDatabaseService::DeleteFile>, "DeleteFile"},
|
||||
FunctionInfo{17, D<&IDatabaseService::Format>, "Format"},
|
||||
FunctionInfo{18, nullptr, "Import"},
|
||||
FunctionInfo{19, nullptr, "Export"},
|
||||
FunctionInfo{20, D<&IDatabaseService::IsBrokenDatabaseWithClearFlag>, "IsBrokenDatabaseWithClearFlag"},
|
||||
FunctionInfo{21, D<&IDatabaseService::GetIndex>, "GetIndex"},
|
||||
FunctionInfo{22, D<&IDatabaseService::SetInterfaceVersion>, "SetInterfaceVersion"},
|
||||
FunctionInfo{23, D<&IDatabaseService::Convert>, "Convert"},
|
||||
FunctionInfo{24, D<&IDatabaseService::ConvertCoreDataToCharInfo>, "ConvertCoreDataToCharInfo"},
|
||||
FunctionInfo{25, D<&IDatabaseService::ConvertCharInfoToCoreData>, "ConvertCharInfoToCoreData"},
|
||||
FunctionInfo{26, D<&IDatabaseService::Append>, "Append"}
|
||||
);
|
||||
}
|
||||
|
||||
private:
|
||||
Result IsUpdated(Out<bool> out_is_updated, SourceFlag source_flag) {
|
||||
LOG_DEBUG(Service_Mii, "called with source_flag={}", source_flag);
|
||||
@@ -324,27 +321,25 @@ std::shared_ptr<MiiManager> IStaticService::GetMiiManager() {
|
||||
|
||||
class IImageDatabaseService final : public ServiceFramework<IImageDatabaseService> {
|
||||
public:
|
||||
explicit IImageDatabaseService(Core::System& system_) : ServiceFramework{system_, "miiimg"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, D<&IImageDatabaseService::Initialize>, "Initialize"},
|
||||
{10, nullptr, "Reload"},
|
||||
{11, D<&IImageDatabaseService::GetCount>, "GetCount"},
|
||||
{12, nullptr, "IsEmpty"},
|
||||
{13, nullptr, "IsFull"},
|
||||
{14, nullptr, "GetAttribute"},
|
||||
{15, nullptr, "LoadImage"},
|
||||
{16, nullptr, "AddOrUpdateImage"},
|
||||
{17, nullptr, "DeleteImages"},
|
||||
{100, nullptr, "DeleteFile"},
|
||||
{101, nullptr, "DestroyFile"},
|
||||
{102, nullptr, "ImportFile"},
|
||||
{103, nullptr, "ExportFile"},
|
||||
{104, nullptr, "ForceInitialize"},
|
||||
};
|
||||
// clang-format on
|
||||
explicit IImageDatabaseService(Core::System& system_) : ServiceFramework{system_, "miiimg"} {}
|
||||
|
||||
RegisterHandlers(functions);
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, D<&IImageDatabaseService::Initialize>, "Initialize"},
|
||||
FunctionInfo{10, nullptr, "Reload"},
|
||||
FunctionInfo{11, D<&IImageDatabaseService::GetCount>, "GetCount"},
|
||||
FunctionInfo{12, nullptr, "IsEmpty"},
|
||||
FunctionInfo{13, nullptr, "IsFull"},
|
||||
FunctionInfo{14, nullptr, "GetAttribute"},
|
||||
FunctionInfo{15, nullptr, "LoadImage"},
|
||||
FunctionInfo{16, nullptr, "AddOrUpdateImage"},
|
||||
FunctionInfo{17, nullptr, "DeleteImages"},
|
||||
FunctionInfo{100, nullptr, "DeleteFile"},
|
||||
FunctionInfo{101, nullptr, "DestroyFile"},
|
||||
FunctionInfo{102, nullptr, "ImportFile"},
|
||||
FunctionInfo{103, nullptr, "ExportFile"},
|
||||
FunctionInfo{104, nullptr, "ForceInitialize"}
|
||||
);
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
@@ -49,21 +49,19 @@ public:
|
||||
|
||||
class MM_U final : public ServiceFramework<MM_U> {
|
||||
public:
|
||||
explicit MM_U(Core::System& system_) : ServiceFramework{system_, "mm:u"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, &MM_U::InitializeOld, "InitializeOld"},
|
||||
{1, &MM_U::FinalizeOld, "FinalizeOld"},
|
||||
{2, &MM_U::SetAndWaitOld, "SetAndWaitOld"},
|
||||
{3, &MM_U::GetOld, "GetOld"},
|
||||
{4, &MM_U::Initialize, "Initialize"},
|
||||
{5, &MM_U::Finalize, "Finalize"},
|
||||
{6, &MM_U::SetAndWait, "SetAndWait"},
|
||||
{7, &MM_U::Get, "Get"},
|
||||
};
|
||||
// clang-format on
|
||||
explicit MM_U(Core::System& system_) : ServiceFramework{system_, "mm:u"} {}
|
||||
|
||||
RegisterHandlers(functions);
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, &MM_U::InitializeOld, "InitializeOld"},
|
||||
FunctionInfo{1, &MM_U::FinalizeOld, "FinalizeOld"},
|
||||
FunctionInfo{2, &MM_U::SetAndWaitOld, "SetAndWaitOld"},
|
||||
FunctionInfo{3, &MM_U::GetOld, "GetOld"},
|
||||
FunctionInfo{4, &MM_U::Initialize, "Initialize"},
|
||||
FunctionInfo{5, &MM_U::Finalize, "Finalize"},
|
||||
FunctionInfo{6, &MM_U::SetAndWait, "SetAndWait"},
|
||||
FunctionInfo{7, &MM_U::Get, "Get"}
|
||||
);
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
@@ -14,15 +14,13 @@ namespace Service::MNPP {
|
||||
|
||||
class MNPP_APP final : public ServiceFramework<MNPP_APP> {
|
||||
public:
|
||||
explicit MNPP_APP(Core::System& system_) : ServiceFramework{system_, "mnpp:app"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, &MNPP_APP::Cmd0, "Cmd0"},
|
||||
{1, &MNPP_APP::Cmd1, "Cmd1"},
|
||||
};
|
||||
// clang-format on
|
||||
explicit MNPP_APP(Core::System& system_) : ServiceFramework{system_, "mnpp:app"} {}
|
||||
|
||||
RegisterHandlers(functions);
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, &MNPP_APP::Cmd0, "Cmd0"},
|
||||
FunctionInfo{1, &MNPP_APP::Cmd1, "Cmd1"}
|
||||
);
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -43,34 +41,32 @@ private:
|
||||
|
||||
class MNPP_SYS final : public ServiceFramework<MNPP_SYS> {
|
||||
public:
|
||||
explicit MNPP_SYS(Core::System& system_) : ServiceFramework{system_, "mnpp:sys"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "Cmd0"},
|
||||
{10, nullptr, "Cmd10"},
|
||||
{100, nullptr, "Cmd100"},
|
||||
{200, nullptr, "Cmd200"},
|
||||
{300, nullptr, "Cmd300"},
|
||||
{400, nullptr, "Cmd400"},
|
||||
};
|
||||
// clang-format on
|
||||
RegisterHandlers(functions);
|
||||
explicit MNPP_SYS(Core::System& system_) : ServiceFramework{system_, "mnpp:sys"} {}
|
||||
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, nullptr, "Cmd0"},
|
||||
FunctionInfo{10, nullptr, "Cmd10"},
|
||||
FunctionInfo{100, nullptr, "Cmd100"},
|
||||
FunctionInfo{200, nullptr, "Cmd200"},
|
||||
FunctionInfo{300, nullptr, "Cmd300"},
|
||||
FunctionInfo{400, nullptr, "Cmd400"}
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
class MNPP_WEB final : public ServiceFramework<MNPP_WEB> {
|
||||
public:
|
||||
explicit MNPP_WEB(Core::System& system_) : ServiceFramework{system_, "mnpp:web"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "Cmd0"},
|
||||
{1, nullptr, "Cmd1"},
|
||||
{10, nullptr, "Cmd10"},
|
||||
{20, nullptr, "Cmd20"},
|
||||
{100, nullptr, "Cmd100"},
|
||||
};
|
||||
// clang-format on
|
||||
RegisterHandlers(functions);
|
||||
explicit MNPP_WEB(Core::System& system_) : ServiceFramework{system_, "mnpp:web"} {}
|
||||
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, nullptr, "Cmd0"},
|
||||
FunctionInfo{1, nullptr, "Cmd1"},
|
||||
FunctionInfo{10, nullptr, "Cmd10"},
|
||||
FunctionInfo{20, nullptr, "Cmd20"},
|
||||
FunctionInfo{100, nullptr, "Cmd100"}
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -24,33 +24,31 @@ namespace Service::NCM {
|
||||
class ILocationResolver final : public ServiceFramework<ILocationResolver> {
|
||||
public:
|
||||
explicit ILocationResolver(Core::System& system_, FileSys::StorageId id)
|
||||
: ServiceFramework{system_, "ILocationResolver"}, storage{id} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "ResolveProgramPath"},
|
||||
{1, nullptr, "RedirectProgramPath"},
|
||||
{2, nullptr, "ResolveApplicationControlPath"},
|
||||
{3, nullptr, "ResolveApplicationHtmlDocumentPath"},
|
||||
{4, nullptr, "ResolveDataPath"},
|
||||
{5, nullptr, "RedirectApplicationControlPath"},
|
||||
{6, nullptr, "RedirectApplicationHtmlDocumentPath"},
|
||||
{7, nullptr, "ResolveApplicationLegalInformationPath"},
|
||||
{8, nullptr, "RedirectApplicationLegalInformationPath"},
|
||||
{9, nullptr, "Refresh"},
|
||||
{10, nullptr, "RedirectApplicationProgramPath"},
|
||||
{11, nullptr, "ClearApplicationRedirection"},
|
||||
{12, nullptr, "EraseProgramRedirection"},
|
||||
{13, nullptr, "EraseApplicationControlRedirection"},
|
||||
{14, nullptr, "EraseApplicationHtmlDocumentRedirection"},
|
||||
{15, nullptr, "EraseApplicationLegalInformationRedirection"},
|
||||
{16, nullptr, "ResolveProgramPathForDebug"},
|
||||
{17, nullptr, "RedirectProgramPathForDebug"},
|
||||
{18, nullptr, "RedirectApplicationProgramPathForDebug"},
|
||||
{19, nullptr, "EraseProgramRedirectionForDebug"},
|
||||
};
|
||||
// clang-format on
|
||||
: ServiceFramework{system_, "ILocationResolver"}, storage{id} {}
|
||||
|
||||
RegisterHandlers(functions);
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, nullptr, "ResolveProgramPath"},
|
||||
FunctionInfo{1, nullptr, "RedirectProgramPath"},
|
||||
FunctionInfo{2, nullptr, "ResolveApplicationControlPath"},
|
||||
FunctionInfo{3, nullptr, "ResolveApplicationHtmlDocumentPath"},
|
||||
FunctionInfo{4, nullptr, "ResolveDataPath"},
|
||||
FunctionInfo{5, nullptr, "RedirectApplicationControlPath"},
|
||||
FunctionInfo{6, nullptr, "RedirectApplicationHtmlDocumentPath"},
|
||||
FunctionInfo{7, nullptr, "ResolveApplicationLegalInformationPath"},
|
||||
FunctionInfo{8, nullptr, "RedirectApplicationLegalInformationPath"},
|
||||
FunctionInfo{9, nullptr, "Refresh"},
|
||||
FunctionInfo{10, nullptr, "RedirectApplicationProgramPath"},
|
||||
FunctionInfo{11, nullptr, "ClearApplicationRedirection"},
|
||||
FunctionInfo{12, nullptr, "EraseProgramRedirection"},
|
||||
FunctionInfo{13, nullptr, "EraseApplicationControlRedirection"},
|
||||
FunctionInfo{14, nullptr, "EraseApplicationHtmlDocumentRedirection"},
|
||||
FunctionInfo{15, nullptr, "EraseApplicationLegalInformationRedirection"},
|
||||
FunctionInfo{16, nullptr, "ResolveProgramPathForDebug"},
|
||||
FunctionInfo{17, nullptr, "RedirectProgramPathForDebug"},
|
||||
FunctionInfo{18, nullptr, "RedirectApplicationProgramPathForDebug"},
|
||||
FunctionInfo{19, nullptr, "EraseProgramRedirectionForDebug"}
|
||||
);
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -60,60 +58,54 @@ private:
|
||||
class IRegisteredLocationResolver final : public ServiceFramework<IRegisteredLocationResolver> {
|
||||
public:
|
||||
explicit IRegisteredLocationResolver(Core::System& system_)
|
||||
: ServiceFramework{system_, "IRegisteredLocationResolver"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "ResolveProgramPath"},
|
||||
{1, nullptr, "RegisterProgramPath"},
|
||||
{2, nullptr, "UnregisterProgramPath"},
|
||||
{3, nullptr, "RedirectProgramPath"},
|
||||
{4, nullptr, "ResolveHtmlDocumentPath"},
|
||||
{5, nullptr, "RegisterHtmlDocumentPath"},
|
||||
{6, nullptr, "UnregisterHtmlDocumentPath"},
|
||||
{7, nullptr, "RedirectHtmlDocumentPath"},
|
||||
{8, nullptr, "Refresh"},
|
||||
{9, nullptr, "RefreshExcluding"},
|
||||
};
|
||||
// clang-format on
|
||||
: ServiceFramework{system_, "IRegisteredLocationResolver"} {}
|
||||
|
||||
RegisterHandlers(functions);
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, nullptr, "ResolveProgramPath"},
|
||||
FunctionInfo{1, nullptr, "RegisterProgramPath"},
|
||||
FunctionInfo{2, nullptr, "UnregisterProgramPath"},
|
||||
FunctionInfo{3, nullptr, "RedirectProgramPath"},
|
||||
FunctionInfo{4, nullptr, "ResolveHtmlDocumentPath"},
|
||||
FunctionInfo{5, nullptr, "RegisterHtmlDocumentPath"},
|
||||
FunctionInfo{6, nullptr, "UnregisterHtmlDocumentPath"},
|
||||
FunctionInfo{7, nullptr, "RedirectHtmlDocumentPath"},
|
||||
FunctionInfo{8, nullptr, "Refresh"},
|
||||
FunctionInfo{9, nullptr, "RefreshExcluding"}
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
class IAddOnContentLocationResolver final : public ServiceFramework<IAddOnContentLocationResolver> {
|
||||
public:
|
||||
explicit IAddOnContentLocationResolver(Core::System& system_)
|
||||
: ServiceFramework{system_, "IAddOnContentLocationResolver"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "ResolveAddOnContentPath"},
|
||||
{1, nullptr, "RegisterAddOnContentStorage"},
|
||||
{2, nullptr, "UnregisterAllAddOnContentPath"},
|
||||
{3, nullptr, "RefreshApplicationAddOnContent"},
|
||||
{4, nullptr, "UnregisterApplicationAddOnContent"},
|
||||
};
|
||||
// clang-format on
|
||||
: ServiceFramework{system_, "IAddOnContentLocationResolver"} {}
|
||||
|
||||
RegisterHandlers(functions);
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, nullptr, "ResolveAddOnContentPath"},
|
||||
FunctionInfo{1, nullptr, "RegisterAddOnContentStorage"},
|
||||
FunctionInfo{2, nullptr, "UnregisterAllAddOnContentPath"},
|
||||
FunctionInfo{3, nullptr, "RefreshApplicationAddOnContent"},
|
||||
FunctionInfo{4, nullptr, "UnregisterApplicationAddOnContent"}
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
class IContentStorage final : public ServiceFramework<IContentStorage> {
|
||||
public:
|
||||
explicit IContentStorage(Core::System& system_, FileSys::StorageId id)
|
||||
: ServiceFramework{system_, "IContentStorage"}, storage{id} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, &IContentStorage::GeneratePlaceHolderId, "GeneratePlaceHolderId"},
|
||||
{1, &IContentStorage::CreatePlaceHolder, "CreatePlaceHolder"},
|
||||
{2, &IContentStorage::DeletePlaceHolder, "DeletePlaceHolder"},
|
||||
{4, &IContentStorage::WritePlaceHolder, "WritePlaceHolder"},
|
||||
{5, &IContentStorage::Register, "Register"},
|
||||
{6, &IContentStorage::Delete, "Delete"},
|
||||
};
|
||||
// clang-format on
|
||||
: ServiceFramework{system_, "IContentStorage"}, storage{id} {}
|
||||
|
||||
RegisterHandlers(functions);
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, &IContentStorage::GeneratePlaceHolderId, "GeneratePlaceHolderId"},
|
||||
FunctionInfo{1, &IContentStorage::CreatePlaceHolder, "CreatePlaceHolder"},
|
||||
FunctionInfo{2, &IContentStorage::DeletePlaceHolder, "DeletePlaceHolder"},
|
||||
FunctionInfo{4, &IContentStorage::WritePlaceHolder, "WritePlaceHolder"},
|
||||
FunctionInfo{5, &IContentStorage::Register, "Register"},
|
||||
FunctionInfo{6, &IContentStorage::Delete, "Delete"}
|
||||
);
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -258,17 +250,15 @@ private:
|
||||
class IContentMetaDatabase final : public ServiceFramework<IContentMetaDatabase> {
|
||||
public:
|
||||
explicit IContentMetaDatabase(Core::System& system_, FileSys::StorageId id)
|
||||
: ServiceFramework{system_, "IContentMetaDatabase"}, storage{id} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, &IContentMetaDatabase::Set, "Set"},
|
||||
{2, &IContentMetaDatabase::Remove, "Remove"},
|
||||
{8, &IContentMetaDatabase::Has, "Has"},
|
||||
{15, &IContentMetaDatabase::Commit, "Commit"},
|
||||
};
|
||||
// clang-format on
|
||||
: ServiceFramework{system_, "IContentMetaDatabase"}, storage{id} {}
|
||||
|
||||
RegisterHandlers(functions);
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, &IContentMetaDatabase::Set, "Set"},
|
||||
FunctionInfo{2, &IContentMetaDatabase::Remove, "Remove"},
|
||||
FunctionInfo{8, &IContentMetaDatabase::Has, "Has"},
|
||||
FunctionInfo{15, &IContentMetaDatabase::Commit, "Commit"}
|
||||
);
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -362,45 +352,41 @@ private:
|
||||
|
||||
class LR final : public ServiceFramework<LR> {
|
||||
public:
|
||||
explicit LR(Core::System& system_) : ServiceFramework{system_, "lr"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "OpenLocationResolver"},
|
||||
{1, nullptr, "OpenRegisteredLocationResolver"},
|
||||
{2, nullptr, "RefreshLocationResolver"},
|
||||
{3, nullptr, "OpenAddOnContentLocationResolver"},
|
||||
};
|
||||
// clang-format on
|
||||
explicit LR(Core::System& system_) : ServiceFramework{system_, "lr"} {}
|
||||
|
||||
RegisterHandlers(functions);
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, nullptr, "OpenLocationResolver"},
|
||||
FunctionInfo{1, nullptr, "OpenRegisteredLocationResolver"},
|
||||
FunctionInfo{2, nullptr, "RefreshLocationResolver"},
|
||||
FunctionInfo{3, nullptr, "OpenAddOnContentLocationResolver"}
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
class NCM final : public ServiceFramework<NCM> {
|
||||
public:
|
||||
explicit NCM(Core::System& system_) : ServiceFramework{system_, "ncm"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "CreateContentStorage"},
|
||||
{1, nullptr, "CreateContentMetaDatabase"},
|
||||
{2, nullptr, "VerifyContentStorage"},
|
||||
{3, nullptr, "VerifyContentMetaDatabase"},
|
||||
{4, &NCM::OpenContentStorage, "OpenContentStorage"},
|
||||
{5, &NCM::OpenContentMetaDatabase, "OpenContentMetaDatabase"},
|
||||
{6, nullptr, "CloseContentStorageForcibly"},
|
||||
{7, nullptr, "CloseContentMetaDatabaseForcibly"},
|
||||
{8, nullptr, "CleanupContentMetaDatabase"},
|
||||
{9, nullptr, "ActivateContentStorage"},
|
||||
{10, nullptr, "InactivateContentStorage"},
|
||||
{11, nullptr, "ActivateContentMetaDatabase"},
|
||||
{12, nullptr, "InactivateContentMetaDatabase"},
|
||||
{13, nullptr, "InvalidateRightsIdCache"},
|
||||
{14, nullptr, "GetMemoryReport"},
|
||||
{15, nullptr, "ActivateFsContentStorage"},
|
||||
};
|
||||
// clang-format on
|
||||
explicit NCM(Core::System& system_) : ServiceFramework{system_, "ncm"} {}
|
||||
|
||||
RegisterHandlers(functions);
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, nullptr, "CreateContentStorage"},
|
||||
FunctionInfo{1, nullptr, "CreateContentMetaDatabase"},
|
||||
FunctionInfo{2, nullptr, "VerifyContentStorage"},
|
||||
FunctionInfo{3, nullptr, "VerifyContentMetaDatabase"},
|
||||
FunctionInfo{4, &NCM::OpenContentStorage, "OpenContentStorage"},
|
||||
FunctionInfo{5, &NCM::OpenContentMetaDatabase, "OpenContentMetaDatabase"},
|
||||
FunctionInfo{6, nullptr, "CloseContentStorageForcibly"},
|
||||
FunctionInfo{7, nullptr, "CloseContentMetaDatabaseForcibly"},
|
||||
FunctionInfo{8, nullptr, "CleanupContentMetaDatabase"},
|
||||
FunctionInfo{9, nullptr, "ActivateContentStorage"},
|
||||
FunctionInfo{10, nullptr, "InactivateContentStorage"},
|
||||
FunctionInfo{11, nullptr, "ActivateContentMetaDatabase"},
|
||||
FunctionInfo{12, nullptr, "InactivateContentMetaDatabase"},
|
||||
FunctionInfo{13, nullptr, "InvalidateRightsIdCache"},
|
||||
FunctionInfo{14, nullptr, "GetMemoryReport"},
|
||||
FunctionInfo{15, nullptr, "ActivateFsContentStorage"}
|
||||
);
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -433,7 +419,7 @@ public:
|
||||
: ServiceFramework{system_, "ncm:v"}
|
||||
{
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "GetSystemVersion"},
|
||||
FunctionInfo{0, nullptr, "GetSystemVersion"}
|
||||
};
|
||||
RegisterHandlers(functions);
|
||||
}
|
||||
|
||||
@@ -19,8 +19,7 @@ namespace Service::NFC {
|
||||
class IUser final : public NfcInterface {
|
||||
public:
|
||||
explicit IUser(Core::System& system_) : NfcInterface(system_, "NFC::IUser", BackendType::Nfc) {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
static const FunctionInfoTyped<IUser> functions[] = {
|
||||
{0, &NfcInterface::Initialize, "InitializeOld"},
|
||||
{1, &NfcInterface::Finalize, "FinalizeOld"},
|
||||
{2, &NfcInterface::GetState, "GetStateOld"},
|
||||
@@ -42,10 +41,8 @@ public:
|
||||
{1001, &NfcInterface::WriteMifare ,"WriteMifare"},
|
||||
{1300, &NfcInterface::SendCommandByPassThrough, "SendCommandByPassThrough"},
|
||||
{1301, nullptr, "KeepPassThroughSession"},
|
||||
{1302, nullptr, "ReleasePassThroughSession"},
|
||||
{1302, nullptr, "ReleasePassThroughSession"}
|
||||
};
|
||||
// clang-format on
|
||||
|
||||
RegisterHandlers(functions);
|
||||
}
|
||||
};
|
||||
@@ -54,8 +51,7 @@ class ISystem final : public NfcInterface {
|
||||
public:
|
||||
explicit ISystem(Core::System& system_)
|
||||
: NfcInterface{system_, "NFC::ISystem", BackendType::Nfc} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
static const FunctionInfoTyped<ISystem> functions[] = {
|
||||
{0, &NfcInterface::Initialize, "InitializeOld"},
|
||||
{1, &NfcInterface::Finalize, "FinalizeOld"},
|
||||
{2, &NfcInterface::GetState, "GetStateOld"},
|
||||
@@ -80,10 +76,8 @@ public:
|
||||
{1001, &NfcInterface::WriteMifare, "WriteMifare"},
|
||||
{1300, &NfcInterface::SendCommandByPassThrough, "SendCommandByPassThrough"},
|
||||
{1301, nullptr, "KeepPassThroughSession"},
|
||||
{1302, nullptr, "ReleasePassThroughSession"},
|
||||
{1302, nullptr, "ReleasePassThroughSession"}
|
||||
};
|
||||
// clang-format on
|
||||
|
||||
RegisterHandlers(functions);
|
||||
}
|
||||
};
|
||||
@@ -93,9 +87,7 @@ public:
|
||||
using MFInterface = NfcInterface;
|
||||
class MFIUser final : public MFInterface {
|
||||
public:
|
||||
explicit MFIUser(Core::System& system_)
|
||||
: MFInterface{system_, "NFC::MFInterface", BackendType::Mifare} {
|
||||
// clang-format off
|
||||
explicit MFIUser(Core::System& system_) : MFInterface{system_, "NFC::MFInterface", BackendType::Mifare} {
|
||||
static const FunctionInfoTyped<MFIUser> functions[] = {
|
||||
{0, &MFIUser::Initialize, "Initialize"},
|
||||
{1, &MFIUser::Finalize, "Finalize"},
|
||||
@@ -110,39 +102,33 @@ public:
|
||||
{10, &MFIUser::GetState, "GetState"},
|
||||
{11, &MFIUser::GetDeviceState, "GetDeviceState"},
|
||||
{12, &MFIUser::GetNpadId, "GetNpadId"},
|
||||
{13, &MFIUser::AttachAvailabilityChangeEvent, "GetAvailabilityChangeEventHandle"},
|
||||
{13, &MFIUser::AttachAvailabilityChangeEvent, "GetAvailabilityChangeEventHandle"}
|
||||
};
|
||||
// clang-format on
|
||||
|
||||
RegisterHandlers(functions);
|
||||
}
|
||||
};
|
||||
|
||||
class IAm final : public ServiceFramework<IAm> {
|
||||
public:
|
||||
explicit IAm(Core::System& system_) : ServiceFramework{system_, "NFC::IAm"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "Initialize"},
|
||||
{1, nullptr, "Finalize"},
|
||||
{2, nullptr, "NotifyForegroundApplet"},
|
||||
};
|
||||
// clang-format on
|
||||
explicit IAm(Core::System& system_) : ServiceFramework{system_, "NFC::IAm"} {}
|
||||
|
||||
RegisterHandlers(functions);
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, nullptr, "Initialize"},
|
||||
FunctionInfo{1, nullptr, "Finalize"},
|
||||
FunctionInfo{2, nullptr, "NotifyForegroundApplet"}
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
class NFC_AM final : public ServiceFramework<NFC_AM> {
|
||||
public:
|
||||
explicit NFC_AM(Core::System& system_) : ServiceFramework{system_, "nfc:am"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, &NFC_AM::CreateAmNfcInterface, "CreateAmNfcInterface"},
|
||||
};
|
||||
// clang-format on
|
||||
explicit NFC_AM(Core::System& system_) : ServiceFramework{system_, "nfc:am"} {}
|
||||
|
||||
RegisterHandlers(functions);
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, &NFC_AM::CreateAmNfcInterface, "CreateAmNfcInterface"}
|
||||
);
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -157,14 +143,12 @@ private:
|
||||
|
||||
class NFC_MF_U final : public ServiceFramework<NFC_MF_U> {
|
||||
public:
|
||||
explicit NFC_MF_U(Core::System& system_) : ServiceFramework{system_, "nfc:mf:u"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, &NFC_MF_U::CreateUserNfcInterface, "CreateUserNfcInterface"},
|
||||
};
|
||||
// clang-format on
|
||||
explicit NFC_MF_U(Core::System& system_) : ServiceFramework{system_, "nfc:mf:u"} {}
|
||||
|
||||
RegisterHandlers(functions);
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, &NFC_MF_U::CreateUserNfcInterface, "CreateUserNfcInterface"}
|
||||
);
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -179,14 +163,12 @@ private:
|
||||
|
||||
class NFC_U final : public ServiceFramework<NFC_U> {
|
||||
public:
|
||||
explicit NFC_U(Core::System& system_) : ServiceFramework{system_, "nfc:user"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, &NFC_U::CreateUserNfcInterface, "CreateUserNfcInterface"},
|
||||
};
|
||||
// clang-format on
|
||||
explicit NFC_U(Core::System& system_) : ServiceFramework{system_, "nfc:user"} {}
|
||||
|
||||
RegisterHandlers(functions);
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, &NFC_U::CreateUserNfcInterface, "CreateUserNfcInterface"}
|
||||
);
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -201,14 +183,12 @@ private:
|
||||
|
||||
class NFC_SYS final : public ServiceFramework<NFC_SYS> {
|
||||
public:
|
||||
explicit NFC_SYS(Core::System& system_) : ServiceFramework{system_, "nfc:sys"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, &NFC_SYS::CreateSystemNfcInterface, "CreateSystemNfcInterface"},
|
||||
};
|
||||
// clang-format on
|
||||
explicit NFC_SYS(Core::System& system_) : ServiceFramework{system_, "nfc:sys"} {}
|
||||
|
||||
RegisterHandlers(functions);
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, &NFC_SYS::CreateSystemNfcInterface, "CreateSystemNfcInterface"}
|
||||
);
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
@@ -15,7 +15,6 @@ namespace Service::NFP {
|
||||
class IUser final : public Interface {
|
||||
public:
|
||||
explicit IUser(Core::System& system_) : Interface(system_, "NFP:IUser") {
|
||||
// clang-format off
|
||||
static const FunctionInfoTyped<IUser> functions[] = {
|
||||
{0, &IUser::Initialize, "Initialize"},
|
||||
{1, &IUser::Finalize, "Finalize"},
|
||||
@@ -42,10 +41,8 @@ public:
|
||||
{22, &IUser::GetApplicationAreaSize, "GetApplicationAreaSize"},
|
||||
{23, &IUser::AttachAvailabilityChangeEvent, "AttachAvailabilityChangeEvent"},
|
||||
{24, &IUser::RecreateApplicationArea, "RecreateApplicationArea"},
|
||||
{25, &IUser::StartDetection, "StartDetectionWithFilter"},
|
||||
{25, &IUser::StartDetection, "StartDetectionWithFilter"}
|
||||
};
|
||||
// clang-format on
|
||||
|
||||
RegisterHandlers(functions);
|
||||
}
|
||||
};
|
||||
@@ -53,7 +50,6 @@ public:
|
||||
class ISystem final : public Interface {
|
||||
public:
|
||||
explicit ISystem(Core::System& system_) : Interface(system_, "NFP:ISystem") {
|
||||
// clang-format off
|
||||
static const FunctionInfoTyped<ISystem> functions[] = {
|
||||
{0, &ISystem::InitializeSystem, "InitializeSystem"},
|
||||
{1, &ISystem::FinalizeSystem, "FinalizeSystem"},
|
||||
@@ -82,10 +78,8 @@ public:
|
||||
{103, &ISystem::SetRegisterInfoPrivate, "SetRegisterInfoPrivate"},
|
||||
{104, &ISystem::DeleteRegisterInfo, "DeleteRegisterInfo"},
|
||||
{105, &ISystem::DeleteApplicationArea, "DeleteApplicationArea"},
|
||||
{106, &ISystem::ExistsApplicationArea, "ExistsApplicationArea"},
|
||||
{106, &ISystem::ExistsApplicationArea, "ExistsApplicationArea"}
|
||||
};
|
||||
// clang-format on
|
||||
|
||||
RegisterHandlers(functions);
|
||||
}
|
||||
};
|
||||
@@ -93,7 +87,6 @@ public:
|
||||
class IDebug final : public Interface {
|
||||
public:
|
||||
explicit IDebug(Core::System& system_) : Interface(system_, "NFP:IDebug") {
|
||||
// clang-format off
|
||||
static const FunctionInfoTyped<IDebug> functions[] = {
|
||||
{0, &IDebug::InitializeDebug, "InitializeDebug"},
|
||||
{1, &IDebug::FinalizeDebug, "FinalizeDebug"},
|
||||
@@ -134,24 +127,20 @@ public:
|
||||
{203, &IDebug::BreakTag, "BreakTag"},
|
||||
{204, &IDebug::ReadBackupData, "ReadBackupData"},
|
||||
{205, &IDebug::WriteBackupData, "WriteBackupData"},
|
||||
{206, &IDebug::WriteNtf, "WriteNtf"},
|
||||
{206, &IDebug::WriteNtf, "WriteNtf"}
|
||||
};
|
||||
// clang-format on
|
||||
|
||||
RegisterHandlers(functions);
|
||||
}
|
||||
};
|
||||
|
||||
class IUserManager final : public ServiceFramework<IUserManager> {
|
||||
public:
|
||||
explicit IUserManager(Core::System& system_) : ServiceFramework{system_, "nfp:user"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, &IUserManager::CreateUserInterface, "CreateUserInterface"},
|
||||
};
|
||||
// clang-format on
|
||||
explicit IUserManager(Core::System& system_) : ServiceFramework{system_, "nfp:user"} {}
|
||||
|
||||
RegisterHandlers(functions);
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, &IUserManager::CreateUserInterface, "CreateUserInterface"}
|
||||
);
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -166,14 +155,12 @@ private:
|
||||
|
||||
class ISystemManager final : public ServiceFramework<ISystemManager> {
|
||||
public:
|
||||
explicit ISystemManager(Core::System& system_) : ServiceFramework{system_, "nfp:sys"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, &ISystemManager::CreateSystemInterface, "CreateSystemInterface"},
|
||||
};
|
||||
// clang-format on
|
||||
explicit ISystemManager(Core::System& system_) : ServiceFramework{system_, "nfp:sys"} {}
|
||||
|
||||
RegisterHandlers(functions);
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, &ISystemManager::CreateSystemInterface, "CreateSystemInterface"}
|
||||
);
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -188,14 +175,12 @@ private:
|
||||
|
||||
class IDebugManager final : public ServiceFramework<IDebugManager> {
|
||||
public:
|
||||
explicit IDebugManager(Core::System& system_) : ServiceFramework{system_, "nfp:dbg"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, &IDebugManager::CreateDebugInterface, "CreateDebugInterface"},
|
||||
};
|
||||
// clang-format on
|
||||
explicit IDebugManager(Core::System& system_) : ServiceFramework{system_, "nfp:dbg"} {}
|
||||
|
||||
RegisterHandlers(functions);
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, &IDebugManager::CreateDebugInterface, "CreateDebugInterface"}
|
||||
);
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
@@ -21,15 +21,13 @@ namespace Service::NGC {
|
||||
|
||||
class IService final : public ServiceFramework<IService> {
|
||||
public:
|
||||
explicit IService(Core::System& system_) : ServiceFramework{system_, "ngct:u"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, &IService::Match, "Match"},
|
||||
{1, &IService::Filter, "Filter"},
|
||||
};
|
||||
// clang-format on
|
||||
explicit IService(Core::System& system_) : ServiceFramework{system_, "ngct:u"} {}
|
||||
|
||||
RegisterHandlers(functions);
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, &IService::Match, "Match"},
|
||||
FunctionInfo{1, &IService::Filter, "Filter"}
|
||||
);
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -65,19 +63,17 @@ private:
|
||||
|
||||
class NgcServiceImpl final : public ServiceFramework<NgcServiceImpl> {
|
||||
public:
|
||||
explicit NgcServiceImpl(Core::System& system_) : ServiceFramework(system_, "ngc:u") {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, &NgcServiceImpl::GetContentVersion, "GetContentVersion"},
|
||||
{1, &NgcServiceImpl::Check, "Check"},
|
||||
{2, &NgcServiceImpl::Mask, "Mask"},
|
||||
{3, &NgcServiceImpl::Reload, "Reload"},
|
||||
{4, &NgcServiceImpl::Check, "Check2"},
|
||||
{5, &NgcServiceImpl::Mask, "Mask2"},
|
||||
};
|
||||
// clang-format on
|
||||
explicit NgcServiceImpl(Core::System& system_) : ServiceFramework(system_, "ngc:u") {}
|
||||
|
||||
RegisterHandlers(functions);
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, &NgcServiceImpl::GetContentVersion, "GetContentVersion"},
|
||||
FunctionInfo{1, &NgcServiceImpl::Check, "Check"},
|
||||
FunctionInfo{2, &NgcServiceImpl::Mask, "Mask"},
|
||||
FunctionInfo{3, &NgcServiceImpl::Reload, "Reload"},
|
||||
FunctionInfo{4, &NgcServiceImpl::Check, "Check2"},
|
||||
FunctionInfo{5, &NgcServiceImpl::Mask, "Mask2"}
|
||||
);
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -154,21 +150,20 @@ private:
|
||||
|
||||
class IServiceWithManagementApi final : public ServiceFramework<IServiceWithManagementApi> {
|
||||
public:
|
||||
explicit IServiceWithManagementApi(Core::System& system_) : ServiceFramework(system_, "ngct:s") {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0 , nullptr, "Match"},
|
||||
{1 , nullptr, "Filter"},
|
||||
{100, nullptr, "ConfigureAutoUpdateSetting"},
|
||||
{101, nullptr, "RequestResourceUpdateCheck"},
|
||||
{110, nullptr, "Reload"},
|
||||
{111, nullptr, "IsReloadRequired"},
|
||||
{112, nullptr, "TryAcquireReloadRequestNotifier"},
|
||||
{120, nullptr, "CalculateContentFingerprint"},
|
||||
{130, nullptr, "TryEnableTemporalPassThrough"},
|
||||
};
|
||||
// clang-format on
|
||||
RegisterHandlers(functions);
|
||||
explicit IServiceWithManagementApi(Core::System& system_) : ServiceFramework(system_, "ngct:s") {}
|
||||
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, nullptr, "Match"},
|
||||
FunctionInfo{1, nullptr, "Filter"},
|
||||
FunctionInfo{100, nullptr, "ConfigureAutoUpdateSetting"},
|
||||
FunctionInfo{101, nullptr, "RequestResourceUpdateCheck"},
|
||||
FunctionInfo{110, nullptr, "Reload"},
|
||||
FunctionInfo{111, nullptr, "IsReloadRequired"},
|
||||
FunctionInfo{112, nullptr, "TryAcquireReloadRequestNotifier"},
|
||||
FunctionInfo{120, nullptr, "CalculateContentFingerprint"},
|
||||
FunctionInfo{130, nullptr, "TryEnableTemporalPassThrough"}
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -179,20 +174,19 @@ static_assert(sizeof(SaveDataHandle) == 0x08);
|
||||
|
||||
class IUserShimScopedObject final : public ServiceFramework<IUserShimScopedObject> {
|
||||
public:
|
||||
explicit IUserShimScopedObject(Core::System& system_) : ServiceFramework(system_, "IUserShimScopedObject") {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{450, nullptr, "InitializeForSaveData"},
|
||||
{451, nullptr, "FinalizeForSaveData"},
|
||||
{452, D<&IUserShimScopedObject::OpenSaveData>, "OpenSaveData"},
|
||||
{453, nullptr, "CloseSaveData"},
|
||||
{454, D<&IUserShimScopedObject::ReadSaveSlot>, "ReadSaveSlot"},
|
||||
{455, D<&IUserShimScopedObject::WriteSaveSlot>, "WriteSaveSlot"},
|
||||
{456, nullptr, "FlushSaveSlot"},
|
||||
{457, nullptr, "CommitSaveData"},
|
||||
};
|
||||
// clang-format on
|
||||
RegisterHandlers(functions);
|
||||
explicit IUserShimScopedObject(Core::System& system_) : ServiceFramework(system_, "IUserShimScopedObject") {}
|
||||
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{450, nullptr, "InitializeForSaveData"},
|
||||
FunctionInfo{451, nullptr, "FinalizeForSaveData"},
|
||||
FunctionInfo{452, D<&IUserShimScopedObject::OpenSaveData>, "OpenSaveData"},
|
||||
FunctionInfo{453, nullptr, "CloseSaveData"},
|
||||
FunctionInfo{454, D<&IUserShimScopedObject::ReadSaveSlot>, "ReadSaveSlot"},
|
||||
FunctionInfo{455, D<&IUserShimScopedObject::WriteSaveSlot>, "WriteSaveSlot"},
|
||||
FunctionInfo{456, nullptr, "FlushSaveSlot"},
|
||||
FunctionInfo{457, nullptr, "CommitSaveData"}
|
||||
);
|
||||
}
|
||||
|
||||
Result OpenSaveData(Account::Uid unk0, Out<SaveDataHandle> unk1) {
|
||||
@@ -214,13 +208,12 @@ public:
|
||||
|
||||
class IUserService final : public ServiceFramework<IUserService> {
|
||||
public:
|
||||
explicit IUserService(Core::System& system_) : ServiceFramework(system_, "stpl:u") {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0 , D<&IUserService::Cmd0>, "Cmd0"},
|
||||
};
|
||||
// clang-format on
|
||||
RegisterHandlers(functions);
|
||||
explicit IUserService(Core::System& system_) : ServiceFramework(system_, "stpl:u") {}
|
||||
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, D<&IUserService::Cmd0>, "Cmd0"}
|
||||
);
|
||||
}
|
||||
Result Cmd0(u32 unk0, OutInterface<IUserShimScopedObject> out_interface) {
|
||||
LOG_WARNING(Service_NGC, "stubbed");
|
||||
@@ -231,21 +224,20 @@ public:
|
||||
|
||||
class ISystemShimScopedObject final : public ServiceFramework<ISystemShimScopedObject> {
|
||||
public:
|
||||
explicit ISystemShimScopedObject(Core::System& system_) : ServiceFramework(system_, "ISystemShimScopedObject") {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{106, nullptr, "Cmd106"},
|
||||
{107, nullptr, "Cmd107"},
|
||||
{108, D<&ISystemShimScopedObject::Cmd108>, "Cmd108"},
|
||||
{207, nullptr, "Cmd207"},
|
||||
{208, D<&ISystemShimScopedObject::Cmd208>, "Cmd208"},
|
||||
{209, nullptr, "Cmd209"},
|
||||
{210, nullptr, "Cmd210"},
|
||||
{211, nullptr, "Cmd211"},
|
||||
{212, nullptr, "Cmd212"},
|
||||
};
|
||||
// clang-format on
|
||||
RegisterHandlers(functions);
|
||||
explicit ISystemShimScopedObject(Core::System& system_) : ServiceFramework(system_, "ISystemShimScopedObject") {}
|
||||
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{106, nullptr, "Cmd106"},
|
||||
FunctionInfo{107, nullptr, "Cmd107"},
|
||||
FunctionInfo{108, D<&ISystemShimScopedObject::Cmd108>, "Cmd108"},
|
||||
FunctionInfo{207, nullptr, "Cmd207"},
|
||||
FunctionInfo{208, D<&ISystemShimScopedObject::Cmd208>, "Cmd208"},
|
||||
FunctionInfo{209, nullptr, "Cmd209"},
|
||||
FunctionInfo{210, nullptr, "Cmd210"},
|
||||
FunctionInfo{211, nullptr, "Cmd211"},
|
||||
FunctionInfo{212, nullptr, "Cmd212"}
|
||||
);
|
||||
}
|
||||
|
||||
Result Cmd108() {
|
||||
@@ -261,13 +253,12 @@ public:
|
||||
|
||||
class ISystemService final : public ServiceFramework<ISystemService> {
|
||||
public:
|
||||
explicit ISystemService(Core::System& system_) : ServiceFramework(system_, "stpl:sys") {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0 , D<&ISystemService::Cmd0>, "Cmd0"},
|
||||
};
|
||||
// clang-format on
|
||||
RegisterHandlers(functions);
|
||||
explicit ISystemService(Core::System& system_) : ServiceFramework(system_, "stpl:sys") {}
|
||||
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, D<&ISystemService::Cmd0>, "Cmd0"}
|
||||
);
|
||||
}
|
||||
Result Cmd0(OutInterface<ISystemShimScopedObject> out_interface) {
|
||||
LOG_WARNING(Service_NGC, "stubbed");
|
||||
|
||||
@@ -236,11 +236,11 @@ public:
|
||||
: ServiceFramework{system_, "IScanRequest"}, svc_ctx{system_, "IScanRequest"} {
|
||||
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, &IScanRequest::Submit, "Submit"},
|
||||
{1, &IScanRequest::IsProcessing, "IsProcessing"},
|
||||
{2, &IScanRequest::GetResult, "GetResult"},
|
||||
{3, &IScanRequest::GetSystemEventReadableHandle, "GetSystemEventReadableHandle"},
|
||||
{4, &IScanRequest::SetChannels, "SetChannels"},
|
||||
FunctionInfo{0, &IScanRequest::Submit, "Submit"},
|
||||
FunctionInfo{1, &IScanRequest::IsProcessing, "IsProcessing"},
|
||||
FunctionInfo{2, &IScanRequest::GetResult, "GetResult"},
|
||||
FunctionInfo{3, &IScanRequest::GetSystemEventReadableHandle, "GetSystemEventReadableHandle"},
|
||||
FunctionInfo{4, &IScanRequest::SetChannels, "SetChannels"}
|
||||
};
|
||||
RegisterHandlers(functions);
|
||||
|
||||
@@ -343,32 +343,32 @@ public:
|
||||
explicit IRequest(Core::System& system_)
|
||||
: ServiceFramework{system_, "IRequest"}, service_context{system_, "IRequest"} {
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, &IRequest::GetRequestState, "GetRequestState"},
|
||||
{1, &IRequest::GetResult, "GetResult"},
|
||||
{2, &IRequest::GetSystemEventReadableHandles, "GetSystemEventReadableHandles"},
|
||||
{3, &IRequest::Cancel, "Cancel"},
|
||||
{4, &IRequest::Submit, "Submit"},
|
||||
{5, nullptr, "SetRequirement"},
|
||||
{6, &IRequest::SetRequirementPreset, "SetRequirementPreset"},
|
||||
{8, nullptr, "SetPriority"},
|
||||
{9, &IRequest::SetNetworkProfileId, "SetNetworkProfileId"},
|
||||
{10, nullptr, "SetRejectable"},
|
||||
{11, &IRequest::SetConnectionConfirmationOption, "SetConnectionConfirmationOption"},
|
||||
{12, nullptr, "SetPersistent"},
|
||||
{13, nullptr, "SetInstant"},
|
||||
{14, nullptr, "SetSustainable"},
|
||||
{15, nullptr, "SetRawPriority"},
|
||||
{16, nullptr, "SetGreedy"},
|
||||
{17, nullptr, "SetSharable"},
|
||||
{18, nullptr, "SetRequirementByRevision"},
|
||||
{19, nullptr, "GetRequirement"},
|
||||
{20, nullptr, "GetRevision"},
|
||||
{21, &IRequest::GetAppletInfo, "GetAppletInfo"},
|
||||
{22, nullptr, "GetAdditionalInfo"},
|
||||
{23, nullptr, "SetKeptInSleep"},
|
||||
{24, nullptr, "RegisterSocketDescriptor"},
|
||||
{25, nullptr, "UnregisterSocketDescriptor"},
|
||||
{26, nullptr, "GetNetworkAccessStatus"}, //21.0.0+
|
||||
FunctionInfo{0, &IRequest::GetRequestState, "GetRequestState"},
|
||||
FunctionInfo{1, &IRequest::GetResult, "GetResult"},
|
||||
FunctionInfo{2, &IRequest::GetSystemEventReadableHandles, "GetSystemEventReadableHandles"},
|
||||
FunctionInfo{3, &IRequest::Cancel, "Cancel"},
|
||||
FunctionInfo{4, &IRequest::Submit, "Submit"},
|
||||
FunctionInfo{5, nullptr, "SetRequirement"},
|
||||
FunctionInfo{6, &IRequest::SetRequirementPreset, "SetRequirementPreset"},
|
||||
FunctionInfo{8, nullptr, "SetPriority"},
|
||||
FunctionInfo{9, &IRequest::SetNetworkProfileId, "SetNetworkProfileId"},
|
||||
FunctionInfo{10, nullptr, "SetRejectable"},
|
||||
FunctionInfo{11, &IRequest::SetConnectionConfirmationOption, "SetConnectionConfirmationOption"},
|
||||
FunctionInfo{12, nullptr, "SetPersistent"},
|
||||
FunctionInfo{13, nullptr, "SetInstant"},
|
||||
FunctionInfo{14, nullptr, "SetSustainable"},
|
||||
FunctionInfo{15, nullptr, "SetRawPriority"},
|
||||
FunctionInfo{16, nullptr, "SetGreedy"},
|
||||
FunctionInfo{17, nullptr, "SetSharable"},
|
||||
FunctionInfo{18, nullptr, "SetRequirementByRevision"},
|
||||
FunctionInfo{19, nullptr, "GetRequirement"},
|
||||
FunctionInfo{20, nullptr, "GetRevision"},
|
||||
FunctionInfo{21, &IRequest::GetAppletInfo, "GetAppletInfo"},
|
||||
FunctionInfo{22, nullptr, "GetAdditionalInfo"},
|
||||
FunctionInfo{23, nullptr, "SetKeptInSleep"},
|
||||
FunctionInfo{24, nullptr, "RegisterSocketDescriptor"},
|
||||
FunctionInfo{25, nullptr, "UnregisterSocketDescriptor"},
|
||||
FunctionInfo{26, nullptr, "GetNetworkAccessStatus"}, //21.0.0+
|
||||
};
|
||||
RegisterHandlers(functions);
|
||||
|
||||
@@ -510,9 +510,9 @@ class INetworkProfile final : public ServiceFramework<INetworkProfile> {
|
||||
public:
|
||||
explicit INetworkProfile(Core::System& system_) : ServiceFramework{system_, "INetworkProfile"} {
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "Update"},
|
||||
{1, nullptr, "PersistOld"},
|
||||
{2, nullptr, "Persist"},
|
||||
FunctionInfo{0, nullptr, "Update"},
|
||||
FunctionInfo{1, nullptr, "PersistOld"},
|
||||
FunctionInfo{2, nullptr, "Persist"}
|
||||
};
|
||||
RegisterHandlers(functions);
|
||||
}
|
||||
@@ -1117,8 +1117,8 @@ public:
|
||||
explicit NetworkInterface(const char* name, Core::System& system_)
|
||||
: ServiceFramework{system_, name} {
|
||||
static const FunctionInfo functions[] = {
|
||||
{4, &NetworkInterface::CreateGeneralServiceOld, "CreateGeneralServiceOld"},
|
||||
{5, &NetworkInterface::CreateGeneralService, "CreateGeneralService"},
|
||||
FunctionInfo{4, &NetworkInterface::CreateGeneralServiceOld, "CreateGeneralServiceOld"},
|
||||
FunctionInfo{5, &NetworkInterface::CreateGeneralService, "CreateGeneralService"}
|
||||
};
|
||||
RegisterHandlers(functions);
|
||||
}
|
||||
|
||||
+312
-327
@@ -24,24 +24,22 @@ namespace Service::NIM {
|
||||
class IShopServiceAsync final : public ServiceFramework<IShopServiceAsync> {
|
||||
public:
|
||||
explicit IShopServiceAsync(Core::System& system_)
|
||||
: ServiceFramework{system_, "IShopServiceAsync"},
|
||||
service_context{system_, "IShopServiceAsync"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, D<&IShopServiceAsync::Cancel>, "Cancel"},
|
||||
{1, D<&IShopServiceAsync::GetSize>, "GetSize"},
|
||||
{2, D<&IShopServiceAsync::Read>, "Read"},
|
||||
{3, D<&IShopServiceAsync::GetErrorCode>, "GetErrorCode"},
|
||||
{4, D<&IShopServiceAsync::Request>, "Request"},
|
||||
{5, D<&IShopServiceAsync::Prepare>, "Prepare"},
|
||||
};
|
||||
// clang-format on
|
||||
|
||||
RegisterHandlers(functions);
|
||||
|
||||
: ServiceFramework{system_, "IShopServiceAsync"}
|
||||
, service_context{system_, "IShopServiceAsync"} {
|
||||
completion_event = service_context.CreateEvent("IShopServiceAsync:Completion");
|
||||
}
|
||||
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, D<&IShopServiceAsync::Cancel>, "Cancel"},
|
||||
FunctionInfo{1, D<&IShopServiceAsync::GetSize>, "GetSize"},
|
||||
FunctionInfo{2, D<&IShopServiceAsync::Read>, "Read"},
|
||||
FunctionInfo{3, D<&IShopServiceAsync::GetErrorCode>, "GetErrorCode"},
|
||||
FunctionInfo{4, D<&IShopServiceAsync::Request>, "Request"},
|
||||
FunctionInfo{5, D<&IShopServiceAsync::Prepare>, "Prepare"}
|
||||
);
|
||||
}
|
||||
|
||||
~IShopServiceAsync() override {
|
||||
CancelImpl();
|
||||
service_context.CloseEvent(completion_event);
|
||||
@@ -141,14 +139,12 @@ private:
|
||||
class IShopServiceAccessor final : public ServiceFramework<IShopServiceAccessor> {
|
||||
public:
|
||||
explicit IShopServiceAccessor(Core::System& system_)
|
||||
: ServiceFramework{system_, "IShopServiceAccessor"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, &IShopServiceAccessor::CreateAsyncInterface, "CreateAsyncInterface"},
|
||||
};
|
||||
// clang-format on
|
||||
: ServiceFramework{system_, "IShopServiceAccessor"} {}
|
||||
|
||||
RegisterHandlers(functions);
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, &IShopServiceAccessor::CreateAsyncInterface, "CreateAsyncInterface"}
|
||||
);
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -165,14 +161,12 @@ private:
|
||||
class IShopServiceAccessServer final : public ServiceFramework<IShopServiceAccessServer> {
|
||||
public:
|
||||
explicit IShopServiceAccessServer(Core::System& system_)
|
||||
: ServiceFramework{system_, "IShopServiceAccessServer"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, &IShopServiceAccessServer::CreateAccessorInterface, "CreateAccessorInterface"},
|
||||
};
|
||||
// clang-format on
|
||||
: ServiceFramework{system_, "IShopServiceAccessServer"} {}
|
||||
|
||||
RegisterHandlers(functions);
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, &IShopServiceAccessServer::CreateAccessorInterface, "CreateAccessorInterface"}
|
||||
);
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -186,254 +180,250 @@ private:
|
||||
|
||||
class NIM final : public ServiceFramework<NIM> {
|
||||
public:
|
||||
explicit NIM(Core::System& system_) : ServiceFramework{system_, "nim"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "CreateSystemUpdateTask"},
|
||||
{1, nullptr, "DestroySystemUpdateTask"},
|
||||
{2, nullptr, "ListSystemUpdateTask"},
|
||||
{3, nullptr, "RequestSystemUpdateTaskRun"},
|
||||
{4, nullptr, "GetSystemUpdateTaskInfo"},
|
||||
{5, nullptr, "CommitSystemUpdateTask"},
|
||||
{6, nullptr, "CreateNetworkInstallTask"},
|
||||
{7, nullptr, "DestroyNetworkInstallTask"},
|
||||
{8, nullptr, "ListNetworkInstallTask"},
|
||||
{9, nullptr, "RequestNetworkInstallTaskRun"},
|
||||
{10, nullptr, "GetNetworkInstallTaskInfo"},
|
||||
{11, nullptr, "CommitNetworkInstallTask"},
|
||||
{12, nullptr, "RequestLatestSystemUpdateMeta"},
|
||||
{14, nullptr, "ListApplicationNetworkInstallTask"},
|
||||
{15, nullptr, "ListNetworkInstallTaskContentMeta"},
|
||||
{16, nullptr, "RequestLatestVersion"},
|
||||
{17, nullptr, "SetNetworkInstallTaskAttribute"},
|
||||
{18, nullptr, "AddNetworkInstallTaskContentMeta"},
|
||||
{19, nullptr, "GetDownloadedSystemDataPath"},
|
||||
{20, nullptr, "CalculateNetworkInstallTaskRequiredSize"},
|
||||
{21, nullptr, "IsExFatDriverIncluded"},
|
||||
{22, nullptr, "GetBackgroundDownloadStressTaskInfo"},
|
||||
{23, nullptr, "RequestDeviceAuthenticationToken"},
|
||||
{24, nullptr, "RequestGameCardRegistrationStatus"},
|
||||
{25, nullptr, "RequestRegisterGameCard"},
|
||||
{26, nullptr, "RequestRegisterNotificationToken"},
|
||||
{27, nullptr, "RequestDownloadTaskList"},
|
||||
{28, nullptr, "RequestApplicationControl"},
|
||||
{29, nullptr, "RequestLatestApplicationControl"},
|
||||
{30, nullptr, "RequestVersionList"},
|
||||
{31, nullptr, "CreateApplyDeltaTask"},
|
||||
{32, nullptr, "DestroyApplyDeltaTask"},
|
||||
{33, nullptr, "ListApplicationApplyDeltaTask"},
|
||||
{34, nullptr, "RequestApplyDeltaTaskRun"},
|
||||
{35, nullptr, "GetApplyDeltaTaskInfo"},
|
||||
{36, nullptr, "ListApplyDeltaTask"},
|
||||
{37, nullptr, "CommitApplyDeltaTask"},
|
||||
{38, nullptr, "CalculateApplyDeltaTaskRequiredSize"},
|
||||
{39, nullptr, "PrepareShutdown"},
|
||||
{40, nullptr, "ListApplyDeltaTask"},
|
||||
{41, nullptr, "ClearNotEnoughSpaceStateOfApplyDeltaTask"},
|
||||
{42, nullptr, "CreateApplyDeltaTaskFromDownloadTask"},
|
||||
{43, nullptr, "GetBackgroundApplyDeltaStressTaskInfo"},
|
||||
{44, nullptr, "GetApplyDeltaTaskRequiredStorage"},
|
||||
{45, nullptr, "CalculateNetworkInstallTaskContentsSize"},
|
||||
{46, nullptr, "PrepareShutdownForSystemUpdate"},
|
||||
{47, nullptr, "FindMaxRequiredApplicationVersionOfTask"},
|
||||
{48, nullptr, "CommitNetworkInstallTaskPartially"},
|
||||
{49, nullptr, "ListNetworkInstallTaskCommittedContentMeta"},
|
||||
{50, nullptr, "ListNetworkInstallTaskNotCommittedContentMeta"},
|
||||
{51, nullptr, "FindMaxRequiredSystemVersionOfTask"},
|
||||
{52, nullptr, "GetNetworkInstallTaskErrorContext"},
|
||||
{53, nullptr, "CreateLocalCommunicationReceiveApplicationTask"},
|
||||
{54, nullptr, "DestroyLocalCommunicationReceiveApplicationTask"},
|
||||
{55, nullptr, "ListLocalCommunicationReceiveApplicationTask"},
|
||||
{56, nullptr, "RequestLocalCommunicationReceiveApplicationTaskRun"},
|
||||
{57, nullptr, "GetLocalCommunicationReceiveApplicationTaskInfo"},
|
||||
{58, nullptr, "CommitLocalCommunicationReceiveApplicationTask"},
|
||||
{59, nullptr, "ListLocalCommunicationReceiveApplicationTaskContentMeta"},
|
||||
{60, nullptr, "CreateLocalCommunicationSendApplicationTask"},
|
||||
{61, nullptr, "RequestLocalCommunicationSendApplicationTaskRun"},
|
||||
{62, nullptr, "GetLocalCommunicationReceiveApplicationTaskErrorContext"},
|
||||
{63, nullptr, "GetLocalCommunicationSendApplicationTaskInfo"},
|
||||
{64, nullptr, "DestroyLocalCommunicationSendApplicationTask"},
|
||||
{65, nullptr, "GetLocalCommunicationSendApplicationTaskErrorContext"},
|
||||
{66, nullptr, "CalculateLocalCommunicationReceiveApplicationTaskRequiredSize"},
|
||||
{67, nullptr, "ListApplicationLocalCommunicationReceiveApplicationTask"},
|
||||
{68, nullptr, "ListApplicationLocalCommunicationSendApplicationTask"},
|
||||
{69, nullptr, "CreateLocalCommunicationReceiveSystemUpdateTask"},
|
||||
{70, nullptr, "DestroyLocalCommunicationReceiveSystemUpdateTask"},
|
||||
{71, nullptr, "ListLocalCommunicationReceiveSystemUpdateTask"},
|
||||
{72, nullptr, "RequestLocalCommunicationReceiveSystemUpdateTaskRun"},
|
||||
{73, nullptr, "GetLocalCommunicationReceiveSystemUpdateTaskInfo"},
|
||||
{74, nullptr, "CommitLocalCommunicationReceiveSystemUpdateTask"},
|
||||
{75, nullptr, "GetLocalCommunicationReceiveSystemUpdateTaskErrorContext"},
|
||||
{76, nullptr, "CreateLocalCommunicationSendSystemUpdateTask"},
|
||||
{77, nullptr, "RequestLocalCommunicationSendSystemUpdateTaskRun"},
|
||||
{78, nullptr, "GetLocalCommunicationSendSystemUpdateTaskInfo"},
|
||||
{79, nullptr, "DestroyLocalCommunicationSendSystemUpdateTask"},
|
||||
{80, nullptr, "GetLocalCommunicationSendSystemUpdateTaskErrorContext"},
|
||||
{81, nullptr, "ListLocalCommunicationSendSystemUpdateTask"},
|
||||
{82, nullptr, "GetReceivedSystemDataPath"},
|
||||
{83, nullptr, "CalculateApplyDeltaTaskOccupiedSize"},
|
||||
{84, nullptr, "ReloadErrorSimulation"},
|
||||
{85, nullptr, "ListNetworkInstallTaskContentMetaFromInstallMeta"},
|
||||
{86, nullptr, "ListNetworkInstallTaskOccupiedSize"},
|
||||
{87, nullptr, "RequestQueryAvailableELicenses"},
|
||||
{88, nullptr, "RequestAssignELicenses"},
|
||||
{89, nullptr, "RequestExtendELicenses"},
|
||||
{90, nullptr, "RequestSyncELicenses"},
|
||||
{91, nullptr, "Unknown91"}, //6.0.0-14.1.2
|
||||
{92, nullptr, "Unknown92"}, //21.0.0+
|
||||
{93, nullptr, "RequestReportActiveELicenses"},
|
||||
{94, nullptr, "RequestReportActiveELicensesPassively"},
|
||||
{95, nullptr, "RequestRegisterDynamicRightsNotificationToken"},
|
||||
{96, nullptr, "RequestAssignAllDeviceLinkedELicenses"},
|
||||
{97, nullptr, "RequestRevokeAllELicenses"},
|
||||
{98, nullptr, "RequestPrefetchForDynamicRights"},
|
||||
{99, nullptr, "CreateNetworkInstallTask"},
|
||||
{100, nullptr, "ListNetworkInstallTaskRightsIds"},
|
||||
{101, nullptr, "RequestDownloadETickets"},
|
||||
{102, nullptr, "RequestQueryDownloadableContents"},
|
||||
{103, nullptr, "DeleteNetworkInstallTaskContentMeta"},
|
||||
{104, nullptr, "RequestIssueEdgeTokenForDebug"},
|
||||
{105, nullptr, "RequestQueryAvailableELicenses2"},
|
||||
{106, nullptr, "RequestAssignELicenses2"},
|
||||
{107, nullptr, "GetNetworkInstallTaskStateCounter"},
|
||||
{108, nullptr, "InvalidateDynamicRightsNaIdTokenCacheForDebug"},
|
||||
{109, nullptr, "ListNetworkInstallTaskPartialInstallContentMeta"},
|
||||
{110, nullptr, "ListNetworkInstallTaskRightsIdsFromIndex"},
|
||||
{111, nullptr, "AddNetworkInstallTaskContentMetaForUser"},
|
||||
{112, nullptr, "RequestAssignELicensesAndDownloadETickets"},
|
||||
{113, nullptr, "RequestQueryAvailableCommonELicenses"},
|
||||
{114, nullptr, "SetNetworkInstallTaskExtendedAttribute"},
|
||||
{115, nullptr, "GetNetworkInstallTaskExtendedAttribute"},
|
||||
{116, nullptr, "GetAllocatorInfo"},
|
||||
{117, nullptr, "RequestQueryDownloadableContentsByApplicationId"},
|
||||
{118, nullptr, "MarkNoDownloadRightsErrorResolved"},
|
||||
{119, nullptr, "GetApplyDeltaTaskAllAppliedContentMeta"},
|
||||
{120, nullptr, "PrioritizeNetworkInstallTask"},
|
||||
{121, nullptr, "RequestQueryAvailableCommonELicenses2"},
|
||||
{122, nullptr, "RequestAssignCommonELicenses"},
|
||||
{123, nullptr, "RequestAssignCommonELicenses2"},
|
||||
{124, nullptr, "IsNetworkInstallTaskFrontOfQueue"},
|
||||
{125, nullptr, "PrioritizeApplyDeltaTask"},
|
||||
{126, nullptr, "RerouteDownloadingPatch"},
|
||||
{127, nullptr, "UnmarkNoDownloadRightsErrorResolved"},
|
||||
{128, nullptr, "RequestContentsSize"},
|
||||
{129, nullptr, "RequestContentsAuthorizationToken"},
|
||||
{130, nullptr, "RequestCdnVendorDiscovery"},
|
||||
{131, nullptr, "RefreshDebugAvailability"},
|
||||
{132, nullptr, "ClearResponseSimulationEntry"},
|
||||
{133, nullptr, "RegisterResponseSimulationEntry"},
|
||||
{134, nullptr, "GetProcessedCdnVendors"},
|
||||
{135, nullptr, "RefreshRuntimeBehaviorsForDebug"},
|
||||
{136, nullptr, "RequestOnlineSubscriptionFreeTrialAvailability"},
|
||||
{137, nullptr, "GetNetworkInstallTaskContentMetaCount"},
|
||||
{138, nullptr, "RequestRevokeELicenses"},
|
||||
{139, nullptr, "EnableNetworkConnectionToUseApplicationCore"},
|
||||
{140, nullptr, "DisableNetworkConnectionToUseApplicationCore"},
|
||||
{141, nullptr, "IsNetworkConnectionEnabledToUseApplicationCore"},
|
||||
{142, nullptr, "RequestCheckSafeSystemVersion"},
|
||||
{143, nullptr, "RequestApplicationIcon"},
|
||||
{144, nullptr, "RequestDownloadIdbeIconFile"},
|
||||
{147, nullptr, "Unknown147"}, //18.0.0+
|
||||
{148, nullptr, "Unknown148"}, //18.0.0+
|
||||
{150, nullptr, "Unknown150"}, //19.0.0+
|
||||
{151, nullptr, "Unknown151"}, //20.0.0+
|
||||
{152, nullptr, "Unknown152"}, //20.0.0+
|
||||
{153, nullptr, "Unknown153"}, //20.0.0+
|
||||
{154, nullptr, "Unknown154"}, //20.0.0+
|
||||
{155, nullptr, "Unknown155"}, //20.0.0+
|
||||
{156, nullptr, "Unknown156"}, //20.0.0+
|
||||
{157, nullptr, "Unknown157"}, //20.0.0+
|
||||
{158, nullptr, "Unknown158"}, //20.0.0+
|
||||
{159, nullptr, "Unknown159"}, //20.0.0+
|
||||
{160, nullptr, "Unknown160"}, //20.0.0+
|
||||
{161, nullptr, "Unknown161"}, //20.0.0+
|
||||
{162, nullptr, "Unknown162"}, //20.0.0+
|
||||
{163, nullptr, "Unknown163"}, //20.0.0+
|
||||
{164, nullptr, "Unknown164"}, //20.0.0+
|
||||
{165, nullptr, "Unknown165"}, //20.0.0+
|
||||
{166, nullptr, "Unknown166"}, //20.0.0+
|
||||
{167, nullptr, "Unknown167"}, //20.0.0+
|
||||
{168, nullptr, "Unknown168"}, //20.0.0+
|
||||
{169, nullptr, "Unknown169"}, //20.0.0+
|
||||
{170, nullptr, "Unknown170"}, //20.0.0+
|
||||
{171, nullptr, "Unknown171"}, //20.0.0+
|
||||
{172, nullptr, "Unknown172"}, //20.0.0+
|
||||
{173, nullptr, "Unknown173"}, //20.0.0+
|
||||
{174, nullptr, "Unknown174"}, //20.0.0+
|
||||
{175, nullptr, "Unknown175"}, //20.0.0+
|
||||
{176, nullptr, "Unknown176"}, //20.0.0+
|
||||
{177, nullptr, "Unknown177"}, //20.0.0+
|
||||
{2000, nullptr, "Unknown2000"}, //20.0.0+
|
||||
{2001, nullptr, "Unknown2001"}, //20.0.0+
|
||||
{2002, nullptr, "Unknown2002"}, //20.0.0+
|
||||
{2003, nullptr, "Unknown2003"}, //20.0.0+
|
||||
{2004, nullptr, "Unknown2004"}, //20.0.0+
|
||||
{2007, nullptr, "Unknown2007"}, //20.0.0+
|
||||
{2011, nullptr, "Unknown2011"}, //20.0.0+
|
||||
{2012, nullptr, "Unknown2012"}, //20.0.0+
|
||||
{2013, nullptr, "Unknown2013"}, //20.0.0+
|
||||
{2014, nullptr, "Unknown2014"}, //20.0.0+
|
||||
{2015, nullptr, "Unknown2015"}, //20.0.0+
|
||||
{2016, nullptr, "Unknown2016"}, //20.0.0+
|
||||
{2017, nullptr, "Unknown2017"}, //20.0.0+
|
||||
{2018, nullptr, "Unknown2018"}, //20.0.0+
|
||||
{2019, nullptr, "Unknown2019"}, //20.0.0+
|
||||
{2020, nullptr, "Unknown2020"}, //20.0.0+
|
||||
{2021, nullptr, "Unknown2021"}, //20.0.0+
|
||||
{2022, nullptr, "Unknown2022"}, //20.0.0+
|
||||
{2023, nullptr, "Unknown2023"}, //20.0.0+
|
||||
{2024, nullptr, "Unknown2024"}, //20.0.0+
|
||||
{2025, nullptr, "Unknown2025"}, //20.0.0+
|
||||
{2026, nullptr, "Unknown2026"}, //20.0.0+
|
||||
{2027, nullptr, "Unknown2027"}, //20.0.0+
|
||||
{2028, nullptr, "Unknown2028"}, //20.0.0+
|
||||
{2029, nullptr, "Unknown2029"}, //20.0.0+
|
||||
{2030, nullptr, "Unknown2030"}, //20.0.0+
|
||||
{2031, nullptr, "Unknown2031"}, //20.0.0+
|
||||
{2032, nullptr, "Unknown2032"}, //20.0.0+
|
||||
{2033, nullptr, "Unknown2033"}, //20.0.0+
|
||||
{2034, nullptr, "Unknown2034"}, //20.0.0+
|
||||
{2035, nullptr, "Unknown2035"}, //20.0.0+
|
||||
{2036, nullptr, "Unknown2036"}, //20.0.0+
|
||||
{2037, nullptr, "Unknown2037"}, //20.0.0+
|
||||
{2038, nullptr, "Unknown2038"}, //20.0.0+
|
||||
{2039, nullptr, "Unknown2039"}, //20.0.0+
|
||||
{2040, nullptr, "Unknown2040"}, //20.0.0+
|
||||
{2041, nullptr, "Unknown2041"}, //20.0.0+
|
||||
{2042, nullptr, "Unknown2042"}, //20.0.0+
|
||||
{2043, nullptr, "Unknown2043"}, //20.0.0+
|
||||
{2044, nullptr, "Unknown2044"}, //20.0.0+
|
||||
{2045, nullptr, "Unknown2045"}, //20.0.0+
|
||||
{2046, nullptr, "Unknown2046"}, //20.0.0+
|
||||
{2047, nullptr, "Unknown2047"}, //20.0.0+
|
||||
{2048, nullptr, "Unknown2048"}, //20.0.0+
|
||||
{2049, nullptr, "Unknown2049"}, //20.0.0+
|
||||
{2050, nullptr, "Unknown2050"}, //20.0.0+
|
||||
{2051, nullptr, "Unknown2051"}, //20.0.0+
|
||||
{3000, nullptr, "RequestLatestApplicationIcon"}, //17.0.0+
|
||||
{3001, nullptr, "RequestDownloadIdbeLatestIconFile"}, //17.0.0+
|
||||
};
|
||||
// clang-format on
|
||||
explicit NIM(Core::System& system_) : ServiceFramework{system_, "nim"} {}
|
||||
|
||||
RegisterHandlers(functions);
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, nullptr, "CreateSystemUpdateTask"},
|
||||
FunctionInfo{1, nullptr, "DestroySystemUpdateTask"},
|
||||
FunctionInfo{2, nullptr, "ListSystemUpdateTask"},
|
||||
FunctionInfo{3, nullptr, "RequestSystemUpdateTaskRun"},
|
||||
FunctionInfo{4, nullptr, "GetSystemUpdateTaskInfo"},
|
||||
FunctionInfo{5, nullptr, "CommitSystemUpdateTask"},
|
||||
FunctionInfo{6, nullptr, "CreateNetworkInstallTask"},
|
||||
FunctionInfo{7, nullptr, "DestroyNetworkInstallTask"},
|
||||
FunctionInfo{8, nullptr, "ListNetworkInstallTask"},
|
||||
FunctionInfo{9, nullptr, "RequestNetworkInstallTaskRun"},
|
||||
FunctionInfo{10, nullptr, "GetNetworkInstallTaskInfo"},
|
||||
FunctionInfo{11, nullptr, "CommitNetworkInstallTask"},
|
||||
FunctionInfo{12, nullptr, "RequestLatestSystemUpdateMeta"},
|
||||
FunctionInfo{14, nullptr, "ListApplicationNetworkInstallTask"},
|
||||
FunctionInfo{15, nullptr, "ListNetworkInstallTaskContentMeta"},
|
||||
FunctionInfo{16, nullptr, "RequestLatestVersion"},
|
||||
FunctionInfo{17, nullptr, "SetNetworkInstallTaskAttribute"},
|
||||
FunctionInfo{18, nullptr, "AddNetworkInstallTaskContentMeta"},
|
||||
FunctionInfo{19, nullptr, "GetDownloadedSystemDataPath"},
|
||||
FunctionInfo{20, nullptr, "CalculateNetworkInstallTaskRequiredSize"},
|
||||
FunctionInfo{21, nullptr, "IsExFatDriverIncluded"},
|
||||
FunctionInfo{22, nullptr, "GetBackgroundDownloadStressTaskInfo"},
|
||||
FunctionInfo{23, nullptr, "RequestDeviceAuthenticationToken"},
|
||||
FunctionInfo{24, nullptr, "RequestGameCardRegistrationStatus"},
|
||||
FunctionInfo{25, nullptr, "RequestRegisterGameCard"},
|
||||
FunctionInfo{26, nullptr, "RequestRegisterNotificationToken"},
|
||||
FunctionInfo{27, nullptr, "RequestDownloadTaskList"},
|
||||
FunctionInfo{28, nullptr, "RequestApplicationControl"},
|
||||
FunctionInfo{29, nullptr, "RequestLatestApplicationControl"},
|
||||
FunctionInfo{30, nullptr, "RequestVersionList"},
|
||||
FunctionInfo{31, nullptr, "CreateApplyDeltaTask"},
|
||||
FunctionInfo{32, nullptr, "DestroyApplyDeltaTask"},
|
||||
FunctionInfo{33, nullptr, "ListApplicationApplyDeltaTask"},
|
||||
FunctionInfo{34, nullptr, "RequestApplyDeltaTaskRun"},
|
||||
FunctionInfo{35, nullptr, "GetApplyDeltaTaskInfo"},
|
||||
FunctionInfo{36, nullptr, "ListApplyDeltaTask"},
|
||||
FunctionInfo{37, nullptr, "CommitApplyDeltaTask"},
|
||||
FunctionInfo{38, nullptr, "CalculateApplyDeltaTaskRequiredSize"},
|
||||
FunctionInfo{39, nullptr, "PrepareShutdown"},
|
||||
FunctionInfo{40, nullptr, "ListApplyDeltaTask"},
|
||||
FunctionInfo{41, nullptr, "ClearNotEnoughSpaceStateOfApplyDeltaTask"},
|
||||
FunctionInfo{42, nullptr, "CreateApplyDeltaTaskFromDownloadTask"},
|
||||
FunctionInfo{43, nullptr, "GetBackgroundApplyDeltaStressTaskInfo"},
|
||||
FunctionInfo{44, nullptr, "GetApplyDeltaTaskRequiredStorage"},
|
||||
FunctionInfo{45, nullptr, "CalculateNetworkInstallTaskContentsSize"},
|
||||
FunctionInfo{46, nullptr, "PrepareShutdownForSystemUpdate"},
|
||||
FunctionInfo{47, nullptr, "FindMaxRequiredApplicationVersionOfTask"},
|
||||
FunctionInfo{48, nullptr, "CommitNetworkInstallTaskPartially"},
|
||||
FunctionInfo{49, nullptr, "ListNetworkInstallTaskCommittedContentMeta"},
|
||||
FunctionInfo{50, nullptr, "ListNetworkInstallTaskNotCommittedContentMeta"},
|
||||
FunctionInfo{51, nullptr, "FindMaxRequiredSystemVersionOfTask"},
|
||||
FunctionInfo{52, nullptr, "GetNetworkInstallTaskErrorContext"},
|
||||
FunctionInfo{53, nullptr, "CreateLocalCommunicationReceiveApplicationTask"},
|
||||
FunctionInfo{54, nullptr, "DestroyLocalCommunicationReceiveApplicationTask"},
|
||||
FunctionInfo{55, nullptr, "ListLocalCommunicationReceiveApplicationTask"},
|
||||
FunctionInfo{56, nullptr, "RequestLocalCommunicationReceiveApplicationTaskRun"},
|
||||
FunctionInfo{57, nullptr, "GetLocalCommunicationReceiveApplicationTaskInfo"},
|
||||
FunctionInfo{58, nullptr, "CommitLocalCommunicationReceiveApplicationTask"},
|
||||
FunctionInfo{59, nullptr, "ListLocalCommunicationReceiveApplicationTaskContentMeta"},
|
||||
FunctionInfo{60, nullptr, "CreateLocalCommunicationSendApplicationTask"},
|
||||
FunctionInfo{61, nullptr, "RequestLocalCommunicationSendApplicationTaskRun"},
|
||||
FunctionInfo{62, nullptr, "GetLocalCommunicationReceiveApplicationTaskErrorContext"},
|
||||
FunctionInfo{63, nullptr, "GetLocalCommunicationSendApplicationTaskInfo"},
|
||||
FunctionInfo{64, nullptr, "DestroyLocalCommunicationSendApplicationTask"},
|
||||
FunctionInfo{65, nullptr, "GetLocalCommunicationSendApplicationTaskErrorContext"},
|
||||
FunctionInfo{66, nullptr, "CalculateLocalCommunicationReceiveApplicationTaskRequiredSize"},
|
||||
FunctionInfo{67, nullptr, "ListApplicationLocalCommunicationReceiveApplicationTask"},
|
||||
FunctionInfo{68, nullptr, "ListApplicationLocalCommunicationSendApplicationTask"},
|
||||
FunctionInfo{69, nullptr, "CreateLocalCommunicationReceiveSystemUpdateTask"},
|
||||
FunctionInfo{70, nullptr, "DestroyLocalCommunicationReceiveSystemUpdateTask"},
|
||||
FunctionInfo{71, nullptr, "ListLocalCommunicationReceiveSystemUpdateTask"},
|
||||
FunctionInfo{72, nullptr, "RequestLocalCommunicationReceiveSystemUpdateTaskRun"},
|
||||
FunctionInfo{73, nullptr, "GetLocalCommunicationReceiveSystemUpdateTaskInfo"},
|
||||
FunctionInfo{74, nullptr, "CommitLocalCommunicationReceiveSystemUpdateTask"},
|
||||
FunctionInfo{75, nullptr, "GetLocalCommunicationReceiveSystemUpdateTaskErrorContext"},
|
||||
FunctionInfo{76, nullptr, "CreateLocalCommunicationSendSystemUpdateTask"},
|
||||
FunctionInfo{77, nullptr, "RequestLocalCommunicationSendSystemUpdateTaskRun"},
|
||||
FunctionInfo{78, nullptr, "GetLocalCommunicationSendSystemUpdateTaskInfo"},
|
||||
FunctionInfo{79, nullptr, "DestroyLocalCommunicationSendSystemUpdateTask"},
|
||||
FunctionInfo{80, nullptr, "GetLocalCommunicationSendSystemUpdateTaskErrorContext"},
|
||||
FunctionInfo{81, nullptr, "ListLocalCommunicationSendSystemUpdateTask"},
|
||||
FunctionInfo{82, nullptr, "GetReceivedSystemDataPath"},
|
||||
FunctionInfo{83, nullptr, "CalculateApplyDeltaTaskOccupiedSize"},
|
||||
FunctionInfo{84, nullptr, "ReloadErrorSimulation"},
|
||||
FunctionInfo{85, nullptr, "ListNetworkInstallTaskContentMetaFromInstallMeta"},
|
||||
FunctionInfo{86, nullptr, "ListNetworkInstallTaskOccupiedSize"},
|
||||
FunctionInfo{87, nullptr, "RequestQueryAvailableELicenses"},
|
||||
FunctionInfo{88, nullptr, "RequestAssignELicenses"},
|
||||
FunctionInfo{89, nullptr, "RequestExtendELicenses"},
|
||||
FunctionInfo{90, nullptr, "RequestSyncELicenses"},
|
||||
FunctionInfo{91, nullptr, "Unknown91"}, //6.0.0-14.1.2
|
||||
FunctionInfo{92, nullptr, "Unknown92"}, //21.0.0+
|
||||
FunctionInfo{93, nullptr, "RequestReportActiveELicenses"},
|
||||
FunctionInfo{94, nullptr, "RequestReportActiveELicensesPassively"},
|
||||
FunctionInfo{95, nullptr, "RequestRegisterDynamicRightsNotificationToken"},
|
||||
FunctionInfo{96, nullptr, "RequestAssignAllDeviceLinkedELicenses"},
|
||||
FunctionInfo{97, nullptr, "RequestRevokeAllELicenses"},
|
||||
FunctionInfo{98, nullptr, "RequestPrefetchForDynamicRights"},
|
||||
FunctionInfo{99, nullptr, "CreateNetworkInstallTask"},
|
||||
FunctionInfo{100, nullptr, "ListNetworkInstallTaskRightsIds"},
|
||||
FunctionInfo{101, nullptr, "RequestDownloadETickets"},
|
||||
FunctionInfo{102, nullptr, "RequestQueryDownloadableContents"},
|
||||
FunctionInfo{103, nullptr, "DeleteNetworkInstallTaskContentMeta"},
|
||||
FunctionInfo{104, nullptr, "RequestIssueEdgeTokenForDebug"},
|
||||
FunctionInfo{105, nullptr, "RequestQueryAvailableELicenses2"},
|
||||
FunctionInfo{106, nullptr, "RequestAssignELicenses2"},
|
||||
FunctionInfo{107, nullptr, "GetNetworkInstallTaskStateCounter"},
|
||||
FunctionInfo{108, nullptr, "InvalidateDynamicRightsNaIdTokenCacheForDebug"},
|
||||
FunctionInfo{109, nullptr, "ListNetworkInstallTaskPartialInstallContentMeta"},
|
||||
FunctionInfo{110, nullptr, "ListNetworkInstallTaskRightsIdsFromIndex"},
|
||||
FunctionInfo{111, nullptr, "AddNetworkInstallTaskContentMetaForUser"},
|
||||
FunctionInfo{112, nullptr, "RequestAssignELicensesAndDownloadETickets"},
|
||||
FunctionInfo{113, nullptr, "RequestQueryAvailableCommonELicenses"},
|
||||
FunctionInfo{114, nullptr, "SetNetworkInstallTaskExtendedAttribute"},
|
||||
FunctionInfo{115, nullptr, "GetNetworkInstallTaskExtendedAttribute"},
|
||||
FunctionInfo{116, nullptr, "GetAllocatorInfo"},
|
||||
FunctionInfo{117, nullptr, "RequestQueryDownloadableContentsByApplicationId"},
|
||||
FunctionInfo{118, nullptr, "MarkNoDownloadRightsErrorResolved"},
|
||||
FunctionInfo{119, nullptr, "GetApplyDeltaTaskAllAppliedContentMeta"},
|
||||
FunctionInfo{120, nullptr, "PrioritizeNetworkInstallTask"},
|
||||
FunctionInfo{121, nullptr, "RequestQueryAvailableCommonELicenses2"},
|
||||
FunctionInfo{122, nullptr, "RequestAssignCommonELicenses"},
|
||||
FunctionInfo{123, nullptr, "RequestAssignCommonELicenses2"},
|
||||
FunctionInfo{124, nullptr, "IsNetworkInstallTaskFrontOfQueue"},
|
||||
FunctionInfo{125, nullptr, "PrioritizeApplyDeltaTask"},
|
||||
FunctionInfo{126, nullptr, "RerouteDownloadingPatch"},
|
||||
FunctionInfo{127, nullptr, "UnmarkNoDownloadRightsErrorResolved"},
|
||||
FunctionInfo{128, nullptr, "RequestContentsSize"},
|
||||
FunctionInfo{129, nullptr, "RequestContentsAuthorizationToken"},
|
||||
FunctionInfo{130, nullptr, "RequestCdnVendorDiscovery"},
|
||||
FunctionInfo{131, nullptr, "RefreshDebugAvailability"},
|
||||
FunctionInfo{132, nullptr, "ClearResponseSimulationEntry"},
|
||||
FunctionInfo{133, nullptr, "RegisterResponseSimulationEntry"},
|
||||
FunctionInfo{134, nullptr, "GetProcessedCdnVendors"},
|
||||
FunctionInfo{135, nullptr, "RefreshRuntimeBehaviorsForDebug"},
|
||||
FunctionInfo{136, nullptr, "RequestOnlineSubscriptionFreeTrialAvailability"},
|
||||
FunctionInfo{137, nullptr, "GetNetworkInstallTaskContentMetaCount"},
|
||||
FunctionInfo{138, nullptr, "RequestRevokeELicenses"},
|
||||
FunctionInfo{139, nullptr, "EnableNetworkConnectionToUseApplicationCore"},
|
||||
FunctionInfo{140, nullptr, "DisableNetworkConnectionToUseApplicationCore"},
|
||||
FunctionInfo{141, nullptr, "IsNetworkConnectionEnabledToUseApplicationCore"},
|
||||
FunctionInfo{142, nullptr, "RequestCheckSafeSystemVersion"},
|
||||
FunctionInfo{143, nullptr, "RequestApplicationIcon"},
|
||||
FunctionInfo{144, nullptr, "RequestDownloadIdbeIconFile"},
|
||||
FunctionInfo{147, nullptr, "Unknown147"}, //18.0.0+
|
||||
FunctionInfo{148, nullptr, "Unknown148"}, //18.0.0+
|
||||
FunctionInfo{150, nullptr, "Unknown150"}, //19.0.0+
|
||||
FunctionInfo{151, nullptr, "Unknown151"}, //20.0.0+
|
||||
FunctionInfo{152, nullptr, "Unknown152"}, //20.0.0+
|
||||
FunctionInfo{153, nullptr, "Unknown153"}, //20.0.0+
|
||||
FunctionInfo{154, nullptr, "Unknown154"}, //20.0.0+
|
||||
FunctionInfo{155, nullptr, "Unknown155"}, //20.0.0+
|
||||
FunctionInfo{156, nullptr, "Unknown156"}, //20.0.0+
|
||||
FunctionInfo{157, nullptr, "Unknown157"}, //20.0.0+
|
||||
FunctionInfo{158, nullptr, "Unknown158"}, //20.0.0+
|
||||
FunctionInfo{159, nullptr, "Unknown159"}, //20.0.0+
|
||||
FunctionInfo{160, nullptr, "Unknown160"}, //20.0.0+
|
||||
FunctionInfo{161, nullptr, "Unknown161"}, //20.0.0+
|
||||
FunctionInfo{162, nullptr, "Unknown162"}, //20.0.0+
|
||||
FunctionInfo{163, nullptr, "Unknown163"}, //20.0.0+
|
||||
FunctionInfo{164, nullptr, "Unknown164"}, //20.0.0+
|
||||
FunctionInfo{165, nullptr, "Unknown165"}, //20.0.0+
|
||||
FunctionInfo{166, nullptr, "Unknown166"}, //20.0.0+
|
||||
FunctionInfo{167, nullptr, "Unknown167"}, //20.0.0+
|
||||
FunctionInfo{168, nullptr, "Unknown168"}, //20.0.0+
|
||||
FunctionInfo{169, nullptr, "Unknown169"}, //20.0.0+
|
||||
FunctionInfo{170, nullptr, "Unknown170"}, //20.0.0+
|
||||
FunctionInfo{171, nullptr, "Unknown171"}, //20.0.0+
|
||||
FunctionInfo{172, nullptr, "Unknown172"}, //20.0.0+
|
||||
FunctionInfo{173, nullptr, "Unknown173"}, //20.0.0+
|
||||
FunctionInfo{174, nullptr, "Unknown174"}, //20.0.0+
|
||||
FunctionInfo{175, nullptr, "Unknown175"}, //20.0.0+
|
||||
FunctionInfo{176, nullptr, "Unknown176"}, //20.0.0+
|
||||
FunctionInfo{177, nullptr, "Unknown177"}, //20.0.0+
|
||||
FunctionInfo{2000, nullptr, "Unknown2000"}, //20.0.0+
|
||||
FunctionInfo{2001, nullptr, "Unknown2001"}, //20.0.0+
|
||||
FunctionInfo{2002, nullptr, "Unknown2002"}, //20.0.0+
|
||||
FunctionInfo{2003, nullptr, "Unknown2003"}, //20.0.0+
|
||||
FunctionInfo{2004, nullptr, "Unknown2004"}, //20.0.0+
|
||||
FunctionInfo{2007, nullptr, "Unknown2007"}, //20.0.0+
|
||||
FunctionInfo{2011, nullptr, "Unknown2011"}, //20.0.0+
|
||||
FunctionInfo{2012, nullptr, "Unknown2012"}, //20.0.0+
|
||||
FunctionInfo{2013, nullptr, "Unknown2013"}, //20.0.0+
|
||||
FunctionInfo{2014, nullptr, "Unknown2014"}, //20.0.0+
|
||||
FunctionInfo{2015, nullptr, "Unknown2015"}, //20.0.0+
|
||||
FunctionInfo{2016, nullptr, "Unknown2016"}, //20.0.0+
|
||||
FunctionInfo{2017, nullptr, "Unknown2017"}, //20.0.0+
|
||||
FunctionInfo{2018, nullptr, "Unknown2018"}, //20.0.0+
|
||||
FunctionInfo{2019, nullptr, "Unknown2019"}, //20.0.0+
|
||||
FunctionInfo{2020, nullptr, "Unknown2020"}, //20.0.0+
|
||||
FunctionInfo{2021, nullptr, "Unknown2021"}, //20.0.0+
|
||||
FunctionInfo{2022, nullptr, "Unknown2022"}, //20.0.0+
|
||||
FunctionInfo{2023, nullptr, "Unknown2023"}, //20.0.0+
|
||||
FunctionInfo{2024, nullptr, "Unknown2024"}, //20.0.0+
|
||||
FunctionInfo{2025, nullptr, "Unknown2025"}, //20.0.0+
|
||||
FunctionInfo{2026, nullptr, "Unknown2026"}, //20.0.0+
|
||||
FunctionInfo{2027, nullptr, "Unknown2027"}, //20.0.0+
|
||||
FunctionInfo{2028, nullptr, "Unknown2028"}, //20.0.0+
|
||||
FunctionInfo{2029, nullptr, "Unknown2029"}, //20.0.0+
|
||||
FunctionInfo{2030, nullptr, "Unknown2030"}, //20.0.0+
|
||||
FunctionInfo{2031, nullptr, "Unknown2031"}, //20.0.0+
|
||||
FunctionInfo{2032, nullptr, "Unknown2032"}, //20.0.0+
|
||||
FunctionInfo{2033, nullptr, "Unknown2033"}, //20.0.0+
|
||||
FunctionInfo{2034, nullptr, "Unknown2034"}, //20.0.0+
|
||||
FunctionInfo{2035, nullptr, "Unknown2035"}, //20.0.0+
|
||||
FunctionInfo{2036, nullptr, "Unknown2036"}, //20.0.0+
|
||||
FunctionInfo{2037, nullptr, "Unknown2037"}, //20.0.0+
|
||||
FunctionInfo{2038, nullptr, "Unknown2038"}, //20.0.0+
|
||||
FunctionInfo{2039, nullptr, "Unknown2039"}, //20.0.0+
|
||||
FunctionInfo{2040, nullptr, "Unknown2040"}, //20.0.0+
|
||||
FunctionInfo{2041, nullptr, "Unknown2041"}, //20.0.0+
|
||||
FunctionInfo{2042, nullptr, "Unknown2042"}, //20.0.0+
|
||||
FunctionInfo{2043, nullptr, "Unknown2043"}, //20.0.0+
|
||||
FunctionInfo{2044, nullptr, "Unknown2044"}, //20.0.0+
|
||||
FunctionInfo{2045, nullptr, "Unknown2045"}, //20.0.0+
|
||||
FunctionInfo{2046, nullptr, "Unknown2046"}, //20.0.0+
|
||||
FunctionInfo{2047, nullptr, "Unknown2047"}, //20.0.0+
|
||||
FunctionInfo{2048, nullptr, "Unknown2048"}, //20.0.0+
|
||||
FunctionInfo{2049, nullptr, "Unknown2049"}, //20.0.0+
|
||||
FunctionInfo{2050, nullptr, "Unknown2050"}, //20.0.0+
|
||||
FunctionInfo{2051, nullptr, "Unknown2051"}, //20.0.0+
|
||||
FunctionInfo{3000, nullptr, "RequestLatestApplicationIcon"}, //17.0.0+
|
||||
FunctionInfo{3001, nullptr, "RequestDownloadIdbeLatestIconFile"} //17.0.0+
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
class NIM_ECA final : public ServiceFramework<NIM_ECA> {
|
||||
public:
|
||||
explicit NIM_ECA(Core::System& system_) : ServiceFramework{system_, "nim:eca"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, &NIM_ECA::CreateServerInterface, "CreateServerInterface"},
|
||||
{1, nullptr, "RefreshDebugAvailability"},
|
||||
{2, nullptr, "ClearDebugResponse"},
|
||||
{3, nullptr, "RegisterDebugResponse"},
|
||||
{4, &NIM_ECA::IsLargeResourceAvailable, "IsLargeResourceAvailable"},
|
||||
{5, &NIM_ECA::CreateServerInterface2, "CreateServerInterface2"} // 17.0.0+
|
||||
};
|
||||
// clang-format on
|
||||
explicit NIM_ECA(Core::System& system_) : ServiceFramework{system_, "nim:eca"} {}
|
||||
|
||||
RegisterHandlers(functions);
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, &NIM_ECA::CreateServerInterface, "CreateServerInterface"},
|
||||
FunctionInfo{1, nullptr, "RefreshDebugAvailability"},
|
||||
FunctionInfo{2, nullptr, "ClearDebugResponse"},
|
||||
FunctionInfo{3, nullptr, "RegisterDebugResponse"},
|
||||
FunctionInfo{4, &NIM_ECA::IsLargeResourceAvailable, "IsLargeResourceAvailable"},
|
||||
FunctionInfo{5, &NIM_ECA::CreateServerInterface2, "CreateServerInterface2"} // 17.0.0+
|
||||
);
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -467,41 +457,39 @@ private:
|
||||
|
||||
class NIM_SHP final : public ServiceFramework<NIM_SHP> {
|
||||
public:
|
||||
explicit NIM_SHP(Core::System& system_) : ServiceFramework{system_, "nim:shp"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "RequestDeviceAuthenticationToken"},
|
||||
{1, nullptr, "RequestCachedDeviceAuthenticationToken"},
|
||||
{2, nullptr, "RequestEdgeToken"},
|
||||
{3, nullptr, "RequestCachedEdgeToken"},
|
||||
{100, nullptr, "RequestRegisterDeviceAccount"},
|
||||
{101, nullptr, "RequestUnregisterDeviceAccount"},
|
||||
{102, nullptr, "RequestDeviceAccountStatus"},
|
||||
{103, nullptr, "GetDeviceAccountInfo"},
|
||||
{104, nullptr, "RequestDeviceRegistrationInfo"},
|
||||
{105, nullptr, "RequestTransferDeviceAccount"},
|
||||
{106, nullptr, "RequestSyncRegistration"},
|
||||
{107, nullptr, "IsOwnDeviceId"},
|
||||
{200, nullptr, "RequestRegisterNotificationToken"},
|
||||
{300, nullptr, "RequestUnlinkDevice"},
|
||||
{301, nullptr, "RequestUnlinkDeviceIntegrated"},
|
||||
{302, nullptr, "RequestLinkDevice"},
|
||||
{303, nullptr, "HasDeviceLink"},
|
||||
{304, nullptr, "RequestUnlinkDeviceAll"},
|
||||
{305, nullptr, "RequestCreateVirtualAccount"},
|
||||
{306, nullptr, "RequestDeviceLinkStatus"},
|
||||
{400, nullptr, "GetAccountByVirtualAccount"},
|
||||
{401, nullptr, "GetVirtualAccount"},
|
||||
{500, nullptr, "RequestSyncTicketLegacy"},
|
||||
{501, nullptr, "RequestDownloadTicket"},
|
||||
{502, nullptr, "RequestDownloadTicketForPrepurchasedContents"},
|
||||
{503, nullptr, "RequestSyncTicket"},
|
||||
{504, nullptr, "RequestDownloadTicketForPrepurchasedContents2"},
|
||||
{505, nullptr, "RequestDownloadTicketForPrepurchasedContentsForAccount"},
|
||||
};
|
||||
// clang-format on
|
||||
explicit NIM_SHP(Core::System& system_) : ServiceFramework{system_, "nim:shp"} {}
|
||||
|
||||
RegisterHandlers(functions);
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, nullptr, "RequestDeviceAuthenticationToken"},
|
||||
FunctionInfo{1, nullptr, "RequestCachedDeviceAuthenticationToken"},
|
||||
FunctionInfo{2, nullptr, "RequestEdgeToken"},
|
||||
FunctionInfo{3, nullptr, "RequestCachedEdgeToken"},
|
||||
FunctionInfo{100, nullptr, "RequestRegisterDeviceAccount"},
|
||||
FunctionInfo{101, nullptr, "RequestUnregisterDeviceAccount"},
|
||||
FunctionInfo{102, nullptr, "RequestDeviceAccountStatus"},
|
||||
FunctionInfo{103, nullptr, "GetDeviceAccountInfo"},
|
||||
FunctionInfo{104, nullptr, "RequestDeviceRegistrationInfo"},
|
||||
FunctionInfo{105, nullptr, "RequestTransferDeviceAccount"},
|
||||
FunctionInfo{106, nullptr, "RequestSyncRegistration"},
|
||||
FunctionInfo{107, nullptr, "IsOwnDeviceId"},
|
||||
FunctionInfo{200, nullptr, "RequestRegisterNotificationToken"},
|
||||
FunctionInfo{300, nullptr, "RequestUnlinkDevice"},
|
||||
FunctionInfo{301, nullptr, "RequestUnlinkDeviceIntegrated"},
|
||||
FunctionInfo{302, nullptr, "RequestLinkDevice"},
|
||||
FunctionInfo{303, nullptr, "HasDeviceLink"},
|
||||
FunctionInfo{304, nullptr, "RequestUnlinkDeviceAll"},
|
||||
FunctionInfo{305, nullptr, "RequestCreateVirtualAccount"},
|
||||
FunctionInfo{306, nullptr, "RequestDeviceLinkStatus"},
|
||||
FunctionInfo{400, nullptr, "GetAccountByVirtualAccount"},
|
||||
FunctionInfo{401, nullptr, "GetVirtualAccount"},
|
||||
FunctionInfo{500, nullptr, "RequestSyncTicketLegacy"},
|
||||
FunctionInfo{501, nullptr, "RequestDownloadTicket"},
|
||||
FunctionInfo{502, nullptr, "RequestDownloadTicketForPrepurchasedContents"},
|
||||
FunctionInfo{503, nullptr, "RequestSyncTicket"},
|
||||
FunctionInfo{504, nullptr, "RequestDownloadTicketForPrepurchasedContents2"},
|
||||
FunctionInfo{505, nullptr, "RequestDownloadTicketForPrepurchasedContentsForAccount"}
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -512,13 +500,13 @@ public:
|
||||
: ServiceFramework{system_, "IEnsureNetworkClockAvailabilityService"},
|
||||
service_context{system_, "IEnsureNetworkClockAvailabilityService"} {
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, &IEnsureNetworkClockAvailabilityService::StartTask, "StartTask"},
|
||||
{1, &IEnsureNetworkClockAvailabilityService::GetFinishNotificationEvent,
|
||||
FunctionInfo{0, &IEnsureNetworkClockAvailabilityService::StartTask, "StartTask"},
|
||||
FunctionInfo{1, &IEnsureNetworkClockAvailabilityService::GetFinishNotificationEvent,
|
||||
"GetFinishNotificationEvent"},
|
||||
{2, &IEnsureNetworkClockAvailabilityService::GetResult, "GetResult"},
|
||||
{3, &IEnsureNetworkClockAvailabilityService::Cancel, "Cancel"},
|
||||
{4, &IEnsureNetworkClockAvailabilityService::IsProcessing, "IsProcessing"},
|
||||
{5, &IEnsureNetworkClockAvailabilityService::GetServerTime, "GetServerTime"},
|
||||
FunctionInfo{2, &IEnsureNetworkClockAvailabilityService::GetResult, "GetResult"},
|
||||
FunctionInfo{3, &IEnsureNetworkClockAvailabilityService::Cancel, "Cancel"},
|
||||
FunctionInfo{4, &IEnsureNetworkClockAvailabilityService::IsProcessing, "IsProcessing"},
|
||||
FunctionInfo{5, &IEnsureNetworkClockAvailabilityService::GetServerTime, "GetServerTime"}
|
||||
};
|
||||
RegisterHandlers(functions);
|
||||
|
||||
@@ -587,16 +575,14 @@ private:
|
||||
|
||||
class NTC final : public ServiceFramework<NTC> {
|
||||
public:
|
||||
explicit NTC(Core::System& system_) : ServiceFramework{system_, "ntc"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, &NTC::OpenEnsureNetworkClockAvailabilityService, "OpenEnsureNetworkClockAvailabilityService"},
|
||||
{100, &NTC::SuspendAutonomicTimeCorrection, "SuspendAutonomicTimeCorrection"},
|
||||
{101, &NTC::ResumeAutonomicTimeCorrection, "ResumeAutonomicTimeCorrection"},
|
||||
};
|
||||
// clang-format on
|
||||
explicit NTC(Core::System& system_) : ServiceFramework{system_, "ntc"} {}
|
||||
|
||||
RegisterHandlers(functions);
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, &NTC::OpenEnsureNetworkClockAvailabilityService, "OpenEnsureNetworkClockAvailabilityService"},
|
||||
FunctionInfo{100, &NTC::SuspendAutonomicTimeCorrection, "SuspendAutonomicTimeCorrection"},
|
||||
FunctionInfo{101, &NTC::ResumeAutonomicTimeCorrection, "ResumeAutonomicTimeCorrection"}
|
||||
);
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -626,14 +612,13 @@ private:
|
||||
|
||||
class NIM_ECAS final : public ServiceFramework<NIM_ECAS> {
|
||||
public:
|
||||
explicit NIM_ECAS(Core::System& system_) : ServiceFramework{system_, "nim:ecas"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "RegisterSpecialClient"},
|
||||
{1, nullptr, "UnregisterSpecialClient"},
|
||||
};
|
||||
// clang-format on
|
||||
RegisterHandlers(functions);
|
||||
explicit NIM_ECAS(Core::System& system_) : ServiceFramework{system_, "nim:ecas"} {}
|
||||
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, nullptr, "RegisterSpecialClient"},
|
||||
FunctionInfo{1, nullptr, "UnregisterSpecialClient"}
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -19,79 +19,77 @@ class INpnsSystem final : public ServiceFramework<INpnsSystem> {
|
||||
public:
|
||||
explicit INpnsSystem(Core::System& system_)
|
||||
: ServiceFramework{system_, "npns:s"}, service_context{system, "npns:s"},
|
||||
get_receive_event{service_context}, get_request_change_state_cancel_event{service_context} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{1, nullptr, "ListenAll"},
|
||||
{2, C<&INpnsSystem::ListenTo>, "ListenTo"},
|
||||
{3, nullptr, "Receive"},
|
||||
{4, nullptr, "ReceiveRaw"},
|
||||
{5, C<&INpnsSystem::GetReceiveEvent>, "GetReceiveEvent"},
|
||||
{6, nullptr, "ListenUndelivered"},
|
||||
{7, nullptr, "GetStateChangeEvent"},
|
||||
{8, C<&INpnsSystem::ListenToByName>, "ListenToByName"},
|
||||
{11, nullptr, "SubscribeTopic"},
|
||||
{12, nullptr, "UnsubscribeTopic"},
|
||||
{13, nullptr, "QueryIsTopicExist"},
|
||||
{14, nullptr, "SubscribeTopicByAccount"}, // 18.0.0+
|
||||
{15, nullptr, "UnsubscribeTopicByAccount"}, // 18.0.0+
|
||||
{16, nullptr, "DownloadSubscriptionList"}, // 18.0.0+
|
||||
{21, nullptr, "CreateToken"},
|
||||
{22, nullptr, "CreateTokenWithApplicationId"},
|
||||
{23, nullptr, "DestroyToken"},
|
||||
{24, nullptr, "DestroyTokenWithApplicationId"},
|
||||
{25, nullptr, "QueryIsTokenValid"},
|
||||
{26, nullptr, "ListenToMyApplicationId"},
|
||||
{27, nullptr, "DestroyTokenAll"},
|
||||
{28, nullptr, "CreateTokenWithName"}, // 18.0.0+
|
||||
{29, nullptr, "DestroyTokenWithName"}, // 18.0.0+
|
||||
{31, nullptr, "UploadTokenToBaaS"},
|
||||
{32, nullptr, "DestroyTokenForBaaS"},
|
||||
{33, nullptr, "CreateTokenForBaaS"},
|
||||
{34, nullptr, "SetBaaSDeviceAccountIdList"},
|
||||
{35, nullptr, "LinkNsaId"}, // 17.0.0+
|
||||
{36, nullptr, "UnlinkNsaId"}, // 17.0.0+
|
||||
{37, nullptr, "RelinkNsaId"}, // 18.0.0+
|
||||
{40, nullptr, "GetNetworkServiceAccountIdTokenRequestEvent"}, // 17.0.0+
|
||||
{41, nullptr, "TryPopNetworkServiceAccountIdTokenRequestUid"}, // 17.0.0+
|
||||
{42, nullptr, "SetNetworkServiceAccountIdTokenSuccess"}, // 17.0.0+
|
||||
{43, nullptr, "SetNetworkServiceAccountIdTokenFailure"}, // 17.0.0+
|
||||
{44, nullptr, "SetUidList"}, // 17.0.0+
|
||||
{45, nullptr, "PutDigitalTwinKeyValue"}, // 17.0.0+
|
||||
{51, nullptr, "DeleteDigitalTwinKeyValue"}, // 18.0.0+
|
||||
{101, nullptr, "Suspend"},
|
||||
{102, nullptr, "Resume"},
|
||||
{103, C<&INpnsSystem::GetState>, "GetState"},
|
||||
{104, nullptr, "GetStatistics"},
|
||||
{105, nullptr, "GetPlayReportRequestEvent"},
|
||||
{106, C<&INpnsSystem::GetLastNotifiedTime>, "GetLastNotifiedTime"}, // 18.0.0+
|
||||
{107, nullptr, "SetLastNotifiedTime"}, // 18.0.0+
|
||||
{111, nullptr, "GetJid"},
|
||||
{112, nullptr, "CreateJid"},
|
||||
{113, nullptr, "DestroyJid"},
|
||||
{114, nullptr, "AttachJid"},
|
||||
{115, nullptr, "DetachJid"},
|
||||
{120, nullptr, "CreateNotificationReceiver"},
|
||||
{151, nullptr, "GetStateWithHandover"},
|
||||
{152, nullptr, "GetStateChangeEventWithHandover"},
|
||||
{153, nullptr, "GetDropEventWithHandover"},
|
||||
{154, nullptr, "CreateTokenAsync"},
|
||||
{155, nullptr, "CreateTokenAsyncWithApplicationId"},
|
||||
{156, nullptr, "CreateTokenWithNameAsync"}, // 18.0.0+
|
||||
{161, C<&INpnsSystem::GetRequestChangeStateCancelEvent>, "GetRequestChangeStateCancelEvent"}, // 10.0.0+
|
||||
{162, nullptr, "RequestChangeStateForceTimedWithCancelEvent"},
|
||||
{201, nullptr, "RequestChangeStateForceTimed"},
|
||||
{202, nullptr, "RequestChangeStateForceAsync"},
|
||||
{301, nullptr, "GetPassword"}, // 18.0.0+
|
||||
{302, nullptr, "GetAllImmigration"}, // 18.0.0+
|
||||
{303, nullptr, "GetNotificationHistories"}, // 18.0.0+
|
||||
{304, nullptr, "GetPersistentConnectionSummary"}, // 18.0.0+
|
||||
{305, nullptr, "GetDigitalTwinSummary"}, // 18.0.0+
|
||||
{306, nullptr, "GetDigitalTwinValue"}, // 18.0.0+
|
||||
};
|
||||
// clang-format on
|
||||
get_receive_event{service_context}, get_request_change_state_cancel_event{service_context} {}
|
||||
|
||||
RegisterHandlers(functions);
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{1, nullptr, "ListenAll"},
|
||||
FunctionInfo{2, C<&INpnsSystem::ListenTo>, "ListenTo"},
|
||||
FunctionInfo{3, nullptr, "Receive"},
|
||||
FunctionInfo{4, nullptr, "ReceiveRaw"},
|
||||
FunctionInfo{5, C<&INpnsSystem::GetReceiveEvent>, "GetReceiveEvent"},
|
||||
FunctionInfo{6, nullptr, "ListenUndelivered"},
|
||||
FunctionInfo{7, nullptr, "GetStateChangeEvent"},
|
||||
FunctionInfo{8, C<&INpnsSystem::ListenToByName>, "ListenToByName"},
|
||||
FunctionInfo{11, nullptr, "SubscribeTopic"},
|
||||
FunctionInfo{12, nullptr, "UnsubscribeTopic"},
|
||||
FunctionInfo{13, nullptr, "QueryIsTopicExist"},
|
||||
FunctionInfo{14, nullptr, "SubscribeTopicByAccount"}, // 18.0.0+
|
||||
FunctionInfo{15, nullptr, "UnsubscribeTopicByAccount"}, // 18.0.0+
|
||||
FunctionInfo{16, nullptr, "DownloadSubscriptionList"}, // 18.0.0+
|
||||
FunctionInfo{21, nullptr, "CreateToken"},
|
||||
FunctionInfo{22, nullptr, "CreateTokenWithApplicationId"},
|
||||
FunctionInfo{23, nullptr, "DestroyToken"},
|
||||
FunctionInfo{24, nullptr, "DestroyTokenWithApplicationId"},
|
||||
FunctionInfo{25, nullptr, "QueryIsTokenValid"},
|
||||
FunctionInfo{26, nullptr, "ListenToMyApplicationId"},
|
||||
FunctionInfo{27, nullptr, "DestroyTokenAll"},
|
||||
FunctionInfo{28, nullptr, "CreateTokenWithName"}, // 18.0.0+
|
||||
FunctionInfo{29, nullptr, "DestroyTokenWithName"}, // 18.0.0+
|
||||
FunctionInfo{31, nullptr, "UploadTokenToBaaS"},
|
||||
FunctionInfo{32, nullptr, "DestroyTokenForBaaS"},
|
||||
FunctionInfo{33, nullptr, "CreateTokenForBaaS"},
|
||||
FunctionInfo{34, nullptr, "SetBaaSDeviceAccountIdList"},
|
||||
FunctionInfo{35, nullptr, "LinkNsaId"}, // 17.0.0+
|
||||
FunctionInfo{36, nullptr, "UnlinkNsaId"}, // 17.0.0+
|
||||
FunctionInfo{37, nullptr, "RelinkNsaId"}, // 18.0.0+
|
||||
FunctionInfo{40, nullptr, "GetNetworkServiceAccountIdTokenRequestEvent"}, // 17.0.0+
|
||||
FunctionInfo{41, nullptr, "TryPopNetworkServiceAccountIdTokenRequestUid"}, // 17.0.0+
|
||||
FunctionInfo{42, nullptr, "SetNetworkServiceAccountIdTokenSuccess"}, // 17.0.0+
|
||||
FunctionInfo{43, nullptr, "SetNetworkServiceAccountIdTokenFailure"}, // 17.0.0+
|
||||
FunctionInfo{44, nullptr, "SetUidList"}, // 17.0.0+
|
||||
FunctionInfo{45, nullptr, "PutDigitalTwinKeyValue"}, // 17.0.0+
|
||||
FunctionInfo{51, nullptr, "DeleteDigitalTwinKeyValue"}, // 18.0.0+
|
||||
FunctionInfo{101, nullptr, "Suspend"},
|
||||
FunctionInfo{102, nullptr, "Resume"},
|
||||
FunctionInfo{103, C<&INpnsSystem::GetState>, "GetState"},
|
||||
FunctionInfo{104, nullptr, "GetStatistics"},
|
||||
FunctionInfo{105, nullptr, "GetPlayReportRequestEvent"},
|
||||
FunctionInfo{106, C<&INpnsSystem::GetLastNotifiedTime>, "GetLastNotifiedTime"}, // 18.0.0+
|
||||
FunctionInfo{107, nullptr, "SetLastNotifiedTime"}, // 18.0.0+
|
||||
FunctionInfo{111, nullptr, "GetJid"},
|
||||
FunctionInfo{112, nullptr, "CreateJid"},
|
||||
FunctionInfo{113, nullptr, "DestroyJid"},
|
||||
FunctionInfo{114, nullptr, "AttachJid"},
|
||||
FunctionInfo{115, nullptr, "DetachJid"},
|
||||
FunctionInfo{120, nullptr, "CreateNotificationReceiver"},
|
||||
FunctionInfo{151, nullptr, "GetStateWithHandover"},
|
||||
FunctionInfo{152, nullptr, "GetStateChangeEventWithHandover"},
|
||||
FunctionInfo{153, nullptr, "GetDropEventWithHandover"},
|
||||
FunctionInfo{154, nullptr, "CreateTokenAsync"},
|
||||
FunctionInfo{155, nullptr, "CreateTokenAsyncWithApplicationId"},
|
||||
FunctionInfo{156, nullptr, "CreateTokenWithNameAsync"}, // 18.0.0+
|
||||
FunctionInfo{161, C<&INpnsSystem::GetRequestChangeStateCancelEvent>, "GetRequestChangeStateCancelEvent"}, // 10.0.0+
|
||||
FunctionInfo{162, nullptr, "RequestChangeStateForceTimedWithCancelEvent"},
|
||||
FunctionInfo{201, nullptr, "RequestChangeStateForceTimed"},
|
||||
FunctionInfo{202, nullptr, "RequestChangeStateForceAsync"},
|
||||
FunctionInfo{301, nullptr, "GetPassword"}, // 18.0.0+
|
||||
FunctionInfo{302, nullptr, "GetAllImmigration"}, // 18.0.0+
|
||||
FunctionInfo{303, nullptr, "GetNotificationHistories"}, // 18.0.0+
|
||||
FunctionInfo{304, nullptr, "GetPersistentConnectionSummary"}, // 18.0.0+
|
||||
FunctionInfo{305, nullptr, "GetDigitalTwinSummary"}, // 18.0.0+
|
||||
FunctionInfo{306, nullptr, "GetDigitalTwinValue"} // 18.0.0+
|
||||
);
|
||||
}
|
||||
|
||||
~INpnsSystem() override = default;
|
||||
@@ -148,34 +146,32 @@ private:
|
||||
class INpnsUser final : public ServiceFramework<INpnsUser> {
|
||||
public:
|
||||
explicit INpnsUser(Core::System& system_)
|
||||
: ServiceFramework{system_, "npns:u"}, service_context{system, "npns:u"}, get_receive_event{service_context} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{1, nullptr, "ListenAll"},
|
||||
{2, nullptr, "ListenTo"},
|
||||
{3, nullptr, "Receive"},
|
||||
{4, nullptr, "ReceiveRaw"},
|
||||
{5, C<&INpnsUser::GetReceiveEvent>, "GetReceiveEvent"},
|
||||
{7, nullptr, "GetStateChangeEvent"},
|
||||
{8, C<&INpnsUser::ListenToByName>, "ListenToByName"}, // 18.0.0+
|
||||
{21, nullptr, "CreateToken"},
|
||||
{23, nullptr, "DestroyToken"},
|
||||
{25, nullptr, "QueryIsTokenValid"},
|
||||
{26, nullptr, "ListenToMyApplicationId"},
|
||||
{101, nullptr, "Suspend"},
|
||||
{102, nullptr, "Resume"},
|
||||
{103, nullptr, "GetState"},
|
||||
{104, nullptr, "GetStatistics"},
|
||||
{111, nullptr, "GetJid"},
|
||||
{120, nullptr, "CreateNotificationReceiver"},
|
||||
{151, nullptr, "GetStateWithHandover"},
|
||||
{152, nullptr, "GetStateChangeEventWithHandover"},
|
||||
{153, nullptr, "GetDropEventWithHandover"},
|
||||
{154, nullptr, "CreateTokenAsync"},
|
||||
};
|
||||
// clang-format on
|
||||
: ServiceFramework{system_, "npns:u"}, service_context{system, "npns:u"}, get_receive_event{service_context} {}
|
||||
|
||||
RegisterHandlers(functions);
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{1, nullptr, "ListenAll"},
|
||||
FunctionInfo{2, nullptr, "ListenTo"},
|
||||
FunctionInfo{3, nullptr, "Receive"},
|
||||
FunctionInfo{4, nullptr, "ReceiveRaw"},
|
||||
FunctionInfo{5, C<&INpnsUser::GetReceiveEvent>, "GetReceiveEvent"},
|
||||
FunctionInfo{7, nullptr, "GetStateChangeEvent"},
|
||||
FunctionInfo{8, C<&INpnsUser::ListenToByName>, "ListenToByName"}, // 18.0.0+
|
||||
FunctionInfo{21, nullptr, "CreateToken"},
|
||||
FunctionInfo{23, nullptr, "DestroyToken"},
|
||||
FunctionInfo{25, nullptr, "QueryIsTokenValid"},
|
||||
FunctionInfo{26, nullptr, "ListenToMyApplicationId"},
|
||||
FunctionInfo{101, nullptr, "Suspend"},
|
||||
FunctionInfo{102, nullptr, "Resume"},
|
||||
FunctionInfo{103, nullptr, "GetState"},
|
||||
FunctionInfo{104, nullptr, "GetStatistics"},
|
||||
FunctionInfo{111, nullptr, "GetJid"},
|
||||
FunctionInfo{120, nullptr, "CreateNotificationReceiver"},
|
||||
FunctionInfo{151, nullptr, "GetStateWithHandover"},
|
||||
FunctionInfo{152, nullptr, "GetStateChangeEventWithHandover"},
|
||||
FunctionInfo{153, nullptr, "GetDropEventWithHandover"},
|
||||
FunctionInfo{154, nullptr, "CreateTokenAsync"}
|
||||
);
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
@@ -9,13 +12,13 @@ IFactoryResetInterface::IFactoryResetInterface(Core::System& system_)
|
||||
: ServiceFramework{system_, "IFactoryResetInterface"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{100, nullptr, "ResetToFactorySettings"},
|
||||
{101, nullptr, "ResetToFactorySettingsWithoutUserSaveData"},
|
||||
{102, nullptr, "ResetToFactorySettingsForRefurbishment"},
|
||||
{103, nullptr, "ResetToFactorySettingsWithPlatformRegion"},
|
||||
{104, nullptr, "ResetToFactorySettingsWithPlatformRegionAuthentication"},
|
||||
{105, nullptr, "RequestResetToFactorySettingsSecurely"},
|
||||
{106, nullptr, "RequestResetToFactorySettingsWithPlatformRegionAuthenticationSecurely"},
|
||||
FunctionInfo{100, nullptr, "ResetToFactorySettings"},
|
||||
FunctionInfo{101, nullptr, "ResetToFactorySettingsWithoutUserSaveData"},
|
||||
FunctionInfo{102, nullptr, "ResetToFactorySettingsForRefurbishment"},
|
||||
FunctionInfo{103, nullptr, "ResetToFactorySettingsWithPlatformRegion"},
|
||||
FunctionInfo{104, nullptr, "ResetToFactorySettingsWithPlatformRegionAuthentication"},
|
||||
FunctionInfo{105, nullptr, "RequestResetToFactorySettingsSecurely"},
|
||||
FunctionInfo{106, nullptr, "RequestResetToFactorySettingsWithPlatformRegionAuthenticationSecurely"}
|
||||
};
|
||||
// clang-format on
|
||||
|
||||
|
||||
@@ -19,25 +19,24 @@ namespace Service::NS {
|
||||
|
||||
class INotifyService final : public ServiceFramework<INotifyService> {
|
||||
public:
|
||||
explicit INotifyService(Core::System& system_) : ServiceFramework{system_, "pdm:ntfy"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{ 0, nullptr, "NotifyAppletEvent" },
|
||||
{ 2, nullptr, "NotifyOperationModeChangeEvent" },
|
||||
{ 3, nullptr, "NotifyPowerStateChangeEvent" },
|
||||
{ 4, nullptr, "NotifyClearAllEvent" },
|
||||
{ 5, nullptr, "NotifyEventForDebug" },
|
||||
{ 6, nullptr, "SuspendUserAccountEventService" },
|
||||
{ 7, nullptr, "ResumeUserAccountEventService" },
|
||||
{ 8, nullptr, "NotifyLibraryAppletEvent" },
|
||||
{ 9, nullptr, "Cmd9" },
|
||||
{ 20, nullptr, "Cmd20" },
|
||||
{ 30, nullptr, "Cmd30" },
|
||||
{ 100, nullptr, "Cmd100" },
|
||||
{ 101, nullptr, "Cmd101" },
|
||||
};
|
||||
// clang-format on
|
||||
RegisterHandlers(functions);
|
||||
explicit INotifyService(Core::System& system_) : ServiceFramework{system_, "pdm:ntfy"} {}
|
||||
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, nullptr, "NotifyAppletEvent" },
|
||||
FunctionInfo{2, nullptr, "NotifyOperationModeChangeEvent" },
|
||||
FunctionInfo{3, nullptr, "NotifyPowerStateChangeEvent" },
|
||||
FunctionInfo{4, nullptr, "NotifyClearAllEvent" },
|
||||
FunctionInfo{5, nullptr, "NotifyEventForDebug" },
|
||||
FunctionInfo{6, nullptr, "SuspendUserAccountEventService" },
|
||||
FunctionInfo{7, nullptr, "ResumeUserAccountEventService" },
|
||||
FunctionInfo{8, nullptr, "NotifyLibraryAppletEvent" },
|
||||
FunctionInfo{9, nullptr, "Cmd9" },
|
||||
FunctionInfo{20, nullptr, "Cmd20" },
|
||||
FunctionInfo{30, nullptr, "Cmd30" },
|
||||
FunctionInfo{100, nullptr, "Cmd100" },
|
||||
FunctionInfo{101, nullptr, "Cmd101" }
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -45,18 +44,17 @@ class IVulnerabilityManagerInterface final
|
||||
: public ServiceFramework<IVulnerabilityManagerInterface> {
|
||||
public:
|
||||
explicit IVulnerabilityManagerInterface(Core::System& system_)
|
||||
: ServiceFramework{system_, "ns:vm"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{1200, D<&IVulnerabilityManagerInterface::NeedsUpdateVulnerability>, "NeedsUpdateVulnerability"},
|
||||
{1201, nullptr, "UpdateSafeSystemVersionForDebug"},
|
||||
{1202, nullptr, "GetSafeSystemVersion"},
|
||||
{3100, D<&IVulnerabilityManagerInterface::GetSafeSystemVersionCheckInfo>, "GetSafeSystemVersionCheckInfo"},
|
||||
{3101, nullptr, "RequestUpdateSafeSystemVersionCheckInfo"},
|
||||
{3102, D<&IVulnerabilityManagerInterface::ResetSafeSystemVersionCheckInfo>, "ResetSafeSystemVersionCheckInfo"},
|
||||
};
|
||||
// clang-format on
|
||||
RegisterHandlers(functions);
|
||||
: ServiceFramework{system_, "ns:vm"} {}
|
||||
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{1200, D<&IVulnerabilityManagerInterface::NeedsUpdateVulnerability>, "NeedsUpdateVulnerability"},
|
||||
FunctionInfo{1201, nullptr, "UpdateSafeSystemVersionForDebug"},
|
||||
FunctionInfo{1202, nullptr, "GetSafeSystemVersion"},
|
||||
FunctionInfo{3100, D<&IVulnerabilityManagerInterface::GetSafeSystemVersionCheckInfo>, "GetSafeSystemVersionCheckInfo"},
|
||||
FunctionInfo{3101, nullptr, "RequestUpdateSafeSystemVersionCheckInfo"},
|
||||
FunctionInfo{3102, D<&IVulnerabilityManagerInterface::ResetSafeSystemVersionCheckInfo>, "ResetSafeSystemVersionCheckInfo"}
|
||||
);
|
||||
}
|
||||
~IVulnerabilityManagerInterface() override = default;
|
||||
|
||||
|
||||
@@ -38,12 +38,12 @@ IQueryService::IQueryService(Core::System& system_) : ServiceFramework{system_,
|
||||
{17, D<&IQueryService::QueryLastPlayTime>, "QueryLastPlayTime"},
|
||||
{18, D<&IQueryService::QueryApplicationPlayStatisticsForSystem>, "QueryApplicationPlayStatisticsForSystem"},
|
||||
{19, D<&IQueryService::QueryApplicationPlayStatisticsByUserAccountIdForSystem>, "QueryApplicationPlayStatisticsByUserAccountIdForSystem"},
|
||||
{ 30, nullptr, "Cmd30" },
|
||||
{ 31, nullptr, "Cmd31" },
|
||||
{ 100, nullptr, "Cmd100" },
|
||||
{ 110, nullptr, "Cmd110" },
|
||||
{ 118, nullptr, "Cmd118" },
|
||||
{ 119, nullptr, "Cmd119" },
|
||||
FunctionInfo{30, nullptr, "Cmd30" },
|
||||
FunctionInfo{31, nullptr, "Cmd31" },
|
||||
FunctionInfo{100, nullptr, "Cmd100" },
|
||||
FunctionInfo{110, nullptr, "Cmd110" },
|
||||
FunctionInfo{118, nullptr, "Cmd118" },
|
||||
FunctionInfo{119, nullptr, "Cmd119" },
|
||||
};
|
||||
// clang-format on
|
||||
|
||||
|
||||
@@ -85,10 +85,10 @@ public:
|
||||
, data_size{size}
|
||||
{
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, D<&IAsyncValue::GetSize>, "GetSize"},
|
||||
{1, D<&IAsyncValue::Get>, "Get"},
|
||||
{2, D<&IAsyncValue::Cancel>, "Cancel"},
|
||||
{3, D<&IAsyncValue::GetErrorContext>, "GetErrorContext"},
|
||||
FunctionInfo{0, D<&IAsyncValue::GetSize>, "GetSize"},
|
||||
FunctionInfo{1, D<&IAsyncValue::Get>, "Get"},
|
||||
FunctionInfo{2, D<&IAsyncValue::Cancel>, "Cancel"},
|
||||
FunctionInfo{3, D<&IAsyncValue::GetErrorContext>, "GetErrorContext"}
|
||||
};
|
||||
RegisterHandlers(functions);
|
||||
completion_event = service_context.CreateEvent("IAsyncValue:Completion");
|
||||
|
||||
@@ -52,14 +52,14 @@ public:
|
||||
: ServiceFramework{system_, "nvgem:c"}
|
||||
{
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "Initialize"},
|
||||
{1, nullptr, "GetEventHandle"},
|
||||
{2, nullptr, "ControlNotification"},
|
||||
{3, nullptr, "SetNotificationPerm"},
|
||||
{4, nullptr, "SetCoreDumpPerm"},
|
||||
{5, nullptr, "GetAruid"},
|
||||
{6, nullptr, "Reset"},
|
||||
{7, nullptr, "GetAruid2"},
|
||||
FunctionInfo{0, nullptr, "Initialize"},
|
||||
FunctionInfo{1, nullptr, "GetEventHandle"},
|
||||
FunctionInfo{2, nullptr, "ControlNotification"},
|
||||
FunctionInfo{3, nullptr, "SetNotificationPerm"},
|
||||
FunctionInfo{4, nullptr, "SetCoreDumpPerm"},
|
||||
FunctionInfo{5, nullptr, "GetAruid"},
|
||||
FunctionInfo{6, nullptr, "Reset"},
|
||||
FunctionInfo{7, nullptr, "GetAruid2"}
|
||||
};
|
||||
RegisterHandlers(functions);
|
||||
}
|
||||
@@ -71,11 +71,11 @@ public:
|
||||
: ServiceFramework{system_, "nvgem:cd"}
|
||||
{
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "Initialize"},
|
||||
{1, nullptr, "GetAruid"},
|
||||
{2, nullptr, "ReadNextBlock"},
|
||||
{3, nullptr, "GetNextBlockSize"},
|
||||
{4, nullptr, "ReadNextBlock2"},
|
||||
FunctionInfo{0, nullptr, "Initialize"},
|
||||
FunctionInfo{1, nullptr, "GetAruid"},
|
||||
FunctionInfo{2, nullptr, "ReadNextBlock"},
|
||||
FunctionInfo{3, nullptr, "GetNextBlockSize"},
|
||||
FunctionInfo{4, nullptr, "ReadNextBlock2"}
|
||||
};
|
||||
RegisterHandlers(functions);
|
||||
}
|
||||
@@ -87,15 +87,15 @@ public:
|
||||
: ServiceFramework{system_, "nvdbg:d"}
|
||||
{
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "Open"},
|
||||
{1, nullptr, "Ioctl"},
|
||||
{2, nullptr, "Close"},
|
||||
{4, nullptr, "QueryEvent"},
|
||||
{9, nullptr, "DumpStatus"},
|
||||
{10, nullptr, "InitializeDevtools"},
|
||||
{11, nullptr, "Ioctl2"},
|
||||
{12, nullptr, "Ioctl3"},
|
||||
{13, nullptr, "SetConfiguration"},
|
||||
FunctionInfo{0, nullptr, "Open"},
|
||||
FunctionInfo{1, nullptr, "Ioctl"},
|
||||
FunctionInfo{2, nullptr, "Close"},
|
||||
FunctionInfo{4, nullptr, "QueryEvent"},
|
||||
FunctionInfo{9, nullptr, "DumpStatus"},
|
||||
FunctionInfo{10, nullptr, "InitializeDevtools"},
|
||||
FunctionInfo{11, nullptr, "Ioctl2"},
|
||||
FunctionInfo{12, nullptr, "Ioctl3"},
|
||||
FunctionInfo{13, nullptr, "SetConfiguration"}
|
||||
};
|
||||
RegisterHandlers(functions);
|
||||
}
|
||||
|
||||
@@ -18,7 +18,7 @@ public:
|
||||
: ServiceFramework{system_, "spbg:sp"}
|
||||
{
|
||||
static const FunctionInfo functions[] = {
|
||||
{ 100, nullptr, "OpenBgAgentController" },
|
||||
FunctionInfo{100, nullptr, "OpenBgAgentController" },
|
||||
};
|
||||
RegisterHandlers(functions);
|
||||
}
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
@@ -10,28 +13,28 @@ IOlscServiceForApplication::IOlscServiceForApplication(Core::System& system_)
|
||||
: ServiceFramework{system_, "olsc:u"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, D<&IOlscServiceForApplication::Initialize>, "Initialize"},
|
||||
{10, nullptr, "VerifySaveDataBackupLicenseAsync"},
|
||||
{13, D<&IOlscServiceForApplication::GetSaveDataBackupSetting>, "GetSaveDataBackupSetting"},
|
||||
{14, D<&IOlscServiceForApplication::SetSaveDataBackupSettingEnabled>, "SetSaveDataBackupSettingEnabled"},
|
||||
{15, nullptr, "SetCustomData"},
|
||||
{16, nullptr, "DeleteSaveDataBackupSetting"},
|
||||
{18, nullptr, "GetSaveDataBackupInfoCache"},
|
||||
{19, nullptr, "UpdateSaveDataBackupInfoCacheAsync"},
|
||||
{22, nullptr, "DeleteSaveDataBackupAsync"},
|
||||
{25, nullptr, "ListDownloadableSaveDataBackupInfoAsync"},
|
||||
{26, nullptr, "DownloadSaveDataBackupAsync"},
|
||||
{27, nullptr, "UploadSaveDataBackupAsync"},
|
||||
{9010, nullptr, "VerifySaveDataBackupLicenseAsyncForDebug"},
|
||||
{9013, nullptr, "GetSaveDataBackupSettingForDebug"},
|
||||
{9014, nullptr, "SetSaveDataBackupSettingEnabledForDebug"},
|
||||
{9015, nullptr, "SetCustomDataForDebug"},
|
||||
{9016, nullptr, "DeleteSaveDataBackupSettingForDebug"},
|
||||
{9018, nullptr, "GetSaveDataBackupInfoCacheForDebug"},
|
||||
{9019, nullptr, "UpdateSaveDataBackupInfoCacheAsyncForDebug"},
|
||||
{9022, nullptr, "DeleteSaveDataBackupAsyncForDebug"},
|
||||
{9025, nullptr, "ListDownloadableSaveDataBackupInfoAsyncForDebug"},
|
||||
{9026, nullptr, "DownloadSaveDataBackupAsyncForDebug"},
|
||||
FunctionInfo{0, D<&IOlscServiceForApplication::Initialize>, "Initialize"},
|
||||
FunctionInfo{10, nullptr, "VerifySaveDataBackupLicenseAsync"},
|
||||
FunctionInfo{13, D<&IOlscServiceForApplication::GetSaveDataBackupSetting>, "GetSaveDataBackupSetting"},
|
||||
FunctionInfo{14, D<&IOlscServiceForApplication::SetSaveDataBackupSettingEnabled>, "SetSaveDataBackupSettingEnabled"},
|
||||
FunctionInfo{15, nullptr, "SetCustomData"},
|
||||
FunctionInfo{16, nullptr, "DeleteSaveDataBackupSetting"},
|
||||
FunctionInfo{18, nullptr, "GetSaveDataBackupInfoCache"},
|
||||
FunctionInfo{19, nullptr, "UpdateSaveDataBackupInfoCacheAsync"},
|
||||
FunctionInfo{22, nullptr, "DeleteSaveDataBackupAsync"},
|
||||
FunctionInfo{25, nullptr, "ListDownloadableSaveDataBackupInfoAsync"},
|
||||
FunctionInfo{26, nullptr, "DownloadSaveDataBackupAsync"},
|
||||
FunctionInfo{27, nullptr, "UploadSaveDataBackupAsync"},
|
||||
FunctionInfo{9010, nullptr, "VerifySaveDataBackupLicenseAsyncForDebug"},
|
||||
FunctionInfo{9013, nullptr, "GetSaveDataBackupSettingForDebug"},
|
||||
FunctionInfo{9014, nullptr, "SetSaveDataBackupSettingEnabledForDebug"},
|
||||
FunctionInfo{9015, nullptr, "SetCustomDataForDebug"},
|
||||
FunctionInfo{9016, nullptr, "DeleteSaveDataBackupSettingForDebug"},
|
||||
FunctionInfo{9018, nullptr, "GetSaveDataBackupInfoCacheForDebug"},
|
||||
FunctionInfo{9019, nullptr, "UpdateSaveDataBackupInfoCacheAsyncForDebug"},
|
||||
FunctionInfo{9022, nullptr, "DeleteSaveDataBackupAsyncForDebug"},
|
||||
FunctionInfo{9025, nullptr, "ListDownloadableSaveDataBackupInfoAsyncForDebug"},
|
||||
FunctionInfo{9026, nullptr, "DownloadSaveDataBackupAsyncForDebug"}
|
||||
};
|
||||
// clang-format on
|
||||
|
||||
|
||||
@@ -15,64 +15,59 @@ namespace Service::PCIe {
|
||||
|
||||
class ISession final : public ServiceFramework<ISession> {
|
||||
public:
|
||||
explicit ISession(Core::System& system_) : ServiceFramework{system_, "ISession"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "QueryFunctions"},
|
||||
{1, nullptr, "AcquireFunction"},
|
||||
{2, nullptr, "ReleaseFunction"},
|
||||
{3, nullptr, "GetFunctionState"},
|
||||
{4, nullptr, "GetBarProfile"},
|
||||
{5, nullptr, "ReadConfig"},
|
||||
{6, nullptr, "WriteConfig"},
|
||||
{7, nullptr, "ReadBarRegion"},
|
||||
{8, nullptr, "WriteBarRegion"},
|
||||
{9, nullptr, "FindCapability"},
|
||||
{10, nullptr, "FindExtendedCapability"},
|
||||
{11, nullptr, "MapDma"},
|
||||
{12, nullptr, "UnmapDma"},
|
||||
{13, nullptr, "UnmapDmaBusAddress"},
|
||||
{14, nullptr, "GetDmaBusAddress"},
|
||||
{15, nullptr, "GetDmaBusAddressRange"},
|
||||
{16, nullptr, "SetDmaEnable"},
|
||||
{17, nullptr, "AcquireIrq"},
|
||||
{18, nullptr, "ReleaseIrq"},
|
||||
{19, nullptr, "SetIrqEnable"},
|
||||
{20, nullptr, "GetIrqEvent"},
|
||||
{21, nullptr, "SetAspmEnable"},
|
||||
{22, nullptr, "SetResetUponResumeEnable"},
|
||||
{23, nullptr, "ResetFunction"},
|
||||
};
|
||||
// clang-format on
|
||||
explicit ISession(Core::System& system_) : ServiceFramework{system_, "ISession"} {}
|
||||
|
||||
RegisterHandlers(functions);
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, nullptr, "QueryFunctions"},
|
||||
FunctionInfo{1, nullptr, "AcquireFunction"},
|
||||
FunctionInfo{2, nullptr, "ReleaseFunction"},
|
||||
FunctionInfo{3, nullptr, "GetFunctionState"},
|
||||
FunctionInfo{4, nullptr, "GetBarProfile"},
|
||||
FunctionInfo{5, nullptr, "ReadConfig"},
|
||||
FunctionInfo{6, nullptr, "WriteConfig"},
|
||||
FunctionInfo{7, nullptr, "ReadBarRegion"},
|
||||
FunctionInfo{8, nullptr, "WriteBarRegion"},
|
||||
FunctionInfo{9, nullptr, "FindCapability"},
|
||||
FunctionInfo{10, nullptr, "FindExtendedCapability"},
|
||||
FunctionInfo{11, nullptr, "MapDma"},
|
||||
FunctionInfo{12, nullptr, "UnmapDma"},
|
||||
FunctionInfo{13, nullptr, "UnmapDmaBusAddress"},
|
||||
FunctionInfo{14, nullptr, "GetDmaBusAddress"},
|
||||
FunctionInfo{15, nullptr, "GetDmaBusAddressRange"},
|
||||
FunctionInfo{16, nullptr, "SetDmaEnable"},
|
||||
FunctionInfo{17, nullptr, "AcquireIrq"},
|
||||
FunctionInfo{18, nullptr, "ReleaseIrq"},
|
||||
FunctionInfo{19, nullptr, "SetIrqEnable"},
|
||||
FunctionInfo{20, nullptr, "GetIrqEvent"},
|
||||
FunctionInfo{21, nullptr, "SetAspmEnable"},
|
||||
FunctionInfo{22, nullptr, "SetResetUponResumeEnable"},
|
||||
FunctionInfo{23, nullptr, "ResetFunction"}
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
class PCIE final : public ServiceFramework<PCIE> {
|
||||
public:
|
||||
explicit PCIE(Core::System& system_) : ServiceFramework{system_, "pcie"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "RegisterClassDriver"},
|
||||
{1, nullptr, "QueryFunctionsUnregistered"},
|
||||
};
|
||||
// clang-format on
|
||||
explicit PCIE(Core::System& system_) : ServiceFramework{system_, "pcie"} {}
|
||||
|
||||
RegisterHandlers(functions);
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, nullptr, "RegisterClassDriver"},
|
||||
FunctionInfo{1, nullptr, "QueryFunctionsUnregistered"}
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
class PCIE_LOG final : public ServiceFramework<PCIE_LOG> {
|
||||
public:
|
||||
explicit PCIE_LOG(Core::System& system_) : ServiceFramework{system_, "pcie:log"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "GetLoggedState"},
|
||||
{1, nullptr, "GetLoggedStateEvent"},
|
||||
};
|
||||
// clang-format on
|
||||
RegisterHandlers(functions);
|
||||
explicit PCIE_LOG(Core::System& system_) : ServiceFramework{system_, "pcie:log"} {}
|
||||
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, nullptr, "GetLoggedState"},
|
||||
FunctionInfo{1, nullptr, "GetLoggedStateEvent"}
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -15,91 +15,86 @@ namespace Service::PCV {
|
||||
|
||||
class PCV final : public ServiceFramework<PCV> {
|
||||
public:
|
||||
explicit PCV(Core::System& system_) : ServiceFramework{system_, "pcv"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "SetPowerEnabled"},
|
||||
{1, nullptr, "SetClockEnabled"},
|
||||
{2, nullptr, "SetClockRate"},
|
||||
{3, nullptr, "GetClockRate"},
|
||||
{4, nullptr, "GetState"},
|
||||
{5, nullptr, "GetPossibleClockRates"},
|
||||
{6, nullptr, "SetMinVClockRate"},
|
||||
{7, nullptr, "SetReset"},
|
||||
{8, nullptr, "SetVoltageEnabled"},
|
||||
{9, nullptr, "GetVoltageEnabled"},
|
||||
{10, nullptr, "GetVoltageRange"},
|
||||
{11, nullptr, "SetVoltageValue"},
|
||||
{12, nullptr, "GetVoltageValue"},
|
||||
{13, nullptr, "GetTemperatureThresholds"},
|
||||
{14, nullptr, "SetTemperature"},
|
||||
{15, nullptr, "Initialize"},
|
||||
{16, nullptr, "IsInitialized"},
|
||||
{17, nullptr, "Finalize"},
|
||||
{18, nullptr, "PowerOn"},
|
||||
{19, nullptr, "PowerOff"},
|
||||
{20, nullptr, "ChangeVoltage"},
|
||||
{21, nullptr, "GetPowerClockInfoEvent"},
|
||||
{22, nullptr, "GetOscillatorClock"},
|
||||
{23, nullptr, "GetDvfsTable"},
|
||||
{24, nullptr, "GetModuleStateTable"},
|
||||
{25, nullptr, "GetPowerDomainStateTable"},
|
||||
{26, nullptr, "GetFuseInfo"},
|
||||
{27, nullptr, "GetDramId"},
|
||||
{28, nullptr, "IsPoweredOn"},
|
||||
{29, nullptr, "GetVoltage"},
|
||||
};
|
||||
// clang-format on
|
||||
explicit PCV(Core::System& system_) : ServiceFramework{system_, "pcv"} {}
|
||||
|
||||
RegisterHandlers(functions);
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, nullptr, "SetPowerEnabled"},
|
||||
FunctionInfo{1, nullptr, "SetClockEnabled"},
|
||||
FunctionInfo{2, nullptr, "SetClockRate"},
|
||||
FunctionInfo{3, nullptr, "GetClockRate"},
|
||||
FunctionInfo{4, nullptr, "GetState"},
|
||||
FunctionInfo{5, nullptr, "GetPossibleClockRates"},
|
||||
FunctionInfo{6, nullptr, "SetMinVClockRate"},
|
||||
FunctionInfo{7, nullptr, "SetReset"},
|
||||
FunctionInfo{8, nullptr, "SetVoltageEnabled"},
|
||||
FunctionInfo{9, nullptr, "GetVoltageEnabled"},
|
||||
FunctionInfo{10, nullptr, "GetVoltageRange"},
|
||||
FunctionInfo{11, nullptr, "SetVoltageValue"},
|
||||
FunctionInfo{12, nullptr, "GetVoltageValue"},
|
||||
FunctionInfo{13, nullptr, "GetTemperatureThresholds"},
|
||||
FunctionInfo{14, nullptr, "SetTemperature"},
|
||||
FunctionInfo{15, nullptr, "Initialize"},
|
||||
FunctionInfo{16, nullptr, "IsInitialized"},
|
||||
FunctionInfo{17, nullptr, "Finalize"},
|
||||
FunctionInfo{18, nullptr, "PowerOn"},
|
||||
FunctionInfo{19, nullptr, "PowerOff"},
|
||||
FunctionInfo{20, nullptr, "ChangeVoltage"},
|
||||
FunctionInfo{21, nullptr, "GetPowerClockInfoEvent"},
|
||||
FunctionInfo{22, nullptr, "GetOscillatorClock"},
|
||||
FunctionInfo{23, nullptr, "GetDvfsTable"},
|
||||
FunctionInfo{24, nullptr, "GetModuleStateTable"},
|
||||
FunctionInfo{25, nullptr, "GetPowerDomainStateTable"},
|
||||
FunctionInfo{26, nullptr, "GetFuseInfo"},
|
||||
FunctionInfo{27, nullptr, "GetDramId"},
|
||||
FunctionInfo{28, nullptr, "IsPoweredOn"},
|
||||
FunctionInfo{29, nullptr, "GetVoltage"}
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
class PCV_ARB final : public ServiceFramework<PCV_ARB> {
|
||||
public:
|
||||
explicit PCV_ARB(Core::System& system_) : ServiceFramework{system_, "pcv:arb"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "ReleaseControl"},
|
||||
};
|
||||
// clang-format on
|
||||
RegisterHandlers(functions);
|
||||
explicit PCV_ARB(Core::System& system_) : ServiceFramework{system_, "pcv:arb"} {}
|
||||
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, nullptr, "ReleaseControl"}
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
class PCV_IMM final : public ServiceFramework<PCV_IMM> {
|
||||
public:
|
||||
explicit PCV_IMM(Core::System& system_) : ServiceFramework{system_, "pcv:imm"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "SetClockRate"},
|
||||
};
|
||||
// clang-format on
|
||||
RegisterHandlers(functions);
|
||||
explicit PCV_IMM(Core::System& system_) : ServiceFramework{system_, "pcv:imm"} {}
|
||||
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, nullptr, "SetClockRate"}
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
class IClkrstSession final : public ServiceFramework<IClkrstSession> {
|
||||
public:
|
||||
explicit IClkrstSession(Core::System& system_, DeviceCode device_code_)
|
||||
: ServiceFramework{system_, "IClkrstSession"}, device_code(device_code_) {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "SetClockEnabled"},
|
||||
{1, nullptr, "SetClockDisabled"},
|
||||
{2, nullptr, "SetResetAsserted"},
|
||||
{3, nullptr, "SetResetDeasserted"},
|
||||
{4, nullptr, "SetPowerEnabled"},
|
||||
{5, nullptr, "SetPowerDisabled"},
|
||||
{6, nullptr, "GetState"},
|
||||
{7, &IClkrstSession::SetClockRate, "SetClockRate"},
|
||||
{8, &IClkrstSession::GetClockRate, "GetClockRate"},
|
||||
{9, nullptr, "SetMinVClockRate"},
|
||||
{10, nullptr, "GetPossibleClockRates"},
|
||||
{11, nullptr, "GetDvfsTable"},
|
||||
};
|
||||
// clang-format on
|
||||
RegisterHandlers(functions);
|
||||
: ServiceFramework{system_, "IClkrstSession"}, device_code(device_code_) {}
|
||||
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, nullptr, "SetClockEnabled"},
|
||||
FunctionInfo{1, nullptr, "SetClockDisabled"},
|
||||
FunctionInfo{2, nullptr, "SetResetAsserted"},
|
||||
FunctionInfo{3, nullptr, "SetResetDeasserted"},
|
||||
FunctionInfo{4, nullptr, "SetPowerEnabled"},
|
||||
FunctionInfo{5, nullptr, "SetPowerDisabled"},
|
||||
FunctionInfo{6, nullptr, "GetState"},
|
||||
FunctionInfo{7, &IClkrstSession::SetClockRate, "SetClockRate"},
|
||||
FunctionInfo{8, &IClkrstSession::GetClockRate, "GetClockRate"},
|
||||
FunctionInfo{9, nullptr, "SetMinVClockRate"},
|
||||
FunctionInfo{10, nullptr, "GetPossibleClockRates"},
|
||||
FunctionInfo{11, nullptr, "GetDvfsTable"}
|
||||
);
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -126,19 +121,17 @@ private:
|
||||
|
||||
class CLKRST final : public ServiceFramework<CLKRST> {
|
||||
public:
|
||||
explicit CLKRST(Core::System& system_, const char* name) : ServiceFramework{system_, name} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, &CLKRST::OpenSession, "OpenSession"},
|
||||
{1, nullptr, "GetTemperatureThresholds"},
|
||||
{2, nullptr, "SetTemperature"},
|
||||
{3, nullptr, "GetModuleStateTable"},
|
||||
{4, nullptr, "GetModuleStateTableEvent"},
|
||||
{5, nullptr, "GetModuleStateTableMaxCount"},
|
||||
};
|
||||
// clang-format on
|
||||
explicit CLKRST(Core::System& system_, const char* name) : ServiceFramework{system_, name} {}
|
||||
|
||||
RegisterHandlers(functions);
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, &CLKRST::OpenSession, "OpenSession"},
|
||||
FunctionInfo{1, nullptr, "GetTemperatureThresholds"},
|
||||
FunctionInfo{2, nullptr, "SetTemperature"},
|
||||
FunctionInfo{3, nullptr, "GetModuleStateTable"},
|
||||
FunctionInfo{4, nullptr, "GetModuleStateTableEvent"},
|
||||
FunctionInfo{5, nullptr, "GetModuleStateTableMaxCount"}
|
||||
);
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -157,14 +150,12 @@ private:
|
||||
|
||||
class CLKRST_A final : public ServiceFramework<CLKRST_A> {
|
||||
public:
|
||||
explicit CLKRST_A(Core::System& system_) : ServiceFramework{system_, "clkrst:a"} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, nullptr, "ReleaseControl"},
|
||||
};
|
||||
// clang-format on
|
||||
explicit CLKRST_A(Core::System& system_) : ServiceFramework{system_, "clkrst:a"} {}
|
||||
|
||||
RegisterHandlers(functions);
|
||||
FunctionInfoBase const* FindRequest(u32 key) override {
|
||||
return HandlerTableGenerateWithFind(key,
|
||||
FunctionInfo{0, nullptr, "ReleaseControl"}
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user