Browse Source
Merge pull request #479 from Subv/hm
Merge pull request #479 from Subv/hm
Services: Added some missing services.pull/15/merge
9 changed files with 364 additions and 1 deletions
-
6src/core/CMakeLists.txt
-
121src/core/hle/service/apt_s.cpp
-
30src/core/hle/service/apt_s.h
-
2src/core/hle/service/apt_u.cpp
-
98src/core/hle/service/cfg/cfg_s.cpp
-
23src/core/hle/service/cfg/cfg_s.h
-
56src/core/hle/service/ptm_sysm.cpp
-
23src/core/hle/service/ptm_sysm.h
-
6src/core/hle/service/service.cpp
@ -0,0 +1,121 @@ |
|||
// Copyright 2015 Citra Emulator Project
|
|||
// Licensed under GPLv2 or any later version
|
|||
// Refer to the license.txt file included.
|
|||
|
|||
|
|||
#include "common/common.h"
|
|||
#include "common/file_util.h"
|
|||
|
|||
#include "core/hle/hle.h"
|
|||
#include "core/hle/kernel/event.h"
|
|||
#include "core/hle/kernel/mutex.h"
|
|||
#include "core/hle/kernel/shared_memory.h"
|
|||
#include "core/hle/service/apt_s.h"
|
|||
|
|||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
|||
// Namespace APT_S
|
|||
|
|||
namespace APT_U { |
|||
extern void GetLockHandle(Service::Interface* self); |
|||
extern void Initialize(Service::Interface* self); |
|||
extern void Enable(Service::Interface* self); |
|||
extern void InquireNotification(Service::Interface* self); |
|||
extern void GetSharedFont(Service::Interface* self); |
|||
extern void AppletUtility(Service::Interface* self); |
|||
extern void GlanceParameter(Service::Interface* self); |
|||
extern void ReceiveParameter(Service::Interface* self); |
|||
} |
|||
|
|||
namespace APT_S { |
|||
|
|||
const Interface::FunctionInfo FunctionTable[] = { |
|||
{0x00010040, APT_U::GetLockHandle, "GetLockHandle"}, |
|||
{0x00020080, APT_U::Initialize, "Initialize"}, |
|||
{0x00030040, APT_U::Enable, "Enable"}, |
|||
{0x00040040, nullptr, "Finalize"}, |
|||
{0x00050040, nullptr, "GetAppletManInfo"}, |
|||
{0x00060040, nullptr, "GetAppletInfo"}, |
|||
{0x00070000, nullptr, "GetLastSignaledAppletId"}, |
|||
{0x00080000, nullptr, "CountRegisteredApplet"}, |
|||
{0x00090040, nullptr, "IsRegistered"}, |
|||
{0x000A0040, nullptr, "GetAttribute"}, |
|||
{0x000B0040, APT_U::InquireNotification, "InquireNotification"}, |
|||
{0x000C0104, nullptr, "SendParameter"}, |
|||
{0x000D0080, APT_U::ReceiveParameter, "ReceiveParameter"}, |
|||
{0x000E0080, APT_U::GlanceParameter, "GlanceParameter"}, |
|||
{0x000F0100, nullptr, "CancelParameter"}, |
|||
{0x001000C2, nullptr, "DebugFunc"}, |
|||
{0x001100C0, nullptr, "MapProgramIdForDebug"}, |
|||
{0x00120040, nullptr, "SetHomeMenuAppletIdForDebug"}, |
|||
{0x00130000, nullptr, "GetPreparationState"}, |
|||
{0x00140040, nullptr, "SetPreparationState"}, |
|||
{0x00150140, nullptr, "PrepareToStartApplication"}, |
|||
{0x00160040, nullptr, "PreloadLibraryApplet"}, |
|||
{0x00170040, nullptr, "FinishPreloadingLibraryApplet"}, |
|||
{0x00180040, nullptr, "PrepareToStartLibraryApplet"}, |
|||
{0x00190040, nullptr, "PrepareToStartSystemApplet"}, |
|||
{0x001A0000, nullptr, "PrepareToStartNewestHomeMenu"}, |
|||
{0x001B00C4, nullptr, "StartApplication"}, |
|||
{0x001C0000, nullptr, "WakeupApplication"}, |
|||
{0x001D0000, nullptr, "CancelApplication"}, |
|||
{0x001E0084, nullptr, "StartLibraryApplet"}, |
|||
{0x001F0084, nullptr, "StartSystemApplet"}, |
|||
{0x00200044, nullptr, "StartNewestHomeMenu"}, |
|||
{0x00210000, nullptr, "OrderToCloseApplication"}, |
|||
{0x00220040, nullptr, "PrepareToCloseApplication"}, |
|||
{0x00230040, nullptr, "PrepareToJumpToApplication"}, |
|||
{0x00240044, nullptr, "JumpToApplication"}, |
|||
{0x002500C0, nullptr, "PrepareToCloseLibraryApplet"}, |
|||
{0x00260000, nullptr, "PrepareToCloseSystemApplet"}, |
|||
{0x00270044, nullptr, "CloseApplication"}, |
|||
{0x00280044, nullptr, "CloseLibraryApplet"}, |
|||
{0x00290044, nullptr, "CloseSystemApplet"}, |
|||
{0x002A0000, nullptr, "OrderToCloseSystemApplet"}, |
|||
{0x002B0000, nullptr, "PrepareToJumpToHomeMenu"}, |
|||
{0x002C0044, nullptr, "JumpToHomeMenu"}, |
|||
{0x002D0000, nullptr, "PrepareToLeaveHomeMenu"}, |
|||
{0x002E0044, nullptr, "LeaveHomeMenu"}, |
|||
{0x002F0040, nullptr, "PrepareToLeaveResidentApplet"}, |
|||
{0x00300044, nullptr, "LeaveResidentApplet"}, |
|||
{0x00310100, nullptr, "PrepareToDoApplicationJump"}, |
|||
{0x00320084, nullptr, "DoApplicationJump"}, |
|||
{0x00330000, nullptr, "GetProgramIdOnApplicationJump"}, |
|||
{0x00340084, nullptr, "SendDeliverArg"}, |
|||
{0x00350080, nullptr, "ReceiveDeliverArg"}, |
|||
{0x00360040, nullptr, "LoadSysMenuArg"}, |
|||
{0x00370042, nullptr, "StoreSysMenuArg"}, |
|||
{0x00380040, nullptr, "PreloadResidentApplet"}, |
|||
{0x00390040, nullptr, "PrepareToStartResidentApplet"}, |
|||
{0x003A0044, nullptr, "StartResidentApplet"}, |
|||
{0x003B0040, nullptr, "CancelLibraryApplet"}, |
|||
{0x003C0042, nullptr, "SendDspSleep"}, |
|||
{0x003D0042, nullptr, "SendDspWakeUp"}, |
|||
{0x003E0080, nullptr, "ReplySleepQuery"}, |
|||
{0x003F0040, nullptr, "ReplySleepNotificationComplete"}, |
|||
{0x00400042, nullptr, "SendCaptureBufferInfo"}, |
|||
{0x00410040, nullptr, "ReceiveCaptureBufferInfo"}, |
|||
{0x00420080, nullptr, "SleepSystem"}, |
|||
{0x00430040, nullptr, "NotifyToWait"}, |
|||
{0x00440000, APT_U::GetSharedFont, "GetSharedFont"}, |
|||
{0x00450040, nullptr, "GetWirelessRebootInfo"}, |
|||
{0x00460104, nullptr, "Wrap"}, |
|||
{0x00470104, nullptr, "Unwrap"}, |
|||
{0x00480100, nullptr, "GetProgramInfo"}, |
|||
{0x00490180, nullptr, "Reboot"}, |
|||
{0x004A0040, nullptr, "GetCaptureInfo"}, |
|||
{0x004B00C2, APT_U::AppletUtility, "AppletUtility"}, |
|||
{0x004C0000, nullptr, "SetFatalErrDispMode"}, |
|||
{0x004D0080, nullptr, "GetAppletProgramInfo"}, |
|||
{0x004E0000, nullptr, "HardwareResetAsync"}, |
|||
{0x004F0080, nullptr, "SetApplicationCpuTimeLimit"}, |
|||
{0x00500040, nullptr, "GetApplicationCpuTimeLimit"}, |
|||
}; |
|||
|
|||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
|||
// Interface class
|
|||
|
|||
Interface::Interface() { |
|||
Register(FunctionTable, ARRAY_SIZE(FunctionTable)); |
|||
} |
|||
|
|||
} // namespace
|
|||
@ -0,0 +1,30 @@ |
|||
// Copyright 2015 Citra Emulator Project |
|||
// Licensed under GPLv2 or any later version |
|||
// Refer to the license.txt file included. |
|||
|
|||
#pragma once |
|||
|
|||
#include "core/hle/service/service.h" |
|||
|
|||
//////////////////////////////////////////////////////////////////////////////////////////////////// |
|||
// Namespace APT_S |
|||
|
|||
namespace APT_S { |
|||
|
|||
// Application and title launching service. These services handle signaling for home/power button as |
|||
// well. Only one session for either APT service can be open at a time, normally processes close the |
|||
// service handle immediately once finished using the service. The commands for APT:U and APT:S are |
|||
// exactly the same, however certain commands are only accessible with APT:S(NS module will call |
|||
// svcBreak when the command isn't accessible). See http://3dbrew.org/wiki/NS#APT_Services. |
|||
|
|||
/// Interface to "APT:S" service |
|||
class Interface : public Service::Interface { |
|||
public: |
|||
Interface(); |
|||
|
|||
std::string GetPortName() const override { |
|||
return "APT:S"; |
|||
} |
|||
}; |
|||
|
|||
} // namespace |
|||
@ -0,0 +1,98 @@ |
|||
// Copyright 2015 Citra Emulator Project
|
|||
// Licensed under GPLv2 or any later version
|
|||
// Refer to the license.txt file included.
|
|||
|
|||
#include "common/log.h"
|
|||
#include "core/hle/hle.h"
|
|||
#include "core/hle/service/cfg/cfg.h"
|
|||
#include "core/hle/service/cfg/cfg_s.h"
|
|||
|
|||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
|||
// Namespace CFG_S
|
|||
|
|||
namespace CFG_S { |
|||
|
|||
/**
|
|||
* CFG_S::GetConfigInfoBlk2 service function |
|||
* Inputs: |
|||
* 0 : 0x00010082 |
|||
* 1 : Size |
|||
* 2 : Block ID |
|||
* 3 : Descriptor for the output buffer |
|||
* 4 : Output buffer pointer |
|||
* Outputs: |
|||
* 1 : Result of function, 0 on success, otherwise error code |
|||
*/ |
|||
static void GetConfigInfoBlk2(Service::Interface* self) { |
|||
u32* cmd_buffer = Kernel::GetCommandBuffer(); |
|||
u32 size = cmd_buffer[1]; |
|||
u32 block_id = cmd_buffer[2]; |
|||
u8* data_pointer = Memory::GetPointer(cmd_buffer[4]); |
|||
|
|||
if (data_pointer == nullptr) { |
|||
cmd_buffer[1] = -1; // TODO(Subv): Find the right error code
|
|||
return; |
|||
} |
|||
|
|||
cmd_buffer[1] = Service::CFG::GetConfigInfoBlock(block_id, size, 0x2, data_pointer).raw; |
|||
} |
|||
|
|||
/**
|
|||
* CFG_S::GetConfigInfoBlk8 service function |
|||
* Inputs: |
|||
* 0 : 0x04010082 |
|||
* 1 : Size |
|||
* 2 : Block ID |
|||
* 3 : Descriptor for the output buffer |
|||
* 4 : Output buffer pointer |
|||
* Outputs: |
|||
* 1 : Result of function, 0 on success, otherwise error code |
|||
*/ |
|||
static void GetConfigInfoBlk8(Service::Interface* self) { |
|||
u32* cmd_buffer = Kernel::GetCommandBuffer(); |
|||
u32 size = cmd_buffer[1]; |
|||
u32 block_id = cmd_buffer[2]; |
|||
u8* data_pointer = Memory::GetPointer(cmd_buffer[4]); |
|||
|
|||
if (data_pointer == nullptr) { |
|||
cmd_buffer[1] = -1; // TODO(Subv): Find the right error code
|
|||
return; |
|||
} |
|||
|
|||
cmd_buffer[1] = Service::CFG::GetConfigInfoBlock(block_id, size, 0x8, data_pointer).raw; |
|||
} |
|||
|
|||
/**
|
|||
* CFG_S::UpdateConfigNANDSavegame service function |
|||
* Inputs: |
|||
* 0 : 0x04030000 |
|||
* Outputs: |
|||
* 1 : Result of function, 0 on success, otherwise error code |
|||
*/ |
|||
static void UpdateConfigNANDSavegame(Service::Interface* self) { |
|||
u32* cmd_buffer = Kernel::GetCommandBuffer(); |
|||
cmd_buffer[1] = Service::CFG::UpdateConfigNANDSavegame().raw; |
|||
} |
|||
|
|||
const Interface::FunctionInfo FunctionTable[] = { |
|||
{0x00010082, GetConfigInfoBlk2, "GetConfigInfoBlk2"}, |
|||
{0x00020000, nullptr, "SecureInfoGetRegion"}, |
|||
{0x04010082, GetConfigInfoBlk8, "GetConfigInfoBlk8"}, |
|||
{0x04020082, nullptr, "SetConfigInfoBlk4"}, |
|||
{0x04030000, UpdateConfigNANDSavegame, "UpdateConfigNANDSavegame"}, |
|||
{0x04040042, nullptr, "GetLocalFriendCodeSeedData"}, |
|||
{0x04050000, nullptr, "GetLocalFriendCodeSeed"}, |
|||
{0x04060000, nullptr, "SecureInfoGetRegion"}, |
|||
{0x04070000, nullptr, "SecureInfoGetByte101"}, |
|||
{0x04080042, nullptr, "SecureInfoGetSerialNo"}, |
|||
{0x04090000, nullptr, "UpdateConfigBlk00040003"}, |
|||
}; |
|||
|
|||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
|||
// Interface class
|
|||
|
|||
Interface::Interface() { |
|||
Register(FunctionTable, ARRAY_SIZE(FunctionTable)); |
|||
} |
|||
|
|||
} // namespace
|
|||
@ -0,0 +1,23 @@ |
|||
// Copyright 2015 Citra Emulator Project |
|||
// Licensed under GPLv2 or any later version |
|||
// Refer to the license.txt file included. |
|||
|
|||
#pragma once |
|||
|
|||
#include "core/hle/service/service.h" |
|||
|
|||
//////////////////////////////////////////////////////////////////////////////////////////////////// |
|||
// Namespace CFG_S |
|||
|
|||
namespace CFG_S { |
|||
|
|||
class Interface : public Service::Interface { |
|||
public: |
|||
Interface(); |
|||
|
|||
std::string GetPortName() const override { |
|||
return "cfg:s"; |
|||
} |
|||
}; |
|||
|
|||
} // namespace |
|||
@ -0,0 +1,56 @@ |
|||
// Copyright 2015 Citra Emulator Project
|
|||
// Licensed under GPLv2 or any later version
|
|||
// Refer to the license.txt file included.
|
|||
|
|||
#include "common/log.h"
|
|||
#include "common/make_unique.h"
|
|||
#include "core/file_sys/archive_extsavedata.h"
|
|||
#include "core/hle/hle.h"
|
|||
#include "core/hle/service/ptm_sysm.h"
|
|||
|
|||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
|||
// Namespace PTM_SYSM
|
|||
|
|||
namespace PTM_SYSM { |
|||
|
|||
const Interface::FunctionInfo FunctionTable[] = { |
|||
{0x040100C0, nullptr, "SetRtcAlarmEx"}, |
|||
{0x04020042, nullptr, "ReplySleepQuery"}, |
|||
{0x04030042, nullptr, "NotifySleepPreparationComplete"}, |
|||
{0x04040102, nullptr, "SetWakeupTrigger"}, |
|||
{0x04050000, nullptr, "GetAwakeReason"}, |
|||
{0x04060000, nullptr, "RequestSleep"}, |
|||
{0x040700C0, nullptr, "ShutdownAsync"}, |
|||
{0x04080000, nullptr, "Awake"}, |
|||
{0x04090080, nullptr, "RebootAsync"}, |
|||
{0x040A0000, nullptr, "CheckNew3DS"}, |
|||
{0x08010640, nullptr, "SetInfoLEDPattern"}, |
|||
{0x08020040, nullptr, "SetInfoLEDPatternHeader"}, |
|||
{0x08030000, nullptr, "GetInfoLEDStatus"}, |
|||
{0x08040040, nullptr, "SetBatteryEmptyLEDPattern"}, |
|||
{0x08050000, nullptr, "ClearStepHistory"}, |
|||
{0x080600C2, nullptr, "SetStepHistory"}, |
|||
{0x08070082, nullptr, "GetPlayHistory"}, |
|||
{0x08080000, nullptr, "GetPlayHistoryStart"}, |
|||
{0x08090000, nullptr, "GetPlayHistoryLength"}, |
|||
{0x080A0000, nullptr, "ClearPlayHistory"}, |
|||
{0x080B0080, nullptr, "CalcPlayHistoryStart"}, |
|||
{0x080C0080, nullptr, "SetUserTime"}, |
|||
{0x080D0000, nullptr, "InvalidateSystemTime"}, |
|||
{0x080E0140, nullptr, "NotifyPlayEvent"}, |
|||
{0x080F0000, nullptr, "IsLegacyPowerOff"}, |
|||
{0x08100000, nullptr, "ClearLegacyPowerOff"}, |
|||
{0x08110000, nullptr, "GetShellStatus"}, |
|||
{0x08120000, nullptr, "IsShutdownByBatteryEmpty"}, |
|||
{0x08130000, nullptr, "FormatSavedata"}, |
|||
{0x08140000, nullptr, "GetLegacyJumpProhibitedFlag"} |
|||
}; |
|||
|
|||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
|||
// Interface class
|
|||
|
|||
Interface::Interface() { |
|||
Register(FunctionTable, ARRAY_SIZE(FunctionTable)); |
|||
} |
|||
|
|||
} // namespace
|
|||
@ -0,0 +1,23 @@ |
|||
// Copyright 2015 Citra Emulator Project |
|||
// Licensed under GPLv2 or any later version |
|||
// Refer to the license.txt file included. |
|||
|
|||
#pragma once |
|||
|
|||
#include "core/hle/service/service.h" |
|||
|
|||
//////////////////////////////////////////////////////////////////////////////////////////////////// |
|||
// Namespace PTM_SYSM |
|||
|
|||
namespace PTM_SYSM { |
|||
|
|||
class Interface : public Service::Interface { |
|||
public: |
|||
Interface(); |
|||
|
|||
std::string GetPortName() const override { |
|||
return "ptm:sysm"; |
|||
} |
|||
}; |
|||
|
|||
} // namespace |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue