diff options
| -rw-r--r-- | src/core/hle/service/apt/apt.cpp | 73 | ||||
| -rw-r--r-- | src/core/hle/service/apt/apt_s.cpp | 4 |
2 files changed, 47 insertions, 30 deletions
diff --git a/src/core/hle/service/apt/apt.cpp b/src/core/hle/service/apt/apt.cpp index 8c0ba73f2..c36775473 100644 --- a/src/core/hle/service/apt/apt.cpp +++ b/src/core/hle/service/apt/apt.cpp | |||
| @@ -165,7 +165,11 @@ void SendParameter(const MessageParameter& parameter) { | |||
| 165 | next_parameter = parameter; | 165 | next_parameter = parameter; |
| 166 | // Signal the event to let the receiver know that a new parameter is ready to be read | 166 | // Signal the event to let the receiver know that a new parameter is ready to be read |
| 167 | auto* const slot_data = GetAppletSlotData(static_cast<AppletId>(parameter.destination_id)); | 167 | auto* const slot_data = GetAppletSlotData(static_cast<AppletId>(parameter.destination_id)); |
| 168 | ASSERT(slot_data); | 168 | if (slot_data == nullptr) { |
| 169 | LOG_DEBUG(Service_APT, "No applet was registered with the id %03X", | ||
| 170 | parameter.destination_id); | ||
| 171 | return; | ||
| 172 | } | ||
| 169 | 173 | ||
| 170 | slot_data->parameter_event->Signal(); | 174 | slot_data->parameter_event->Signal(); |
| 171 | } | 175 | } |
| @@ -486,9 +490,6 @@ void SendParameter(Service::Interface* self) { | |||
| 486 | size_t size; | 490 | size_t size; |
| 487 | VAddr buffer = rp.PopStaticBuffer(&size); | 491 | VAddr buffer = rp.PopStaticBuffer(&size); |
| 488 | 492 | ||
| 489 | std::shared_ptr<HLE::Applets::Applet> dest_applet = | ||
| 490 | HLE::Applets::Applet::Get(static_cast<AppletId>(dst_app_id)); | ||
| 491 | |||
| 492 | LOG_DEBUG(Service_APT, | 493 | LOG_DEBUG(Service_APT, |
| 493 | "called src_app_id=0x%08X, dst_app_id=0x%08X, signal_type=0x%08X," | 494 | "called src_app_id=0x%08X, dst_app_id=0x%08X, signal_type=0x%08X," |
| 494 | "buffer_size=0x%08X, handle=0x%08X, size=0x%08zX, in_param_buffer_ptr=0x%08X", | 495 | "buffer_size=0x%08X, handle=0x%08X, size=0x%08zX, in_param_buffer_ptr=0x%08X", |
| @@ -503,12 +504,6 @@ void SendParameter(Service::Interface* self) { | |||
| 503 | return; | 504 | return; |
| 504 | } | 505 | } |
| 505 | 506 | ||
| 506 | if (dest_applet == nullptr) { | ||
| 507 | LOG_ERROR(Service_APT, "Unknown applet id=0x%08X", dst_app_id); | ||
| 508 | rb.Push<u32>(-1); // TODO(Subv): Find the right error code | ||
| 509 | return; | ||
| 510 | } | ||
| 511 | |||
| 512 | MessageParameter param; | 507 | MessageParameter param; |
| 513 | param.destination_id = dst_app_id; | 508 | param.destination_id = dst_app_id; |
| 514 | param.sender_id = src_app_id; | 509 | param.sender_id = src_app_id; |
| @@ -517,7 +512,14 @@ void SendParameter(Service::Interface* self) { | |||
| 517 | param.buffer.resize(buffer_size); | 512 | param.buffer.resize(buffer_size); |
| 518 | Memory::ReadBlock(buffer, param.buffer.data(), param.buffer.size()); | 513 | Memory::ReadBlock(buffer, param.buffer.data(), param.buffer.size()); |
| 519 | 514 | ||
| 520 | rb.Push(dest_applet->ReceiveParameter(param)); | 515 | SendParameter(param); |
| 516 | |||
| 517 | // If the applet is running in HLE mode, use the HLE interface to communicate with it. | ||
| 518 | if (auto dest_applet = HLE::Applets::Applet::Get(static_cast<AppletId>(dst_app_id))) { | ||
| 519 | rb.Push(dest_applet->ReceiveParameter(param)); | ||
| 520 | } else { | ||
| 521 | rb.Push(RESULT_SUCCESS); | ||
| 522 | } | ||
| 521 | } | 523 | } |
| 522 | 524 | ||
| 523 | void ReceiveParameter(Service::Interface* self) { | 525 | void ReceiveParameter(Service::Interface* self) { |
| @@ -746,7 +748,12 @@ void PrepareToStartLibraryApplet(Service::Interface* self) { | |||
| 746 | IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x18, 1, 0); // 0x180040 | 748 | IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x18, 1, 0); // 0x180040 |
| 747 | AppletId applet_id = static_cast<AppletId>(rp.Pop<u32>()); | 749 | AppletId applet_id = static_cast<AppletId>(rp.Pop<u32>()); |
| 748 | 750 | ||
| 751 | LOG_DEBUG(Service_APT, "called applet_id=%08X", applet_id); | ||
| 752 | |||
| 749 | IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); | 753 | IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); |
| 754 | |||
| 755 | // TODO(Subv): Launch the requested applet application. | ||
| 756 | |||
| 750 | auto applet = HLE::Applets::Applet::Get(applet_id); | 757 | auto applet = HLE::Applets::Applet::Get(applet_id); |
| 751 | if (applet) { | 758 | if (applet) { |
| 752 | LOG_WARNING(Service_APT, "applet has already been started id=%08X", applet_id); | 759 | LOG_WARNING(Service_APT, "applet has already been started id=%08X", applet_id); |
| @@ -754,14 +761,18 @@ void PrepareToStartLibraryApplet(Service::Interface* self) { | |||
| 754 | } else { | 761 | } else { |
| 755 | rb.Push(HLE::Applets::Applet::Create(applet_id)); | 762 | rb.Push(HLE::Applets::Applet::Create(applet_id)); |
| 756 | } | 763 | } |
| 757 | LOG_DEBUG(Service_APT, "called applet_id=%08X", applet_id); | ||
| 758 | } | 764 | } |
| 759 | 765 | ||
| 760 | void PreloadLibraryApplet(Service::Interface* self) { | 766 | void PreloadLibraryApplet(Service::Interface* self) { |
| 761 | IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x16, 1, 0); // 0x160040 | 767 | IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x16, 1, 0); // 0x160040 |
| 762 | AppletId applet_id = static_cast<AppletId>(rp.Pop<u32>()); | 768 | AppletId applet_id = static_cast<AppletId>(rp.Pop<u32>()); |
| 763 | 769 | ||
| 770 | LOG_DEBUG(Service_APT, "called applet_id=%08X", applet_id); | ||
| 771 | |||
| 764 | IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); | 772 | IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); |
| 773 | |||
| 774 | // TODO(Subv): Launch the requested applet application. | ||
| 775 | |||
| 765 | auto applet = HLE::Applets::Applet::Get(applet_id); | 776 | auto applet = HLE::Applets::Applet::Get(applet_id); |
| 766 | if (applet) { | 777 | if (applet) { |
| 767 | LOG_WARNING(Service_APT, "applet has already been started id=%08X", applet_id); | 778 | LOG_WARNING(Service_APT, "applet has already been started id=%08X", applet_id); |
| @@ -769,34 +780,40 @@ void PreloadLibraryApplet(Service::Interface* self) { | |||
| 769 | } else { | 780 | } else { |
| 770 | rb.Push(HLE::Applets::Applet::Create(applet_id)); | 781 | rb.Push(HLE::Applets::Applet::Create(applet_id)); |
| 771 | } | 782 | } |
| 772 | LOG_DEBUG(Service_APT, "called applet_id=%08X", applet_id); | ||
| 773 | } | 783 | } |
| 774 | 784 | ||
| 775 | void StartLibraryApplet(Service::Interface* self) { | 785 | void StartLibraryApplet(Service::Interface* self) { |
| 776 | IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x1E, 2, 4); // 0x1E0084 | 786 | IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x1E, 2, 4); // 0x1E0084 |
| 777 | AppletId applet_id = static_cast<AppletId>(rp.Pop<u32>()); | 787 | AppletId applet_id = static_cast<AppletId>(rp.Pop<u32>()); |
| 778 | std::shared_ptr<HLE::Applets::Applet> applet = HLE::Applets::Applet::Get(applet_id); | ||
| 779 | |||
| 780 | LOG_DEBUG(Service_APT, "called applet_id=%08X", applet_id); | ||
| 781 | |||
| 782 | if (applet == nullptr) { | ||
| 783 | LOG_ERROR(Service_APT, "unknown applet id=%08X", applet_id); | ||
| 784 | IPC::RequestBuilder rb = rp.MakeBuilder(1, 0, false); | ||
| 785 | rb.Push<u32>(-1); // TODO(Subv): Find the right error code | ||
| 786 | return; | ||
| 787 | } | ||
| 788 | 788 | ||
| 789 | size_t buffer_size = rp.Pop<u32>(); | 789 | size_t buffer_size = rp.Pop<u32>(); |
| 790 | Kernel::Handle handle = rp.PopHandle(); | 790 | Kernel::Handle handle = rp.PopHandle(); |
| 791 | VAddr buffer_addr = rp.PopStaticBuffer(); | 791 | VAddr buffer_addr = rp.PopStaticBuffer(); |
| 792 | 792 | ||
| 793 | AppletStartupParameter parameter; | 793 | LOG_DEBUG(Service_APT, "called applet_id=%08X", applet_id); |
| 794 | parameter.object = Kernel::g_handle_table.GetGeneric(handle); | ||
| 795 | parameter.buffer.resize(buffer_size); | ||
| 796 | Memory::ReadBlock(buffer_addr, parameter.buffer.data(), parameter.buffer.size()); | ||
| 797 | 794 | ||
| 798 | IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); | 795 | IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); |
| 799 | rb.Push(applet->Start(parameter)); | 796 | |
| 797 | // Send the Wakeup signal to the applet | ||
| 798 | MessageParameter param; | ||
| 799 | param.destination_id = static_cast<u32>(applet_id); | ||
| 800 | param.sender_id = static_cast<u32>(AppletId::Application); | ||
| 801 | param.object = Kernel::g_handle_table.GetGeneric(handle); | ||
| 802 | param.signal = static_cast<u32>(SignalType::Wakeup); | ||
| 803 | param.buffer.resize(buffer_size); | ||
| 804 | Memory::ReadBlock(buffer_addr, param.buffer.data(), param.buffer.size()); | ||
| 805 | SendParameter(param); | ||
| 806 | |||
| 807 | // In case the applet is being HLEd, attempt to communicate with it. | ||
| 808 | if (auto applet = HLE::Applets::Applet::Get(applet_id)) { | ||
| 809 | AppletStartupParameter parameter; | ||
| 810 | parameter.object = Kernel::g_handle_table.GetGeneric(handle); | ||
| 811 | parameter.buffer.resize(buffer_size); | ||
| 812 | Memory::ReadBlock(buffer_addr, parameter.buffer.data(), parameter.buffer.size()); | ||
| 813 | rb.Push(applet->Start(parameter)); | ||
| 814 | } else { | ||
| 815 | rb.Push(RESULT_SUCCESS); | ||
| 816 | } | ||
| 800 | } | 817 | } |
| 801 | 818 | ||
| 802 | void CancelLibraryApplet(Service::Interface* self) { | 819 | void CancelLibraryApplet(Service::Interface* self) { |
diff --git a/src/core/hle/service/apt/apt_s.cpp b/src/core/hle/service/apt/apt_s.cpp index ec5668d05..cf74c2a36 100644 --- a/src/core/hle/service/apt/apt_s.cpp +++ b/src/core/hle/service/apt/apt_s.cpp | |||
| @@ -20,7 +20,7 @@ const Interface::FunctionInfo FunctionTable[] = { | |||
| 20 | {0x00090040, nullptr, "IsRegistered"}, | 20 | {0x00090040, nullptr, "IsRegistered"}, |
| 21 | {0x000A0040, nullptr, "GetAttribute"}, | 21 | {0x000A0040, nullptr, "GetAttribute"}, |
| 22 | {0x000B0040, InquireNotification, "InquireNotification"}, | 22 | {0x000B0040, InquireNotification, "InquireNotification"}, |
| 23 | {0x000C0104, nullptr, "SendParameter"}, | 23 | {0x000C0104, SendParameter, "SendParameter"}, |
| 24 | {0x000D0080, ReceiveParameter, "ReceiveParameter"}, | 24 | {0x000D0080, ReceiveParameter, "ReceiveParameter"}, |
| 25 | {0x000E0080, GlanceParameter, "GlanceParameter"}, | 25 | {0x000E0080, GlanceParameter, "GlanceParameter"}, |
| 26 | {0x000F0100, nullptr, "CancelParameter"}, | 26 | {0x000F0100, nullptr, "CancelParameter"}, |
| @@ -38,7 +38,7 @@ const Interface::FunctionInfo FunctionTable[] = { | |||
| 38 | {0x001B00C4, nullptr, "StartApplication"}, | 38 | {0x001B00C4, nullptr, "StartApplication"}, |
| 39 | {0x001C0000, nullptr, "WakeupApplication"}, | 39 | {0x001C0000, nullptr, "WakeupApplication"}, |
| 40 | {0x001D0000, nullptr, "CancelApplication"}, | 40 | {0x001D0000, nullptr, "CancelApplication"}, |
| 41 | {0x001E0084, nullptr, "StartLibraryApplet"}, | 41 | {0x001E0084, StartLibraryApplet, "StartLibraryApplet"}, |
| 42 | {0x001F0084, nullptr, "StartSystemApplet"}, | 42 | {0x001F0084, nullptr, "StartSystemApplet"}, |
| 43 | {0x00200044, nullptr, "StartNewestHomeMenu"}, | 43 | {0x00200044, nullptr, "StartNewestHomeMenu"}, |
| 44 | {0x00210000, nullptr, "OrderToCloseApplication"}, | 44 | {0x00210000, nullptr, "OrderToCloseApplication"}, |