mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-08-06 17:32:40 +00:00
Address review comments
This commit is contained in:
parent
0fdc6c4370
commit
665ef0b82f
@ -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<u8*>(addr_context) + size_context;
|
||||||
|
|
||||||
|
/* Apply signature to start of stack */
|
||||||
|
*(u64*)addr_context = kFiberStackSignature;
|
||||||
|
|
||||||
|
if (fiber->flags & FiberFlags::ContextSizeCheck) {
|
||||||
|
u64* stack_start = reinterpret_cast<u64*>(fiber->context_start);
|
||||||
|
u64* stack_end = reinterpret_cast<u64*>(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,
|
void PS4_SYSV_ABI _sceFiberSwitchToFiber(OrbisFiber* fiber, u64 arg_on_run_to,
|
||||||
OrbisFiberContext* ctx) {
|
OrbisFiberContext* ctx) {
|
||||||
OrbisFiberContext* fiber_ctx = fiber->context;
|
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.entry = fiber->entry;
|
||||||
data.arg_on_initialize = fiber->arg_on_initialize;
|
data.arg_on_initialize = fiber->arg_on_initialize;
|
||||||
data.arg_on_run_to = arg_on_run_to;
|
data.arg_on_run_to = arg_on_run_to;
|
||||||
data.stack_addr =
|
data.stack_addr = reinterpret_cast<u8*>(fiber->addr_context) + fiber->size_context;
|
||||||
reinterpret_cast<void*>(reinterpret_cast<u64>(fiber->addr_context) + fiber->size_context);
|
|
||||||
if (fiber->flags & FiberFlags::SetFpuRegs) {
|
if (fiber->flags & FiberFlags::SetFpuRegs) {
|
||||||
data.fpucw = 0x037f;
|
data.fpucw = 0x037f;
|
||||||
data.mxcsr = 0x9fc0;
|
data.mxcsr = 0x9fc0;
|
||||||
@ -169,8 +201,7 @@ s32 PS4_SYSV_ABI sceFiberInitialize(OrbisFiber* fiber, const char* name, OrbisFi
|
|||||||
|
|
||||||
if (addr_context != nullptr) {
|
if (addr_context != nullptr) {
|
||||||
fiber->context_start = addr_context;
|
fiber->context_start = addr_context;
|
||||||
fiber->context_end =
|
fiber->context_end = reinterpret_cast<u8*>(addr_context) + size_context;
|
||||||
reinterpret_cast<void*>(reinterpret_cast<u64>(addr_context) + size_context);
|
|
||||||
|
|
||||||
/* Apply signature to start of stack */
|
/* Apply signature to start of stack */
|
||||||
*(u64*)addr_context = kFiberStackSignature;
|
*(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. */
|
/* Caller wants to attach context and run. */
|
||||||
if (addr_context != nullptr || size_context != 0) {
|
if (addr_context != nullptr || size_context != 0) {
|
||||||
if (size_context && size_context < ORBIS_FIBER_CONTEXT_MINIMUM_SIZE) {
|
s32 res = _sceFiberAttachContext(fiber, addr_context, size_context);
|
||||||
return ORBIS_FIBER_ERROR_RANGE;
|
if (res < 0) {
|
||||||
}
|
return res;
|
||||||
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<void*>(reinterpret_cast<u64>(addr_context) + size_context);
|
|
||||||
|
|
||||||
/* Apply signature to start of stack */
|
|
||||||
*(u64*)addr_context = kFiberStackSignature;
|
|
||||||
|
|
||||||
if (fiber->flags & FiberFlags::ContextSizeCheck) {
|
|
||||||
u64* stack_start = reinterpret_cast<u64*>(fiber->context_start);
|
|
||||||
u64* stack_end = reinterpret_cast<u64*>(fiber->context_end);
|
|
||||||
|
|
||||||
u64* stack_ptr = stack_start + 1;
|
|
||||||
while (stack_ptr < stack_end) {
|
|
||||||
*stack_ptr++ = kFiberStackSizeCheck;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -344,37 +347,9 @@ s32 PS4_SYSV_ABI sceFiberSwitchImpl(OrbisFiber* fiber, void* addr_context, u64 s
|
|||||||
|
|
||||||
/* Caller wants to attach context and switch. */
|
/* Caller wants to attach context and switch. */
|
||||||
if (addr_context != nullptr || size_context != 0) {
|
if (addr_context != nullptr || size_context != 0) {
|
||||||
if (size_context && size_context < ORBIS_FIBER_CONTEXT_MINIMUM_SIZE) {
|
s32 res = _sceFiberAttachContext(fiber, addr_context, size_context);
|
||||||
return ORBIS_FIBER_ERROR_RANGE;
|
if (res < 0) {
|
||||||
}
|
return res;
|
||||||
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<void*>(reinterpret_cast<u64>(addr_context) + size_context);
|
|
||||||
|
|
||||||
/* Apply signature to start of stack */
|
|
||||||
*(u64*)addr_context = kFiberStackSignature;
|
|
||||||
|
|
||||||
if (fiber->flags & FiberFlags::ContextSizeCheck) {
|
|
||||||
u64* stack_start = reinterpret_cast<u64*>(fiber->context_start);
|
|
||||||
u64* stack_end = reinterpret_cast<u64*>(fiber->context_end);
|
|
||||||
|
|
||||||
u64* stack_ptr = stack_start + 1;
|
|
||||||
while (stack_ptr < stack_end) {
|
|
||||||
*stack_ptr++ = kFiberStackSizeCheck;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user