Merge pull request #52 from ogniK5377/fsp
added more svcGetInfo pairs for 3.0.0+ support, Changed HEAP_SIZE and TLS_AREA_VADDR. changed mem usage & heap usage stub added, ISelfController, IApplication function stubs. Added SetThreadCoreMask
This commit is contained in:
commit
1aa4cdc3c8
|
@ -131,6 +131,8 @@ public:
|
||||||
/// Bitmask of allowed CPUs that this process' threads can run on. TODO(Subv): Actually parse
|
/// Bitmask of allowed CPUs that this process' threads can run on. TODO(Subv): Actually parse
|
||||||
/// this value from the process header.
|
/// this value from the process header.
|
||||||
u32 allowed_processor_mask = THREADPROCESSORID_DEFAULT_MASK;
|
u32 allowed_processor_mask = THREADPROCESSORID_DEFAULT_MASK;
|
||||||
|
u32 allowed_thread_priority_mask = 0xFFFFFFFF;
|
||||||
|
u32 is_virtual_address_memory_enabled = 0;
|
||||||
/// Current status of the process
|
/// Current status of the process
|
||||||
ProcessStatus status;
|
ProcessStatus status;
|
||||||
|
|
||||||
|
|
|
@ -312,6 +312,15 @@ static ResultCode GetInfo(u64* result, u64 info_id, u64 handle, u64 info_sub_id)
|
||||||
case GetInfoType::AllowedCpuIdBitmask:
|
case GetInfoType::AllowedCpuIdBitmask:
|
||||||
*result = g_current_process->allowed_processor_mask;
|
*result = g_current_process->allowed_processor_mask;
|
||||||
break;
|
break;
|
||||||
|
case GetInfoType::AllowedThreadPrioBitmask:
|
||||||
|
*result = g_current_process->allowed_thread_priority_mask;
|
||||||
|
break;
|
||||||
|
case GetInfoType::MapRegionBaseAddr:
|
||||||
|
*result = vm_manager.GetAddressSpaceBaseAddr();
|
||||||
|
break;
|
||||||
|
case GetInfoType::MapRegionSize:
|
||||||
|
*result = vm_manager.GetAddressSpaceSize();
|
||||||
|
break;
|
||||||
case GetInfoType::TotalMemoryUsage:
|
case GetInfoType::TotalMemoryUsage:
|
||||||
*result = vm_manager.GetTotalMemoryUsage();
|
*result = vm_manager.GetTotalMemoryUsage();
|
||||||
break;
|
break;
|
||||||
|
@ -333,6 +342,9 @@ static ResultCode GetInfo(u64* result, u64 info_id, u64 handle, u64 info_sub_id)
|
||||||
case GetInfoType::NewMapRegionSize:
|
case GetInfoType::NewMapRegionSize:
|
||||||
*result = vm_manager.GetNewMapRegionSize();
|
*result = vm_manager.GetNewMapRegionSize();
|
||||||
break;
|
break;
|
||||||
|
case GetInfoType::IsVirtualAddressMemoryEnabled:
|
||||||
|
*result = g_current_process->is_virtual_address_memory_enabled;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
UNIMPLEMENTED();
|
UNIMPLEMENTED();
|
||||||
}
|
}
|
||||||
|
@ -707,6 +719,11 @@ static ResultCode CreateTransferMemory(Handle* handle, VAddr addr, u64 size, u32
|
||||||
return RESULT_SUCCESS;
|
return RESULT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static ResultCode SetThreadCoreMask(u64, u64, u64) {
|
||||||
|
LOG_WARNING(Kernel_SVC, "(STUBBED) called");
|
||||||
|
return RESULT_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
struct FunctionDef {
|
struct FunctionDef {
|
||||||
using Func = void();
|
using Func = void();
|
||||||
|
@ -733,7 +750,7 @@ static const FunctionDef SVC_Table[] = {
|
||||||
{0x0C, SvcWrap<GetThreadPriority>, "GetThreadPriority"},
|
{0x0C, SvcWrap<GetThreadPriority>, "GetThreadPriority"},
|
||||||
{0x0D, SvcWrap<SetThreadPriority>, "SetThreadPriority"},
|
{0x0D, SvcWrap<SetThreadPriority>, "SetThreadPriority"},
|
||||||
{0x0E, nullptr, "GetThreadCoreMask"},
|
{0x0E, nullptr, "GetThreadCoreMask"},
|
||||||
{0x0F, nullptr, "SetThreadCoreMask"},
|
{0x0F, SvcWrap<SetThreadCoreMask>, "SetThreadCoreMask"},
|
||||||
{0x10, SvcWrap<GetCurrentProcessorNumber>, "GetCurrentProcessorNumber"},
|
{0x10, SvcWrap<GetCurrentProcessorNumber>, "GetCurrentProcessorNumber"},
|
||||||
{0x11, nullptr, "SignalEvent"},
|
{0x11, nullptr, "SignalEvent"},
|
||||||
{0x12, nullptr, "ClearEvent"},
|
{0x12, nullptr, "ClearEvent"},
|
||||||
|
|
|
@ -24,14 +24,27 @@ struct PageInfo {
|
||||||
enum class GetInfoType : u64 {
|
enum class GetInfoType : u64 {
|
||||||
// 1.0.0+
|
// 1.0.0+
|
||||||
AllowedCpuIdBitmask = 0,
|
AllowedCpuIdBitmask = 0,
|
||||||
|
AllowedThreadPrioBitmask = 1,
|
||||||
|
MapRegionBaseAddr = 2,
|
||||||
|
MapRegionSize = 3,
|
||||||
|
HeapRegionBaseAddr = 4,
|
||||||
|
HeapRegionSize = 5,
|
||||||
TotalMemoryUsage = 6,
|
TotalMemoryUsage = 6,
|
||||||
TotalHeapUsage = 7,
|
TotalHeapUsage = 7,
|
||||||
|
IsCurrentProcessBeingDebugged = 8,
|
||||||
|
ResourceHandleLimit = 9,
|
||||||
|
IdleTickCount = 10,
|
||||||
RandomEntropy = 11,
|
RandomEntropy = 11,
|
||||||
|
PerformanceCounter = 0xF0000002,
|
||||||
// 2.0.0+
|
// 2.0.0+
|
||||||
AddressSpaceBaseAddr = 12,
|
AddressSpaceBaseAddr = 12,
|
||||||
AddressSpaceSize = 13,
|
AddressSpaceSize = 13,
|
||||||
NewMapRegionBaseAddr = 14,
|
NewMapRegionBaseAddr = 14,
|
||||||
NewMapRegionSize = 15,
|
NewMapRegionSize = 15,
|
||||||
|
// 3.0.0+
|
||||||
|
IsVirtualAddressMemoryEnabled = 16,
|
||||||
|
TitleId = 18,
|
||||||
|
PrivilegedProcessId = 19,
|
||||||
};
|
};
|
||||||
|
|
||||||
void CallSVC(u32 immediate);
|
void CallSVC(u32 immediate);
|
||||||
|
|
|
@ -357,12 +357,12 @@ void VMManager::UpdatePageTableForVMA(const VirtualMemoryArea& vma) {
|
||||||
|
|
||||||
u64 VMManager::GetTotalMemoryUsage() {
|
u64 VMManager::GetTotalMemoryUsage() {
|
||||||
LOG_WARNING(Kernel, "(STUBBED) called");
|
LOG_WARNING(Kernel, "(STUBBED) called");
|
||||||
return 0x400000;
|
return 0xBE000000;
|
||||||
}
|
}
|
||||||
|
|
||||||
u64 VMManager::GetTotalHeapUsage() {
|
u64 VMManager::GetTotalHeapUsage() {
|
||||||
LOG_WARNING(Kernel, "(STUBBED) called");
|
LOG_WARNING(Kernel, "(STUBBED) called");
|
||||||
return 0x10000;
|
return 0x0;
|
||||||
}
|
}
|
||||||
|
|
||||||
VAddr VMManager::GetAddressSpaceBaseAddr() {
|
VAddr VMManager::GetAddressSpaceBaseAddr() {
|
||||||
|
|
|
@ -54,7 +54,14 @@ class ISelfController final : public ServiceFramework<ISelfController> {
|
||||||
public:
|
public:
|
||||||
ISelfController() : ServiceFramework("ISelfController") {
|
ISelfController() : ServiceFramework("ISelfController") {
|
||||||
static const FunctionInfo functions[] = {
|
static const FunctionInfo functions[] = {
|
||||||
|
{11, &ISelfController::SetOperationModeChangedNotification,
|
||||||
|
"SetOperationModeChangedNotification"},
|
||||||
|
{12, &ISelfController::SetPerformanceModeChangedNotification,
|
||||||
|
"SetPerformanceModeChangedNotification"},
|
||||||
{13, &ISelfController::SetFocusHandlingMode, "SetFocusHandlingMode"},
|
{13, &ISelfController::SetFocusHandlingMode, "SetFocusHandlingMode"},
|
||||||
|
{14, &ISelfController::SetRestartMessageEnabled, "SetRestartMessageEnabled"},
|
||||||
|
{16, &ISelfController::SetOutOfFocusSuspendingEnabled,
|
||||||
|
"SetOutOfFocusSuspendingEnabled"},
|
||||||
};
|
};
|
||||||
RegisterHandlers(functions);
|
RegisterHandlers(functions);
|
||||||
}
|
}
|
||||||
|
@ -69,6 +76,37 @@ private:
|
||||||
|
|
||||||
LOG_WARNING(Service, "(STUBBED) called");
|
LOG_WARNING(Service, "(STUBBED) called");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SetRestartMessageEnabled(Kernel::HLERequestContext& ctx) {
|
||||||
|
IPC::RequestBuilder rb{ctx, 2};
|
||||||
|
rb.Push(RESULT_SUCCESS);
|
||||||
|
|
||||||
|
LOG_WARNING(Service, "(STUBBED) called");
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetPerformanceModeChangedNotification(Kernel::HLERequestContext& ctx) {
|
||||||
|
IPC::RequestBuilder rb{ctx, 2};
|
||||||
|
rb.Push(RESULT_SUCCESS);
|
||||||
|
|
||||||
|
LOG_WARNING(Service, "(STUBBED) called");
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetOperationModeChangedNotification(Kernel::HLERequestContext& ctx) {
|
||||||
|
IPC::RequestBuilder rb{ctx, 2};
|
||||||
|
rb.Push(RESULT_SUCCESS);
|
||||||
|
|
||||||
|
LOG_WARNING(Service, "(STUBBED) called");
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetOutOfFocusSuspendingEnabled(Kernel::HLERequestContext& ctx) {
|
||||||
|
// Takes 3 input u8s with each field located immediately after the previous u8, these are
|
||||||
|
// bool flags. No output.
|
||||||
|
|
||||||
|
IPC::RequestBuilder rb{ctx, 2};
|
||||||
|
rb.Push(RESULT_SUCCESS);
|
||||||
|
|
||||||
|
LOG_WARNING(Service, "(STUBBED) called");
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class ICommonStateGetter final : public ServiceFramework<ICommonStateGetter> {
|
class ICommonStateGetter final : public ServiceFramework<ICommonStateGetter> {
|
||||||
|
@ -119,6 +157,9 @@ public:
|
||||||
IApplicationFunctions() : ServiceFramework("IApplicationFunctions") {
|
IApplicationFunctions() : ServiceFramework("IApplicationFunctions") {
|
||||||
static const FunctionInfo functions[] = {
|
static const FunctionInfo functions[] = {
|
||||||
{22, &IApplicationFunctions::SetTerminateResult, "SetTerminateResult"},
|
{22, &IApplicationFunctions::SetTerminateResult, "SetTerminateResult"},
|
||||||
|
{66, &IApplicationFunctions::InitializeGamePlayRecording,
|
||||||
|
"InitializeGamePlayRecording"},
|
||||||
|
{67, &IApplicationFunctions::SetGamePlayRecordingState, "SetGamePlayRecordingState"},
|
||||||
};
|
};
|
||||||
RegisterHandlers(functions);
|
RegisterHandlers(functions);
|
||||||
}
|
}
|
||||||
|
@ -136,6 +177,18 @@ private:
|
||||||
|
|
||||||
LOG_WARNING(Service, "(STUBBED) called, result=0x%08X", result);
|
LOG_WARNING(Service, "(STUBBED) called, result=0x%08X", result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void InitializeGamePlayRecording(Kernel::HLERequestContext& ctx) {
|
||||||
|
IPC::RequestBuilder rb{ctx, 2};
|
||||||
|
rb.Push(RESULT_SUCCESS);
|
||||||
|
LOG_WARNING(Service, "(STUBBED) called");
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetGamePlayRecordingState(Kernel::HLERequestContext& ctx) {
|
||||||
|
IPC::RequestBuilder rb{ctx, 2};
|
||||||
|
rb.Push(RESULT_SUCCESS);
|
||||||
|
LOG_WARNING(Service, "(STUBBED) called");
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class ILibraryAppletCreator final : public ServiceFramework<ILibraryAppletCreator> {
|
class ILibraryAppletCreator final : public ServiceFramework<ILibraryAppletCreator> {
|
||||||
|
|
|
@ -136,7 +136,7 @@ enum : VAddr {
|
||||||
|
|
||||||
/// Application heap (includes stack).
|
/// Application heap (includes stack).
|
||||||
HEAP_VADDR = 0x108000000,
|
HEAP_VADDR = 0x108000000,
|
||||||
HEAP_SIZE = 0x18000000,
|
HEAP_SIZE = 0xF0000000,
|
||||||
HEAP_VADDR_END = HEAP_VADDR + HEAP_SIZE,
|
HEAP_VADDR_END = HEAP_VADDR + HEAP_SIZE,
|
||||||
|
|
||||||
/// Area where shared memory buffers are mapped onto.
|
/// Area where shared memory buffers are mapped onto.
|
||||||
|
@ -177,7 +177,7 @@ enum : VAddr {
|
||||||
SHARED_PAGE_VADDR_END = SHARED_PAGE_VADDR + SHARED_PAGE_SIZE,
|
SHARED_PAGE_VADDR_END = SHARED_PAGE_VADDR + SHARED_PAGE_SIZE,
|
||||||
|
|
||||||
/// Area where TLS (Thread-Local Storage) buffers are allocated.
|
/// Area where TLS (Thread-Local Storage) buffers are allocated.
|
||||||
TLS_AREA_VADDR = 0x1FF82000,
|
TLS_AREA_VADDR = 0x228000000,
|
||||||
TLS_ENTRY_SIZE = 0x200,
|
TLS_ENTRY_SIZE = 0x200,
|
||||||
|
|
||||||
/// Equivalent to LINEAR_HEAP_VADDR, but expanded to cover the extra memory in the New 3DS.
|
/// Equivalent to LINEAR_HEAP_VADDR, but expanded to cover the extra memory in the New 3DS.
|
||||||
|
|
Reference in New Issue