Created
May 26, 2015 01:42
-
-
Save Subv/48cbca5b3a80260a1041 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt | |
| index 42b4be9..fbbb682 100644 | |
| --- a/src/core/CMakeLists.txt | |
| +++ b/src/core/CMakeLists.txt | |
| @@ -25,6 +25,7 @@ set(SRCS | |
| file_sys/ivfc_archive.cpp | |
| hle/config_mem.cpp | |
| hle/hle.cpp | |
| + hle/applets/applet.cpp | |
| hle/kernel/address_arbiter.cpp | |
| hle/kernel/event.cpp | |
| hle/kernel/kernel.cpp | |
| @@ -136,6 +137,7 @@ set(HEADERS | |
| hle/config_mem.h | |
| hle/function_wrappers.h | |
| hle/hle.h | |
| + hle/applets/applet.h | |
| hle/kernel/address_arbiter.h | |
| hle/kernel/event.h | |
| hle/kernel/kernel.h | |
| diff --git a/src/core/hle/service/apt/apt.cpp b/src/core/hle/service/apt/apt.cpp | |
| index 3fd4cfb..603c751 100644 | |
| --- a/src/core/hle/service/apt/apt.cpp | |
| +++ b/src/core/hle/service/apt/apt.cpp | |
| @@ -6,6 +6,7 @@ | |
| #include "common/file_util.h" | |
| #include "common/logging/log.h" | |
| +#include "core/hle/applets/applet.h" | |
| #include "core/hle/service/service.h" | |
| #include "core/hle/service/apt/apt.h" | |
| #include "core/hle/service/apt/apt_a.h" | |
| @@ -40,6 +41,13 @@ static std::vector<u8> shared_font; | |
| static u32 cpu_percent; ///< CPU time available to the running application | |
| +static Parameter next_parameter; | |
| + | |
| +void SendParameter(Parameter const& parameter) { | |
| + next_parameter = parameter; | |
| + start_event->Signal(); | |
| +} | |
| + | |
| void Initialize(Service::Interface* self) { | |
| u32* cmd_buff = Kernel::GetCommandBuffer(); | |
| u32 app_id = cmd_buff[1]; | |
| @@ -119,8 +127,8 @@ void GetAppletManInfo(Service::Interface* self) { | |
| cmd_buff[1] = RESULT_SUCCESS.raw; // No error | |
| cmd_buff[2] = 0; | |
| cmd_buff[3] = 0; | |
| - cmd_buff[4] = static_cast<u32>(AppID::HomeMenu); // Home menu AppID | |
| - cmd_buff[5] = static_cast<u32>(AppID::Application); // TODO(purpasmart96): Do this correctly | |
| + cmd_buff[4] = static_cast<u32>(AppletId::HomeMenu); // Home menu AppID | |
| + cmd_buff[5] = static_cast<u32>(AppletId::Application); // TODO(purpasmart96): Do this correctly | |
| LOG_WARNING(Service_APT, "(STUBBED) called unk=0x%08X", unk); | |
| } | |
| @@ -143,50 +151,81 @@ void InquireNotification(Service::Interface* self) { | |
| void SendParameter(Service::Interface* self) { | |
| u32* cmd_buff = Kernel::GetCommandBuffer(); | |
| - u32 src_app_id = cmd_buff[1]; | |
| - u32 dst_app_id = cmd_buff[2]; | |
| - u32 signal_type = cmd_buff[3]; | |
| - u32 buffer_size = cmd_buff[4]; | |
| - u32 value = cmd_buff[5]; | |
| - u32 handle = cmd_buff[6]; | |
| - u32 size = cmd_buff[7]; | |
| - u32 in_param_buffer_ptr = cmd_buff[8]; | |
| - | |
| - cmd_buff[1] = RESULT_SUCCESS.raw; // No error | |
| + u32 src_app_id = cmd_buff[1]; | |
| + u32 dst_app_id = cmd_buff[2]; | |
| + u32 signal_type = cmd_buff[3]; | |
| + u32 buffer_size = cmd_buff[4]; | |
| + u32 value = cmd_buff[5]; | |
| + u32 handle = cmd_buff[6]; | |
| + u32 size = cmd_buff[7]; | |
| + u32 buffer = cmd_buff[8]; | |
| + | |
| + std::shared_ptr<HLE::Applets::Applet> dest_applet = HLE::Applets::Applet::Get(static_cast<AppletId>(dst_app_id)); | |
| + | |
| + if (dest_applet == nullptr) { | |
| + LOG_ERROR(Service_APT, "Unknown applet id=0x%08X", dst_app_id); | |
| + return; | |
| + } | |
| + | |
| + Parameter param; | |
| + param.buffer_size = buffer_size; | |
| + param.destination_id = dst_app_id; | |
| + param.sender_id = src_app_id; | |
| + param.object = Kernel::g_handle_table.GetGeneric(handle); | |
| + param.signal = signal_type; | |
| + param.data = Memory::GetPointer(buffer); | |
| + | |
| + cmd_buff[1] = dest_applet->ReceiveParameter(param).raw; | |
| LOG_WARNING(Service_APT, "(STUBBED) called src_app_id=0x%08X, dst_app_id=0x%08X, signal_type=0x%08X," | |
| "buffer_size=0x%08X, value=0x%08X, handle=0x%08X, size=0x%08X, in_param_buffer_ptr=0x%08X", | |
| - src_app_id, dst_app_id, signal_type, buffer_size, value, handle, size, in_param_buffer_ptr); | |
| + src_app_id, dst_app_id, signal_type, buffer_size, value, handle, size, buffer); | |
| } | |
| void ReceiveParameter(Service::Interface* self) { | |
| u32* cmd_buff = Kernel::GetCommandBuffer(); | |
| u32 app_id = cmd_buff[1]; | |
| u32 buffer_size = cmd_buff[2]; | |
| + VAddr buffer = cmd_buff[0x104 >> 2]; | |
| + | |
| cmd_buff[1] = RESULT_SUCCESS.raw; // No error | |
| - cmd_buff[2] = 0; | |
| - cmd_buff[3] = static_cast<u32>(SignalType::AppJustStarted); // Signal type | |
| - cmd_buff[4] = 0x10; // Parameter buffer size (16) | |
| - cmd_buff[5] = 0; | |
| + cmd_buff[2] = next_parameter.sender_id; | |
| + cmd_buff[3] = next_parameter.signal; // Signal type | |
| + cmd_buff[4] = next_parameter.buffer_size; // Parameter buffer size | |
| + cmd_buff[5] = 0x10; | |
| cmd_buff[6] = 0; | |
| - cmd_buff[7] = 0; | |
| - LOG_WARNING(Service_APT, "(STUBBED) called app_id=0x%08X, buffer_size=0x%08X", app_id, buffer_size); | |
| + if (next_parameter.object != nullptr) | |
| + cmd_buff[6] = Kernel::g_handle_table.Create(next_parameter.object).MoveFrom(); | |
| + cmd_buff[7] = (next_parameter.buffer_size << 14) | 2; | |
| + cmd_buff[8] = buffer; | |
| + | |
| + if (next_parameter.data) | |
| + memcpy(Memory::GetPointer(buffer), next_parameter.data, std::min(buffer_size, next_parameter.buffer_size)); | |
| + | |
| + LOG_WARNING(Service_APT, "called app_id=0x%08X, buffer_size=0x%08X", app_id, buffer_size); | |
| } | |
| void GlanceParameter(Service::Interface* self) { | |
| u32* cmd_buff = Kernel::GetCommandBuffer(); | |
| u32 app_id = cmd_buff[1]; | |
| u32 buffer_size = cmd_buff[2]; | |
| + VAddr buffer = cmd_buff[0x104 >> 2]; | |
| cmd_buff[1] = RESULT_SUCCESS.raw; // No error | |
| - cmd_buff[2] = 0; | |
| - cmd_buff[3] = static_cast<u32>(SignalType::AppJustStarted); // Signal type | |
| - cmd_buff[4] = 0x10; // Parameter buffer size (16) | |
| - cmd_buff[5] = 0; | |
| + cmd_buff[2] = next_parameter.sender_id; | |
| + cmd_buff[3] = next_parameter.signal; // Signal type | |
| + cmd_buff[4] = next_parameter.buffer_size; // Parameter buffer size | |
| + cmd_buff[5] = 0x10; | |
| cmd_buff[6] = 0; | |
| - cmd_buff[7] = 0; | |
| + if (next_parameter.object != nullptr) | |
| + cmd_buff[6] = Kernel::g_handle_table.Create(next_parameter.object).MoveFrom(); | |
| + cmd_buff[7] = (next_parameter.buffer_size << 14) | 2; | |
| + cmd_buff[8] = buffer; | |
| + | |
| + if (next_parameter.data) | |
| + memcpy(Memory::GetPointer(buffer), next_parameter.data, std::min(buffer_size, next_parameter.buffer_size)); | |
| - LOG_WARNING(Service_APT, "(STUBBED) called app_id=0x%08X, buffer_size=0x%08X", app_id, buffer_size); | |
| + LOG_WARNING(Service_APT, "called app_id=0x%08X, buffer_size=0x%08X", app_id, buffer_size); | |
| } | |
| void CancelParameter(Service::Interface* self) { | |
| @@ -279,6 +318,11 @@ void GetAppCpuTimeLimit(Service::Interface* self) { | |
| LOG_WARNING(Service_APT, "(STUBBED) called value=%u", value); | |
| } | |
| +void PrepareToStartLibraryApplet(Service::Interface* self) { | |
| + u32* cmd_buff = Kernel::GetCommandBuffer(); | |
| + cmd_buff[1] = HLE::Applets::Applet::Create(static_cast<AppletId>(cmd_buff[1])).raw; | |
| +} | |
| + | |
| void Init() { | |
| AddService(new APT_A_Interface); | |
| AddService(new APT_S_Interface); | |
| @@ -317,6 +361,9 @@ void Init() { | |
| // TODO(bunnei): Check if these are created in Initialize or on APT process startup. | |
| notification_event = Kernel::Event::Create(RESETTYPE_ONESHOT, "APT_U:Notification"); | |
| start_event = Kernel::Event::Create(RESETTYPE_ONESHOT, "APT_U:Start"); | |
| + | |
| + next_parameter.signal = static_cast<u32>(SignalType::AppJustStarted); | |
| + next_parameter.destination_id = 0x300; | |
| } | |
| void Shutdown() { | |
| diff --git a/src/core/hle/service/apt/apt.h b/src/core/hle/service/apt/apt.h | |
| index e7fa393..8b0939b 100644 | |
| --- a/src/core/hle/service/apt/apt.h | |
| +++ b/src/core/hle/service/apt/apt.h | |
| @@ -11,6 +11,15 @@ | |
| namespace Service { | |
| namespace APT { | |
| +struct Parameter { | |
| + u32 sender_id = 0; | |
| + u32 destination_id = 0; | |
| + u32 signal = 0; | |
| + u32 buffer_size = 0; | |
| + Kernel::SharedPtr<Kernel::Object> object = nullptr; | |
| + u8* data = nullptr; | |
| +}; | |
| + | |
| /// Signals used by APT functions | |
| enum class SignalType : u32 { | |
| None = 0x0, | |
| @@ -23,7 +32,7 @@ enum class SignalType : u32 { | |
| }; | |
| /// App Id's used by APT functions | |
| -enum class AppID : u32 { | |
| +enum class AppletId : u32 { | |
| HomeMenu = 0x101, | |
| AlternateMenu = 0x103, | |
| Camera = 0x110, | |
| @@ -45,6 +54,8 @@ enum class AppID : u32 { | |
| SoftwareKeyboard2 = 0x401, | |
| }; | |
| +void SendParameter(Parameter const& parameter); | |
| + | |
| /** | |
| * APT::Initialize service function | |
| * Service function that initializes the APT process for the running application | |
| @@ -249,6 +260,8 @@ void SetAppCpuTimeLimit(Service::Interface* self); | |
| */ | |
| void GetAppCpuTimeLimit(Service::Interface* self); | |
| +void PrepareToStartLibraryApplet(Service::Interface* self); | |
| + | |
| /// Initialize the APT service | |
| void Init(); | |
| diff --git a/src/core/hle/service/apt/apt_u.cpp b/src/core/hle/service/apt/apt_u.cpp | |
| index d006b59..0c53b72 100644 | |
| --- a/src/core/hle/service/apt/apt_u.cpp | |
| +++ b/src/core/hle/service/apt/apt_u.cpp | |
| @@ -35,7 +35,7 @@ const Interface::FunctionInfo FunctionTable[] = { | |
| {0x00150140, nullptr, "PrepareToStartApplication"}, | |
| {0x00160040, nullptr, "PreloadLibraryApplet"}, | |
| {0x00170040, nullptr, "FinishPreloadingLibraryApplet"}, | |
| - {0x00180040, nullptr, "PrepareToStartLibraryApplet"}, | |
| + {0x00180040, PrepareToStartLibraryApplet, "PrepareToStartLibraryApplet"}, | |
| {0x00190040, nullptr, "PrepareToStartSystemApplet"}, | |
| {0x001A0000, nullptr, "PrepareToStartNewestHomeMenu"}, | |
| {0x001B00C4, nullptr, "StartApplication"}, |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment