mirror of
https://github.com/starr-dusT/citra.git
synced 2024-10-02 10:26:17 -07:00

* boss: Implement some NsData header and read commands. Co-authored-by: Rokkubro <lachlanb03@gmail.com> * boss: Move opening ext data to common function and improve logging. --------- Co-authored-by: Rokkubro <lachlanb03@gmail.com>
1066 lines
36 KiB
C++
1066 lines
36 KiB
C++
// Copyright 2015 Citra Emulator Project
|
|
// Licensed under GPLv2 or any later version
|
|
// Refer to the license.txt file included.
|
|
|
|
#include "common/archives.h"
|
|
#include "common/logging/log.h"
|
|
#include "core/core.h"
|
|
#include "core/hle/ipc_helpers.h"
|
|
#include "core/hle/result.h"
|
|
#include "core/hle/service/boss/boss.h"
|
|
#include "core/hle/service/boss/boss_p.h"
|
|
#include "core/hle/service/boss/boss_u.h"
|
|
|
|
SERVICE_CONSTRUCT_IMPL(Service::BOSS::Module)
|
|
SERIALIZE_EXPORT_IMPL(Service::BOSS::Module)
|
|
SERIALIZE_EXPORT_IMPL(Service::BOSS::Module::SessionData)
|
|
|
|
namespace Service::BOSS {
|
|
|
|
template <class Archive>
|
|
void Module::serialize(Archive& ar, const unsigned int) {
|
|
ar& task_finish_event;
|
|
ar& new_arrival_flag;
|
|
ar& ns_data_new_flag;
|
|
ar& ns_data_new_flag_privileged;
|
|
ar& output_flag;
|
|
}
|
|
SERIALIZE_IMPL(Module)
|
|
|
|
template <class Archive>
|
|
void Module::SessionData::serialize(Archive& ar, const unsigned int) {
|
|
ar& boost::serialization::base_object<Kernel::SessionRequestHandler::SessionDataBase>(*this);
|
|
ar& online_service;
|
|
}
|
|
SERIALIZE_IMPL(Module::SessionData)
|
|
|
|
std::shared_ptr<OnlineService> Module::Interface::GetSessionService(
|
|
Kernel::HLERequestContext& ctx) {
|
|
const auto session_data = GetSessionData(ctx.Session());
|
|
if (session_data == nullptr || session_data->online_service == nullptr) {
|
|
LOG_WARNING(Service_BOSS, "Client attempted to use uninitialized BOSS session.");
|
|
|
|
// TODO: Error code for uninitialized session.
|
|
IPC::RequestParser rp(ctx);
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
|
|
rb.Push(RESULT_UNKNOWN);
|
|
return nullptr;
|
|
}
|
|
return session_data->online_service;
|
|
}
|
|
|
|
void Module::Interface::InitializeSession(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
const u64 program_id = rp.Pop<u64>();
|
|
rp.PopPID();
|
|
|
|
const auto session_data = GetSessionData(ctx.Session());
|
|
if (session_data->online_service == nullptr) {
|
|
u64 curr_program_id;
|
|
u64 curr_extdata_id;
|
|
boss->system.GetAppLoader().ReadProgramId(curr_program_id);
|
|
boss->system.GetAppLoader().ReadExtdataId(curr_extdata_id);
|
|
|
|
session_data->online_service =
|
|
std::make_shared<OnlineService>(curr_program_id, curr_extdata_id);
|
|
}
|
|
|
|
const auto result = session_data->online_service->InitializeSession(program_id);
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
|
|
rb.Push(result);
|
|
|
|
LOG_DEBUG(Service_BOSS, "called, program_id={:#018x}", program_id);
|
|
}
|
|
|
|
void Module::Interface::SetStorageInfo(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
const u64 extdata_id = rp.Pop<u64>();
|
|
const u32 boss_size = rp.Pop<u32>();
|
|
const u8 extdata_type = rp.Pop<u8>(); /// 0 = NAND, 1 = SD
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
|
|
rb.Push(RESULT_SUCCESS);
|
|
|
|
LOG_WARNING(Service_BOSS,
|
|
"(STUBBED) extdata_id={:#018x}, boss_size={:#010x}, extdata_type={:#04x}",
|
|
extdata_id, boss_size, extdata_type);
|
|
}
|
|
|
|
void Module::Interface::UnregisterStorage(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
|
|
rb.Push(RESULT_SUCCESS);
|
|
|
|
LOG_WARNING(Service_BOSS, "(STUBBED) called");
|
|
}
|
|
|
|
void Module::Interface::GetStorageInfo(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(2, 0);
|
|
rb.Push(RESULT_SUCCESS);
|
|
rb.Push<u32>(0);
|
|
|
|
LOG_WARNING(Service_BOSS, "(STUBBED) called");
|
|
}
|
|
|
|
void Module::Interface::RegisterPrivateRootCa(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
[[maybe_unused]] const u32 size = rp.Pop<u32>();
|
|
auto& buffer = rp.PopMappedBuffer();
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(1, 2);
|
|
rb.Push(RESULT_SUCCESS);
|
|
rb.PushMappedBuffer(buffer);
|
|
|
|
LOG_WARNING(Service_BOSS, "(STUBBED)");
|
|
}
|
|
|
|
void Module::Interface::RegisterPrivateClientCert(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
const u32 buffer1_size = rp.Pop<u32>();
|
|
const u32 buffer2_size = rp.Pop<u32>();
|
|
auto& buffer1 = rp.PopMappedBuffer();
|
|
auto& buffer2 = rp.PopMappedBuffer();
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(1, 4);
|
|
rb.Push(RESULT_SUCCESS);
|
|
rb.PushMappedBuffer(buffer1);
|
|
rb.PushMappedBuffer(buffer2);
|
|
|
|
LOG_WARNING(Service_BOSS, "(STUBBED) buffer1_size={:#010x}, buffer2_size={:#010x}, ",
|
|
buffer1_size, buffer2_size);
|
|
}
|
|
|
|
void Module::Interface::GetNewArrivalFlag(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(2, 0);
|
|
rb.Push(RESULT_SUCCESS);
|
|
rb.Push<u8>(boss->new_arrival_flag);
|
|
|
|
LOG_WARNING(Service_BOSS, "(STUBBED) new_arrival_flag={}", boss->new_arrival_flag);
|
|
}
|
|
|
|
void Module::Interface::RegisterNewArrivalEvent(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
[[maybe_unused]] const auto event = rp.PopObject<Kernel::Event>();
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
|
|
rb.Push(RESULT_SUCCESS);
|
|
|
|
LOG_WARNING(Service_BOSS, "(STUBBED)");
|
|
}
|
|
|
|
void Module::Interface::SetOptoutFlag(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
boss->output_flag = rp.Pop<u8>();
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
|
|
rb.Push(RESULT_SUCCESS);
|
|
|
|
LOG_WARNING(Service_BOSS, "output_flag={}", boss->output_flag);
|
|
}
|
|
|
|
void Module::Interface::GetOptoutFlag(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(2, 0);
|
|
rb.Push(RESULT_SUCCESS);
|
|
rb.Push<u8>(boss->output_flag);
|
|
|
|
LOG_WARNING(Service_BOSS, "output_flag={}", boss->output_flag);
|
|
}
|
|
|
|
void Module::Interface::RegisterTask(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
const u32 size = rp.Pop<u32>();
|
|
const u8 unk_param2 = rp.Pop<u8>();
|
|
const u8 unk_param3 = rp.Pop<u8>();
|
|
auto& buffer = rp.PopMappedBuffer();
|
|
|
|
const auto online_service = GetSessionService(ctx);
|
|
if (online_service == nullptr) {
|
|
return;
|
|
}
|
|
online_service->RegisterTask(size, buffer);
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(1, 2);
|
|
rb.Push(RESULT_SUCCESS);
|
|
rb.PushMappedBuffer(buffer);
|
|
|
|
LOG_DEBUG(Service_BOSS, "called, size={:#010x}, unk_param2={:#04x}, unk_param3={:#04x}", size,
|
|
unk_param2, unk_param3);
|
|
}
|
|
|
|
void Module::Interface::UnregisterTask(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
const u32 size = rp.Pop<u32>();
|
|
const u8 unk_param2 = rp.Pop<u8>();
|
|
auto& buffer = rp.PopMappedBuffer();
|
|
|
|
const auto online_service = GetSessionService(ctx);
|
|
if (online_service == nullptr) {
|
|
return;
|
|
}
|
|
const auto result = online_service->UnregisterTask(size, buffer);
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(1, 2);
|
|
rb.Push(result);
|
|
rb.PushMappedBuffer(buffer);
|
|
|
|
LOG_DEBUG(Service_BOSS, "called, size={:#010x}, unk_param2={:#04x}", size, unk_param2);
|
|
}
|
|
|
|
void Module::Interface::ReconfigureTask(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
const u32 size = rp.Pop<u32>();
|
|
const u8 unk_param2 = rp.Pop<u8>();
|
|
auto& buffer = rp.PopMappedBuffer();
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(1, 2);
|
|
rb.Push(RESULT_SUCCESS);
|
|
rb.PushMappedBuffer(buffer);
|
|
|
|
LOG_WARNING(Service_BOSS, "(STUBBED) size={:#010x}, unk_param2={:#04x}", size, unk_param2);
|
|
}
|
|
|
|
void Module::Interface::GetTaskIdList(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
|
|
const auto online_service = GetSessionService(ctx);
|
|
if (online_service == nullptr) {
|
|
return;
|
|
}
|
|
online_service->GetTaskIdList();
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
|
|
rb.Push(RESULT_SUCCESS);
|
|
|
|
LOG_DEBUG(Service_BOSS, "called");
|
|
}
|
|
|
|
void Module::Interface::GetStepIdList(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
const u32 size = rp.Pop<u32>();
|
|
auto& buffer = rp.PopMappedBuffer();
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(1, 2);
|
|
rb.Push(RESULT_SUCCESS);
|
|
rb.PushMappedBuffer(buffer);
|
|
|
|
LOG_WARNING(Service_BOSS, "(STUBBED) size={:#010x}", size);
|
|
}
|
|
|
|
void Module::Interface::GetNsDataIdList(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
const u32 filter = rp.Pop<u32>();
|
|
const u32 max_entries = rp.Pop<u32>(); /// buffer size in words
|
|
const u16 word_index_start = rp.Pop<u16>();
|
|
const u32 start_ns_data_id = rp.Pop<u32>();
|
|
auto& buffer = rp.PopMappedBuffer();
|
|
|
|
const auto online_service = GetSessionService(ctx);
|
|
if (online_service == nullptr) {
|
|
return;
|
|
}
|
|
const u16 entries_count = online_service->GetNsDataIdList(filter, max_entries, buffer);
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(3, 2);
|
|
rb.Push(RESULT_SUCCESS);
|
|
rb.Push<u16>(entries_count); /// Actual number of output entries
|
|
rb.Push<u16>(0); /// Last word-index copied to output in the internal NsDataId list.
|
|
rb.PushMappedBuffer(buffer);
|
|
|
|
LOG_DEBUG(Service_BOSS,
|
|
"filter={:#010x}, max_entries={:#010x}, "
|
|
"word_index_start={:#06x}, start_ns_data_id={:#010x}",
|
|
filter, max_entries, word_index_start, start_ns_data_id);
|
|
}
|
|
|
|
void Module::Interface::GetNsDataIdList1(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
const u32 filter = rp.Pop<u32>();
|
|
const u32 max_entries = rp.Pop<u32>(); /// buffer size in words
|
|
const u16 word_index_start = rp.Pop<u16>();
|
|
const u32 start_ns_data_id = rp.Pop<u32>();
|
|
auto& buffer = rp.PopMappedBuffer();
|
|
|
|
const auto online_service = GetSessionService(ctx);
|
|
if (online_service == nullptr) {
|
|
return;
|
|
}
|
|
const u16 entries_count = online_service->GetNsDataIdList(filter, max_entries, buffer);
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(3, 2);
|
|
rb.Push(RESULT_SUCCESS);
|
|
rb.Push<u16>(entries_count); /// Actual number of output entries
|
|
rb.Push<u16>(0); /// Last word-index copied to output in the internal NsDataId list.
|
|
rb.PushMappedBuffer(buffer);
|
|
|
|
LOG_DEBUG(Service_BOSS,
|
|
"filter={:#010x}, max_entries={:#010x}, "
|
|
"word_index_start={:#06x}, start_ns_data_id={:#010x}",
|
|
filter, max_entries, word_index_start, start_ns_data_id);
|
|
}
|
|
|
|
void Module::Interface::GetNsDataIdList2(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
const u32 filter = rp.Pop<u32>();
|
|
const u32 max_entries = rp.Pop<u32>(); /// buffer size in words
|
|
const u16 word_index_start = rp.Pop<u16>();
|
|
const u32 start_ns_data_id = rp.Pop<u32>();
|
|
auto& buffer = rp.PopMappedBuffer();
|
|
|
|
const auto online_service = GetSessionService(ctx);
|
|
if (online_service == nullptr) {
|
|
return;
|
|
}
|
|
const u16 entries_count = online_service->GetNsDataIdList(filter, max_entries, buffer);
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(3, 2);
|
|
rb.Push(RESULT_SUCCESS);
|
|
rb.Push<u16>(entries_count); /// Actual number of output entries
|
|
rb.Push<u16>(0); /// Last word-index copied to output in the internal NsDataId list.
|
|
rb.PushMappedBuffer(buffer);
|
|
|
|
LOG_DEBUG(Service_BOSS,
|
|
"filter={:#010x}, max_entries={:#010x}, "
|
|
"word_index_start={:#06x}, start_ns_data_id={:#010x}",
|
|
filter, max_entries, word_index_start, start_ns_data_id);
|
|
}
|
|
|
|
void Module::Interface::GetNsDataIdList3(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
const u32 filter = rp.Pop<u32>();
|
|
const u32 max_entries = rp.Pop<u32>(); /// buffer size in words
|
|
const u16 word_index_start = rp.Pop<u16>();
|
|
const u32 start_ns_data_id = rp.Pop<u32>();
|
|
auto& buffer = rp.PopMappedBuffer();
|
|
|
|
const auto online_service = GetSessionService(ctx);
|
|
if (online_service == nullptr) {
|
|
return;
|
|
}
|
|
const u16 entries_count = online_service->GetNsDataIdList(filter, max_entries, buffer);
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(3, 2);
|
|
rb.Push(RESULT_SUCCESS);
|
|
rb.Push<u16>(entries_count); /// Actual number of output entries
|
|
rb.Push<u16>(0); /// Last word-index copied to output in the internal NsDataId list.
|
|
rb.PushMappedBuffer(buffer);
|
|
|
|
LOG_DEBUG(Service_BOSS,
|
|
"filter={:#010x}, max_entries={:#010x}, "
|
|
"word_index_start={:#06x}, start_ns_data_id={:#010x}",
|
|
filter, max_entries, word_index_start, start_ns_data_id);
|
|
}
|
|
|
|
void Module::Interface::SendProperty(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
const u16 property_id = rp.Pop<u16>();
|
|
const u32 size = rp.Pop<u32>();
|
|
auto& buffer = rp.PopMappedBuffer();
|
|
|
|
const auto online_service = GetSessionService(ctx);
|
|
if (online_service == nullptr) {
|
|
return;
|
|
}
|
|
const auto result = online_service->SendProperty(property_id, size, buffer);
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(1, 2);
|
|
rb.Push(result);
|
|
rb.PushMappedBuffer(buffer);
|
|
|
|
LOG_DEBUG(Service_BOSS, "property_id={:#06x}, size={:#010x}", property_id, size);
|
|
}
|
|
|
|
void Module::Interface::SendPropertyHandle(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
const u16 property_id = rp.Pop<u16>();
|
|
[[maybe_unused]] const std::shared_ptr<Kernel::Object> object = rp.PopGenericObject();
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
|
|
rb.Push(RESULT_SUCCESS);
|
|
|
|
LOG_WARNING(Service_BOSS, "(STUBBED) property_id={:#06x}", property_id);
|
|
}
|
|
|
|
void Module::Interface::ReceiveProperty(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
const u16 property_id = rp.Pop<u16>();
|
|
const u32 size = rp.Pop<u32>();
|
|
auto& buffer = rp.PopMappedBuffer();
|
|
|
|
const auto online_service = GetSessionService(ctx);
|
|
if (online_service == nullptr) {
|
|
return;
|
|
}
|
|
const auto result = online_service->ReceiveProperty(property_id, size, buffer);
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(2, 2);
|
|
rb.Push(result);
|
|
rb.Push<u32>(size);
|
|
rb.PushMappedBuffer(buffer);
|
|
|
|
LOG_DEBUG(Service_BOSS, "property_id={:#06x}, size={:#010x}", property_id, size);
|
|
}
|
|
|
|
void Module::Interface::UpdateTaskInterval(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
const u32 size = rp.Pop<u32>();
|
|
const u16 unk_param2 = rp.Pop<u16>();
|
|
auto& buffer = rp.PopMappedBuffer();
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(1, 2);
|
|
rb.Push(RESULT_SUCCESS);
|
|
rb.PushMappedBuffer(buffer);
|
|
|
|
LOG_WARNING(Service_BOSS, "(STUBBED) size={:#010x}, unk_param2={:#06x}", size, unk_param2);
|
|
}
|
|
|
|
void Module::Interface::UpdateTaskCount(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
const u32 size = rp.Pop<u32>();
|
|
const u32 unk_param2 = rp.Pop<u32>();
|
|
auto& buffer = rp.PopMappedBuffer();
|
|
|
|
std::string task_id(size, 0);
|
|
buffer.Read(task_id.data(), 0, size);
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(1, 2);
|
|
rb.Push(RESULT_SUCCESS);
|
|
rb.PushMappedBuffer(buffer);
|
|
|
|
LOG_WARNING(Service_BOSS, "(STUBBED) size={:#010x}, unk_param2={:#010x}, task_id={}", size,
|
|
unk_param2, task_id);
|
|
}
|
|
|
|
void Module::Interface::GetTaskInterval(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
const u32 size = rp.Pop<u32>();
|
|
auto& buffer = rp.PopMappedBuffer();
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(2, 2);
|
|
rb.Push(RESULT_SUCCESS);
|
|
rb.Push<u32>(0); // stub 0 ( 32bit value)
|
|
rb.PushMappedBuffer(buffer);
|
|
|
|
LOG_WARNING(Service_BOSS, "(STUBBED) size={:#010x}", size);
|
|
}
|
|
|
|
void Module::Interface::GetTaskCount(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
const u32 size = rp.Pop<u32>();
|
|
auto& buffer = rp.PopMappedBuffer();
|
|
|
|
std::string task_id(size, 0);
|
|
buffer.Read(task_id.data(), 0, size);
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(2, 2);
|
|
rb.Push(RESULT_SUCCESS);
|
|
rb.Push<u32>(0); // stub 0 ( 32bit value)
|
|
rb.PushMappedBuffer(buffer);
|
|
|
|
LOG_WARNING(Service_BOSS, "(STUBBED) size={:#010x}, task_id={}", size, task_id);
|
|
}
|
|
|
|
void Module::Interface::GetTaskServiceStatus(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
const u32 size = rp.Pop<u32>();
|
|
auto& buffer = rp.PopMappedBuffer();
|
|
|
|
// Not sure what this is but it's not the task status. Maybe it's the status of the service
|
|
// after running the task?
|
|
constexpr u8 task_service_status = 1;
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(2, 2);
|
|
rb.Push(RESULT_SUCCESS);
|
|
rb.Push<u8>(task_service_status);
|
|
rb.PushMappedBuffer(buffer);
|
|
|
|
LOG_WARNING(Service_BOSS, "(STUBBED) size={:#010x}", size);
|
|
}
|
|
|
|
void Module::Interface::StartTask(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
const u32 size = rp.Pop<u32>();
|
|
auto& buffer = rp.PopMappedBuffer();
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(1, 2);
|
|
rb.Push(RESULT_SUCCESS);
|
|
rb.PushMappedBuffer(buffer);
|
|
|
|
LOG_WARNING(Service_BOSS, "(STUBBED) size={:#010x}", size);
|
|
}
|
|
|
|
void Module::Interface::StartTaskImmediate(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
const u32 size = rp.Pop<u32>();
|
|
auto& buffer = rp.PopMappedBuffer();
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(1, 2);
|
|
rb.Push(RESULT_SUCCESS);
|
|
rb.PushMappedBuffer(buffer);
|
|
|
|
LOG_WARNING(Service_BOSS, "(STUBBED) size={:#010x}", size);
|
|
}
|
|
|
|
void Module::Interface::CancelTask(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
const u32 size = rp.Pop<u32>();
|
|
auto& buffer = rp.PopMappedBuffer();
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(1, 2);
|
|
rb.Push(RESULT_SUCCESS);
|
|
rb.PushMappedBuffer(buffer);
|
|
|
|
LOG_WARNING(Service_BOSS, "(STUBBED) size={:#010x}", size);
|
|
}
|
|
|
|
void Module::Interface::GetTaskFinishHandle(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(1, 2);
|
|
rb.Push(RESULT_SUCCESS);
|
|
rb.PushCopyObjects<Kernel::Event>(boss->task_finish_event);
|
|
|
|
LOG_WARNING(Service_BOSS, "(STUBBED) called");
|
|
}
|
|
|
|
void Module::Interface::GetTaskState(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
const u32 size = rp.Pop<u32>();
|
|
const u8 state = rp.Pop<u8>();
|
|
auto& buffer = rp.PopMappedBuffer();
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(4, 2);
|
|
rb.Push(RESULT_SUCCESS);
|
|
rb.Push<u8>(0); /// TaskStatus
|
|
rb.Push<u32>(0); /// Current state value for task PropertyID 0x4
|
|
rb.Push<u8>(0); /// unknown, usually 0
|
|
rb.PushMappedBuffer(buffer);
|
|
|
|
LOG_WARNING(Service_BOSS, "(STUBBED) size={:#010x}, state={:#06x}", size, state);
|
|
}
|
|
|
|
void Module::Interface::GetTaskResult(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
const u32 size = rp.Pop<u32>();
|
|
auto& buffer = rp.PopMappedBuffer();
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(4, 2);
|
|
rb.Push(RESULT_SUCCESS);
|
|
rb.Push<u8>(0); // stub 0 (8 bit value)
|
|
rb.Push<u32>(0); // stub 0 (32 bit value)
|
|
rb.Push<u8>(0); // stub 0 (8 bit value)
|
|
rb.PushMappedBuffer(buffer);
|
|
|
|
LOG_WARNING(Service_BOSS, "(STUBBED) size={:#010x}", size);
|
|
}
|
|
|
|
void Module::Interface::GetTaskCommErrorCode(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
const u32 size = rp.Pop<u32>();
|
|
auto& buffer = rp.PopMappedBuffer();
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(4, 2);
|
|
rb.Push(RESULT_SUCCESS);
|
|
rb.Push<u32>(0); // stub 0 (32 bit value)
|
|
rb.Push<u32>(0); // stub 0 (32 bit value)
|
|
rb.Push<u8>(0); // stub 0 (8 bit value)
|
|
rb.PushMappedBuffer(buffer);
|
|
|
|
LOG_WARNING(Service_BOSS, "(STUBBED) size={:#010x}", size);
|
|
}
|
|
|
|
void Module::Interface::GetTaskStatus(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
const u32 size = rp.Pop<u32>();
|
|
const u8 unk_param2 = rp.Pop<u8>();
|
|
const u8 unk_param3 = rp.Pop<u8>();
|
|
auto& buffer = rp.PopMappedBuffer();
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(2, 2);
|
|
rb.Push(RESULT_SUCCESS);
|
|
rb.Push<u8>(0); // stub 0 (8 bit value)
|
|
rb.PushMappedBuffer(buffer);
|
|
|
|
LOG_WARNING(Service_BOSS, "(STUBBED) size={:#010x}, unk_param2={:#04x}, unk_param3={:#04x}",
|
|
size, unk_param2, unk_param3);
|
|
}
|
|
|
|
void Module::Interface::GetTaskError(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
const u32 size = rp.Pop<u32>();
|
|
const u8 unk_param2 = rp.Pop<u8>();
|
|
auto& buffer = rp.PopMappedBuffer();
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(2, 2);
|
|
rb.Push(RESULT_SUCCESS);
|
|
rb.Push<u8>(0); // stub 0 (8 bit value)
|
|
rb.PushMappedBuffer(buffer);
|
|
|
|
LOG_WARNING(Service_BOSS, "(STUBBED) size={:#010x}, unk_param2={:#04x}", size, unk_param2);
|
|
}
|
|
|
|
void Module::Interface::GetTaskInfo(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
const u32 size = rp.Pop<u32>();
|
|
const u8 unk_param2 = rp.Pop<u8>();
|
|
auto& buffer = rp.PopMappedBuffer();
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(1, 2);
|
|
rb.Push(RESULT_SUCCESS);
|
|
rb.PushMappedBuffer(buffer);
|
|
|
|
LOG_WARNING(Service_BOSS, "(STUBBED) size={:#010x}, unk_param2={:#04x}", size, unk_param2);
|
|
}
|
|
|
|
void Module::Interface::DeleteNsData(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
const u32 ns_data_id = rp.Pop<u32>();
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
|
|
rb.Push(RESULT_SUCCESS);
|
|
|
|
LOG_WARNING(Service_BOSS, "(STUBBED) ns_data_id={:#010x}", ns_data_id);
|
|
}
|
|
|
|
void Module::Interface::GetNsDataHeaderInfo(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
const auto ns_data_id = rp.Pop<u32>();
|
|
const auto type = rp.PopEnum<NsDataHeaderInfoType>();
|
|
const auto size = rp.Pop<u32>();
|
|
auto& buffer = rp.PopMappedBuffer();
|
|
|
|
const auto online_service = GetSessionService(ctx);
|
|
if (online_service == nullptr) {
|
|
return;
|
|
}
|
|
const auto result = online_service->GetNsDataHeaderInfo(ns_data_id, type, size, buffer);
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(1, 2);
|
|
rb.Push(result);
|
|
rb.PushMappedBuffer(buffer);
|
|
|
|
LOG_DEBUG(Service_BOSS, "called, ns_data_id={:#010x}, type={:#04x}, size={:#010x}", ns_data_id,
|
|
type, size);
|
|
}
|
|
|
|
void Module::Interface::ReadNsData(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
const auto ns_data_id = rp.Pop<u32>();
|
|
const auto offset = rp.Pop<u64>();
|
|
const auto size = rp.Pop<u32>();
|
|
auto& buffer = rp.PopMappedBuffer();
|
|
|
|
const auto online_service = GetSessionService(ctx);
|
|
if (online_service == nullptr) {
|
|
return;
|
|
}
|
|
const auto result = online_service->ReadNsData(ns_data_id, offset, size, buffer);
|
|
|
|
if (result.Succeeded()) {
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(3, 2);
|
|
rb.Push(result.Code());
|
|
rb.Push<u32>(static_cast<u32>(result.Unwrap()));
|
|
rb.Push<u32>(0); /// unknown
|
|
rb.PushMappedBuffer(buffer);
|
|
} else {
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
|
|
rb.Push(result.Code());
|
|
}
|
|
|
|
LOG_DEBUG(Service_BOSS, "called, ns_data_id={:#010x}, offset={:#018x}, size={:#010x}",
|
|
ns_data_id, offset, size);
|
|
}
|
|
|
|
void Module::Interface::SetNsDataAdditionalInfo(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
const u32 unk_param1 = rp.Pop<u32>();
|
|
const u32 unk_param2 = rp.Pop<u32>();
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
|
|
rb.Push(RESULT_SUCCESS);
|
|
|
|
LOG_WARNING(Service_BOSS, "(STUBBED) unk_param1={:#010x}, unk_param2={:#010x}", unk_param1,
|
|
unk_param2);
|
|
}
|
|
|
|
void Module::Interface::GetNsDataAdditionalInfo(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
const u32 unk_param1 = rp.Pop<u32>();
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(2, 0);
|
|
rb.Push(RESULT_SUCCESS);
|
|
rb.Push<u32>(0); // stub 0 (32bit value)
|
|
|
|
LOG_WARNING(Service_BOSS, "(STUBBED) unk_param1={:#010x}", unk_param1);
|
|
}
|
|
|
|
void Module::Interface::SetNsDataNewFlag(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
const u32 unk_param1 = rp.Pop<u32>();
|
|
boss->ns_data_new_flag = rp.Pop<u8>();
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
|
|
rb.Push(RESULT_SUCCESS);
|
|
|
|
LOG_WARNING(Service_BOSS, "(STUBBED) unk_param1={:#010x}, ns_data_new_flag={:#04x}", unk_param1,
|
|
boss->ns_data_new_flag);
|
|
}
|
|
|
|
void Module::Interface::GetNsDataNewFlag(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
const u32 unk_param1 = rp.Pop<u32>();
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(2, 0);
|
|
rb.Push(RESULT_SUCCESS);
|
|
rb.Push<u8>(boss->ns_data_new_flag);
|
|
|
|
LOG_WARNING(Service_BOSS, "(STUBBED) unk_param1={:#010x}, ns_data_new_flag={:#04x}", unk_param1,
|
|
boss->ns_data_new_flag);
|
|
}
|
|
|
|
void Module::Interface::GetNsDataLastUpdate(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
const u32 ns_data_id = rp.Pop<u32>();
|
|
|
|
const auto online_service = GetSessionService(ctx);
|
|
if (online_service == nullptr) {
|
|
return;
|
|
}
|
|
|
|
const auto entry = online_service->GetNsDataEntryFromId(ns_data_id);
|
|
if (!entry.has_value()) {
|
|
// TODO: Proper error code.
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
|
|
rb.Push(RESULT_UNKNOWN);
|
|
return;
|
|
}
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(3, 0);
|
|
rb.Push(RESULT_SUCCESS);
|
|
rb.Push<u32>(0);
|
|
rb.Push<u32>(entry->header.download_date); // return the download date from the ns data
|
|
|
|
LOG_DEBUG(Service_BOSS, "called, ns_data_id={:#010X}", ns_data_id);
|
|
}
|
|
|
|
void Module::Interface::GetErrorCode(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
const u8 input = rp.Pop<u8>();
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(2, 0);
|
|
rb.Push(RESULT_SUCCESS);
|
|
rb.Push<u32>(0); /// output value
|
|
|
|
LOG_WARNING(Service_BOSS, "(STUBBED) input={:#010x}", input);
|
|
}
|
|
|
|
void Module::Interface::RegisterStorageEntry(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
const u32 unk_param1 = rp.Pop<u32>();
|
|
const u32 unk_param2 = rp.Pop<u32>();
|
|
const u32 unk_param3 = rp.Pop<u32>();
|
|
const u32 unk_param4 = rp.Pop<u32>();
|
|
const u8 unk_param5 = rp.Pop<u8>();
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
|
|
rb.Push(RESULT_SUCCESS);
|
|
|
|
LOG_WARNING(Service_BOSS,
|
|
"(STUBBED) unk_param1={:#010x}, unk_param2={:#010x}, unk_param3={:#010x}, "
|
|
"unk_param4={:#010x}, unk_param5={:#04x}",
|
|
unk_param1, unk_param2, unk_param3, unk_param4, unk_param5);
|
|
}
|
|
|
|
void Module::Interface::GetStorageEntryInfo(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(3, 0);
|
|
rb.Push(RESULT_SUCCESS);
|
|
rb.Push<u32>(0); // stub 0 (32bit value)
|
|
rb.Push<u16>(0); // stub 0 (16bit value)
|
|
|
|
LOG_WARNING(Service_BOSS, "(STUBBED) called");
|
|
}
|
|
|
|
void Module::Interface::SetStorageOption(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
const u8 unk_param1 = rp.Pop<u8>();
|
|
const u32 unk_param2 = rp.Pop<u32>();
|
|
const u16 unk_param3 = rp.Pop<u16>();
|
|
const u16 unk_param4 = rp.Pop<u16>();
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
|
|
rb.Push(RESULT_SUCCESS);
|
|
|
|
LOG_WARNING(Service_BOSS,
|
|
"(STUBBED) unk_param1={:#04x}, unk_param2={:#010x}, "
|
|
"unk_param3={:#08x}, unk_param4={:#08x}",
|
|
unk_param1, unk_param2, unk_param3, unk_param4);
|
|
}
|
|
|
|
void Module::Interface::GetStorageOption(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(5, 0);
|
|
rb.Push(RESULT_SUCCESS);
|
|
rb.Push<u32>(0); // stub 0 (32bit value)
|
|
rb.Push<u8>(0); // stub 0 (8bit value)
|
|
rb.Push<u16>(0); // stub 0 (16bit value)
|
|
rb.Push<u16>(0); // stub 0 (16bit value)
|
|
|
|
LOG_WARNING(Service_BOSS, "(STUBBED) called");
|
|
}
|
|
|
|
void Module::Interface::StartBgImmediate(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
const u32 size = rp.Pop<u32>();
|
|
auto& buffer = rp.PopMappedBuffer();
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(1, 2);
|
|
rb.Push(RESULT_SUCCESS);
|
|
rb.PushMappedBuffer(buffer);
|
|
|
|
LOG_WARNING(Service_BOSS, "(STUBBED) size={:#010x}", size);
|
|
}
|
|
|
|
void Module::Interface::GetTaskProperty0(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
const u32 size = rp.Pop<u32>();
|
|
auto& buffer = rp.PopMappedBuffer();
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(2, 2);
|
|
rb.Push(RESULT_SUCCESS);
|
|
rb.Push<u8>(0); /// current state of PropertyID 0x0 stub 0 (8bit value)
|
|
rb.PushMappedBuffer(buffer);
|
|
|
|
LOG_WARNING(Service_BOSS, "(STUBBED) size={:#010x}", size);
|
|
}
|
|
|
|
void Module::Interface::RegisterImmediateTask(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
const u32 size = rp.Pop<u32>();
|
|
const u8 unk_param2 = rp.Pop<u8>();
|
|
const u8 unk_param3 = rp.Pop<u8>();
|
|
auto& buffer = rp.PopMappedBuffer();
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(1, 2);
|
|
rb.Push(RESULT_SUCCESS);
|
|
rb.PushMappedBuffer(buffer);
|
|
|
|
LOG_WARNING(Service_BOSS, "(STUBBED) size={:#010x}, unk_param2={:#04x}, unk_param3={:#04x}",
|
|
size, unk_param2, unk_param3);
|
|
}
|
|
|
|
void Module::Interface::SetTaskQuery(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
const u32 buffer1_size = rp.Pop<u32>();
|
|
const u32 buffer2_size = rp.Pop<u32>();
|
|
auto& buffer1 = rp.PopMappedBuffer();
|
|
auto& buffer2 = rp.PopMappedBuffer();
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(1, 4);
|
|
rb.Push(RESULT_SUCCESS);
|
|
rb.PushMappedBuffer(buffer1);
|
|
rb.PushMappedBuffer(buffer2);
|
|
|
|
LOG_WARNING(Service_BOSS, "(STUBBED) buffer1_size={:#010x}, buffer2_size={:#010x}",
|
|
buffer1_size, buffer2_size);
|
|
}
|
|
|
|
void Module::Interface::GetTaskQuery(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
const u32 buffer1_size = rp.Pop<u32>();
|
|
const u32 buffer2_size = rp.Pop<u32>();
|
|
auto& buffer1 = rp.PopMappedBuffer();
|
|
auto& buffer2 = rp.PopMappedBuffer();
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(1, 4);
|
|
rb.Push(RESULT_SUCCESS);
|
|
rb.PushMappedBuffer(buffer1);
|
|
rb.PushMappedBuffer(buffer2);
|
|
|
|
LOG_WARNING(Service_BOSS, "(STUBBED) buffer1_size={:#010x}, buffer2_size={:#010x}",
|
|
buffer1_size, buffer2_size);
|
|
}
|
|
|
|
void Module::Interface::InitializeSessionPrivileged(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
const u64 programID = rp.Pop<u64>();
|
|
rp.PopPID();
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
|
|
rb.Push(RESULT_SUCCESS);
|
|
|
|
LOG_WARNING(Service_BOSS, "(STUBBED) programID={:#018x}", programID);
|
|
}
|
|
|
|
void Module::Interface::GetAppNewFlag(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
const u64 programID = rp.Pop<u64>();
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(2, 0);
|
|
rb.Push(RESULT_SUCCESS);
|
|
rb.Push<u8>(0); // 0 = nothing new, 1 = new content
|
|
|
|
LOG_WARNING(Service_BOSS, "(STUBBED) programID={:#018x}", programID);
|
|
}
|
|
|
|
void Module::Interface::GetNsDataIdListPrivileged(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
const u64 programID = rp.Pop<u64>();
|
|
const u32 filter = rp.Pop<u32>();
|
|
const u32 max_entries = rp.Pop<u32>(); /// buffer size in words
|
|
const u16 word_index_start = rp.Pop<u16>();
|
|
const u32 start_ns_data_id = rp.Pop<u32>();
|
|
auto& buffer = rp.PopMappedBuffer();
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(3, 2);
|
|
rb.Push(RESULT_SUCCESS);
|
|
rb.Push<u16>(0); /// Actual number of output entries
|
|
rb.Push<u16>(0); /// Last word-index copied to output in the internal NsDataId list.
|
|
rb.PushMappedBuffer(buffer);
|
|
|
|
LOG_WARNING(Service_BOSS,
|
|
"(STUBBED) programID={:#018x}, filter={:#010x}, max_entries={:#010x}, "
|
|
"word_index_start={:#06x}, start_ns_data_id={:#010x}",
|
|
programID, filter, max_entries, word_index_start, start_ns_data_id);
|
|
}
|
|
|
|
void Module::Interface::GetNsDataIdListPrivileged1(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
const u64 programID = rp.Pop<u64>();
|
|
const u32 filter = rp.Pop<u32>();
|
|
const u32 max_entries = rp.Pop<u32>(); /// buffer size in words
|
|
const u16 word_index_start = rp.Pop<u16>();
|
|
const u32 start_ns_data_id = rp.Pop<u32>();
|
|
auto& buffer = rp.PopMappedBuffer();
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(3, 2);
|
|
rb.Push(RESULT_SUCCESS);
|
|
rb.Push<u16>(0); /// Actual number of output entries
|
|
rb.Push<u16>(0); /// Last word-index copied to output in the internal NsDataId list.
|
|
rb.PushMappedBuffer(buffer);
|
|
|
|
LOG_WARNING(Service_BOSS,
|
|
"(STUBBED) programID={:#018x}, filter={:#010x}, max_entries={:#010x}, "
|
|
"word_index_start={:#06x}, start_ns_data_id={:#010x}",
|
|
programID, filter, max_entries, word_index_start, start_ns_data_id);
|
|
}
|
|
|
|
void Module::Interface::SendPropertyPrivileged(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
const u16 property_id = rp.Pop<u16>();
|
|
const u32 size = rp.Pop<u32>();
|
|
auto& buffer = rp.PopMappedBuffer();
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(1, 2);
|
|
rb.Push(RESULT_SUCCESS);
|
|
rb.PushMappedBuffer(buffer);
|
|
|
|
LOG_WARNING(Service_BOSS, "(STUBBED) property_id={:#06x}, size={:#010x}", property_id, size);
|
|
}
|
|
|
|
void Module::Interface::DeleteNsDataPrivileged(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
const u64 programID = rp.Pop<u64>();
|
|
const u32 ns_data_id = rp.Pop<u32>();
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
|
|
rb.Push(RESULT_SUCCESS);
|
|
|
|
LOG_WARNING(Service_BOSS, "(STUBBED) programID={:#018x}, ns_data_id={:#010x}", programID,
|
|
ns_data_id);
|
|
}
|
|
|
|
void Module::Interface::GetNsDataHeaderInfoPrivileged(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
const u64 programID = rp.Pop<u64>();
|
|
const u32 ns_data_id = rp.Pop<u32>();
|
|
const u8 type = rp.Pop<u8>();
|
|
const u32 size = rp.Pop<u32>();
|
|
auto& buffer = rp.PopMappedBuffer();
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(1, 2);
|
|
rb.Push(RESULT_SUCCESS);
|
|
rb.PushMappedBuffer(buffer);
|
|
|
|
LOG_WARNING(Service_BOSS,
|
|
"(STUBBED) programID={:#018x} ns_data_id={:#010x}, type={:#04x}, size={:#010x}",
|
|
programID, ns_data_id, type, size);
|
|
}
|
|
|
|
void Module::Interface::ReadNsDataPrivileged(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
const u64 programID = rp.Pop<u64>();
|
|
const u32 ns_data_id = rp.Pop<u32>();
|
|
const u64 offset = rp.Pop<u64>();
|
|
const u32 size = rp.Pop<u32>();
|
|
auto& buffer = rp.PopMappedBuffer();
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(3, 2);
|
|
rb.Push(RESULT_SUCCESS);
|
|
rb.Push<u32>(size); /// Should be actual read size
|
|
rb.Push<u32>(0); /// unknown
|
|
rb.PushMappedBuffer(buffer);
|
|
|
|
LOG_WARNING(Service_BOSS,
|
|
"(STUBBED) programID={:#018x}, ns_data_id={:#010x}, offset={:#018x}, size={:#010x}",
|
|
programID, ns_data_id, offset, size);
|
|
}
|
|
|
|
void Module::Interface::SetNsDataNewFlagPrivileged(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
const u64 programID = rp.Pop<u64>();
|
|
const u32 unk_param1 = rp.Pop<u32>();
|
|
boss->ns_data_new_flag_privileged = rp.Pop<u8>();
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
|
|
rb.Push(RESULT_SUCCESS);
|
|
|
|
LOG_WARNING(
|
|
Service_BOSS,
|
|
"(STUBBED) programID={:#018x}, unk_param1={:#010x}, ns_data_new_flag_privileged={:#04x}",
|
|
programID, unk_param1, boss->ns_data_new_flag_privileged);
|
|
}
|
|
|
|
void Module::Interface::GetNsDataNewFlagPrivileged(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp(ctx);
|
|
const u64 programID = rp.Pop<u64>();
|
|
const u32 unk_param1 = rp.Pop<u32>();
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(2, 0);
|
|
rb.Push(RESULT_SUCCESS);
|
|
rb.Push<u8>(boss->ns_data_new_flag_privileged);
|
|
|
|
LOG_WARNING(
|
|
Service_BOSS,
|
|
"(STUBBED) programID={:#018x}, unk_param1={:#010x}, ns_data_new_flag_privileged={:#04x}",
|
|
programID, unk_param1, boss->ns_data_new_flag_privileged);
|
|
}
|
|
|
|
Module::Interface::Interface(std::shared_ptr<Module> boss, const char* name, u32 max_session)
|
|
: ServiceFramework(name, max_session), boss(std::move(boss)) {}
|
|
|
|
Module::Module(Core::System& system_) : system(system_) {
|
|
using namespace Kernel;
|
|
// TODO: verify ResetType
|
|
task_finish_event =
|
|
system.Kernel().CreateEvent(Kernel::ResetType::OneShot, "BOSS::task_finish_event");
|
|
}
|
|
|
|
void InstallInterfaces(Core::System& system) {
|
|
auto& service_manager = system.ServiceManager();
|
|
auto boss = std::make_shared<Module>(system);
|
|
std::make_shared<BOSS_P>(boss)->InstallAsService(service_manager);
|
|
std::make_shared<BOSS_U>(boss)->InstallAsService(service_manager);
|
|
}
|
|
|
|
} // namespace Service::BOSS
|