// Copyright 2014 Citra Emulator Project // Licensed under GPLv2 // Refer to the license.txt file included. #include "common/common.h" #include "core/hle/hle.h" #include "core/hle/kernel/event.h" #include "core/hle/kernel/mutex.h" #include "core/hle/service/apt.h" //////////////////////////////////////////////////////////////////////////////////////////////////// // Namespace APT_U namespace APT_U { /// Signals used by APT functions enum class SignalType : u32 { None = 0x0, AppJustStarted = 0x1, ReturningToApp = 0xB, ExitingApp = 0xC, }; void Initialize(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); cmd_buff[3] = Kernel::CreateEvent(RESETTYPE_ONESHOT, "APT_U:Menu"); // APT menu event handle cmd_buff[4] = Kernel::CreateEvent(RESETTYPE_ONESHOT, "APT_U:Pause"); // APT pause event handle Kernel::SetEventLocked(cmd_buff[3], true); Kernel::SetEventLocked(cmd_buff[4], false); // Fire start event cmd_buff[1] = 0; // No error DEBUG_LOG(KERNEL, "called"); } void GetLockHandle(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); u32 flags = cmd_buff[1]; // TODO(bunnei): Figure out the purpose of the flag field cmd_buff[1] = 0; // No error cmd_buff[5] = Kernel::CreateMutex(false, "APT_U:Lock"); DEBUG_LOG(KERNEL, "called handle=0x%08X", cmd_buff[5]); } void Enable(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); u32 unk = cmd_buff[1]; // TODO(bunnei): What is this field used for? cmd_buff[1] = 0; // No error WARN_LOG(KERNEL, "(STUBBED) called unk=0x%08X", unk); } void Finalize(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void GetAppletManInfo(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void GetAppletInfo(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void GetLastSignaledAppletId(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void CountRegisteredApplet(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void IsRegistered(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void GetAttribute(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void InquireNotification(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); u32 app_id = cmd_buff[2]; cmd_buff[1] = 0; // No error cmd_buff[2] = static_cast<u32>(SignalType::None); // Signal type WARN_LOG(KERNEL, "(STUBBED) called app_id=0x%08X", app_id); } void SendParameter(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void ReceiveParameter(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); u32 app_id = cmd_buff[1]; u32 buffer_size = cmd_buff[2]; cmd_buff[1] = 0; // No error cmd_buff[2] = 0; cmd_buff[3] = static_cast<u32>(SignalType::AppJustStarted); // Signal type cmd_buff[4] = 0x10; cmd_buff[5] = 0; cmd_buff[6] = 0; cmd_buff[7] = 0; WARN_LOG(KERNEL, "(STUBBED) called app_id=0x%08X, buffer_size=0x%08X", app_id, buffer_size); } void GlanceParameter(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void CancelParameter(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void DebugFunc(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void MapProgramIdForDebug(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void SetHomeMenuAppletIdForDebug(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void GetPreparationState(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void SetPreparationState(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void PrepareToStartApplication(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void PreloadLibraryApplet(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void FinishPreloadingLibraryApplet(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void PrepareToStartLibraryApplet(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void PrepareToStartSystemApplet(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void PrepareToStartNewestHomeMenu(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void StartApplication(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void WakeupApplication(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void CancelApplication(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void StartLibraryApplet(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void StartSystemApplet(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void StartNewestHomeMenu(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void OrderToCloseApplication(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void PrepareToCloseApplication(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void PrepareToJumpToApplication(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void JumpToApplication(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void PrepareToCloseLibraryApplet(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void PrepareToCloseSystemApplet(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void CloseApplication(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void CloseLibraryApplet(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void CloseSystemApplet(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void OrderToCloseSystemApplet(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void PrepareToJumpToHomeMenu(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void JumpToHomeMenu(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void PrepareToLeaveHomeMenu(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void LeaveHomeMenu(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void PrepareToLeaveResidentApplet(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void LeaveResidentApplet(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void PrepareToDoApplicationJump(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void DoApplicationJump(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void GetProgramIdOnApplicationJump(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void SendDeliverArg(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void ReceiveDeliverArg(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void LoadSysMenuArg(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void StoreSysMenuArg(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void PreloadResidentApplet(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void PrepareToStartResidentApplet(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void StartResidentApplet(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void CancelLibraryApplet(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void SendDspSleep(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void SendDspWakeUp(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void ReplySleepQuery(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void ReplySleepNotificationComplete(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void SendCaptureBufferInfo(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void ReceiveCaptureBufferInfo(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void SleepSystem(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void NotifyToWait(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void GetSharedFont(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void GetWirelessRebootInfo(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void Wrap(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void Unwrap(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void GetProgramInfo(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void Reboot(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void GetCaptureInfo(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void AppletUtility(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void SetFatalErrDispMode(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void GetAppletProgramInfo(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } void HardwareResetAsync(Service::Interface* self) { u32* cmd_buff = Service::GetCommandBuffer(); ERROR_LOG(KERNEL, "Unimplemented function"); cmd_buff[1] = 0; // No error } const Interface::FunctionInfo FunctionTable[] = { {0x00010040, GetLockHandle, "GetLockHandle"}, {0x00020080, Initialize, "Initialize"}, {0x00030040, Enable, "Enable"}, {0x00040040, Finalize, "Finalize"}, {0x00050040, GetAppletManInfo, "GetAppletManInfo"}, {0x00060040, GetAppletInfo, "GetAppletInfo"}, {0x00070000, GetLastSignaledAppletId, "GetLastSignaledAppletId"}, {0x00080000, CountRegisteredApplet, "CountRegisteredApplet"}, {0x00090040, IsRegistered, "IsRegistered"}, {0x000A0040, GetAttribute, "GetAttribute"}, {0x000B0040, InquireNotification, "InquireNotification"}, {0x000C0104, SendParameter, "SendParameter"}, {0x000D0080, ReceiveParameter, "ReceiveParameter"}, {0x000E0080, GlanceParameter, "GlanceParameter"}, {0x000F0100, CancelParameter, "CancelParameter"}, {0x001000C2, DebugFunc, "DebugFunc"}, {0x001100C0, MapProgramIdForDebug, "MapProgramIdForDebug"}, {0x00120040, SetHomeMenuAppletIdForDebug, "SetHomeMenuAppletIdForDebug"}, {0x00130000, GetPreparationState, "GetPreparationState"}, {0x00140040, SetPreparationState, "SetPreparationState"}, {0x00150140, PrepareToStartApplication, "PrepareToStartApplication"}, {0x00160040, PreloadLibraryApplet, "PreloadLibraryApplet"}, {0x00170040, FinishPreloadingLibraryApplet, "FinishPreloadingLibraryApplet"}, {0x00180040, PrepareToStartLibraryApplet, "PrepareToStartLibraryApplet"}, {0x00190040, PrepareToStartSystemApplet, "PrepareToStartSystemApplet"}, {0x001A0000, PrepareToStartNewestHomeMenu, "PrepareToStartNewestHomeMenu"}, {0x001B00C4, StartApplication, "StartApplication"}, {0x001C0000, WakeupApplication, "WakeupApplication"}, {0x001D0000, CancelApplication, "CancelApplication"}, {0x001E0084, StartLibraryApplet, "StartLibraryApplet"}, {0x001F0084, StartSystemApplet, "StartSystemApplet"}, {0x00200044, StartNewestHomeMenu, "StartNewestHomeMenu"}, {0x00210000, OrderToCloseApplication, "OrderToCloseApplication"}, {0x00220040, PrepareToCloseApplication, "PrepareToCloseApplication"}, {0x00230040, PrepareToJumpToApplication, "PrepareToJumpToApplication"}, {0x00240044, JumpToApplication, "JumpToApplication"}, {0x002500C0, PrepareToCloseLibraryApplet, "PrepareToCloseLibraryApplet"}, {0x00260000, PrepareToCloseSystemApplet, "PrepareToCloseSystemApplet"}, {0x00270044, CloseApplication, "CloseApplication"}, {0x00280044, CloseLibraryApplet, "CloseLibraryApplet"}, {0x00290044, CloseSystemApplet, "CloseSystemApplet"}, {0x002A0000, OrderToCloseSystemApplet, "OrderToCloseSystemApplet"}, {0x002B0000, PrepareToJumpToHomeMenu, "PrepareToJumpToHomeMenu"}, {0x002C0044, JumpToHomeMenu, "JumpToHomeMenu"}, {0x002D0000, PrepareToLeaveHomeMenu, "PrepareToLeaveHomeMenu"}, {0x002E0044, LeaveHomeMenu, "LeaveHomeMenu"}, {0x002F0040, PrepareToLeaveResidentApplet, "PrepareToLeaveResidentApplet"}, {0x00300044, LeaveResidentApplet, "LeaveResidentApplet"}, {0x00310100, PrepareToDoApplicationJump, "PrepareToDoApplicationJump"}, {0x00320084, DoApplicationJump, "DoApplicationJump"}, {0x00330000, GetProgramIdOnApplicationJump, "GetProgramIdOnApplicationJump"}, {0x00340084, SendDeliverArg, "SendDeliverArg"}, {0x00350080, ReceiveDeliverArg, "ReceiveDeliverArg"}, {0x00360040, LoadSysMenuArg, "LoadSysMenuArg"}, {0x00370042, StoreSysMenuArg, "StoreSysMenuArg"}, {0x00380040, PreloadResidentApplet, "PreloadResidentApplet"}, {0x00390040, PrepareToStartResidentApplet, "PrepareToStartResidentApplet"}, {0x003A0044, StartResidentApplet, "StartResidentApplet"}, {0x003B0040, CancelLibraryApplet, "CancelLibraryApplet"}, {0x003C0042, SendDspSleep, "SendDspSleep"}, {0x003D0042, SendDspWakeUp, "SendDspWakeUp"}, {0x003E0080, ReplySleepQuery, "ReplySleepQuery"}, {0x003F0040, ReplySleepNotificationComplete, "ReplySleepNotificationComplete"}, {0x00400042, SendCaptureBufferInfo, "SendCaptureBufferInfo"}, {0x00410040, ReceiveCaptureBufferInfo, "ReceiveCaptureBufferInfo"}, {0x00420080, SleepSystem, "SleepSystem"}, {0x00430040, NotifyToWait, "NotifyToWait"}, {0x00440000, GetSharedFont, "GetSharedFont"}, {0x00450040, GetWirelessRebootInfo, "GetWirelessRebootInfo"}, {0x00460104, Wrap, "Wrap"}, {0x00470104, Unwrap, "Unwrap"}, {0x00480100, GetProgramInfo, "GetProgramInfo"}, {0x00490180, Reboot, "Reboot"}, {0x004A0040, GetCaptureInfo, "GetCaptureInfo"}, {0x004B00C2, AppletUtility, "AppletUtility"}, {0x004C0000, SetFatalErrDispMode, "SetFatalErrDispMode"}, {0x004D0080, GetAppletProgramInfo, "GetAppletProgramInfo"}, {0x004E0000, HardwareResetAsync, "HardwareResetAsync"}, }; //////////////////////////////////////////////////////////////////////////////////////////////////// // Interface class Interface::Interface() { Register(FunctionTable, ARRAY_SIZE(FunctionTable)); } Interface::~Interface() { } } // namespace