From 198c0ddc72d59f8e288c1074ee0bb1169f706cac Mon Sep 17 00:00:00 2001 From: purpasmart96 Date: Sat, 7 Mar 2015 17:54:16 -0800 Subject: Services: Stubs and minor changes --- src/core/hle/service/apt/apt.cpp | 74 ++++++++++++++++++++++++++++---------- src/core/hle/service/apt/apt.h | 49 +++++++++++++++++++++---- src/core/hle/service/apt/apt_a.cpp | 6 ++-- 3 files changed, 102 insertions(+), 27 deletions(-) (limited to 'src/core/hle/service/apt') diff --git a/src/core/hle/service/apt/apt.cpp b/src/core/hle/service/apt/apt.cpp index 5971f860..4861d9e5 100644 --- a/src/core/hle/service/apt/apt.cpp +++ b/src/core/hle/service/apt/apt.cpp @@ -28,16 +28,21 @@ namespace APT { static const VAddr SHARED_FONT_VADDR = 0x18000000; /// Handle to shared memory region designated to for shared system font -static Kernel::SharedPtr shared_font_mem; +static Kernel::SharedPtr shared_font_mem = nullptr; -static Kernel::SharedPtr lock; -static Kernel::SharedPtr notification_event; ///< APT notification event -static Kernel::SharedPtr pause_event = 0; ///< APT pause event +static Kernel::SharedPtr lock = nullptr; +static Kernel::SharedPtr notification_event = nullptr; ///< APT notification event +static Kernel::SharedPtr pause_event = nullptr; ///< APT pause event static std::vector shared_font; +static u32 cpu_percent = 0; ///< CPU time available to the running application + void Initialize(Service::Interface* self) { u32* cmd_buff = Kernel::GetCommandBuffer(); + u32 app_id = cmd_buff[1]; + u32 flags = cmd_buff[2]; + cmd_buff[2] = 0x04000000; // According to 3dbrew, this value should be 0x04000000 cmd_buff[3] = Kernel::g_handle_table.Create(notification_event).MoveFrom(); cmd_buff[4] = Kernel::g_handle_table.Create(pause_event).MoveFrom(); @@ -49,6 +54,8 @@ void Initialize(Service::Interface* self) { lock->Release(); cmd_buff[1] = RESULT_SUCCESS.raw; // No error + + LOG_TRACE(Service_APT, "called app_id=0x%08X, flags=0x%08X", app_id, flags); } void GetSharedFont(Service::Interface* self) { @@ -190,7 +197,38 @@ void CancelParameter(Service::Interface* self) { cmd_buff[2] = 1; // Set to Success LOG_WARNING(Service_APT, "(STUBBED) called flag1=0x%08X, unk=0x%08X, flag2=0x%08X, app_id=0x%08X", - flag1, unk, flag2, app_id); + flag1, unk, flag2, app_id); +} + +void PrepareToStartApplication(Service::Interface* self) { + u32* cmd_buff = Kernel::GetCommandBuffer(); + u32 title_info1 = cmd_buff[1]; + u32 title_info2 = cmd_buff[2]; + u32 title_info3 = cmd_buff[3]; + u32 title_info4 = cmd_buff[4]; + u32 flags = cmd_buff[5]; + + cmd_buff[1] = RESULT_SUCCESS.raw; // No error + + LOG_WARNING(Service_APT, "(STUBBED) called title_info1=0x%08X, title_info2=0x%08X, title_info3=0x%08X," + "title_info4=0x%08X, flags=0x%08X", title_info1, title_info2, title_info3, title_info4, flags); +} + +void StartApplication(Service::Interface* self) { + u32* cmd_buff = Kernel::GetCommandBuffer(); + u32 buffer1_size = cmd_buff[1]; + u32 buffer2_size = cmd_buff[2]; + u32 flag = cmd_buff[3]; + u32 size1 = cmd_buff[4]; + u32 buffer1_ptr = cmd_buff[5]; + u32 size2 = cmd_buff[6]; + u32 buffer2_ptr = cmd_buff[7]; + + cmd_buff[1] = RESULT_SUCCESS.raw; // No error + + LOG_WARNING(Service_APT, "(STUBBED) called buffer1_size=0x%08X, buffer2_size=0x%08X, flag=0x%08X," + "size1=0x%08X, buffer1_ptr=0x%08X, size2=0x%08X, buffer2_ptr=0x%08X", + buffer1_size, buffer2_size, flag, size1, buffer1_ptr, size2, buffer2_ptr); } void AppletUtility(Service::Interface* self) { @@ -205,15 +243,15 @@ void AppletUtility(Service::Interface* self) { cmd_buff[1] = RESULT_SUCCESS.raw; // No error - LOG_WARNING(Service_APT, "(STUBBED) called unk=0x%08X, buffer1_size=0x%08x, buffer2_size=0x%08x, " - "buffer1_addr=0x%08x, buffer2_addr=0x%08x", unk, buffer1_size, buffer2_size, + LOG_WARNING(Service_APT, "(STUBBED) called unk=0x%08X, buffer1_size=0x%08X, buffer2_size=0x%08X, " + "buffer1_addr=0x%08X, buffer2_addr=0x%08X", unk, buffer1_size, buffer2_size, buffer1_addr, buffer2_addr); } void SetAppCpuTimeLimit(Service::Interface* self) { u32* cmd_buff = Kernel::GetCommandBuffer(); - u32 value = cmd_buff[1]; - u32 percent = cmd_buff[2]; + u32 value = cmd_buff[1]; + cpu_percent = cmd_buff[2]; if (value != 1) { LOG_ERROR(Service_APT, "This value should be one, but is actually %u!", value); @@ -221,27 +259,26 @@ void SetAppCpuTimeLimit(Service::Interface* self) { cmd_buff[1] = RESULT_SUCCESS.raw; // No error - LOG_WARNING(Service_APT, "(STUBBED) called percent=0x%08X, value=0x%08x", percent, value); + LOG_WARNING(Service_APT, "(STUBBED) called cpu_percent=%u, value=%u", cpu_percent, value); } void GetAppCpuTimeLimit(Service::Interface* self) { u32* cmd_buff = Kernel::GetCommandBuffer(); u32 value = cmd_buff[1]; + ASSERT(cpu_percent != 0); + if (value != 1) { LOG_ERROR(Service_APT, "This value should be one, but is actually %u!", value); } - // TODO(purpasmart96): This is incorrect, I'm pretty sure the percentage should - // be set by the application. - cmd_buff[1] = RESULT_SUCCESS.raw; // No error - cmd_buff[2] = 0x80; // Set to 80% + cmd_buff[2] = cpu_percent; - LOG_WARNING(Service_APT, "(STUBBED) called value=0x%08x", value); + LOG_WARNING(Service_APT, "(STUBBED) called value=%u", value); } -void APTInit() { +void Init() { AddService(new APT_A_Interface); AddService(new APT_S_Interface); AddService(new APT_U_Interface); @@ -271,13 +308,14 @@ void APTInit() { } lock = Kernel::Mutex::Create(false, "APT_U:Lock"); - + cpu_percent = 0; + // TODO(bunnei): Check if these are created in Initialize or on APT process startup. notification_event = Kernel::Event::Create(RESETTYPE_ONESHOT, "APT_U:Notification"); pause_event = Kernel::Event::Create(RESETTYPE_ONESHOT, "APT_U:Pause"); } -void APTShutdown() { +void Shutdown() { } diff --git a/src/core/hle/service/apt/apt.h b/src/core/hle/service/apt/apt.h index a39adbff..e7fa3932 100644 --- a/src/core/hle/service/apt/apt.h +++ b/src/core/hle/service/apt/apt.h @@ -13,10 +13,13 @@ namespace APT { /// Signals used by APT functions enum class SignalType : u32 { - None = 0x0, - AppJustStarted = 0x1, - ReturningToApp = 0xB, - ExitingApp = 0xC, + None = 0x0, + AppJustStarted = 0x1, + LibAppJustStarted = 0x2, + LibAppFinished = 0x3, + LibAppClosed = 0xA, + ReturningToApp = 0xB, + ExitingApp = 0xC, }; /// App Id's used by APT functions @@ -178,6 +181,40 @@ void GlanceParameter(Service::Interface* self); */ void CancelParameter(Service::Interface* self); +/** + * APT::PrepareToStartApplication service function. When the input title-info programID is zero, + * NS will load the actual program ID via AMNet:GetTitleIDList. After doing some checks with the + * programID, NS will then set a NS state flag to value 1, then set the programID for AppID + * 0x300(application) to the input program ID(or the one from GetTitleIDList). A media-type field + * in the NS state is also set to the input media-type value + * (other state fields are set at this point as well). With 8.0.0-18, NS will set an u8 NS state + * field to value 1 when input flags bit8 is set + * Inputs: + * 1-4 : 0x10-byte title-info struct + * 4 : Flags + * Outputs: + * 0 : Return header + * 1 : Result of function, 0 on success, otherwise error code + */ +void PrepareToStartApplication(Service::Interface* self); + +/** + * APT::StartApplication service function. Buf0 is copied to NS FIRMparams+0x0, then Buf1 is copied + * to the NS FIRMparams+0x480. Then the application is launched. + * Inputs: + * 1 : Buffer 0 size, max size is 0x300 + * 2 : Buffer 1 size, max size is 0x20 (this can be zero) + * 3 : u8 flag + * 4 : (Size0<<14) | 2 + * 5 : Buffer 0 pointer + * 6 : (Size1<<14) | 0x802 + * 7 : Buffer 1 pointer + * Outputs: + * 0 : Return Header + * 1 : Result of function, 0 on success, otherwise error code +*/ +void StartApplication(Service::Interface* self); + /** * APT::AppletUtility service function * Inputs: @@ -213,10 +250,10 @@ void SetAppCpuTimeLimit(Service::Interface* self); void GetAppCpuTimeLimit(Service::Interface* self); /// Initialize the APT service -void APTInit(); +void Init(); /// Shutdown the APT service -void APTShutdown(); +void Shutdown(); } // namespace APT } // namespace Service diff --git a/src/core/hle/service/apt/apt_a.cpp b/src/core/hle/service/apt/apt_a.cpp index dbe5c1d8..86493424 100644 --- a/src/core/hle/service/apt/apt_a.cpp +++ b/src/core/hle/service/apt/apt_a.cpp @@ -12,16 +12,16 @@ namespace APT { const Interface::FunctionInfo FunctionTable[] = { {0x00010040, GetLockHandle, "GetLockHandle?"}, {0x00020080, Initialize, "Initialize?"}, - {0x00030040, nullptr, "Enable?"}, + {0x00030040, Enable, "Enable?"}, {0x00040040, nullptr, "Finalize?"}, {0x00050040, nullptr, "GetAppletManInfo?"}, {0x00060040, nullptr, "GetAppletInfo?"}, {0x000D0080, ReceiveParameter, "ReceiveParameter?"}, {0x000E0080, GlanceParameter, "GlanceParameter?"}, {0x003B0040, nullptr, "CancelLibraryApplet?"}, - {0x00430040, nullptr, "NotifyToWait?"}, + {0x00430040, NotifyToWait, "NotifyToWait?"}, {0x00440000, GetSharedFont, "GetSharedFont?"}, - {0x004B00C2, nullptr, "AppletUtility?"}, + {0x004B00C2, AppletUtility, "AppletUtility?"}, {0x00550040, nullptr, "WriteInputToNsState?"}, }; -- cgit v1.2.3