summaryrefslogtreecommitdiffstats
path: root/src/core/hle
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/hle')
-rw-r--r--src/core/hle/applets/erreula.cpp6
-rw-r--r--src/core/hle/applets/mii_selector.cpp6
-rw-r--r--src/core/hle/applets/swkbd.cpp6
-rw-r--r--src/core/hle/kernel/event.cpp5
-rw-r--r--src/core/hle/kernel/memory.cpp2
-rw-r--r--src/core/hle/kernel/thread.cpp2
-rw-r--r--src/core/hle/kernel/timer.cpp5
-rw-r--r--src/core/hle/service/ac_u.cpp207
-rw-r--r--src/core/hle/service/ac_u.h1
-rw-r--r--src/core/hle/service/apt/apt.cpp2
-rw-r--r--src/core/hle/service/apt/apt.h23
-rw-r--r--src/core/hle/service/boss/boss.cpp967
-rw-r--r--src/core/hle/service/boss/boss.h785
-rw-r--r--src/core/hle/service/boss/boss_u.cpp60
-rw-r--r--src/core/hle/service/frd/frd.cpp2
-rw-r--r--src/core/hle/service/ldr_ro/cro_helper.cpp2
-rw-r--r--src/core/hle/service/nwm_uds.cpp11
-rw-r--r--src/core/hle/service/soc_u.cpp8
18 files changed, 2062 insertions, 38 deletions
diff --git a/src/core/hle/applets/erreula.cpp b/src/core/hle/applets/erreula.cpp
index 14964427b..e1379ac4d 100644
--- a/src/core/hle/applets/erreula.cpp
+++ b/src/core/hle/applets/erreula.cpp
@@ -10,7 +10,7 @@ namespace HLE {
namespace Applets {
ResultCode ErrEula::ReceiveParameter(const Service::APT::MessageParameter& parameter) {
- if (parameter.signal != static_cast<u32>(Service::APT::SignalType::LibAppJustStarted)) {
+ if (parameter.signal != static_cast<u32>(Service::APT::SignalType::Request)) {
LOG_ERROR(Service_APT, "unsupported signal %u", parameter.signal);
UNIMPLEMENTED();
// TODO(Subv): Find the right error code
@@ -36,7 +36,7 @@ ResultCode ErrEula::ReceiveParameter(const Service::APT::MessageParameter& param
// Send the response message with the newly created SharedMemory
Service::APT::MessageParameter result;
- result.signal = static_cast<u32>(Service::APT::SignalType::LibAppFinished);
+ result.signal = static_cast<u32>(Service::APT::SignalType::Response);
result.buffer.clear();
result.destination_id = static_cast<u32>(Service::APT::AppletId::Application);
result.sender_id = static_cast<u32>(id);
@@ -57,7 +57,7 @@ ResultCode ErrEula::StartImpl(const Service::APT::AppletStartupParameter& parame
Service::APT::MessageParameter message;
message.buffer.resize(parameter.buffer.size());
std::fill(message.buffer.begin(), message.buffer.end(), 0);
- message.signal = static_cast<u32>(Service::APT::SignalType::LibAppClosed);
+ message.signal = static_cast<u32>(Service::APT::SignalType::WakeupByExit);
message.destination_id = static_cast<u32>(Service::APT::AppletId::Application);
message.sender_id = static_cast<u32>(id);
Service::APT::SendParameter(message);
diff --git a/src/core/hle/applets/mii_selector.cpp b/src/core/hle/applets/mii_selector.cpp
index 53a8683a4..3455b9201 100644
--- a/src/core/hle/applets/mii_selector.cpp
+++ b/src/core/hle/applets/mii_selector.cpp
@@ -19,7 +19,7 @@ namespace HLE {
namespace Applets {
ResultCode MiiSelector::ReceiveParameter(const Service::APT::MessageParameter& parameter) {
- if (parameter.signal != static_cast<u32>(Service::APT::SignalType::LibAppJustStarted)) {
+ if (parameter.signal != static_cast<u32>(Service::APT::SignalType::Request)) {
LOG_ERROR(Service_APT, "unsupported signal %u", parameter.signal);
UNIMPLEMENTED();
// TODO(Subv): Find the right error code
@@ -44,7 +44,7 @@ ResultCode MiiSelector::ReceiveParameter(const Service::APT::MessageParameter& p
// Send the response message with the newly created SharedMemory
Service::APT::MessageParameter result;
- result.signal = static_cast<u32>(Service::APT::SignalType::LibAppFinished);
+ result.signal = static_cast<u32>(Service::APT::SignalType::Response);
result.buffer.clear();
result.destination_id = static_cast<u32>(Service::APT::AppletId::Application);
result.sender_id = static_cast<u32>(id);
@@ -73,7 +73,7 @@ ResultCode MiiSelector::StartImpl(const Service::APT::AppletStartupParameter& pa
Service::APT::MessageParameter message;
message.buffer.resize(sizeof(MiiResult));
std::memcpy(message.buffer.data(), &result, message.buffer.size());
- message.signal = static_cast<u32>(Service::APT::SignalType::LibAppClosed);
+ message.signal = static_cast<u32>(Service::APT::SignalType::WakeupByExit);
message.destination_id = static_cast<u32>(Service::APT::AppletId::Application);
message.sender_id = static_cast<u32>(id);
Service::APT::SendParameter(message);
diff --git a/src/core/hle/applets/swkbd.cpp b/src/core/hle/applets/swkbd.cpp
index 06ddf538b..1e21337f5 100644
--- a/src/core/hle/applets/swkbd.cpp
+++ b/src/core/hle/applets/swkbd.cpp
@@ -22,7 +22,7 @@ namespace HLE {
namespace Applets {
ResultCode SoftwareKeyboard::ReceiveParameter(Service::APT::MessageParameter const& parameter) {
- if (parameter.signal != static_cast<u32>(Service::APT::SignalType::LibAppJustStarted)) {
+ if (parameter.signal != static_cast<u32>(Service::APT::SignalType::Request)) {
LOG_ERROR(Service_APT, "unsupported signal %u", parameter.signal);
UNIMPLEMENTED();
// TODO(Subv): Find the right error code
@@ -47,7 +47,7 @@ ResultCode SoftwareKeyboard::ReceiveParameter(Service::APT::MessageParameter con
// Send the response message with the newly created SharedMemory
Service::APT::MessageParameter result;
- result.signal = static_cast<u32>(Service::APT::SignalType::LibAppFinished);
+ result.signal = static_cast<u32>(Service::APT::SignalType::Response);
result.buffer.clear();
result.destination_id = static_cast<u32>(Service::APT::AppletId::Application);
result.sender_id = static_cast<u32>(id);
@@ -108,7 +108,7 @@ void SoftwareKeyboard::Finalize() {
Service::APT::MessageParameter message;
message.buffer.resize(sizeof(SoftwareKeyboardConfig));
std::memcpy(message.buffer.data(), &config, message.buffer.size());
- message.signal = static_cast<u32>(Service::APT::SignalType::LibAppClosed);
+ message.signal = static_cast<u32>(Service::APT::SignalType::WakeupByExit);
message.destination_id = static_cast<u32>(Service::APT::AppletId::Application);
message.sender_id = static_cast<u32>(id);
Service::APT::SendParameter(message);
diff --git a/src/core/hle/kernel/event.cpp b/src/core/hle/kernel/event.cpp
index 1489c7002..3e116e3df 100644
--- a/src/core/hle/kernel/event.cpp
+++ b/src/core/hle/kernel/event.cpp
@@ -22,6 +22,11 @@ SharedPtr<Event> Event::Create(ResetType reset_type, std::string name) {
evt->reset_type = reset_type;
evt->name = std::move(name);
+ if (reset_type == ResetType::Pulse) {
+ LOG_ERROR(Kernel, "Unimplemented event reset type Pulse");
+ UNIMPLEMENTED();
+ }
+
return evt;
}
diff --git a/src/core/hle/kernel/memory.cpp b/src/core/hle/kernel/memory.cpp
index e65fd5c41..33c165197 100644
--- a/src/core/hle/kernel/memory.cpp
+++ b/src/core/hle/kernel/memory.cpp
@@ -23,7 +23,7 @@ namespace Kernel {
static MemoryRegionInfo memory_regions[3];
-/// Size of the APPLICATION, SYSTEM and BASE memory regions (respectively) for each sytem
+/// Size of the APPLICATION, SYSTEM and BASE memory regions (respectively) for each system
/// memory configuration type.
static const u32 memory_region_sizes[8][3] = {
// Old 3DS layouts
diff --git a/src/core/hle/kernel/thread.cpp b/src/core/hle/kernel/thread.cpp
index c4eeeee56..84d6d24c6 100644
--- a/src/core/hle/kernel/thread.cpp
+++ b/src/core/hle/kernel/thread.cpp
@@ -204,7 +204,7 @@ static std::tuple<u32*, u32*> GetWaitSynchTimeoutParameterRegister(Thread* threa
}
/**
- * Updates the WaitSynchronization timeout paramter according to the difference
+ * Updates the WaitSynchronization timeout parameter according to the difference
* between ticks of the last WaitSynchronization call and the incoming one.
* @param timeout_low a pointer to the register for the low part of the timeout parameter
* @param timeout_high a pointer to the register for the high part of the timeout parameter
diff --git a/src/core/hle/kernel/timer.cpp b/src/core/hle/kernel/timer.cpp
index a9f98223c..eac181f4e 100644
--- a/src/core/hle/kernel/timer.cpp
+++ b/src/core/hle/kernel/timer.cpp
@@ -31,6 +31,11 @@ SharedPtr<Timer> Timer::Create(ResetType reset_type, std::string name) {
timer->interval_delay = 0;
timer->callback_handle = timer_callback_handle_table.Create(timer).MoveFrom();
+ if (reset_type == ResetType::Pulse) {
+ LOG_ERROR(Kernel, "Unimplemented timer reset type Pulse");
+ UNIMPLEMENTED();
+ }
+
return timer;
}
diff --git a/src/core/hle/service/ac_u.cpp b/src/core/hle/service/ac_u.cpp
index 12d94f37a..18026975f 100644
--- a/src/core/hle/service/ac_u.cpp
+++ b/src/core/hle/service/ac_u.cpp
@@ -11,11 +11,85 @@
namespace AC_U {
+struct ACConfig {
+ std::array<u8, 0x200> data;
+};
+
+static ACConfig default_config{};
+
+static bool ac_connected = false;
+
+static Kernel::SharedPtr<Kernel::Event> close_event;
+static Kernel::SharedPtr<Kernel::Event> connect_event;
+static Kernel::SharedPtr<Kernel::Event> disconnect_event;
+
+/**
+ * AC_U::CreateDefaultConfig service function
+ * Inputs:
+ * 64 : ACConfig size << 14 | 2
+ * 65 : pointer to ACConfig struct
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ */
+static void CreateDefaultConfig(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+
+ u32 ac_config_addr = cmd_buff[65];
+
+ ASSERT_MSG(cmd_buff[64] == (sizeof(ACConfig) << 14 | 2),
+ "Output buffer size not equal ACConfig size");
+
+ Memory::WriteBlock(ac_config_addr, &default_config, sizeof(ACConfig));
+ cmd_buff[1] = RESULT_SUCCESS.raw; // No error
+
+ LOG_WARNING(Service_AC, "(STUBBED) called");
+}
+
+/**
+ * AC_U::ConnectAsync service function
+ * Inputs:
+ * 1 : ProcessId Header
+ * 3 : Copy Handle Header
+ * 4 : Connection Event handle
+ * 5 : ACConfig size << 14 | 2
+ * 6 : pointer to ACConfig struct
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ */
+static void ConnectAsync(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+
+ connect_event = Kernel::g_handle_table.Get<Kernel::Event>(cmd_buff[4]);
+ if (connect_event) {
+ connect_event->name = "AC_U:connect_event";
+ connect_event->Signal();
+ ac_connected = true;
+ }
+ cmd_buff[1] = RESULT_SUCCESS.raw; // No error
+
+ LOG_WARNING(Service_AC, "(STUBBED) called");
+}
+
+/**
+ * AC_U::GetConnectResult service function
+ * Inputs:
+ * 1 : ProcessId Header
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ */
+static void GetConnectResult(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+
+ cmd_buff[1] = RESULT_SUCCESS.raw; // No error
+
+ LOG_WARNING(Service_AC, "(STUBBED) called");
+}
+
/**
* AC_U::CloseAsync service function
* Inputs:
- * 1 : Always 0x20
- * 3 : Always 0
+ * 1 : ProcessId Header
+ * 3 : Copy Handle Header
* 4 : Event handle, should be signaled when AC connection is closed
* Outputs:
* 1 : Result of function, 0 on success, otherwise error code
@@ -23,16 +97,37 @@ namespace AC_U {
static void CloseAsync(Service::Interface* self) {
u32* cmd_buff = Kernel::GetCommandBuffer();
- auto evt = Kernel::g_handle_table.Get<Kernel::Event>(cmd_buff[4]);
+ if (ac_connected && disconnect_event) {
+ disconnect_event->Signal();
+ }
- if (evt) {
- evt->name = "AC_U:close_event";
- evt->Signal();
+ close_event = Kernel::g_handle_table.Get<Kernel::Event>(cmd_buff[4]);
+ if (close_event) {
+ close_event->name = "AC_U:close_event";
+ close_event->Signal();
}
+
+ ac_connected = false;
+
+ cmd_buff[1] = RESULT_SUCCESS.raw; // No error
+ LOG_WARNING(Service_AC, "(STUBBED) called");
+}
+
+/**
+ * AC_U::GetCloseResult service function
+ * Inputs:
+ * 1 : ProcessId Header
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ */
+static void GetCloseResult(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+
cmd_buff[1] = RESULT_SUCCESS.raw; // No error
LOG_WARNING(Service_AC, "(STUBBED) called");
}
+
/**
* AC_U::GetWifiStatus service function
* Outputs:
@@ -52,6 +147,75 @@ static void GetWifiStatus(Service::Interface* self) {
}
/**
+ * AC_U::GetInfraPriority service function
+ * Inputs:
+ * 1 : ACConfig size << 14 | 2
+ * 2 : pointer to ACConfig struct
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ * 2 : Infra Priority
+ */
+static void GetInfraPriority(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+
+ cmd_buff[1] = RESULT_SUCCESS.raw; // No error
+ cmd_buff[2] = 0; // Infra Priority, default 0
+
+ LOG_WARNING(Service_AC, "(STUBBED) called");
+}
+
+/**
+ * AC_U::SetRequestEulaVersion service function
+ * Inputs:
+ * 1 : Eula Version major
+ * 2 : Eula Version minor
+ * 3 : ACConfig size << 14 | 2
+ * 4 : Input pointer to ACConfig struct
+ * 64 : ACConfig size << 14 | 2
+ * 65 : Output pointer to ACConfig struct
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ * 2 : Infra Priority
+ */
+static void SetRequestEulaVersion(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+
+ u32 major = cmd_buff[1] & 0xFF;
+ u32 minor = cmd_buff[2] & 0xFF;
+
+ ASSERT_MSG(cmd_buff[3] == (sizeof(ACConfig) << 14 | 2),
+ "Input buffer size not equal ACConfig size");
+ ASSERT_MSG(cmd_buff[64] == (sizeof(ACConfig) << 14 | 2),
+ "Output buffer size not equal ACConfig size");
+
+ cmd_buff[1] = RESULT_SUCCESS.raw; // No error
+ cmd_buff[2] = 0; // Infra Priority
+
+ LOG_WARNING(Service_AC, "(STUBBED) called, major=%u, minor=%u", major, minor);
+}
+
+/**
+ * AC_U::RegisterDisconnectEvent service function
+ * Inputs:
+ * 1 : ProcessId Header
+ * 3 : Copy Handle Header
+ * 4 : Event handle, should be signaled when AC connection is closed
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ */
+static void RegisterDisconnectEvent(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+
+ disconnect_event = Kernel::g_handle_table.Get<Kernel::Event>(cmd_buff[4]);
+ if (disconnect_event) {
+ disconnect_event->name = "AC_U:disconnect_event";
+ }
+ cmd_buff[1] = RESULT_SUCCESS.raw; // No error
+
+ LOG_WARNING(Service_AC, "(STUBBED) called");
+}
+
+/**
* AC_U::IsConnected service function
* Outputs:
* 1 : Result of function, 0 on success, otherwise error code
@@ -61,26 +225,29 @@ static void IsConnected(Service::Interface* self) {
u32* cmd_buff = Kernel::GetCommandBuffer();
cmd_buff[1] = RESULT_SUCCESS.raw; // No error
- cmd_buff[2] = false; // Not connected to ac:u service
+ cmd_buff[2] = ac_connected;
LOG_WARNING(Service_AC, "(STUBBED) called");
}
const Interface::FunctionInfo FunctionTable[] = {
- {0x00010000, nullptr, "CreateDefaultConfig"},
- {0x00040006, nullptr, "ConnectAsync"},
- {0x00050002, nullptr, "GetConnectResult"},
+ {0x00010000, CreateDefaultConfig, "CreateDefaultConfig"},
+ {0x00040006, ConnectAsync, "ConnectAsync"},
+ {0x00050002, GetConnectResult, "GetConnectResult"},
+ {0x00070002, nullptr, "CancelConnectAsync"},
{0x00080004, CloseAsync, "CloseAsync"},
- {0x00090002, nullptr, "GetCloseResult"},
+ {0x00090002, GetCloseResult, "GetCloseResult"},
{0x000A0000, nullptr, "GetLastErrorCode"},
+ {0x000C0000, nullptr, "GetStatus"},
{0x000D0000, GetWifiStatus, "GetWifiStatus"},
{0x000E0042, nullptr, "GetCurrentAPInfo"},
{0x00100042, nullptr, "GetCurrentNZoneInfo"},
{0x00110042, nullptr, "GetNZoneApNumService"},
+ {0x001D0042, nullptr, "ScanAPs"},
{0x00240042, nullptr, "AddDenyApType"},
- {0x00270002, nullptr, "GetInfraPriority"},
- {0x002D0082, nullptr, "SetRequestEulaVersion"},
- {0x00300004, nullptr, "RegisterDisconnectEvent"},
+ {0x00270002, GetInfraPriority, "GetInfraPriority"},
+ {0x002D0082, SetRequestEulaVersion, "SetRequestEulaVersion"},
+ {0x00300004, RegisterDisconnectEvent, "RegisterDisconnectEvent"},
{0x003C0042, nullptr, "GetAPSSIDList"},
{0x003E0042, IsConnected, "IsConnected"},
{0x00400042, nullptr, "SetClientVersion"},
@@ -91,6 +258,18 @@ const Interface::FunctionInfo FunctionTable[] = {
Interface::Interface() {
Register(FunctionTable);
+
+ ac_connected = false;
+
+ close_event = nullptr;
+ connect_event = nullptr;
+ disconnect_event = nullptr;
+}
+
+Interface::~Interface() {
+ close_event = nullptr;
+ connect_event = nullptr;
+ disconnect_event = nullptr;
}
} // namespace
diff --git a/src/core/hle/service/ac_u.h b/src/core/hle/service/ac_u.h
index f1d26ebe8..6592b21c9 100644
--- a/src/core/hle/service/ac_u.h
+++ b/src/core/hle/service/ac_u.h
@@ -16,6 +16,7 @@ namespace AC_U {
class Interface : public Service::Interface {
public:
Interface();
+ ~Interface();
std::string GetPortName() const override {
return "ac:u";
diff --git a/src/core/hle/service/apt/apt.cpp b/src/core/hle/service/apt/apt.cpp
index c4bd65986..c7198293e 100644
--- a/src/core/hle/service/apt/apt.cpp
+++ b/src/core/hle/service/apt/apt.cpp
@@ -523,7 +523,7 @@ void Init() {
notification_event = Kernel::Event::Create(Kernel::ResetType::OneShot, "APT_U:Notification");
parameter_event = Kernel::Event::Create(Kernel::ResetType::OneShot, "APT_U:Start");
- next_parameter.signal = static_cast<u32>(SignalType::AppJustStarted);
+ next_parameter.signal = static_cast<u32>(SignalType::Wakeup);
next_parameter.destination_id = 0x300;
}
diff --git a/src/core/hle/service/apt/apt.h b/src/core/hle/service/apt/apt.h
index a118cda1f..cbcba96a5 100644
--- a/src/core/hle/service/apt/apt.h
+++ b/src/core/hle/service/apt/apt.h
@@ -46,12 +46,23 @@ static_assert(sizeof(CaptureBufferInfo) == 0x20, "CaptureBufferInfo struct has i
/// Signals used by APT functions
enum class SignalType : u32 {
None = 0x0,
- AppJustStarted = 0x1,
- LibAppJustStarted = 0x2,
- LibAppFinished = 0x3,
- LibAppClosed = 0xA,
- ReturningToApp = 0xB,
- ExitingApp = 0xC,
+ Wakeup = 0x1,
+ Request = 0x2,
+ Response = 0x3,
+ Exit = 0x4,
+ Message = 0x5,
+ HomeButtonSingle = 0x6,
+ HomeButtonDouble = 0x7,
+ DspSleep = 0x8,
+ DspWakeup = 0x9,
+ WakeupByExit = 0xA,
+ WakeupByPause = 0xB,
+ WakeupByCancel = 0xC,
+ WakeupByCancelAll = 0xD,
+ WakeupByPowerButtonClick = 0xE,
+ WakeupToJumpHome = 0xF,
+ RequestForSysApplet = 0x10,
+ WakeupToLaunchApplication = 0x11,
};
/// App Id's used by APT functions
diff --git a/src/core/hle/service/boss/boss.cpp b/src/core/hle/service/boss/boss.cpp
index 757a8c2c7..6ab16ccd5 100644
--- a/src/core/hle/service/boss/boss.cpp
+++ b/src/core/hle/service/boss/boss.cpp
@@ -10,11 +10,978 @@
namespace Service {
namespace BOSS {
+static u32 new_arrival_flag;
+static u32 ns_data_new_flag;
+static u32 output_flag;
+
+void InitializeSession(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+ // TODO(JamePeng): Figure out the meaning of these parameters
+ u64 unk_param = ((u64)cmd_buff[1] | ((u64)cmd_buff[2] << 32));
+ u32 translation = cmd_buff[3];
+ u32 unk_param4 = cmd_buff[4];
+
+ if (translation != IPC::CallingPidDesc()) {
+ cmd_buff[0] = IPC::MakeHeader(0, 0x1, 0); // 0x40
+ cmd_buff[1] = ResultCode(ErrorDescription::OS_InvalidBufferDescriptor, ErrorModule::OS,
+ ErrorSummary::WrongArgument, ErrorLevel::Permanent)
+ .raw;
+ LOG_ERROR(Service_BOSS, "The translation was invalid, translation=0x%08X", translation);
+ return;
+ }
+
+ cmd_buff[0] = IPC::MakeHeader(0x1, 0x1, 0);
+ cmd_buff[1] = RESULT_SUCCESS.raw;
+
+ LOG_WARNING(Service_BOSS, "(STUBBED) unk_param=0x%016X, translation=0x%08X, unk_param4=0x%08X",
+ unk_param, translation, unk_param4);
+}
+
+void RegisterStorage(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+ // TODO(JamePeng): Figure out the meaning of these parameters
+ u32 unk_param1 = cmd_buff[1];
+ u32 unk_param2 = cmd_buff[2];
+ u32 unk_param3 = cmd_buff[3];
+ u32 unk_flag = cmd_buff[4] & 0xFF;
+
+ cmd_buff[0] = IPC::MakeHeader(0x2, 0x1, 0);
+ cmd_buff[1] = RESULT_SUCCESS.raw;
+
+ LOG_WARNING(
+ Service_BOSS,
+ "(STUBBED) unk_param1=0x%08X, unk_param2=0x%08X, unk_param3=0x%08X, unk_flag=0x%08X",
+ unk_param1, unk_param2, unk_param3, unk_flag);
+}
+
+void UnregisterStorage(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+
+ cmd_buff[0] = IPC::MakeHeader(0x3, 0x1, 0);
+ cmd_buff[1] = RESULT_SUCCESS.raw;
+
+ LOG_WARNING(Service_BOSS, "(STUBBED) called");
+}
+
+void GetStorageInfo(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+
+ cmd_buff[0] = IPC::MakeHeader(0x4, 0x2, 0);
+ cmd_buff[1] = RESULT_SUCCESS.raw;
+ cmd_buff[2] = 0; // stub 0
+
+ LOG_WARNING(Service_BOSS, "(STUBBED) called");
+}
+
+void RegisterPrivateRootCa(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+
+ u32 translation = cmd_buff[2];
+ u32 buff_addr = cmd_buff[3];
+ u32 buff_size = (translation >> 4);
+
+ cmd_buff[0] = IPC::MakeHeader(0x5, 0x1, 0x2);
+ cmd_buff[1] = RESULT_SUCCESS.raw;
+ cmd_buff[2] = (buff_size << 4 | 0xA);
+ cmd_buff[3] = buff_addr;
+
+ LOG_WARNING(Service_BOSS, "(STUBBED) translation=0x%08X, buff_addr=0x%08X, buff_size=0x%08X",
+ translation, buff_addr, buff_size);
+}
+
+void RegisterPrivateClientCert(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+ // TODO(JamePeng): Figure out the meaning of these parameters
+ u32 unk_param1 = cmd_buff[1];
+ u32 unk_param2 = cmd_buff[2];
+ u32 translation1 = cmd_buff[3];
+ u32 buff1_addr = cmd_buff[4];
+ u32 buff1_size = (translation1 >> 4);
+ u32 translation2 = cmd_buff[5];
+ u32 buff2_addr = cmd_buff[6];
+ u32 buff2_size = (translation2 >> 4);
+
+ cmd_buff[0] = IPC::MakeHeader(0x6, 0x1, 0x4);
+ cmd_buff[1] = RESULT_SUCCESS.raw;
+ cmd_buff[2] = (buff1_size << 4 | 0xA);
+ cmd_buff[3] = buff1_addr;
+ cmd_buff[2] = (buff2_size << 4 | 0xA);
+ cmd_buff[3] = buff2_addr;
+
+ LOG_WARNING(Service_BOSS, "(STUBBED) unk_param1=0x%08X, unk_param2=0x%08X, "
+ "translation1=0x%08X, buff1_addr=0x%08X, buff1_size=0x%08X, "
+ "translation2=0x%08X, buff2_addr=0x%08X, buff2_size=0x%08X",
+ unk_param1, unk_param2, translation1, buff1_addr, buff1_size, translation2,
+ buff2_addr, buff2_size);
+}
+
+void GetNewArrivalFlag(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+
+ cmd_buff[0] = IPC::MakeHeader(0x7, 0x2, 0);
+ cmd_buff[1] = RESULT_SUCCESS.raw;
+ cmd_buff[2] = new_arrival_flag;
+
+ LOG_WARNING(Service_BOSS, "(STUBBED) new_arrival_flag=%u", new_arrival_flag);
+}
+
+void RegisterNewArrivalEvent(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+ // TODO(JamePeng): Figure out the meaning of these parameters
+ u32 unk_param1 = cmd_buff[1];
+ u32 unk_param2 = cmd_buff[2];
+
+ cmd_buff[0] = IPC::MakeHeader(0x8, 0x1, 0);
+ cmd_buff[1] = RESULT_SUCCESS.raw;
+
+ LOG_WARNING(Service_BOSS, "(STUBBED) unk_param1=0x%08X, unk_param2=0x%08X", unk_param1,
+ unk_param2);
+}
+
+void SetOptoutFlag(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+
+ output_flag = cmd_buff[1] & 0xFF;
+
+ cmd_buff[0] = IPC::MakeHeader(0x9, 0x1, 0);
+ cmd_buff[1] = RESULT_SUCCESS.raw;
+
+ LOG_WARNING(Service_BOSS, "output_flag=%u", output_flag);
+}
+
+void GetOptoutFlag(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+
+ cmd_buff[0] = IPC::MakeHeader(0xA, 0x2, 0);
+ cmd_buff[1] = RESULT_SUCCESS.raw;
+ cmd_buff[2] = output_flag;
+
+ LOG_WARNING(Service_BOSS, "output_flag=%u", output_flag);
+}
+
+void RegisterTask(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+ // TODO(JamePeng): Figure out the meaning of these parameters
+ u32 unk_param1 = cmd_buff[1];
+ u32 unk_param2 = cmd_buff[2] & 0xFF;
+ u32 unk_param3 = cmd_buff[3] & 0xFF;
+ u32 translation = cmd_buff[4];
+ u32 buff_addr = cmd_buff[5];
+ u32 buff_size = (translation >> 4);
+
+ cmd_buff[0] = IPC::MakeHeader(0xB, 0x1, 0x2);
+ cmd_buff[1] = RESULT_SUCCESS.raw;
+ cmd_buff[2] = (buff_size << 4 | 0xA);
+ cmd_buff[3] = buff_addr;
+
+ LOG_WARNING(Service_BOSS, "(STUBBED) unk_param1=0x%08X, unk_param2=0x%08X, unk_param3=0x%08X, "
+ "translation=0x%08X, buff_addr=0x%08X, buff_size=0x%08X",
+ unk_param1, unk_param2, unk_param3, translation, buff_addr, buff_size);
+}
+
+void UnregisterTask(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+ // TODO(JamePeng): Figure out the meaning of these parameters
+ u32 unk_param1 = cmd_buff[1];
+ u32 unk_param2 = cmd_buff[2] & 0xFF;
+ u32 translation = cmd_buff[3];
+ u32 buff_addr = cmd_buff[4];
+ u32 buff_size = (translation >> 4);
+
+ cmd_buff[0] = IPC::MakeHeader(0xC, 0x1, 0x2);
+ cmd_buff[1] = RESULT_SUCCESS.raw;
+ cmd_buff[2] = (buff_size << 4 | 0xA);
+ cmd_buff[3] = buff_addr;
+
+ LOG_WARNING(Service_BOSS, "(STUBBED) unk_param1=0x%08X, unk_param2=0x%08X, translation=0x%08X, "
+ "buff_addr=0x%08X, buff_size=0x%08X",
+ unk_param1, unk_param2, translation, buff_addr, buff_size);
+}
+
+void ReconfigureTask(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+ // TODO(JamePeng): Figure out the meaning of these parameters
+ u32 unk_param1 = cmd_buff[1];
+ u32 unk_param2 = cmd_buff[2] & 0xFF;
+ u32 translation = cmd_buff[3];
+ u32 buff_addr = cmd_buff[4];
+ u32 buff_size = (translation >> 4);
+
+ cmd_buff[0] = IPC::MakeHeader(0xD, 0x1, 0x2);
+ cmd_buff[1] = RESULT_SUCCESS.raw;
+ cmd_buff[2] = (buff_size << 4 | 0xA);
+ cmd_buff[3] = buff_addr;
+
+ LOG_WARNING(Service_BOSS, "(STUBBED) unk_param1=0x%08X, unk_param2=0x%08X, translation=0x%08X, "
+ "buff_addr=0x%08X, buff_size=0x%08X",
+ unk_param1, unk_param2, translation, buff_addr, buff_size);
+}
+
+void GetTaskIdList(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+
+ cmd_buff[0] = IPC::MakeHeader(0xE, 0x1, 0);
+ cmd_buff[1] = RESULT_SUCCESS.raw;
+
+ LOG_WARNING(Service_BOSS, "(STUBBED) called");
+}
+
+void GetStepIdList(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+
+ u32 translation = cmd_buff[2];
+ u32 buff_addr = cmd_buff[3];
+ u32 buff_size = (translation >> 4);
+
+ cmd_buff[0] = IPC::MakeHeader(0xF, 0x1, 0x2);
+ cmd_buff[1] = RESULT_SUCCESS.raw;
+ cmd_buff[2] = (buff_size << 4 | 0xA);
+ cmd_buff[3] = buff_addr;
+
+ LOG_WARNING(Service_BOSS, "(STUBBED) translation=0x%08X, buff_addr=0x%08X, buff_size=0x%08X",
+ translation, buff_addr, buff_size);
+}
+
+void GetNsDataIdList(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+ // TODO(JamePeng): Figure out the meaning of these parameters
+ u32 unk_param1 = cmd_buff[1];
+ u32 unk_param2 = cmd_buff[2];
+ u32 unk_param3 = cmd_buff[3];
+ u32 unk_param4 = cmd_buff[4];
+ u32 translation = cmd_buff[5];
+ u32 buff_addr = cmd_buff[6];
+ u32 buff_size = (translation >> 4);
+
+ cmd_buff[0] = IPC::MakeHeader(0x10, 0x3, 0x2);
+ cmd_buff[1] = RESULT_SUCCESS.raw;
+ cmd_buff[2] = 0; // stub 0 (16 bit value)
+ cmd_buff[3] = 0; // stub 0 (16 bit value)
+ cmd_buff[4] = (buff_size << 4 | 0xC);
+ cmd_buff[5] = buff_addr;
+
+ LOG_WARNING(Service_BOSS, "(STUBBED) unk_param1=0x%08X, unk_param2=0x%08X, unk_param3=0x%08X, "
+ "unk_param4=0x%08X, translation=0x%08X, "
+ "buff_addr=0x%08X, buff_size=0x%08X",
+ unk_param1, unk_param2, unk_param3, unk_param4, translation, buff_addr, buff_size);
+}
+
+void GetOwnNsDataIdList(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+ // TODO(JamePeng): Figure out the meaning of these parameters
+ u32 unk_param1 = cmd_buff[1];
+ u32 unk_param2 = cmd_buff[2];
+ u32 unk_param3 = cmd_buff[3];
+ u32 unk_param4 = cmd_buff[4];
+ u32 translation = cmd_buff[5];
+ u32 buff_addr = cmd_buff[6];
+ u32 buff_size = (translation >> 4);
+
+ cmd_buff[0] = IPC::MakeHeader(0x11, 0x3, 0x2);
+ cmd_buff[1] = RESULT_SUCCESS.raw;
+ cmd_buff[2] = 0; // stub 0 (16 bit value)
+ cmd_buff[3] = 0; // stub 0 (16 bit value)
+ cmd_buff[4] = (buff_size << 4 | 0xC);
+ cmd_buff[5] = buff_addr;
+
+ LOG_WARNING(Service_BOSS, "(STUBBED) unk_param1=0x%08X, unk_param2=0x%08X, unk_param3=0x%08X, "
+ "unk_param4=0x%08X, translation=0x%08X, "
+ "buff_addr=0x%08X, buff_size=0x%08X",
+ unk_param1, unk_param2, unk_param3, unk_param4, translation, buff_addr, buff_size);
+}
+
+void GetNewDataNsDataIdList(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+ // TODO(JamePeng): Figure out the meaning of these parameters
+ u32 unk_param1 = cmd_buff[1];
+ u32 unk_param2 = cmd_buff[2];
+ u32 unk_param3 = cmd_buff[3];
+ u32 unk_param4 = cmd_buff[4];
+ u32 translation = cmd_buff[5];
+ u32 buff_addr = cmd_buff[6];
+ u32 buff_size = (translation >> 4);
+
+ cmd_buff[0] = IPC::MakeHeader(0x12, 0x3, 0x2);
+ cmd_buff[1] = RESULT_SUCCESS.raw;
+ cmd_buff[2] = 0; // stub 0 (16 bit value)
+ cmd_buff[3] = 0; // stub 0 (16 bit value)
+ cmd_buff[4] = (buff_size << 4 | 0xC);
+ cmd_buff[5] = buff_addr;
+
+ LOG_WARNING(Service_BOSS, "(STUBBED) unk_param1=0x%08X, unk_param2=0x%08X, unk_param3=0x%08X, "
+ "unk_param4=0x%08X, translation=0x%08X, "
+ "buff_addr=0x%08X, buff_size=0x%08X",
+ unk_param1, unk_param2, unk_param3, unk_param4, translation, buff_addr, buff_size);
+}
+
+void GetOwnNewDataNsDataIdList(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+ // TODO(JamePeng): Figure out the meaning of these parameters
+ u32 unk_param1 = cmd_buff[1];
+ u32 unk_param2 = cmd_buff[2];
+ u32 unk_param3 = cmd_buff[3];
+ u32 unk_param4 = cmd_buff[4];
+ u32 translation = cmd_buff[5];
+ u32 buff_addr = cmd_buff[6];
+ u32 buff_size = (translation >> 4);
+
+ cmd_buff[0] = IPC::MakeHeader(0x13, 0x3, 0x2);
+ cmd_buff[1] = RESULT_SUCCESS.raw;
+ cmd_buff[2] = 0; // stub 0 (16 bit value)
+ cmd_buff[3] = 0; // stub 0 (16 bit value)
+ cmd_buff[4] = (buff_size << 4 | 0xC);
+ cmd_buff[5] = buff_addr;
+
+ LOG_WARNING(Service_BOSS, "(STUBBED) unk_param1=0x%08X, unk_param2=0x%08X, unk_param3=0x%08X, "
+ "unk_param4=0x%08X, translation=0x%08X, "
+ "buff_addr=0x%08X, buff_size=0x%08X",
+ unk_param1, unk_param2, unk_param3, unk_param4, translation, buff_addr, buff_size);
+}
+
+void SendProperty(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+ // TODO(JamePeng): Figure out the meaning of these parameters
+ u32 unk_param1 = cmd_buff[1];
+ u32 unk_param2 = cmd_buff[2];
+ u32 translation = cmd_buff[3];
+ u32 buff_addr = cmd_buff[4];
+ u32 buff_size = (translation >> 4);
+
+ cmd_buff[0] = IPC::MakeHeader(0x14, 0x1, 0x2);
+ cmd_buff[1] = RESULT_SUCCESS.raw;
+ cmd_buff[2] = (buff_size << 4 | 0xA);
+ cmd_buff[3] = buff_addr;
+
+ LOG_WARNING(Service_BOSS, "(STUBBED) unk_param1=0x%08X, unk_param2=0x%08X, translation=0x%08X, "
+ "buff_addr=0x%08X, buff_size=0x%08X",
+ unk_param1, unk_param2, translation, buff_addr, buff_size);
+}
+
+void SendPropertyHandle(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+ // TODO(JamePeng): Figure out the meaning of these parameters
+ u32 unk_param1 = cmd_buff[2] & 0xFF;
+ u32 translation = cmd_buff[3];
+ u32 buff_addr = cmd_buff[4];
+ u32 buff_size = (translation >> 4);
+
+ cmd_buff[0] = IPC::MakeHeader(0x15, 0x1, 0x2);
+ cmd_buff[1] = RESULT_SUCCESS.raw;
+ cmd_buff[2] = (buff_size << 4 | 0xA);
+ cmd_buff[3] = buff_addr;
+
+ LOG_WARNING(Service_BOSS, "(STUBBED) unk_param1=0x%08X, translation=0x%08X, "
+ "buff_addr=0x%08X, buff_size=0x%08X",
+ unk_param1, translation, buff_addr, buff_size);
+}
+
+void ReceiveProperty(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+ // TODO(JamePeng): Figure out the meaning of these parameters
+ u32 unk_param1 = cmd_buff[1];
+ u32 buff_size = cmd_buff[2];
+ u32 translation = cmd_buff[3];
+ u32 buff_addr = cmd_buff[4];
+
+ cmd_buff[0] = IPC::MakeHeader(0x16, 0x2, 0x2);
+ cmd_buff[1] = RESULT_SUCCESS.raw;
+ cmd_buff[2] = 0; // stub 0 (32 bit value)
+ cmd_buff[2] = (buff_size << 4 | 0xC);
+ cmd_buff[3] = buff_addr;
+
+ LOG_WARNING(Service_BOSS, "(STUBBED) unk_param1=0x%08X, buff_size=0x%08X, "
+ "translation=0x%08X, buff_addr=0x%08X",
+ unk_param1, buff_size, translation, buff_addr);
+}
+
+void UpdateTaskInterval(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+ // TODO(JamePeng): Figure out the meaning of these parameters
+ u32 unk_param1 = cmd_buff[1];
+ u32 unk_param2 = cmd_buff[2] & 0xFF;
+ u32 translation = cmd_buff[3];
+ u32 buff_addr = cmd_buff[4];
+ u32 buff_size = (translation >> 4);
+
+ cmd_buff[0] = IPC::MakeHeader(0x17, 0x1, 0x2);
+ cmd_buff[1] = RESULT_SUCCESS.raw;
+ cmd_buff[2] = (buff_size << 4 | 0xA);
+ cmd_buff[3] = buff_addr;
+
+ LOG_WARNING(Service_BOSS, "(STUBBED) unk_param1=0x%08X, unk_param2=0x%08X, "
+ "translation=0x%08X, buff_addr=0x%08X, buff_size=0x%08X",
+ unk_param1, unk_param2, translation, buff_addr, buff_size);
+}
+
+void UpdateTaskCount(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+
+ u32 buff_size = cmd_buff[1];
+ u32 unk_param2 = cmd_buff[2]; // TODO(JamePeng): Figure out the meaning of these parameters
+ u32 translation = cmd_buff[3];
+ u32 buff_addr = cmd_buff[4];
+
+ cmd_buff[0] = IPC::MakeHeader(0x18, 0x1, 0x2);
+ cmd_buff[1] = RESULT_SUCCESS.raw;
+ cmd_buff[2] = (buff_size << 4 | 0xA);
+ cmd_buff[3] = buff_addr;
+
+ LOG_WARNING(Service_BOSS, "(STUBBED) buff_size=0x%08X, unk_param2=0x%08X, "
+ "translation=0x%08X, buff_addr=0x%08X",
+ buff_size, unk_param2, translation, buff_addr);
+}
+
+void GetTaskInterval(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+
+ u32 unk_param1 = cmd_buff[1]; // TODO(JamePeng): Figure out the meaning of these parameters
+ u32 translation = cmd_buff[2];
+ u32 buff_addr = cmd_buff[3];
+ u32 buff_size = (translation >> 4);
+
+ cmd_buff[0] = IPC::MakeHeader(0x19, 0x2, 0x2);
+ cmd_buff[1] = RESULT_SUCCESS.raw;
+ cmd_buff[2] = 0; // stub 0 ( 32bit value)
+ cmd_buff[3] = (buff_size << 4 | 0xA);
+ cmd_buff[4] = buff_addr;
+
+ LOG_WARNING(Service_BOSS, "(STUBBED) unk_param1=0x%08X, translation=0x%08X, "
+ "buff_addr=0x%08X, buff_size=0x%08X",
+ unk_param1, translation, buff_addr, buff_size);
+}
+
+void GetTaskCount(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+
+ u32 unk_param1 = cmd_buff[1]; // TODO(JamePeng): Figure out the meaning of these parameters
+ u32 translation = cmd_buff[2];
+ u32 buff_addr = cmd_buff[3];
+ u32 buff_size = (translation >> 4);
+
+ cmd_buff[0] = IPC::MakeHeader(0x1A, 0x2, 0x2);
+ cmd_buff[1] = RESULT_SUCCESS.raw;
+ cmd_buff[2] = 0; // stub 0 ( 32bit value)
+ cmd_buff[3] = (buff_size << 4 | 0xA);
+ cmd_buff[4] = buff_addr;
+
+ LOG_WARNING(Service_BOSS, "(STUBBED) unk_param1=0x%08X, translation=0x%08X, "
+ "buff_addr=0x%08X, buff_size=0x%08X",
+ unk_param1, translation, buff_addr, buff_size);
+}
+
+void GetTaskServiceStatus(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+
+ u32 unk_param1 = cmd_buff[1]; // TODO(JamePeng): Figure out the meaning of these parameters
+ u32 translation = cmd_buff[2];
+ u32 buff_addr = cmd_buff[3];
+ u32 buff_size = (translation >> 4);
+
+ cmd_buff[0] = IPC::MakeHeader(0x1B, 0x2, 0x2);
+ cmd_buff[1] = RESULT_SUCCESS.raw;
+ cmd_buff[2] = 0; // stub 0 ( 8bit value)
+ cmd_buff[3] = (buff_size << 4 | 0xA);
+ cmd_buff[4] = buff_addr;
+
+ LOG_WARNING(Service_BOSS, "(STUBBED) unk_param1=0x%08X, translation=0x%08X, "
+ "buff_addr=0x%08X, buff_size=0x%08X",
+ unk_param1, translation, buff_addr, buff_size);
+}
+
+void StartTask(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+
+ u32 unk_param1 = cmd_buff[1]; // TODO(JamePeng): Figure out the meaning of these parameters
+ u32 translation = cmd_buff[2];
+ u32 buff_addr = cmd_buff[3];
+ u32 buff_size = (translation >> 4);
+
+ cmd_buff[0] = IPC::MakeHeader(0x1C, 0x1, 0x2);
+ cmd_buff[1] = RESULT_SUCCESS.raw;
+ cmd_buff[2] = (buff_size << 4 | 0xA);
+ cmd_buff[3] = buff_addr;
+
+ LOG_WARNING(Service_BOSS, "(STUBBED) unk_param1=0x%08X, translation=0x%08X, "
+ "buff_addr=0x%08X, buff_size=0x%08X",
+ unk_param1, translation, buff_addr, buff_size);
+}
+
+void StartTaskImmediate(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+
+ u32 unk_param1 = cmd_buff[1]; // TODO(JamePeng): Figure out the meaning of these parameters
+ u32 translation = cmd_buff[2];
+ u32 buff_addr = cmd_buff[3];
+ u32 buff_size = (translation >> 4);
+
+ cmd_buff[0] = IPC::MakeHeader(0x1D, 0x1, 0x2);
+ cmd_buff[1] = RESULT_SUCCESS.raw;
+ cmd_buff[2] = (buff_size << 4 | 0xA);
+ cmd_buff[3] = buff_addr;
+
+ LOG_WARNING(Service_BOSS, "(STUBBED) unk_param1=0x%08X, translation=0x%08X, "
+ "buff_addr=0x%08X, buff_size=0x%08X",
+ unk_param1, translation, buff_addr, buff_size);
+}
+
+void CancelTask(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+ // TODO(JamePeng): Figure out the meaning of these parameters
+ u32 unk_param1 = cmd_buff[1];
+ u32 translation = cmd_buff[2];
+ u32 buff_addr = cmd_buff[3];
+ u32 buff_size = (translation >> 4);
+
+ cmd_buff[0] = IPC::MakeHeader(0x1E, 0x1, 0x2);
+ cmd_buff[1] = RESULT_SUCCESS.raw;
+ cmd_buff[2] = (buff_size << 4 | 0xA);
+ cmd_buff[3] = buff_addr;
+
+ LOG_WARNING(Service_BOSS, "(STUBBED) unk_param1=0x%08X, translation=0x%08X, "
+ "buff_addr=0x%08X, buff_size=0x%08X",
+ unk_param1, translation, buff_addr, buff_size);
+}
+
+void GetTaskFinishHandle(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+
+ cmd_buff[0] = IPC::MakeHeader(0x1F, 0x1, 0x2);
+ cmd_buff[1] = RESULT_SUCCESS.raw;
+ cmd_buff[2] = 0;
+ cmd_buff[3] = 0; // stub 0(This should be a handle of task_finish ?)
+
+ LOG_WARNING(Service_BOSS, "(STUBBED) called");
+}
+
+void GetTaskState(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+ // TODO(JamePeng): Figure out the meaning of these parameters
+ u32 buff_size = cmd_buff[1];
+ u32 unk_param2 = cmd_buff[2] & 0xFF;
+ u32 translation = cmd_buff[3];
+ u32 buff_addr = cmd_buff[4];
+
+ cmd_buff[0] = IPC::MakeHeader(0x20, 0x4, 0x2);
+ cmd_buff[1] = RESULT_SUCCESS.raw;
+ cmd_buff[2] = 0; // stub 0 (8 bit value)
+ cmd_buff[3] = 0; // stub 0 (32 bit value)
+ cmd_buff[4] = 0; // stub 0 (8 bit value)
+ cmd_buff[5] = (buff_size << 4 | 0xA);
+ cmd_buff[6] = buff_addr;
+
+ LOG_WARNING(Service_BOSS, "(STUBBED) buff_size=0x%08X, unk_param2=0x%08X, "
+ "translation=0x%08X, buff_addr=0x%08X",
+ buff_size, unk_param2, translation, buff_addr);
+}
+
+void GetTaskResult(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+ // TODO(JamePeng): Figure out the meaning of these parameters
+ u32 unk_param1 = cmd_buff[1];
+ u32 translation = cmd_buff[2];
+ u32 buff_addr = cmd_buff[3];
+ u32 buff_size = (translation >> 4);
+
+ cmd_buff[0] = IPC::MakeHeader(0x21, 0x4, 0x2);
+ cmd_buff[1] = RESULT_SUCCESS.raw;
+ cmd_buff[2] = 0; // stub 0 (8 bit value)
+ cmd_buff[3] = 0; // stub 0 (32 bit value)
+ cmd_buff[4] = 0; // stub 0 (8 bit value)
+ cmd_buff[5] = (buff_size << 4 | 0xA);
+ cmd_buff[6] = buff_addr;
+
+ LOG_WARNING(Service_BOSS, "(STUBBED) unk_param1=0x%08X, translation=0x%08X, "
+ "buff_addr=0x%08X, buff_size=0x%08X",
+ unk_param1, translation, buff_addr, buff_size);
+}
+
+void GetTaskCommErrorCode(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+ // TODO(JamePeng): Figure out the meaning of these parameters
+ u32 unk_param1 = cmd_buff[1];
+ u32 translation = cmd_buff[2];
+ u32 buff_addr = cmd_buff[3];
+ u32 buff_size = (translation >> 4);
+
+ cmd_buff[0] = IPC::MakeHeader(0x22, 0x4, 0x2);
+ cmd_buff[1] = RESULT_SUCCESS.raw;
+ cmd_buff[2] = 0; // stub 0 (32 bit value)
+ cmd_buff[3] = 0; // stub 0 (32 bit value)
+ cmd_buff[4] = 0; // stub 0 (8 bit value)
+ cmd_buff[5] = (buff_size << 4 | 0xA);
+ cmd_buff[6] = buff_addr;
+
+ LOG_WARNING(Service_BOSS, "(STUBBED) unk_param1=0x%08X, translation=0x%08X, "
+ "buff_addr=0x%08X, buff_size=0x%08X",
+ unk_param1, translation, buff_addr, buff_size);
+}
+
+void GetTaskStatus(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+ // TODO(JamePeng): Figure out the meaning of these parameters
+ u32 unk_param1 = cmd_buff[1];
+ u32 unk_param2 = cmd_buff[2] & 0xFF;
+ u32 unk_param3 = cmd_buff[3] & 0xFF;
+ u32 translation = cmd_buff[4];
+ u32 buff_addr = cmd_buff[5];
+ u32 buff_size = (translation >> 4);
+
+ cmd_buff[0] = IPC::MakeHeader(0x23, 0x2, 0x2);
+ cmd_buff[1] = RESULT_SUCCESS.raw;
+ cmd_buff[2] = 0; // stub 0 (8 bit value)
+ cmd_buff[3] = (buff_size << 4 | 0xA);
+ cmd_buff[4] = buff_addr;
+
+ LOG_WARNING(Service_BOSS, "(STUBBED) unk_param1=0x%08X, unk_param2=0x%08X, unk_param3=0x%08X, "
+ "translation=0x%08X, buff_addr=0x%08X, buff_size=0x%08X",
+ unk_param1, unk_param2, unk_param3, translation, buff_addr, buff_size);
+}
+
+void GetTaskError(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+ // TODO(JamePeng): Figure out the meaning of these parameters
+ u32 unk_param1 = cmd_buff[1];
+ u32 unk_param2 = cmd_buff[2] & 0xFF;
+ u32 translation = cmd_buff[4];
+ u32 buff_addr = cmd_buff[5];
+ u32 buff_size = (translation >> 4);
+
+ cmd_buff[0] = IPC::MakeHeader(0x24, 0x2, 0x2);
+ cmd_buff[1] = RESULT_SUCCESS.raw;
+ cmd_buff[2] = 0; // stub 0 (8 bit value)
+ cmd_buff[3] = (buff_size << 4 | 0xA);
+ cmd_buff[4] = buff_addr;
+
+ LOG_WARNING(Service_BOSS, "(STUBBED) unk_param1=0x%08X, unk_param2=0x%08X, translation=0x%08X, "
+ "buff_addr=0x%08X, buff_size=0x%08X",
+ unk_param1, unk_param2, translation, buff_addr, buff_size);
+}
+
+void GetTaskInfo(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+ // TODO(JamePeng): Figure out the meaning of these parameters
+ u32 unk_param1 = cmd_buff[1];
+ u32 unk_param2 = cmd_buff[2] & 0xFF;
+ u32 translation = cmd_buff[4];
+ u32 buff_addr = cmd_buff[5];
+ u32 buff_size = (translation >> 4);
+
+ cmd_buff[0] = IPC::MakeHeader(0x25, 0x1, 0x2);
+ cmd_buff[1] = RESULT_SUCCESS.raw;
+ cmd_buff[2] = (buff_size << 4 | 0xA);
+ cmd_buff[3] = buff_addr;
+
+ LOG_WARNING(Service_BOSS, "(STUBBED) unk_param1=0x%08X, unk_param2=0x%08X, translation=0x%08X, "
+ "buff_addr=0x%08X, buff_size=0x%08X",
+ unk_param1, unk_param2, translation, buff_addr, buff_size);
+}
+
+void DeleteNsData(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+ // TODO(JamePeng): Figure out the meaning of these parameters
+ u32 unk_param1 = cmd_buff[1];
+
+ cmd_buff[0] = IPC::MakeHeader(0x26, 0x1, 0);
+ cmd_buff[1] = RESULT_SUCCESS.raw;
+
+ LOG_WARNING(Service_BOSS, "(STUBBED) unk_param1=0x%08X", unk_param1);
+}
+
+void GetNsDataHeaderInfo(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+ // TODO(JamePeng): Figure out the meaning of these parameters
+ u32 unk_param1 = cmd_buff[1];
+ u32 unk_param2 = cmd_buff[2] & 0xFF;
+ u32 unk_param3 = cmd_buff[3];
+ u32 translation = cmd_buff[4];
+ u32 buff_addr = cmd_buff[5];
+ u32 buff_size = (translation >> 4);
+
+ cmd_buff[0] = IPC::MakeHeader(0x27, 0x1, 0x2);
+ cmd_buff[1] = RESULT_SUCCESS.raw;
+ cmd_buff[2] = (buff_size << 4 | 0xC);
+ cmd_buff[3] = buff_addr;
+
+ LOG_WARNING(Service_BOSS, "(STUBBED) unk_param1=0x%08X, unk_param2=0x%08X, unk_param3=0x%08X, "
+ "translation=0x%08X, buff_addr=0x%08X, buff_size=0x%08X",
+ unk_param1, unk_param2, unk_param3, translation, buff_addr, buff_size);
+}
+
+void ReadNsData(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+ // TODO(JamePeng): Figure out the meaning of these parameters
+ u32 unk_param1 = cmd_buff[1];
+ u32 unk_param2 = cmd_buff[2];
+ u32 unk_param3 = cmd_buff[3];
+ u32 unk_param4 = cmd_buff[4];
+ u32 translation = cmd_buff[5];
+ u32 buff_addr = cmd_buff[6];
+ u32 buff_size = (translation >> 4);
+
+ cmd_buff[0] = IPC::MakeHeader(0x28, 0x3, 0x2);
+ cmd_buff[1] = RESULT_SUCCESS.raw;
+ cmd_buff[2] = 0; // stub 0 (32bit value)
+ cmd_buff[3] = 0; // stub 0 (32bit value)
+ cmd_buff[4] = (buff_size << 4 | 0xC);
+ cmd_buff[5] = buff_addr;
+
+ LOG_WARNING(Service_BOSS, "(STUBBED) unk_param1=0x%08X, unk_param2=0x%08X, unk_param3=0x%08X, "
+ "unk_param4=0x%08X, translation=0x%08X, "
+ "buff_addr=0x%08X, buff_size=0x%08X",
+ unk_param1, unk_param2, unk_param3, unk_param4, translation, buff_addr, buff_size);
+}
+
+void SetNsDataAdditionalInfo(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+ // TODO(JamePeng): Figure out the meaning of these parameters
+ u32 unk_param1 = cmd_buff[1];
+ u32 unk_param2 = cmd_buff[2];
+
+ cmd_buff[0] = IPC::MakeHeader(0x29, 0x1, 0);
+ cmd_buff[1] = RESULT_SUCCESS.raw;
+
+ LOG_WARNING(Service_BOSS, "(STUBBED) unk_param1=0x%08X, unk_param2=0x%08X", unk_param1,
+ unk_param2);
+}
+
+void GetNsDataAdditionalInfo(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+ // TODO(JamePeng): Figure out the meaning of these parameters
+ u32 unk_param1 = cmd_buff[1];
+
+ cmd_buff[0] = IPC::MakeHeader(0x2A, 0x2, 0);
+ cmd_buff[1] = RESULT_SUCCESS.raw;
+ cmd_buff[2] = 0; // stub 0 (32bit value)
+
+ LOG_WARNING(Service_BOSS, "(STUBBED) unk_param1=0x%08X", unk_param1);
+}
+
+void SetNsDataNewFlag(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+ // TODO(JamePeng): Figure out the meaning of these parameters
+ u32 unk_param1 = cmd_buff[1];
+ ns_data_new_flag = cmd_buff[2] & 0xFF;
+
+ cmd_buff[0] = IPC::MakeHeader(0x2B, 0x1, 0);
+ cmd_buff[1] = RESULT_SUCCESS.raw;
+
+ LOG_WARNING(Service_BOSS, "(STUBBED) unk_param1=0x%08X, ns_data_new_flag=0x%08X", unk_param1,
+ ns_data_new_flag);
+}
+
+void GetNsDataNewFlag(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+ // TODO(JamePeng): Figure out the meaning of these parameters
+ u32 unk_param1 = cmd_buff[1];
+
+ cmd_buff[0] = IPC::MakeHeader(0x2C, 0x2, 0);
+ cmd_buff[1] = RESULT_SUCCESS.raw;
+ cmd_buff[2] = ns_data_new_flag;
+
+ LOG_WARNING(Service_BOSS, "(STUBBED) unk_param1=0x%08X, ns_data_new_flag=0x%08X", unk_param1,
+ ns_data_new_flag);
+}
+
+void GetNsDataLastUpdate(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+ // TODO(JamePeng): Figure out the meaning of these parameters
+ u32 unk_param1 = cmd_buff[1];
+
+ cmd_buff[0] = IPC::MakeHeader(0x2D, 0x3, 0);
+ cmd_buff[1] = RESULT_SUCCESS.raw;
+ cmd_buff[2] = 0; // stub 0 (32bit value)
+ cmd_buff[3] = 0; // stub 0 (32bit value)
+
+ LOG_WARNING(Service_BOSS, "(STUBBED) unk_param1=0x%08X", unk_param1);
+}
+
+void GetErrorCode(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+ // TODO(JamePeng): Figure out the meaning of these parameters
+ u32 unk_param1 = cmd_buff[1];
+
+ cmd_buff[0] = IPC::MakeHeader(0x2E, 0x2, 0);
+ cmd_buff[1] = RESULT_SUCCESS.raw;
+ cmd_buff[2] = 0; // stub 0 (32bit value)
+
+ LOG_WARNING(Service_BOSS, "(STUBBED) unk_param1=0x%08X", unk_param1);
+}
+
+void RegisterStorageEntry(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+ // TODO(JamePeng): Figure out the meaning of these parameters
+ u32 unk_param1 = cmd_buff[1];
+ u32 unk_param2 = cmd_buff[2];
+ u32 unk_param3 = cmd_buff[3];
+ u32 unk_param4 = cmd_buff[4];
+ u32 unk_param5 = cmd_buff[5] & 0xFF;
+
+ cmd_buff[0] = IPC::MakeHeader(0x2F, 0x1, 0);
+ cmd_buff[1] = RESULT_SUCCESS.raw;
+
+ LOG_WARNING(Service_BOSS, "(STUBBED) unk_param1=0x%08X, unk_param2=0x%08X, unk_param3=0x%08X, "
+ "unk_param4=0x%08X, unk_param5=0x%08X",
+ unk_param1, unk_param2, unk_param3, unk_param4, unk_param5);
+}
+
+void GetStorageEntryInfo(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+
+ cmd_buff[0] = IPC::MakeHeader(0x30, 0x3, 0);
+ cmd_buff[1] = RESULT_SUCCESS.raw;
+ cmd_buff[2] = 0; // stub 0 (32bit value)
+ cmd_buff[3] = 0; // stub 0 (16bit value)
+
+ LOG_WARNING(Service_BOSS, "(STUBBED) called");
+}
+
+void SetStorageOption(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+ // TODO(JamePeng): Figure out the meaning of these parameters
+ u32 unk_param1 = cmd_buff[1] & 0xFF;
+ u32 unk_param2 = cmd_buff[2];
+ u32 unk_param3 = cmd_buff[3];
+ u32 unk_param4 = cmd_buff[4];
+
+ cmd_buff[0] = IPC::MakeHeader(0x31, 0x1, 0);
+ cmd_buff[1] = RESULT_SUCCESS.raw;
+
+ LOG_WARNING(Service_BOSS, "(STUBBED) unk_param1=0x%08X, unk_param2=0x%08X, "
+ "unk_param3=0x%08X, unk_param4=0x%08X",
+ unk_param1, unk_param2, unk_param3, unk_param4);
+}
+
+void GetStorageOption(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+
+ cmd_buff[0] = IPC::MakeHeader(0x32, 0x5, 0);
+ cmd_buff[1] = RESULT_SUCCESS.raw;
+ cmd_buff[2] = 0; // stub 0 (32bit value)
+ cmd_buff[3] = 0; // stub 0 (8bit value)
+ cmd_buff[4] = 0; // stub 0 (16bit value)
+ cmd_buff[5] = 0; // stub 0 (16bit value)
+
+ LOG_WARNING(Service_BOSS, "(STUBBED) called");
+}
+
+void StartBgImmediate(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+
+ u32 unk_param1 = cmd_buff[1]; // TODO(JamePeng): Figure out the meaning of these parameters
+ u32 translation = cmd_buff[2];
+ u32 buff_addr = cmd_buff[3];
+ u32 buff_size = (translation >> 4);
+
+ cmd_buff[0] = IPC::MakeHeader(0x33, 0x1, 0x2);
+ cmd_buff[1] = RESULT_SUCCESS.raw;
+ cmd_buff[2] = (buff_size << 4 | 0xA);
+ cmd_buff[3] = buff_addr;
+
+ LOG_WARNING(Service_BOSS, "(STUBBED) buff_size=0x%08X, unk_param2=0x%08X, "
+ "translation=0x%08X, buff_addr=0x%08X",
+ unk_param1, translation, buff_addr, buff_size);
+}
+
+void GetTaskActivePriority(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+
+ u32 unk_param1 = cmd_buff[1]; // TODO(JamePeng): Figure out the meaning of these parameters
+ u32 translation = cmd_buff[2];
+ u32 buff_addr = cmd_buff[3];
+ u32 buff_size = (translation >> 4);
+
+ cmd_buff[0] = IPC::MakeHeader(0x34, 0x2, 0x2);
+ cmd_buff[1] = RESULT_SUCCESS.raw;
+ cmd_buff[2] = 0; // stub 0 (8bit value)
+ cmd_buff[3] = (buff_size << 4 | 0xA);
+ cmd_buff[4] = buff_addr;
+
+ LOG_WARNING(Service_BOSS, "(STUBBED) buff_size=0x%08X, unk_param2=0x%08X, "
+ "translation=0x%08X, buff_addr=0x%08X",
+ unk_param1, translation, buff_addr, buff_size);
+}
+
+void RegisterImmediateTask(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+ // TODO(JamePeng): Figure out the meaning of these parameters
+ u32 unk_param1 = cmd_buff[1];
+ u32 unk_param2 = cmd_buff[2] & 0xFF;
+ u32 unk_param3 = cmd_buff[3] & 0xFF;
+ u32 translation = cmd_buff[4];
+ u32 buff_addr = cmd_buff[5];
+ u32 buff_size = (translation >> 4);
+
+ cmd_buff[0] = IPC::MakeHeader(0x35, 0x1, 0x2);
+ cmd_buff[1] = RESULT_SUCCESS.raw;
+ cmd_buff[3] = (buff_size << 4 | 0xA);
+ cmd_buff[4] = buff_addr;
+
+ LOG_WARNING(Service_BOSS, "(STUBBED) unk_param1=0x%08X, unk_param2=0x%08X, unk_param3=0x%08X, "
+ "translation=0x%08X, buff_addr=0x%08X, buff_size=0x%08X",
+ unk_param1, unk_param2, unk_param3, translation, buff_addr, buff_size);
+}
+
+void SetTaskQuery(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+ // TODO(JamePeng): Figure out the meaning of these parameters
+ u32 unk_param1 = cmd_buff[1];
+ u32 unk_param2 = cmd_buff[2];
+ u32 translation1 = cmd_buff[3];
+ u32 buff1_addr = cmd_buff[4];
+ u32 buff1_size = (translation1 >> 4);
+ u32 translation2 = cmd_buff[5];
+ u32 buff2_addr = cmd_buff[6];
+ u32 buff2_size = (translation2 >> 4);
+
+ cmd_buff[0] = IPC::MakeHeader(0x36, 0x1, 0x4);
+ cmd_buff[1] = RESULT_SUCCESS.raw;
+ cmd_buff[2] = (buff1_size << 4 | 0xA);
+ cmd_buff[3] = buff1_addr;
+ cmd_buff[2] = (buff2_size << 4 | 0xA);
+ cmd_buff[3] = buff2_addr;
+
+ LOG_WARNING(Service_BOSS, "(STUBBED) unk_param1=0x%08X, unk_param2=0x%08X, "
+ "translation1=0x%08X, buff1_addr=0x%08X, buff1_size=0x%08X, "
+ "translation2=0x%08X, buff2_addr=0x%08X, buff2_size=0x%08X",
+ unk_param1, unk_param2, translation1, buff1_addr, buff1_size, translation2,
+ buff2_addr, buff2_size);
+}
+
+void GetTaskQuery(Service::Interface* self) {
+ u32* cmd_buff = Kernel::GetCommandBuffer();
+ // TODO(JamePeng): Figure out the meaning of these parameters
+ u32 unk_param1 = cmd_buff[1];
+ u32 unk_param2 = cmd_buff[2];
+ u32 translation1 = cmd_buff[3];
+ u32 buff1_addr = cmd_buff[4];
+ u32 buff1_size = (translation1 >> 4);
+ u32 translation2 = cmd_buff[5];
+ u32 buff2_addr = cmd_buff[6];
+ u32 buff2_size = (translation2 >> 4);
+
+ cmd_buff[0] = IPC::MakeHeader(0x37, 0x1, 0x4);
+ cmd_buff[1] = RESULT_SUCCESS.raw;
+ cmd_buff[2] = (buff1_size << 4 | 0xA);
+ cmd_buff[3] = buff1_addr;
+ cmd_buff[2] = (buff2_size << 4 | 0xC);
+ cmd_buff[3] = buff2_addr;
+
+ LOG_WARNING(Service_BOSS, "(STUBBED) unk_param1=0x%08X, unk_param2=0x%08X, "
+ "translation1=0x%08X, buff1_addr=0x%08X, buff1_size=0x%08X, "
+ "translation2=0x%08X, buff2_addr=0x%08X, buff2_size=0x%08X",
+ unk_param1, unk_param2, translation1, buff1_addr, buff1_size, translation2,
+ buff2_addr, buff2_size);
+}
+
void Init() {
using namespace Kernel;
AddService(new BOSS_P_Interface);
AddService(new BOSS_U_Interface);
+
+ new_arrival_flag = 0;
+ ns_data_new_flag = 0;
+ output_flag = 0;
}
void Shutdown() {}
diff --git a/src/core/hle/service/boss/boss.h b/src/core/hle/service/boss/boss.h
index d3b5d7101..8cdc663c8 100644
--- a/src/core/hle/service/boss/boss.h
+++ b/src/core/hle/service/boss/boss.h
@@ -4,9 +4,794 @@
#pragma once
+#include "core/hle/service/service.h"
+
namespace Service {
namespace BOSS {
+/**
+ * BOSS::InitializeSession service function
+ * Inputs:
+ * 0 : Header Code[0x00010082]
+ * 1 : u32 lower 64bit value
+ * 2 : u32 higher 64bit value
+ * 3 : 0x20
+ * 4 : u32 unknown value
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ */
+void InitializeSession(Service::Interface* self);
+
+/**
+ * BOSS::RegisterStorage service function
+ * Inputs:
+ * 0 : Header Code[0x00020010]
+ * 1 : u32 unknown1
+ * 2 : u32 unknown2
+ * 3 : u32 unknown3
+ * 4 : u8 unknown_flag
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ */
+void RegisterStorage(Service::Interface* self);
+
+/**
+ * BOSS::UnregisterStorage service function
+ * Inputs:
+ * 0 : Header Code[0x00030000]
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ */
+void UnregisterStorage(Service::Interface* self);
+
+/**
+ * BOSS::GetStorageInfo service function
+ * Inputs:
+ * 0 : Header Code[0x00040000]
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ * 2 : u32 unknown value
+ */
+void GetStorageInfo(Service::Interface* self);
+
+/**
+ * BOSS::RegisterPrivateRootCa service function
+ * Inputs:
+ * 0 : Header Code[0x00050042]
+ * 1 : u32 unknown value
+ * 2 : MappedBufferDesc(permission = R)
+ * 3 : u32 buff_addr
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ * 2 : buff_size << 4 | 0xA
+ * 3 : u32 buff_addr
+ */
+void RegisterPrivateRootCa(Service::Interface* self);
+
+/**
+ * BOSS::RegisterPrivateClientCert service function
+ * Inputs:
+ * 0 : Header Code[0x00060084]
+ * 1 : u32 unknown value
+ * 2 : u32 unknown value
+ * 3 : MappedBufferDesc1(permission = R)
+ * 4 : u32 buff_addr1
+ * 5 : MappedBufferDesc2(permission = R)
+ * 6 : u32 buff_addr2
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ * 2 : buff1_size << 4 | 0xA
+ * 3 : u32 buff_addr1
+ * 4 : buff2_size << 4 | 0xA
+ * 5 : u32 buff_addr2
+ */
+void RegisterPrivateClientCert(Service::Interface* self);
+
+/**
+ * BOSS::GetNewArrivalFlag service function
+ * Inputs:
+ * 0 : Header Code[0x00070000]
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ * 2 : u8 flag
+ */
+void GetNewArrivalFlag(Service::Interface* self);
+
+/**
+ * BOSS::RegisterNewArrivalEvent service function
+ * Inputs:
+ * 0 : Header Code[0x00080002]
+ * 1 : u32 unknown1
+ * 2 : u32 unknown2
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ */
+void RegisterNewArrivalEvent(Service::Interface* self);
+
+/**
+ * BOSS::SetOptoutFlag service function
+ * Inputs:
+ * 0 : Header Code[0x00090040]
+ * 1 : u8 output_flag
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ */
+void SetOptoutFlag(Service::Interface* self);
+
+/**
+ * BOSS::GetOptoutFlag service function
+ * Inputs:
+ * 0 : Header Code[0x000A0000]
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ * 2 : u8 output_flag
+ */
+void GetOptoutFlag(Service::Interface* self);
+
+/**
+ * BOSS::RegisterTask service function
+ * Inputs:
+ * 0 : Header Code[0x000B00C2]
+ * 1 : u32 unknown value
+ * 2 : u8 unknown value
+ * 3 : u8 unknown value
+ * 4 : MappedBufferDesc1(permission = R)
+ * 5 : buff_addr
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ * 2 : buff_size << 4 | 0xA
+ * 3 : u32 buff_addr
+ */
+void RegisterTask(Service::Interface* self);
+
+/**
+ * BOSS::UnregisterTask service function
+ * Inputs:
+ * 0 : Header Code[0x000C0082]
+ * 1 : u32 unknown value
+ * 2 : u8 unknown value
+ * 3 : MappedBufferDesc1(permission = R)
+ * 4 : buff_addr
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ * 2 : buff_size << 4 | 0xA
+ * 3 : u32 buff_addr
+ */
+void UnregisterTask(Service::Interface* self);
+
+/**
+ * BOSS::ReconfigureTask service function
+ * Inputs:
+ * 0 : Header Code[0x000D0082]
+ * 1 : u32 unknown value
+ * 2 : u8 unknown value
+ * 3 : MappedBufferDesc1(permission = R)
+ * 4 : buff_addr
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ * 2 : buff_size << 4 | 0xA
+ * 3 : u32 buff_addr
+ */
+void ReconfigureTask(Service::Interface* self);
+
+/**
+ * BOSS::GetTaskIdList service function
+ * Inputs:
+ * 0 : Header Code[0x000E0000]
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ */
+void GetTaskIdList(Service::Interface* self);
+
+/**
+ * BOSS::GetStepIdList service function
+ * Inputs:
+ * 0 : Header Code[0x000F0042]
+ * 2 : MappedBufferDesc(permission = R)
+ * 3 : u32 buff_addr
+ *
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ * 2 : buff_size << 4 | 0xA
+ * 3 : u32 buff_addr
+ */
+void GetStepIdList(Service::Interface* self);
+
+/**
+ * BOSS::GetNsDataIdList service function
+ * Inputs:
+ * 0 : Header Code[0x00100102]
+ * 1 : u32 unknown1
+ * 2 : u32 unknown2
+ * 3 : u32 unknown3
+ * 4 : u32 unknown4
+ * 5 : MappedBufferDesc(permission = W)
+ * 6 : u32 buff_addr
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ * 2 : u16 unknown value
+ * 3 : u16 unknown value
+ * 4 : buff_size << 4 | 0xC
+ * 5 : u32 buff_addr
+ */
+void GetNsDataIdList(Service::Interface* self);
+
+/**
+ * BOSS::GetOwnNsDataIdList service function
+ * Inputs:
+ * 0 : Header Code[0x00110102]
+ * 1 : u32 unknown1
+ * 2 : u32 unknown2
+ * 3 : u32 unknown3
+ * 4 : u32 unknown4
+ * 5 : MappedBufferDesc(permission = W)
+ * 6 : u32 buff_addr
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ * 2 : u16 unknown value
+ * 3 : u16 unknown value
+ * 4 : buff_size << 4 | 0xC
+ * 5 : u32 buff_addr
+ */
+void GetOwnNsDataIdList(Service::Interface* self);
+
+/**
+ * BOSS::GetNewDataNsDataIdList service function
+ * Inputs:
+ * 0 : Header Code[0x00120102]
+ * 1 : u32 unknown1
+ * 2 : u32 unknown2
+ * 3 : u32 unknown3
+ * 4 : u32 unknown4
+ * 5 : MappedBufferDesc(permission = W)
+ * 6 : u32 buff_addr
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ * 2 : u16 unknown value
+ * 3 : u16 unknown value
+ * 4 : buff_size << 4 | 0xC
+ * 5 : u32 buff_addr
+ */
+void GetNewDataNsDataIdList(Service::Interface* self);
+
+/**
+ * BOSS::GetOwnNewDataNsDataIdList service function
+ * Inputs:
+ * 0 : Header Code[0x00130102]
+ * 1 : u32 unknown1
+ * 2 : u32 unknown2
+ * 3 : u32 unknown3
+ * 4 : u32 unknown4
+ * 5 : MappedBufferDesc(permission = W)
+ * 6 : u32 buff_addr
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ * 2 : u16 unknown value
+ * 3 : u16 unknown value
+
+ */
+void GetOwnNewDataNsDataIdList(Service::Interface* self);
+
+/**
+ * BOSS::SendProperty service function
+ * Inputs:
+ * 0 : Header Code[0x00140082]
+ * 1 : u16 unknown value
+ * 2 : u32 unknown value
+ * 3 : MappedBufferDesc(permission = R)
+ * 4 : u32 buff_addr
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ * 2 : buff_size << 4 | 0xA
+ * 3 : u32 buff_addr
+ */
+void SendProperty(Service::Interface* self);
+
+/**
+ * BOSS::SendPropertyHandle service function
+ * Inputs:
+ * 0 : Header Code[0x00150042]
+ * 2 : u8 unknown value
+ * 3 : MappedBufferDesc(permission = R)
+ * 4 : u32 buff_addr
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ * 2 : buff_size << 4 | 0xA
+ * 3 : u32 buff_addr
+ */
+void SendPropertyHandle(Service::Interface* self);
+
+/**
+ * BOSS::ReceiveProperty service function
+ * Inputs:
+ * 0 : Header Code[0x00160082]
+ * 1 : u16 unknown1
+ * 2 : u32 buff_size
+ * 3 : MappedBufferDesc(permission = W)
+ * 4 : u32 buff addr
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ * 2 : u32 unknown value
+ * 3 : u16 unknown value
+ * 4 : buff_size << 4 | 0xC
+ * 5 : u32 buff_addr
+ */
+void ReceiveProperty(Service::Interface* self);
+
+/**
+ * BOSS::UpdateTaskInterval service function
+ * Inputs:
+ * 0 : Header Code[0x00170082]
+ * 1 : u32 unknown value
+ * 2 : u8 unknown value
+ * 3 : MappedBufferDesc1(permission = R)
+ * 4 : buff_addr
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ * 2 : buff_size << 4 | 0xA
+ * 3 : u32 buff_addr
+ */
+void UpdateTaskInterval(Service::Interface* self);
+
+/**
+ * BOSS::UpdateTaskCount service function
+ * Inputs:
+ * 0 : Header Code[0x00180082]
+ * 1 : u32 buff_size
+ * 2 : u32 unknown2
+ * 3 : MappedBufferDesc(permission = R)
+ * 4 : u32 buff_addr
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ * 2 : buff_size << 4 | 0xA
+ * 3 : u32 buff_addr
+ */
+void UpdateTaskCount(Service::Interface* self);
+
+/**
+ * BOSS::GetTaskInterval service function
+ * Inputs:
+ * 0 : Header Code[0x00190042]
+ * 1 : u32 unknown value
+ * 2 : MappedBufferDesc(permission = R)
+ * 3 : u32 buff_addr
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ * 2 : u32 unknown value
+ * 3 : buff_size << 4 | 0xA
+ * 4 : u32 buff_addr
+ */
+void GetTaskInterval(Service::Interface* self);
+
+/**
+ * BOSS::GetTaskCount service function
+ * Inputs:
+ * 0 : Header Code[0x001A0042]
+ * 1 : u32 unknown value
+ * 2 : MappedBufferDesc(permission = R)
+ * 3 : u32 buff_addr
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ * 2 : u32 unknown value
+ * 3 : buff_size << 4 | 0xA
+ * 4 : u32 buff_addr
+ */
+void GetTaskCount(Service::Interface* self);
+
+/**
+ * BOSS::GetTaskServiceStatus service function
+ * Inputs:
+ * 0 : Header Code[0x001B0042]
+ * 1 : u32 unknown value
+ * 2 : MappedBufferDesc(permission = R)
+ * 3 : u32 buff_addr
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ * 2 : u8 unknown value
+ * 3 : buff_size << 4 | 0xA
+ * 4 : u32 buff_addr
+ */
+void GetTaskServiceStatus(Service::Interface* self);
+
+/**
+ * BOSS::StartTask service function
+ * Inputs:
+ * 0 : Header Code[0x001C0042]
+ * 1 : u32 unknown value
+ * 2 : MappedBufferDesc(permission = R)
+ * 3 : u32 buff_addr
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ * 2 : buff_size << 4 | 0xA
+ * 3 : u32 buff_addr
+ */
+void StartTask(Service::Interface* self);
+
+/**
+ * BOSS::StartTaskImmediate service function
+ * Inputs:
+ * 0 : Header Code[0x001D0042]
+ * 1 : u32 unknown value
+ * 2 : MappedBufferDesc(permission = R)
+ * 3 : u32 buff_addr
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ * 2 : buff_size << 4 | 0xA
+ * 3 : u32 buff_addr
+ */
+void StartTaskImmediate(Service::Interface* self);
+
+/**
+ * BOSS::CancelTask service function
+ * Inputs:
+ * 0 : Header Code[0x001E0042]
+ * 1 : u32 unknown value
+ * 2 : MappedBufferDesc(permission = R)
+ * 3 : u32 buff_addr
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ * 2 : buff_size << 4 | 0xA
+ * 3 : u32 buff_addr
+ */
+void CancelTask(Service::Interface* self);
+
+/**
+ * BOSS::GetTaskFinishHandle service function
+ * Inputs:
+ * 0 : Header Code[0x001F0000]
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ * 2 : 0
+ * 3 : Task Finish Handle
+ */
+void GetTaskFinishHandle(Service::Interface* self);
+
+/**
+ * BOSS::GetTaskState service function
+ * Inputs:
+ * 0 : Header Code[0x00200082]
+ * 1 : u32 buff_size
+ * 2 : u8 unknown value
+ * 3 : MappedBufferDesc(permission = R)
+ * 4 : u32 buff_addr
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ * 2 : u8 unknown value
+ * 3 : u32 unknown value
+ * 4 : u8 unknown value
+ * 5 : buff_size << 4 | 0xA
+ * 6 : u32 buff_addr
+ */
+void GetTaskState(Service::Interface* self);
+
+/**
+ * BOSS::GetTaskResult service function
+ * Inputs:
+ * 0 : Header Code[0x00210042]
+ * 1 : u32 unknown value
+ * 2 : MappedBufferDesc(permission = R)
+ * 3 : u32 buff_addr
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ * 2 : u8 unknown value
+ * 3 : u32 unknown value
+ * 4 : u8 unknown value
+ * 5 : buff_size << 4 | 0xA
+ * 6 : u32 buff_addr
+ */
+void GetTaskResult(Service::Interface* self);
+
+/**
+ * BOSS::GetTaskCommErrorCode service function
+ * Inputs:
+ * 0 : Header Code[0x00220042]
+ * 1 : u32 unknown value
+ * 2 : MappedBufferDesc(permission = R)
+ * 3 : u32 buff_addr
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ * 2 : u32 unknown value
+ * 3 : u32 unknown value
+ * 4 : u8 unknown value
+ * 5 : buff_size << 4 | 0xA
+ * 6 : u32 buff_addr
+ */
+void GetTaskCommErrorCode(Service::Interface* self);
+
+/**
+ * BOSS::GetTaskStatus service function
+ * Inputs:
+ * 0 : Header Code[0x002300C2]
+ * 1 : u32 unknown value
+ * 2 : u8 unknown value
+ * 3 : u8 unknown value
+ * 4 : MappedBufferDesc(permission = R)
+ * 5 : u32 buff_addr
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ * 2 : u8 unknown value
+ * 3 : buff_size << 4 | 0xA
+ * 4 : u32 buff_addr
+ */
+void GetTaskStatus(Service::Interface* self);
+
+/**
+ * BOSS::GetTaskError service function
+ * Inputs:
+ * 0 : Header Code[0x00240082]
+ * 1 : u32 unknown value
+ * 2 : u8 unknown value
+ * 3 : MappedBufferDesc(permission = R)
+ * 4 : u32 buff_addr
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ * 2 : u8 unknown value
+ * 3 : buff_size << 4 | 0xA
+ * 4 : u32 buff_addr
+ */
+void GetTaskError(Service::Interface* self);
+
+/**
+ * BOSS::GetTaskInfo service function
+ * Inputs:
+ * 0 : Header Code[0x00250082]
+ * 1 : u32 unknown value
+ * 2 : u8 unknown value
+ * 3 : MappedBufferDesc(permission = R)
+ * 4 : u32 buff_addr
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ * 2 : buff_size << 4 | 0xA
+ * 3 : u32 buff_addr
+ */
+void GetTaskInfo(Service::Interface* self);
+
+/**
+ * BOSS::DeleteNsData service function
+ * Inputs:
+ * 0 : Header Code[0x00260040]
+ * 1 : u32 unknown value
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ */
+void DeleteNsData(Service::Interface* self);
+
+/**
+ * BOSS::GetNsDataHeaderInfo service function
+ * Inputs:
+ * 0 : Header Code[0x002700C2]
+ * 1 : u32 unknown value
+ * 2 : u8 unknown value
+ * 3 : u32 unknown value
+ * 4 : MappedBufferDesc(permission = W)
+ * 5 : u32 buff_addr
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ * 2 : buff_size << 4 | 0xC
+ * 3 : u32 buff_addr
+ */
+void GetNsDataHeaderInfo(Service::Interface* self);
+
+/**
+ * BOSS::ReadNsData service function
+ * Inputs:
+ * 0 : Header Code[0x00280102]
+ * 1 : u32 unknown value
+ * 2 : u32 unknown value
+ * 3 : u32 unknown value
+ * 4 : u32 unknown value
+ * 5 : MappedBufferDesc(permission = W)
+ * 6 : u32 buff_addr
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ * 2 : u32 unknown value
+ * 3 : u32 unknown value
+ * 4 : buff_size << 4 | 0xC
+ * 5 : u32 buff_addr
+ */
+void ReadNsData(Service::Interface* self);
+
+/**
+ * BOSS::SetNsDataAdditionalInfo service function
+ * Inputs:
+ * 0 : Header Code[0x00290080]
+ * 1 : u32 unknown value
+ * 2 : u32 unknown value
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ */
+void SetNsDataAdditionalInfo(Service::Interface* self);
+
+/**
+ * BOSS::GetNsDataAdditionalInfo service function
+ * Inputs:
+ * 0 : Header Code[0x002A0040]
+ * 1 : u32 unknown value
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ * 2 : u32 unknown value
+ */
+void GetNsDataAdditionalInfo(Service::Interface* self);
+
+/**
+ * BOSS::SetNsDataNewFlag service function
+ * Inputs:
+ * 0 : Header Code[0x002B0080]
+ * 1 : u32 unknown value
+ * 2 : u8 flag
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ */
+void SetNsDataNewFlag(Service::Interface* self);
+
+/**
+ * BOSS::GetNsDataNewFlag service function
+ * Inputs:
+ * 0 : Header Code[0x002C0040]
+ * 1 : u32 unknown value
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ * 2 : u8 flag
+ */
+void GetNsDataNewFlag(Service::Interface* self);
+
+/**
+ * BOSS::GetNsDataLastUpdate service function
+ * Inputs:
+ * 0 : Header Code[0x002D0040]
+ * 1 : u32 unknown value
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ * 2 : u32 unknown value
+ * 3 : u32 unknown value
+ */
+void GetNsDataLastUpdate(Service::Interface* self);
+
+/**
+ * BOSS::GetErrorCode service function
+ * Inputs:
+ * 0 : Header Code[0x002E0040]
+ * 1 : u8 unknown value
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ * 2 : u32 unknown value
+ */
+void GetErrorCode(Service::Interface* self);
+
+/**
+ * BOSS::RegisterStorageEntry service function
+ * Inputs:
+ * 0 : Header Code[0x002F0140]
+ * 1 : u32 unknown value
+ * 2 : u32 unknown value
+ * 3 : u32 unknown value
+ * 4 : u16 unknown value
+ * 5 : u8 unknown value
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ */
+void RegisterStorageEntry(Service::Interface* self);
+
+/**
+ * BOSS::GetStorageEntryInfo service function
+ * Inputs:
+ * 0 : Header Code[0x00300000]
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ * 2 : u32 unknown value
+ * 3 : u16 unknown value
+ */
+void GetStorageEntryInfo(Service::Interface* self);
+
+/**
+ * BOSS::SetStorageOption service function
+ * Inputs:
+ * 0 : Header Code[0x00310100]
+ * 1 : u8 unknown value
+ * 2 : u32 unknown value
+ * 3 : u16 unknown value
+ * 4 : u16 unknown value
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ */
+void SetStorageOption(Service::Interface* self);
+
+/**
+ * BOSS::GetStorageOption service function
+ * Inputs:
+ * 0 : Header Code[0x00320000]
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ * 2 : u8 unknown value
+ * 3 : u32 unknown value
+ * 4 : u16 unknown value
+ * 5 : u16 unknown value
+ */
+void GetStorageOption(Service::Interface* self);
+
+/**
+ * BOSS::StartBgImmediate service function
+ * Inputs:
+ * 0 : Header Code[0x00330042]
+ * 1 : u32 unknown value
+ * 2 : MappedBufferDesc(permission = R)
+ * 3 : u32 buff_addr
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ * 2 : buff_size << 4 | 0xA
+ * 3 : u32 buff_addr
+ */
+void StartBgImmediate(Service::Interface* self);
+
+/**
+ * BOSS::GetTaskActivePriority service function
+ * Inputs:
+ * 0 : Header Code[0x00340042]
+ * 1 : u32 unknown value
+ * 2 : MappedBufferDesc(permission = R)
+ * 3 : u32 buff_addr
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ * 2 : u8 unknown value
+ * 3 : buff_size << 4 | 0xA
+ * 4 : u32 buff_addr
+ */
+void GetTaskActivePriority(Service::Interface* self);
+
+/**
+ * BOSS::RegisterImmediateTask service function
+ * Inputs:
+ * 0 : Header Code[0x003500C2]
+ * 1 : u32 unknown value
+ * 2 : u8 unknown value
+ * 3 : u8 unknown value
+ * 4 : MappedBufferDesc(permission = R)
+ * 5 : u32 buff_addr
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ * 2 : buff_size << 4 | 0xA
+ * 3 : u32 buff_addr
+ */
+void RegisterImmediateTask(Service::Interface* self);
+
+/**
+ * BOSS::SetTaskQuery service function
+ * Inputs:
+ * 0 : Header Code[0x00360084]
+ * 1 : u32 unknown value
+ * 2 : u32 unknown value
+ * 3 : MappedBufferDesc1(permission = R)
+ * 4 : u32 buff1_addr
+ * 5 : MappedBufferDesc2(permission = R)
+ * 6 : u32 buff2_addr
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ * 2 : buff1_size << 4 | 0xA
+ * 3 : u32 buff1_addr
+ * 4 : buff2_size << 4 | 0xA
+ * 5 : u32 buff2_addr
+ */
+void SetTaskQuery(Service::Interface* self);
+
+/**
+ * BOSS::GetTaskQuery service function
+ * Inputs:
+ * 0 : Header Code[0x00370084]
+ * 1 : u32 unknown value
+ * 2 : u32 unknown value
+ * 3 : MappedBufferDesc1(permission = R)
+ * 4 : u32 buff1_addr
+ * 5 : MappedBufferDesc2(permission = W)
+ * 6 : u32 buff2_addr
+ * Outputs:
+ * 1 : Result of function, 0 on success, otherwise error code
+ * 2 : buff1_size << 4 | 0xA
+ * 3 : u32 buff1_addr
+ * 4 : buff2_size << 4 | 0xC
+ * 5 : u32 buff2_addr
+ */
+void GetTaskQuery(Service::Interface* self);
+
/// Initialize BOSS service(s)
void Init();
diff --git a/src/core/hle/service/boss/boss_u.cpp b/src/core/hle/service/boss/boss_u.cpp
index 6affa23b1..371d702e0 100644
--- a/src/core/hle/service/boss/boss_u.cpp
+++ b/src/core/hle/service/boss/boss_u.cpp
@@ -2,16 +2,68 @@
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
+#include "core/hle/service/boss/boss.h"
#include "core/hle/service/boss/boss_u.h"
namespace Service {
namespace BOSS {
const Interface::FunctionInfo FunctionTable[] = {
- {0x00020100, nullptr, "GetStorageInfo"},
- {0x000C0082, nullptr, "UnregisterTask"},
- {0x001E0042, nullptr, "CancelTask"},
- {0x00330042, nullptr, "StartBgImmediate"},
+ {0x00010082, InitializeSession, "InitializeSession"},
+ {0x00020100, RegisterStorage, "RegisterStorage"},
+ {0x00030000, UnregisterStorage, "UnregisterStorage"},
+ {0x00040000, GetStorageInfo, "GetStorageInfo"},
+ {0x00050042, RegisterPrivateRootCa, "RegisterPrivateRootCa"},
+ {0x00060084, RegisterPrivateClientCert, "RegisterPrivateClientCert"},
+ {0x00070000, GetNewArrivalFlag, "GetNewArrivalFlag"},
+ {0x00080002, RegisterNewArrivalEvent, "RegisterNewArrivalEvent"},
+ {0x00090040, SetOptoutFlag, "SetOptoutFlag"},
+ {0x000A0000, GetOptoutFlag, "GetOptoutFlag"},
+ {0x000B00C2, RegisterTask, "RegisterTask"},
+ {0x000C0082, UnregisterTask, "UnregisterTask"},
+ {0x000D0082, ReconfigureTask, "ReconfigureTask"},
+ {0x000E0000, GetTaskIdList, "GetTaskIdList"},
+ {0x000F0042, GetStepIdList, "GetStepIdList"},
+ {0x00100102, GetNsDataIdList, "GetNsDataIdList"},
+ {0x00110102, GetOwnNsDataIdList, "GetOwnNsDataIdList"},
+ {0x00120102, GetNewDataNsDataIdList, "GetNewDataNsDataIdList"},
+ {0x00130102, GetOwnNewDataNsDataIdList, "GetOwnNewDataNsDataIdList"},
+ {0x00140082, SendProperty, "SendProperty"},
+ {0x00150042, SendPropertyHandle, "SendPropertyHandle"},
+ {0x00160082, ReceiveProperty, "ReceiveProperty"},
+ {0x00170082, UpdateTaskInterval, "UpdateTaskInterval"},
+ {0x00180082, UpdateTaskCount, "UpdateTaskCount"},
+ {0x00190042, GetTaskInterval, "GetTaskInterval"},
+ {0x001A0042, GetTaskCount, "GetTaskCount"},
+ {0x001B0042, GetTaskServiceStatus, "GetTaskServiceStatus"},
+ {0x001C0042, StartTask, "StartTask"},
+ {0x001D0042, StartTaskImmediate, "StartTaskImmediate"},
+ {0x001E0042, CancelTask, "CancelTask"},
+ {0x001F0000, GetTaskFinishHandle, "GetTaskFinishHandle"},
+ {0x00200082, GetTaskState, "GetTaskState"},
+ {0x00210042, GetTaskResult, "GetTaskResult"},
+ {0x00220042, GetTaskCommErrorCode, "GetTaskCommErrorCode"},
+ {0x002300C2, GetTaskStatus, "GetTaskStatus"},
+ {0x00240082, GetTaskError, "GetTaskError"},
+ {0x00250082, GetTaskInfo, "GetTaskInfo"},
+ {0x00260040, DeleteNsData, "DeleteNsData"},
+ {0x002700C2, GetNsDataHeaderInfo, "GetNsDataHeaderInfo"},
+ {0x00280102, ReadNsData, "ReadNsData"},
+ {0x00290080, SetNsDataAdditionalInfo, "SetNsDataAdditionalInfo"},
+ {0x002A0040, GetNsDataAdditionalInfo, "GetNsDataAdditionalInfo"},
+ {0x002B0080, SetNsDataNewFlag, "SetNsDataNewFlag"},
+ {0x002C0040, GetNsDataNewFlag, "GetNsDataNewFlag"},
+ {0x002D0040, GetNsDataLastUpdate, "GetNsDataLastUpdate"},
+ {0x002E0040, GetErrorCode, "GetErrorCode"},
+ {0x002F0140, RegisterStorageEntry, "RegisterStorageEntry"},
+ {0x00300000, GetStorageEntryInfo, "GetStorageEntryInfo"},
+ {0x00310100, SetStorageOption, "SetStorageOption"},
+ {0x00320000, GetStorageOption, "GetStorageOption"},
+ {0x00330042, StartBgImmediate, "StartBgImmediate"},
+ {0x00340042, GetTaskActivePriority, "GetTaskActivePriority"},
+ {0x003500C2, RegisterImmediateTask, "RegisterImmediateTask"},
+ {0x00360084, SetTaskQuery, "SetTaskQuery"},
+ {0x00370084, GetTaskQuery, "GetTaskQuery"},
};
BOSS_U_Interface::BOSS_U_Interface() {
diff --git a/src/core/hle/service/frd/frd.cpp b/src/core/hle/service/frd/frd.cpp
index fa5080535..1d16f8732 100644
--- a/src/core/hle/service/frd/frd.cpp
+++ b/src/core/hle/service/frd/frd.cpp
@@ -87,7 +87,7 @@ void GetMyFriendKey(Service::Interface* self) {
u32* cmd_buff = Kernel::GetCommandBuffer();
cmd_buff[1] = RESULT_SUCCESS.raw; // No error
- Memory::WriteBlock(cmd_buff[2], &my_friend_key, sizeof(FriendKey));
+ std::memcpy(&cmd_buff[2], &my_friend_key, sizeof(FriendKey));
LOG_WARNING(Service_FRD, "(STUBBED) called");
}
diff --git a/src/core/hle/service/ldr_ro/cro_helper.cpp b/src/core/hle/service/ldr_ro/cro_helper.cpp
index b7d250312..4f0aa77eb 100644
--- a/src/core/hle/service/ldr_ro/cro_helper.cpp
+++ b/src/core/hle/service/ldr_ro/cro_helper.cpp
@@ -1227,7 +1227,7 @@ ResultCode CROHelper::Link(VAddr crs_address, bool link_on_load_bug_fix) {
// The bug itself is:
// If a relocation target is in .data segment, it will relocate to the
// user-specified buffer. But if this is linking during loading,
- // the .data segment hasn't been tranfer from CRO to the buffer,
+ // the .data segment hasn't been transfer from CRO to the buffer,
// thus the relocation will be overwritten by data transfer.
// To fix this bug, we need temporarily restore the old .data segment
// offset and apply imported symbols.
diff --git a/src/core/hle/service/nwm_uds.cpp b/src/core/hle/service/nwm_uds.cpp
index 27e829209..80081aae2 100644
--- a/src/core/hle/service/nwm_uds.cpp
+++ b/src/core/hle/service/nwm_uds.cpp
@@ -97,10 +97,21 @@ static void Initialize(Service::Interface* self) {
u32 value = cmd_buff[13];
u32 handle = cmd_buff[14];
+ // Because NWM service is not implemented at all, we stub the Initialize function with an error
+ // code instead of success to prevent games from using the service and from causing more issues.
+ // The error code is from a real 3DS with wifi off, thus believed to be "network disabled".
+ /*
cmd_buff[1] = RESULT_SUCCESS.raw;
cmd_buff[2] = 0;
cmd_buff[3] = Kernel::g_handle_table.Create(handle_event)
.MoveFrom(); // TODO(purpasmart): Verify if this is a event handle
+ */
+ cmd_buff[0] = IPC::MakeHeader(0x1B, 1, 2);
+ cmd_buff[1] = ResultCode(static_cast<ErrorDescription>(2), ErrorModule::UDS,
+ ErrorSummary::StatusChanged, ErrorLevel::Status)
+ .raw;
+ cmd_buff[2] = 0;
+ cmd_buff[3] = 0;
LOG_WARNING(Service_NWM, "(STUBBED) called unk1=0x%08X, unk2=0x%08X, value=%u, handle=0x%08X",
unk1, unk2, value, handle);
diff --git a/src/core/hle/service/soc_u.cpp b/src/core/hle/service/soc_u.cpp
index 4279b67fb..46b75db25 100644
--- a/src/core/hle/service/soc_u.cpp
+++ b/src/core/hle/service/soc_u.cpp
@@ -104,7 +104,9 @@ static const std::unordered_map<int, int> error_map = {{
{ERRNO(ENETUNREACH), 40},
{ENFILE, 41},
{ERRNO(ENOBUFS), 42},
+#ifdef ENODATA
{ENODATA, 43},
+#endif
{ENODEV, 44},
{ENOENT, 45},
{ENOEXEC, 46},
@@ -114,8 +116,12 @@ static const std::unordered_map<int, int> error_map = {{
{ENOMSG, 50},
{ERRNO(ENOPROTOOPT), 51},
{ENOSPC, 52},
+#ifdef ENOSR
{ENOSR, 53},
+#endif
+#ifdef ENOSTR
{ENOSTR, 54},
+#endif
{ENOSYS, 55},
{ERRNO(ENOTCONN), 56},
{ENOTDIR, 57},
@@ -136,7 +142,9 @@ static const std::unordered_map<int, int> error_map = {{
{ESPIPE, 72},
{ESRCH, 73},
{ERRNO(ESTALE), 74},
+#ifdef ETIME
{ETIME, 75},
+#endif
{ERRNO(ETIMEDOUT), 76},
}};