diff options
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/gdbstub/gdbstub.cpp | 4 | ||||
-rw-r--r-- | src/core/hle/applets/erreula.cpp | 6 | ||||
-rw-r--r-- | src/core/hle/applets/mii_selector.cpp | 6 | ||||
-rw-r--r-- | src/core/hle/applets/swkbd.cpp | 6 | ||||
-rw-r--r-- | src/core/hle/kernel/event.cpp | 5 | ||||
-rw-r--r-- | src/core/hle/kernel/memory.cpp | 2 | ||||
-rw-r--r-- | src/core/hle/kernel/thread.cpp | 2 | ||||
-rw-r--r-- | src/core/hle/kernel/timer.cpp | 5 | ||||
-rw-r--r-- | src/core/hle/service/ac_u.cpp | 207 | ||||
-rw-r--r-- | src/core/hle/service/ac_u.h | 1 | ||||
-rw-r--r-- | src/core/hle/service/apt/apt.cpp | 2 | ||||
-rw-r--r-- | src/core/hle/service/apt/apt.h | 23 | ||||
-rw-r--r-- | src/core/hle/service/boss/boss.cpp | 967 | ||||
-rw-r--r-- | src/core/hle/service/boss/boss.h | 785 | ||||
-rw-r--r-- | src/core/hle/service/boss/boss_u.cpp | 60 | ||||
-rw-r--r-- | src/core/hle/service/frd/frd.cpp | 2 | ||||
-rw-r--r-- | src/core/hle/service/ldr_ro/cro_helper.cpp | 2 | ||||
-rw-r--r-- | src/core/hle/service/nwm_uds.cpp | 11 | ||||
-rw-r--r-- | src/core/hle/service/soc_u.cpp | 8 | ||||
-rw-r--r-- | src/core/loader/ncch.cpp | 2 | ||||
-rw-r--r-- | src/core/loader/ncch.h | 2 | ||||
-rw-r--r-- | src/core/settings.cpp | 7 | ||||
-rw-r--r-- | src/core/settings.h | 11 |
23 files changed, 2084 insertions, 42 deletions
diff --git a/src/core/gdbstub/gdbstub.cpp b/src/core/gdbstub/gdbstub.cpp index 7fc72d801..aea43e92b 100644 --- a/src/core/gdbstub/gdbstub.cpp +++ b/src/core/gdbstub/gdbstub.cpp @@ -14,7 +14,7 @@ #include <numeric> #include <fcntl.h> -#ifdef _MSC_VER +#ifdef _WIN32 #include <WinSock2.h> #include <common/x64/abi.h> #include <io.h> @@ -413,7 +413,7 @@ static void HandleQuery() { if (strcmp(query, "TStatus") == 0) { SendReply("T0"); - } else if (strncmp(query, "Supported:", strlen("Supported:")) == 0) { + } else if (strncmp(query, "Supported", strlen("Supported")) == 0) { // PacketSize needs to be large enough for target xml SendReply("PacketSize=800;qXfer:features:read+"); } else if (strncmp(query, "Xfer:features:read:target.xml:", 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}, }}; diff --git a/src/core/loader/ncch.cpp b/src/core/loader/ncch.cpp index 2e4510857..fadd7b16b 100644 --- a/src/core/loader/ncch.cpp +++ b/src/core/loader/ncch.cpp @@ -163,7 +163,7 @@ ResultStatus AppLoader_NCCH::LoadExec() { Kernel::g_current_process->ideal_processor = exheader_header.arm11_system_local_caps.ideal_processor; - // Copy data while converting endianess + // Copy data while converting endianness std::array<u32, ARRAY_SIZE(exheader_header.arm11_kernel_caps.descriptors)> kernel_caps; std::copy_n(exheader_header.arm11_kernel_caps.descriptors, kernel_caps.size(), begin(kernel_caps)); diff --git a/src/core/loader/ncch.h b/src/core/loader/ncch.h index 04350d006..f8718d063 100644 --- a/src/core/loader/ncch.h +++ b/src/core/loader/ncch.h @@ -11,7 +11,7 @@ #include "core/loader/loader.h" //////////////////////////////////////////////////////////////////////////////////////////////////// -/// NCCH header (Note: "NCCH" appears to be a publically unknown acronym) +/// NCCH header (Note: "NCCH" appears to be a publicly unknown acronym) struct NCCH_Header { u8 signature[0x100]; diff --git a/src/core/settings.cpp b/src/core/settings.cpp index 4a0969b00..05f41f798 100644 --- a/src/core/settings.cpp +++ b/src/core/settings.cpp @@ -7,6 +7,8 @@ #include "settings.h" #include "video_core/video_core.h" +#include "common/emu_window.h" + namespace Settings { Values values = {}; @@ -20,6 +22,11 @@ void Apply() { VideoCore::g_shader_jit_enabled = values.use_shader_jit; VideoCore::g_scaled_resolution_enabled = values.use_scaled_resolution; + if (VideoCore::g_emu_window) { + auto layout = VideoCore::g_emu_window->GetFramebufferLayout(); + VideoCore::g_emu_window->UpdateCurrentFramebufferLayout(layout.width, layout.height); + } + AudioCore::SelectSink(values.sink_id); AudioCore::EnableStretching(values.enable_audio_stretching); } diff --git a/src/core/settings.h b/src/core/settings.h index 5a64f8018..e931953d7 100644 --- a/src/core/settings.h +++ b/src/core/settings.h @@ -10,7 +10,15 @@ namespace Settings { +enum class LayoutOption { + Default, + SingleScreen, + LargeScreen, + Custom, +}; + namespace NativeInput { + enum Values { // directly mapped keys A, @@ -84,6 +92,9 @@ struct Values { bool use_scaled_resolution; bool use_vsync; + LayoutOption layout_option; + bool swap_screen; + float bg_red; float bg_green; float bg_blue; |