svc: Implement svcCreateResourceLimit()
This function simply creates a ResourceLimit instance and attempts to create a handle for it within the current process' handle table. If the kernal fails to either create the ResourceLimit instance or create a handle for the ResourceLimit instance, it returns a failure code (OUT_OF_RESOURCE, and HANDLE_TABLE_FULL respectively). Finally, it exits by providing the output parameter with the handle value for the ResourceLimit instance and returning that it was successful. Note: We do not return OUT_OF_RESOURCE because, if yuzu runs out of available memory, then new will currently throw. We *could* allocate the kernel instance with std::nothrow, however this would be inconsistent with how all other kernel objects are currently allocated.
This commit is contained in:
parent
f9a211220c
commit
4ef2af8c98
|
@ -1346,6 +1346,24 @@ static ResultCode GetProcessInfo(u64* out, Handle process_handle, u32 type) {
|
||||||
return RESULT_SUCCESS;
|
return RESULT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static ResultCode CreateResourceLimit(Handle* out_handle) {
|
||||||
|
LOG_DEBUG(Kernel_SVC, "called");
|
||||||
|
|
||||||
|
auto& kernel = Core::System::GetInstance().Kernel();
|
||||||
|
auto resource_limit = ResourceLimit::Create(kernel);
|
||||||
|
|
||||||
|
auto* const current_process = kernel.CurrentProcess();
|
||||||
|
ASSERT(current_process != nullptr);
|
||||||
|
|
||||||
|
const auto handle = current_process->GetHandleTable().Create(std::move(resource_limit));
|
||||||
|
if (handle.Failed()) {
|
||||||
|
return handle.Code();
|
||||||
|
}
|
||||||
|
|
||||||
|
*out_handle = *handle;
|
||||||
|
return RESULT_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
struct FunctionDef {
|
struct FunctionDef {
|
||||||
using Func = void();
|
using Func = void();
|
||||||
|
@ -1482,7 +1500,7 @@ static const FunctionDef SVC_Table[] = {
|
||||||
{0x7A, nullptr, "StartProcess"},
|
{0x7A, nullptr, "StartProcess"},
|
||||||
{0x7B, nullptr, "TerminateProcess"},
|
{0x7B, nullptr, "TerminateProcess"},
|
||||||
{0x7C, SvcWrap<GetProcessInfo>, "GetProcessInfo"},
|
{0x7C, SvcWrap<GetProcessInfo>, "GetProcessInfo"},
|
||||||
{0x7D, nullptr, "CreateResourceLimit"},
|
{0x7D, SvcWrap<CreateResourceLimit>, "CreateResourceLimit"},
|
||||||
{0x7E, nullptr, "SetResourceLimitLimitValue"},
|
{0x7E, nullptr, "SetResourceLimitLimitValue"},
|
||||||
{0x7F, nullptr, "CallSecureMonitor"},
|
{0x7F, nullptr, "CallSecureMonitor"},
|
||||||
};
|
};
|
||||||
|
|
|
@ -43,6 +43,14 @@ void SvcWrap() {
|
||||||
FuncReturn(func(static_cast<u32>(Param(0)), static_cast<u32>(Param(1))).raw);
|
FuncReturn(func(static_cast<u32>(Param(0)), static_cast<u32>(Param(1))).raw);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <ResultCode func(u32*)>
|
||||||
|
void SvcWrap() {
|
||||||
|
u32 param = 0;
|
||||||
|
const u32 retval = func(¶m).raw;
|
||||||
|
Core::CurrentArmInterface().SetReg(1, param);
|
||||||
|
FuncReturn(retval);
|
||||||
|
}
|
||||||
|
|
||||||
template <ResultCode func(u32*, u32)>
|
template <ResultCode func(u32*, u32)>
|
||||||
void SvcWrap() {
|
void SvcWrap() {
|
||||||
u32 param_1 = 0;
|
u32 param_1 = 0;
|
||||||
|
|
Reference in New Issue