From 665ef0b82f7eb6c31720ee9262ec967904d79029 Mon Sep 17 00:00:00 2001 From: polyproxy <47796739+polybiusproxy@users.noreply.github.com> Date: Sat, 28 Dec 2024 16:25:09 +0100 Subject: [PATCH] Address review comments --- src/core/libraries/fiber/fiber.cpp | 107 +++++++++++------------------ 1 file changed, 41 insertions(+), 66 deletions(-) diff --git a/src/core/libraries/fiber/fiber.cpp b/src/core/libraries/fiber/fiber.cpp index 4123219ae..937409d95 100644 --- a/src/core/libraries/fiber/fiber.cpp +++ b/src/core/libraries/fiber/fiber.cpp @@ -41,6 +41,39 @@ void PS4_SYSV_ABI _sceFiberCheckStackOverflow(OrbisFiberContext* ctx) { } } +s32 PS4_SYSV_ABI _sceFiberAttachContext(OrbisFiber* fiber, void* addr_context, u64 size_context) { + if (size_context && size_context < ORBIS_FIBER_CONTEXT_MINIMUM_SIZE) { + return ORBIS_FIBER_ERROR_RANGE; + } + if (size_context & 15) { + return ORBIS_FIBER_ERROR_INVALID; + } + if (!addr_context || !size_context) { + return ORBIS_FIBER_ERROR_INVALID; + } + if (fiber->addr_context) { + return ORBIS_FIBER_ERROR_INVALID; + } + + fiber->addr_context = addr_context; + fiber->size_context = size_context; + fiber->context_start = addr_context; + fiber->context_end = reinterpret_cast(addr_context) + size_context; + + /* Apply signature to start of stack */ + *(u64*)addr_context = kFiberStackSignature; + + if (fiber->flags & FiberFlags::ContextSizeCheck) { + u64* stack_start = reinterpret_cast(fiber->context_start); + u64* stack_end = reinterpret_cast(fiber->context_end); + + u64* stack_ptr = stack_start + 1; + while (stack_ptr < stack_end) { + *stack_ptr++ = kFiberStackSizeCheck; + } + } +} + void PS4_SYSV_ABI _sceFiberSwitchToFiber(OrbisFiber* fiber, u64 arg_on_run_to, OrbisFiberContext* ctx) { OrbisFiberContext* fiber_ctx = fiber->context; @@ -62,8 +95,7 @@ void PS4_SYSV_ABI _sceFiberSwitchToFiber(OrbisFiber* fiber, u64 arg_on_run_to, data.entry = fiber->entry; data.arg_on_initialize = fiber->arg_on_initialize; data.arg_on_run_to = arg_on_run_to; - data.stack_addr = - reinterpret_cast(reinterpret_cast(fiber->addr_context) + fiber->size_context); + data.stack_addr = reinterpret_cast(fiber->addr_context) + fiber->size_context; if (fiber->flags & FiberFlags::SetFpuRegs) { data.fpucw = 0x037f; data.mxcsr = 0x9fc0; @@ -169,8 +201,7 @@ s32 PS4_SYSV_ABI sceFiberInitialize(OrbisFiber* fiber, const char* name, OrbisFi if (addr_context != nullptr) { fiber->context_start = addr_context; - fiber->context_end = - reinterpret_cast(reinterpret_cast(addr_context) + size_context); + fiber->context_end = reinterpret_cast(addr_context) + size_context; /* Apply signature to start of stack */ *(u64*)addr_context = kFiberStackSignature; @@ -240,37 +271,9 @@ s32 PS4_SYSV_ABI sceFiberRunImpl(OrbisFiber* fiber, void* addr_context, u64 size /* Caller wants to attach context and run. */ if (addr_context != nullptr || size_context != 0) { - if (size_context && size_context < ORBIS_FIBER_CONTEXT_MINIMUM_SIZE) { - return ORBIS_FIBER_ERROR_RANGE; - } - if (size_context & 15) { - return ORBIS_FIBER_ERROR_INVALID; - } - if (!addr_context || !size_context) { - return ORBIS_FIBER_ERROR_INVALID; - } - if (fiber->addr_context) { - return ORBIS_FIBER_ERROR_INVALID; - } - - fiber->addr_context = addr_context; - fiber->size_context = size_context; - - fiber->context_start = addr_context; - fiber->context_end = - reinterpret_cast(reinterpret_cast(addr_context) + size_context); - - /* Apply signature to start of stack */ - *(u64*)addr_context = kFiberStackSignature; - - if (fiber->flags & FiberFlags::ContextSizeCheck) { - u64* stack_start = reinterpret_cast(fiber->context_start); - u64* stack_end = reinterpret_cast(fiber->context_end); - - u64* stack_ptr = stack_start + 1; - while (stack_ptr < stack_end) { - *stack_ptr++ = kFiberStackSizeCheck; - } + s32 res = _sceFiberAttachContext(fiber, addr_context, size_context); + if (res < 0) { + return res; } } @@ -344,37 +347,9 @@ s32 PS4_SYSV_ABI sceFiberSwitchImpl(OrbisFiber* fiber, void* addr_context, u64 s /* Caller wants to attach context and switch. */ if (addr_context != nullptr || size_context != 0) { - if (size_context && size_context < ORBIS_FIBER_CONTEXT_MINIMUM_SIZE) { - return ORBIS_FIBER_ERROR_RANGE; - } - if (size_context & 15) { - return ORBIS_FIBER_ERROR_INVALID; - } - if (!addr_context || !size_context) { - return ORBIS_FIBER_ERROR_INVALID; - } - if (fiber->addr_context) { - return ORBIS_FIBER_ERROR_INVALID; - } - - fiber->addr_context = addr_context; - fiber->size_context = size_context; - - fiber->context_start = addr_context; - fiber->context_end = - reinterpret_cast(reinterpret_cast(addr_context) + size_context); - - /* Apply signature to start of stack */ - *(u64*)addr_context = kFiberStackSignature; - - if (fiber->flags & FiberFlags::ContextSizeCheck) { - u64* stack_start = reinterpret_cast(fiber->context_start); - u64* stack_end = reinterpret_cast(fiber->context_end); - - u64* stack_ptr = stack_start + 1; - while (stack_ptr < stack_end) { - *stack_ptr++ = kFiberStackSizeCheck; - } + s32 res = _sceFiberAttachContext(fiber, addr_context, size_context); + if (res < 0) { + return res; } }