diff options
Diffstat (limited to 'src')
30 files changed, 1910 insertions, 85 deletions
diff --git a/src/audio_core/hle/dsp.cpp b/src/audio_core/hle/dsp.cpp index 58690970a..31421fdc6 100644 --- a/src/audio_core/hle/dsp.cpp +++ b/src/audio_core/hle/dsp.cpp @@ -23,12 +23,12 @@ static size_t CurrentRegionIndex() { // This function only returns a 0 or 1. if (g_regions[0].frame_counter == 0xFFFFu && g_regions[1].frame_counter != 0xFFFEu) { - // Wraparound has occured. + // Wraparound has occurred. return 1; } if (g_regions[1].frame_counter == 0xFFFFu && g_regions[0].frame_counter != 0xFFFEu) { - // Wraparound has occured. + // Wraparound has occurred. return 0; } diff --git a/src/audio_core/hle/pipe.cpp b/src/audio_core/hle/pipe.cpp index b472c81d8..bc69acbc2 100644 --- a/src/audio_core/hle/pipe.cpp +++ b/src/audio_core/hle/pipe.cpp @@ -117,7 +117,7 @@ void PipeWrite(DspPipe pipe_number, const std::vector<u8>& buffer) { } enum class StateChange { - Initalize = 0, + Initialize = 0, Shutdown = 1, Wakeup = 2, Sleep = 3, @@ -130,7 +130,7 @@ void PipeWrite(DspPipe pipe_number, const std::vector<u8>& buffer) { // sleeping and reset it back after wakeup on behalf of the DSP. switch (static_cast<StateChange>(buffer[0])) { - case StateChange::Initalize: + case StateChange::Initialize: LOG_INFO(Audio_DSP, "Application has requested initialization of DSP hardware"); ResetPipes(); AudioPipeWriteStructAddresses(); diff --git a/src/citra/CMakeLists.txt b/src/citra/CMakeLists.txt index 43fa06b4e..f9c488a1a 100644 --- a/src/citra/CMakeLists.txt +++ b/src/citra/CMakeLists.txt @@ -23,7 +23,7 @@ if (MSVC) endif() target_link_libraries(citra ${PLATFORM_LIBRARIES} Threads::Threads) -if(${CMAKE_SYSTEM_NAME} MATCHES "Linux|FreeBSD|OpenBSD|NetBSD") +if(UNIX AND NOT APPLE) install(TARGETS citra RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}/bin") endif() diff --git a/src/citra_qt/CMakeLists.txt b/src/citra_qt/CMakeLists.txt index b3c01ddd8..384875450 100644 --- a/src/citra_qt/CMakeLists.txt +++ b/src/citra_qt/CMakeLists.txt @@ -104,7 +104,7 @@ target_link_libraries(citra-qt core video_core audio_core common qhexedit) target_link_libraries(citra-qt ${OPENGL_gl_LIBRARY} ${CITRA_QT_LIBS}) target_link_libraries(citra-qt ${PLATFORM_LIBRARIES} Threads::Threads) -if(${CMAKE_SYSTEM_NAME} MATCHES "Linux|FreeBSD|OpenBSD|NetBSD") +if(UNIX AND NOT APPLE) install(TARGETS citra-qt RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}/bin") endif() diff --git a/src/citra_qt/debugger/graphics_vertex_shader.cpp b/src/citra_qt/debugger/graphics_vertex_shader.cpp index 0b4320da5..96b40db1e 100644 --- a/src/citra_qt/debugger/graphics_vertex_shader.cpp +++ b/src/citra_qt/debugger/graphics_vertex_shader.cpp @@ -424,7 +424,7 @@ GraphicsVertexShaderWidget::GraphicsVertexShaderWidget( // Create an HBoxLayout to store the widgets used to specify a particular attribute // and store it in a QWidget to allow for easy hiding and unhiding. auto row_layout = new QHBoxLayout; - // Remove unecessary padding between rows + // Remove unnecessary padding between rows row_layout->setContentsMargins(0, 0, 0, 0); row_layout->addWidget(new QLabel(tr("Attribute %1").arg(i, 2))); @@ -590,7 +590,7 @@ void GraphicsVertexShaderWidget::OnCycleIndexChanged(int index) { .arg(record.dest_out.w.ToFloat32()); if (record.mask & Pica::Shader::DebugDataRecord::ADDR_REG_OUT) - text += tr("Addres Registers: %1, %2\n") + text += tr("Address Registers: %1, %2\n") .arg(record.address_registers[0]) .arg(record.address_registers[1]); if (record.mask & Pica::Shader::DebugDataRecord::CMP_RESULT) diff --git a/src/citra_qt/debugger/registers.cpp b/src/citra_qt/debugger/registers.cpp index 0b644432f..4c529d3c3 100644 --- a/src/citra_qt/debugger/registers.cpp +++ b/src/citra_qt/debugger/registers.cpp @@ -136,7 +136,7 @@ void RegistersWidget::UpdateCPSRValues() { cpsr->child(2)->setText(1, QString::number((cpsr_val >> 6) & 1)); // F - FIQ disable cpsr->child(3)->setText(1, QString::number((cpsr_val >> 7) & 1)); // I - IRQ disable cpsr->child(4)->setText(1, QString::number((cpsr_val >> 8) & 1)); // A - Imprecise abort - cpsr->child(5)->setText(1, QString::number((cpsr_val >> 9) & 1)); // E - Data endianess + cpsr->child(5)->setText(1, QString::number((cpsr_val >> 9) & 1)); // E - Data endianness cpsr->child(6)->setText(1, QString::number((cpsr_val >> 10) & 0x3F)); // IT - If-Then state (DNM) cpsr->child(7)->setText(1, diff --git a/src/citra_qt/game_list_p.h b/src/citra_qt/game_list_p.h index 60ab4cf02..5ca3fe991 100644 --- a/src/citra_qt/game_list_p.h +++ b/src/citra_qt/game_list_p.h @@ -64,7 +64,7 @@ public: * A specialization of GameListItem for path values. * This class ensures that for every full path value it holds, a correct string representation * of just the filename (with no extension) will be displayed to the user. - * If this class recieves valid SMDH data, it will also display game icons and titles. + * If this class receives valid SMDH data, it will also display game icons and titles. */ class GameListItemPath : public GameListItem { diff --git a/src/common/file_util.cpp b/src/common/file_util.cpp index 14cbcac6b..407ed047a 100644 --- a/src/common/file_util.cpp +++ b/src/common/file_util.cpp @@ -23,8 +23,8 @@ #define fseeko _fseeki64 #define ftello _ftelli64 #define atoll _atoi64 -#define stat64 _stat64 -#define fstat64 _fstat64 +#define stat _stat64 +#define fstat _fstat64 #define fileno _fileno #else #ifdef __APPLE__ @@ -52,11 +52,6 @@ #define S_ISDIR(m) (((m)&S_IFMT) == S_IFDIR) #endif -#ifdef BSD4_4 -#define stat64 stat -#define fstat64 fstat -#endif - // This namespace has various generic functions related to files and paths. // The code still needs a ton of cleanup. // REMEMBER: strdup considered harmful! @@ -76,7 +71,7 @@ static void StripTailDirSlashes(std::string& fname) { // Returns true if file filename exists bool Exists(const std::string& filename) { - struct stat64 file_info; + struct stat file_info; std::string copy(filename); StripTailDirSlashes(copy); @@ -88,7 +83,7 @@ bool Exists(const std::string& filename) { int result = _wstat64(Common::UTF8ToUTF16W(copy).c_str(), &file_info); #else - int result = stat64(copy.c_str(), &file_info); + int result = stat(copy.c_str(), &file_info); #endif return (result == 0); @@ -96,7 +91,7 @@ bool Exists(const std::string& filename) { // Returns true if filename is a directory bool IsDirectory(const std::string& filename) { - struct stat64 file_info; + struct stat file_info; std::string copy(filename); StripTailDirSlashes(copy); @@ -108,7 +103,7 @@ bool IsDirectory(const std::string& filename) { int result = _wstat64(Common::UTF8ToUTF16W(copy).c_str(), &file_info); #else - int result = stat64(copy.c_str(), &file_info); + int result = stat(copy.c_str(), &file_info); #endif if (result < 0) { @@ -339,11 +334,11 @@ u64 GetSize(const std::string& filename) { return 0; } - struct stat64 buf; + struct stat buf; #ifdef _WIN32 if (_wstat64(Common::UTF8ToUTF16W(filename).c_str(), &buf) == 0) #else - if (stat64(filename.c_str(), &buf) == 0) + if (stat(filename.c_str(), &buf) == 0) #endif { LOG_TRACE(Common_Filesystem, "%s: %lld", filename.c_str(), (long long)buf.st_size); @@ -356,8 +351,8 @@ u64 GetSize(const std::string& filename) { // Overloaded GetSize, accepts file descriptor u64 GetSize(const int fd) { - struct stat64 buf; - if (fstat64(fd, &buf) != 0) { + struct stat buf; + if (fstat(fd, &buf) != 0) { LOG_ERROR(Common_Filesystem, "GetSize: stat failed %i: %s", fd, GetLastErrorMsg()); return 0; } diff --git a/src/common/hash.cpp b/src/common/hash.cpp index 5aa5118eb..2309320bb 100644 --- a/src/common/hash.cpp +++ b/src/common/hash.cpp @@ -31,7 +31,7 @@ static FORCE_INLINE u64 fmix64(u64 k) { return k; } -// This is the 128-bit variant of the MurmurHash3 hash function that is targetted for 64-bit +// This is the 128-bit variant of the MurmurHash3 hash function that is targeted for 64-bit // platforms (MurmurHash3_x64_128). It was taken from: // https://code.google.com/p/smhasher/source/browse/trunk/MurmurHash3.cpp void MurmurHash3_128(const void* key, int len, u32 seed, void* out) { diff --git a/src/common/logging/backend.cpp b/src/common/logging/backend.cpp index 9a13a9e90..88209081d 100644 --- a/src/common/logging/backend.cpp +++ b/src/common/logging/backend.cpp @@ -37,6 +37,7 @@ namespace Log { SUB(Service, FS) \ SUB(Service, ERR) \ SUB(Service, APT) \ + SUB(Service, BOSS) \ SUB(Service, GSP) \ SUB(Service, AC) \ SUB(Service, AM) \ diff --git a/src/common/logging/log.h b/src/common/logging/log.h index a4b4750de..8d3a2d03e 100644 --- a/src/common/logging/log.h +++ b/src/common/logging/log.h @@ -54,6 +54,7 @@ enum class Class : ClassType { Service_FS, ///< The FS (Filesystem) service implementation Service_ERR, ///< The ERR (Error) port implementation Service_APT, ///< The APT (Applets) service + Service_BOSS, ///< The BOSS (SpotPass) service Service_GSP, ///< The GSP (GPU control) service Service_AC, ///< The AC (WiFi status) service Service_AM, ///< The AM (Application manager) service diff --git a/src/common/logging/text_formatter.h b/src/common/logging/text_formatter.h index 0da102bc6..749268310 100644 --- a/src/common/logging/text_formatter.h +++ b/src/common/logging/text_formatter.h @@ -17,7 +17,7 @@ struct Entry; * * @param path The input file path as a null-terminated string * @param root The name of the root source directory as a null-terminated string. Path up to and - * including the last occurence of this name will be stripped + * including the last occurrence of this name will be stripped * @return A pointer to the same string passed as `path`, but starting at the trimmed portion */ const char* TrimSourcePath(const char* path, const char* root = "src"); diff --git a/src/common/swap.h b/src/common/swap.h index e241c9f73..d94cbe6b2 100644 --- a/src/common/swap.h +++ b/src/common/swap.h @@ -21,7 +21,8 @@ #include <cstdlib> #elif defined(__linux__) #include <byteswap.h> -#elif defined(__FreeBSD__) +#elif defined(__Bitrig__) || defined(__DragonFly__) || defined(__FreeBSD__) || \ + defined(__NetBSD__) || defined(__OpenBSD__) #include <sys/endian.h> #endif #include <cstring> @@ -101,7 +102,9 @@ inline __attribute__((always_inline)) u32 swap32(u32 _data) { inline __attribute__((always_inline)) u64 swap64(u64 _data) { return __builtin_bswap64(_data); } -#elif __FreeBSD__ +#elif defined(__Bitrig__) || defined(__OpenBSD__) +// swap16, swap32, swap64 are left as is +#elif defined(__DragonFly__) || defined(__FreeBSD__) || defined(__NetBSD__) inline u16 swap16(u16 _data) { return bswap16(_data); } diff --git a/src/common/thread.cpp b/src/common/thread.cpp index 6e7b39b9a..9bb2f4e1d 100644 --- a/src/common/thread.cpp +++ b/src/common/thread.cpp @@ -8,7 +8,7 @@ #elif defined(_WIN32) #include <Windows.h> #else -#if defined(BSD4_4) || defined(__OpenBSD__) +#if defined(__Bitrig__) || defined(__DragonFly__) || defined(__FreeBSD__) || defined(__OpenBSD__) #include <pthread_np.h> #else #include <pthread.h> @@ -19,6 +19,10 @@ #include <unistd.h> #endif +#ifdef __FreeBSD__ +#define cpu_set_t cpuset_t +#endif + namespace Common { int CurrentThreadId() { @@ -86,7 +90,7 @@ void SetCurrentThreadName(const char* szThreadName) { void SetThreadAffinity(std::thread::native_handle_type thread, u32 mask) { #ifdef __APPLE__ thread_policy_set(pthread_mach_thread_np(thread), THREAD_AFFINITY_POLICY, (integer_t*)&mask, 1); -#elif (defined __linux__ || defined BSD4_4) && !(defined ANDROID) +#elif (defined __linux__ || defined __FreeBSD__) && !(defined ANDROID) cpu_set_t cpu_set; CPU_ZERO(&cpu_set); @@ -117,8 +121,10 @@ void SwitchCurrentThread() { void SetCurrentThreadName(const char* szThreadName) { #ifdef __APPLE__ pthread_setname_np(szThreadName); -#elif defined(__OpenBSD__) +#elif defined(__Bitrig__) || defined(__DragonFly__) || defined(__FreeBSD__) || defined(__OpenBSD__) pthread_set_name_np(pthread_self(), szThreadName); +#elif defined(__NetBSD__) + pthread_setname_np(pthread_self(), "%s", (void*)szThreadName); #else pthread_setname_np(pthread_self(), szThreadName); #endif diff --git a/src/common/vector_math.h b/src/common/vector_math.h index 2d56f168c..a57d86d88 100644 --- a/src/common/vector_math.h +++ b/src/common/vector_math.h @@ -60,7 +60,6 @@ public: } Vec2() = default; - Vec2(const T a[2]) : x(a[0]), y(a[1]) {} Vec2(const T& _x, const T& _y) : x(_x), y(_y) {} template <typename T2> @@ -199,7 +198,6 @@ public: } Vec3() = default; - Vec3(const T a[3]) : x(a[0]), y(a[1]), z(a[2]) {} Vec3(const T& _x, const T& _y, const T& _z) : x(_x), y(_y), z(_z) {} template <typename T2> @@ -405,7 +403,6 @@ public: } Vec4() = default; - Vec4(const T a[4]) : x(a[0]), y(a[1]), z(a[2]), w(a[3]) {} Vec4(const T& _x, const T& _y, const T& _z, const T& _w) : x(_x), y(_y), z(_z), w(_w) {} template <typename T2> diff --git a/src/common/x64/cpu_detect.cpp b/src/common/x64/cpu_detect.cpp index 6ddf9b70c..370ae2c80 100644 --- a/src/common/x64/cpu_detect.cpp +++ b/src/common/x64/cpu_detect.cpp @@ -12,13 +12,15 @@ namespace Common { #ifndef _MSC_VER -#ifdef __FreeBSD__ -#include <machine/cpufunc.h> +#if defined(__DragonFly__) || defined(__FreeBSD__) +// clang-format off #include <sys/types.h> +#include <machine/cpufunc.h> +// clang-format on #endif static inline void __cpuidex(int info[4], int function_id, int subfunction_id) { -#ifdef __FreeBSD__ +#if defined(__DragonFly__) || defined(__FreeBSD__) // Despite the name, this is just do_cpuid() with ECX as second input. cpuid_count((u_int)function_id, (u_int)subfunction_id, (u_int*)info); #else diff --git a/src/core/gdbstub/gdbstub.cpp b/src/core/gdbstub/gdbstub.cpp index 7fc72d801..ceb993ea1 100644 --- a/src/core/gdbstub/gdbstub.cpp +++ b/src/core/gdbstub/gdbstub.cpp @@ -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/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/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/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/video_core/command_processor.cpp b/src/video_core/command_processor.cpp index bb618cacd..fda91e29c 100644 --- a/src/video_core/command_processor.cpp +++ b/src/video_core/command_processor.cpp @@ -292,7 +292,7 @@ static void WritePicaReg(u32 id, u32 value, u32 mask) { } } - // Retreive vertex from register data + // Retrieve vertex from register data Shader::OutputVertex output_vertex = output_registers.ToVertex(regs.vs); // Send to renderer diff --git a/src/video_core/shader/shader.cpp b/src/video_core/shader/shader.cpp index 272f3ffe1..3febe739c 100644 --- a/src/video_core/shader/shader.cpp +++ b/src/video_core/shader/shader.cpp @@ -146,10 +146,8 @@ DebugData<true> ShaderSetup::ProduceDebugInfo(const InputVertex& input, int num_ state.debug.max_opdesc_id = 0; // Setup input register table + boost::fill(state.registers.input, Math::Vec4<float24>::AssignToAll(float24::Zero())); const auto& attribute_register_map = config.input_register_map; - float24 dummy_register; - boost::fill(state.registers.input, &dummy_register); - for (unsigned i = 0; i < num_attributes; i++) state.registers.input[attribute_register_map.GetRegisterForAttribute(i)] = input.attr[i]; diff --git a/src/video_core/shader/shader_interpreter.cpp b/src/video_core/shader/shader_interpreter.cpp index 501d00b6b..6abb6761f 100644 --- a/src/video_core/shader/shader_interpreter.cpp +++ b/src/video_core/shader/shader_interpreter.cpp @@ -116,32 +116,36 @@ void RunInterpreter(const ShaderSetup& setup, UnitState<Debug>& state, unsigned : state.address_registers[instr.common.address_register_index - 1]; const float24* src1_ = LookupSourceRegister(instr.common.GetSrc1(is_inverted) + - (!is_inverted * address_offset)); + (is_inverted ? 0 : address_offset)); const float24* src2_ = LookupSourceRegister(instr.common.GetSrc2(is_inverted) + - (is_inverted * address_offset)); + (is_inverted ? address_offset : 0)); const bool negate_src1 = ((bool)swizzle.negate_src1 != false); const bool negate_src2 = ((bool)swizzle.negate_src2 != false); float24 src1[4] = { - src1_[(int)swizzle.GetSelectorSrc1(0)], src1_[(int)swizzle.GetSelectorSrc1(1)], - src1_[(int)swizzle.GetSelectorSrc1(2)], src1_[(int)swizzle.GetSelectorSrc1(3)], + src1_[(int)swizzle.src1_selector_0.Value()], + src1_[(int)swizzle.src1_selector_1.Value()], + src1_[(int)swizzle.src1_selector_2.Value()], + src1_[(int)swizzle.src1_selector_3.Value()], }; if (negate_src1) { - src1[0] = src1[0] * float24::FromFloat32(-1); - src1[1] = src1[1] * float24::FromFloat32(-1); - src1[2] = src1[2] * float24::FromFloat32(-1); - src1[3] = src1[3] * float24::FromFloat32(-1); + src1[0] = -src1[0]; + src1[1] = -src1[1]; + src1[2] = -src1[2]; + src1[3] = -src1[3]; } float24 src2[4] = { - src2_[(int)swizzle.GetSelectorSrc2(0)], src2_[(int)swizzle.GetSelectorSrc2(1)], - src2_[(int)swizzle.GetSelectorSrc2(2)], src2_[(int)swizzle.GetSelectorSrc2(3)], + src2_[(int)swizzle.src2_selector_0.Value()], + src2_[(int)swizzle.src2_selector_1.Value()], + src2_[(int)swizzle.src2_selector_2.Value()], + src2_[(int)swizzle.src2_selector_3.Value()], }; if (negate_src2) { - src2[0] = src2[0] * float24::FromFloat32(-1); - src2[1] = src2[1] * float24::FromFloat32(-1); - src2[2] = src2[2] * float24::FromFloat32(-1); - src2[3] = src2[3] * float24::FromFloat32(-1); + src2[0] = -src2[0]; + src2[1] = -src2[1]; + src2[2] = -src2[2]; + src2[3] = -src2[3]; } float24* dest = @@ -451,34 +455,40 @@ void RunInterpreter(const ShaderSetup& setup, UnitState<Debug>& state, unsigned const bool negate_src3 = ((bool)swizzle.negate_src3 != false); float24 src1[4] = { - src1_[(int)swizzle.GetSelectorSrc1(0)], src1_[(int)swizzle.GetSelectorSrc1(1)], - src1_[(int)swizzle.GetSelectorSrc1(2)], src1_[(int)swizzle.GetSelectorSrc1(3)], + src1_[(int)swizzle.src1_selector_0.Value()], + src1_[(int)swizzle.src1_selector_1.Value()], + src1_[(int)swizzle.src1_selector_2.Value()], + src1_[(int)swizzle.src1_selector_3.Value()], }; if (negate_src1) { - src1[0] = src1[0] * float24::FromFloat32(-1); - src1[1] = src1[1] * float24::FromFloat32(-1); - src1[2] = src1[2] * float24::FromFloat32(-1); - src1[3] = src1[3] * float24::FromFloat32(-1); + src1[0] = -src1[0]; + src1[1] = -src1[1]; + src1[2] = -src1[2]; + src1[3] = -src1[3]; } float24 src2[4] = { - src2_[(int)swizzle.GetSelectorSrc2(0)], src2_[(int)swizzle.GetSelectorSrc2(1)], - src2_[(int)swizzle.GetSelectorSrc2(2)], src2_[(int)swizzle.GetSelectorSrc2(3)], + src2_[(int)swizzle.src2_selector_0.Value()], + src2_[(int)swizzle.src2_selector_1.Value()], + src2_[(int)swizzle.src2_selector_2.Value()], + src2_[(int)swizzle.src2_selector_3.Value()], }; if (negate_src2) { - src2[0] = src2[0] * float24::FromFloat32(-1); - src2[1] = src2[1] * float24::FromFloat32(-1); - src2[2] = src2[2] * float24::FromFloat32(-1); - src2[3] = src2[3] * float24::FromFloat32(-1); + src2[0] = -src2[0]; + src2[1] = -src2[1]; + src2[2] = -src2[2]; + src2[3] = -src2[3]; } float24 src3[4] = { - src3_[(int)swizzle.GetSelectorSrc3(0)], src3_[(int)swizzle.GetSelectorSrc3(1)], - src3_[(int)swizzle.GetSelectorSrc3(2)], src3_[(int)swizzle.GetSelectorSrc3(3)], + src3_[(int)swizzle.src3_selector_0.Value()], + src3_[(int)swizzle.src3_selector_1.Value()], + src3_[(int)swizzle.src3_selector_2.Value()], + src3_[(int)swizzle.src3_selector_3.Value()], }; if (negate_src3) { - src3[0] = src3[0] * float24::FromFloat32(-1); - src3[1] = src3[1] * float24::FromFloat32(-1); - src3[2] = src3[2] * float24::FromFloat32(-1); - src3[3] = src3[3] * float24::FromFloat32(-1); + src3[0] = -src3[0]; + src3[1] = -src3[1]; + src3[2] = -src3[2]; + src3[3] = -src3[3]; } float24* dest = |