mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-01-15 11:25:13 +00:00
hotfix: fix fiber initialization
Some checks are pending
Build and Release / reuse (push) Waiting to run
Build and Release / clang-format (push) Waiting to run
Build and Release / get-info (push) Waiting to run
Build and Release / windows-sdl (push) Blocked by required conditions
Build and Release / windows-qt (push) Blocked by required conditions
Build and Release / macos-sdl (push) Blocked by required conditions
Build and Release / macos-qt (push) Blocked by required conditions
Build and Release / linux-sdl (push) Blocked by required conditions
Build and Release / linux-qt (push) Blocked by required conditions
Build and Release / pre-release (push) Blocked by required conditions
Some checks are pending
Build and Release / reuse (push) Waiting to run
Build and Release / clang-format (push) Waiting to run
Build and Release / get-info (push) Waiting to run
Build and Release / windows-sdl (push) Blocked by required conditions
Build and Release / windows-qt (push) Blocked by required conditions
Build and Release / macos-sdl (push) Blocked by required conditions
Build and Release / macos-qt (push) Blocked by required conditions
Build and Release / linux-sdl (push) Blocked by required conditions
Build and Release / linux-qt (push) Blocked by required conditions
Build and Release / pre-release (push) Blocked by required conditions
This commit is contained in:
parent
851995d444
commit
ee974414d2
|
@ -34,6 +34,7 @@ public:
|
||||||
static constexpr u32 FW_20 = 0x2000000;
|
static constexpr u32 FW_20 = 0x2000000;
|
||||||
static constexpr u32 FW_25 = 0x2500000;
|
static constexpr u32 FW_25 = 0x2500000;
|
||||||
static constexpr u32 FW_30 = 0x3000000;
|
static constexpr u32 FW_30 = 0x3000000;
|
||||||
|
static constexpr u32 FW_35 = 0x3500000;
|
||||||
static constexpr u32 FW_40 = 0x4000000;
|
static constexpr u32 FW_40 = 0x4000000;
|
||||||
static constexpr u32 FW_45 = 0x4500000;
|
static constexpr u32 FW_45 = 0x4500000;
|
||||||
static constexpr u32 FW_50 = 0x5000000;
|
static constexpr u32 FW_50 = 0x5000000;
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
#include "fiber.h"
|
#include "fiber.h"
|
||||||
|
|
||||||
|
#include "common/elf_info.h"
|
||||||
#include "common/logging/log.h"
|
#include "common/logging/log.h"
|
||||||
#include "core/libraries/fiber/fiber_error.h"
|
#include "core/libraries/fiber/fiber_error.h"
|
||||||
#include "core/libraries/libs.h"
|
#include "core/libraries/libs.h"
|
||||||
|
@ -72,6 +73,8 @@ s32 PS4_SYSV_ABI _sceFiberAttachContext(OrbisFiber* fiber, void* addr_context, u
|
||||||
*stack_ptr++ = kFiberStackSizeCheck;
|
*stack_ptr++ = kFiberStackSizeCheck;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return ORBIS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PS4_SYSV_ABI _sceFiberSwitchToFiber(OrbisFiber* fiber, u64 arg_on_run_to,
|
void PS4_SYSV_ABI _sceFiberSwitchToFiber(OrbisFiber* fiber, u64 arg_on_run_to,
|
||||||
|
@ -143,9 +146,10 @@ void PS4_SYSV_ABI _sceFiberTerminate(OrbisFiber* fiber, u64 arg_on_return, Orbis
|
||||||
__builtin_trap();
|
__builtin_trap();
|
||||||
}
|
}
|
||||||
|
|
||||||
s32 PS4_SYSV_ABI sceFiberInitialize(OrbisFiber* fiber, const char* name, OrbisFiberEntry entry,
|
s32 PS4_SYSV_ABI sceFiberInitializeImpl(OrbisFiber* fiber, const char* name, OrbisFiberEntry entry,
|
||||||
u64 arg_on_initialize, void* addr_context, u64 size_context,
|
u64 arg_on_initialize, void* addr_context, u64 size_context,
|
||||||
const OrbisFiberOptParam* opt_param, u32 build_ver) {
|
const OrbisFiberOptParam* opt_param, u32 flags,
|
||||||
|
u32 build_ver) {
|
||||||
if (!fiber || !name || !entry) {
|
if (!fiber || !name || !entry) {
|
||||||
return ORBIS_FIBER_ERROR_NULL;
|
return ORBIS_FIBER_ERROR_NULL;
|
||||||
}
|
}
|
||||||
|
@ -171,12 +175,12 @@ s32 PS4_SYSV_ABI sceFiberInitialize(OrbisFiber* fiber, const char* name, OrbisFi
|
||||||
return ORBIS_FIBER_ERROR_INVALID;
|
return ORBIS_FIBER_ERROR_INVALID;
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 flags = FiberFlags::None;
|
u32 user_flags = flags;
|
||||||
if (build_ver >= 0x3500000) {
|
if (build_ver >= Common::ElfInfo::FW_35) {
|
||||||
flags |= FiberFlags::SetFpuRegs;
|
user_flags |= FiberFlags::SetFpuRegs;
|
||||||
}
|
}
|
||||||
if (context_size_check) {
|
if (context_size_check) {
|
||||||
flags |= FiberFlags::ContextSizeCheck;
|
user_flags |= FiberFlags::ContextSizeCheck;
|
||||||
}
|
}
|
||||||
|
|
||||||
strncpy(fiber->name, name, ORBIS_FIBER_MAX_NAME_LENGTH);
|
strncpy(fiber->name, name, ORBIS_FIBER_MAX_NAME_LENGTH);
|
||||||
|
@ -186,7 +190,7 @@ s32 PS4_SYSV_ABI sceFiberInitialize(OrbisFiber* fiber, const char* name, OrbisFi
|
||||||
fiber->addr_context = addr_context;
|
fiber->addr_context = addr_context;
|
||||||
fiber->size_context = size_context;
|
fiber->size_context = size_context;
|
||||||
fiber->context = nullptr;
|
fiber->context = nullptr;
|
||||||
fiber->flags = flags;
|
fiber->flags = user_flags;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
A low stack area is problematic, as we can easily
|
A low stack area is problematic, as we can easily
|
||||||
|
@ -525,6 +529,13 @@ s32 PS4_SYSV_ABI sceFiberGetThreadFramePointerAddress(u64* addr_frame_pointer) {
|
||||||
return ORBIS_OK;
|
return ORBIS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
s32 PS4_SYSV_ABI sceFiberInitialize(OrbisFiber* fiber, const char* name, OrbisFiberEntry entry,
|
||||||
|
u64 arg_on_initialize, void* addr_context, u64 size_context,
|
||||||
|
const OrbisFiberOptParam* opt_param, u32 build_ver) {
|
||||||
|
return sceFiberInitializeImpl(fiber, name, entry, arg_on_initialize, addr_context, size_context,
|
||||||
|
opt_param, 0, build_ver);
|
||||||
|
}
|
||||||
|
|
||||||
s32 PS4_SYSV_ABI sceFiberRun(OrbisFiber* fiber, u64 arg_on_run_to, u64* arg_on_return) {
|
s32 PS4_SYSV_ABI sceFiberRun(OrbisFiber* fiber, u64 arg_on_run_to, u64* arg_on_return) {
|
||||||
return sceFiberRunImpl(fiber, nullptr, 0, arg_on_run_to, arg_on_return);
|
return sceFiberRunImpl(fiber, nullptr, 0, arg_on_run_to, arg_on_return);
|
||||||
}
|
}
|
||||||
|
@ -536,7 +547,7 @@ s32 PS4_SYSV_ABI sceFiberSwitch(OrbisFiber* fiber, u64 arg_on_run_to, u64* arg_o
|
||||||
void RegisterlibSceFiber(Core::Loader::SymbolsResolver* sym) {
|
void RegisterlibSceFiber(Core::Loader::SymbolsResolver* sym) {
|
||||||
LIB_FUNCTION("hVYD7Ou2pCQ", "libSceFiber", 1, "libSceFiber", 1, 1, sceFiberInitialize);
|
LIB_FUNCTION("hVYD7Ou2pCQ", "libSceFiber", 1, "libSceFiber", 1, 1, sceFiberInitialize);
|
||||||
LIB_FUNCTION("7+OJIpko9RY", "libSceFiber", 1, "libSceFiber", 1, 1,
|
LIB_FUNCTION("7+OJIpko9RY", "libSceFiber", 1, "libSceFiber", 1, 1,
|
||||||
sceFiberInitialize); // _sceFiberInitializeWithInternalOptionImpl
|
sceFiberInitializeImpl); // _sceFiberInitializeWithInternalOptionImpl
|
||||||
LIB_FUNCTION("asjUJJ+aa8s", "libSceFiber", 1, "libSceFiber", 1, 1, sceFiberOptParamInitialize);
|
LIB_FUNCTION("asjUJJ+aa8s", "libSceFiber", 1, "libSceFiber", 1, 1, sceFiberOptParamInitialize);
|
||||||
LIB_FUNCTION("JeNX5F-NzQU", "libSceFiber", 1, "libSceFiber", 1, 1, sceFiberFinalize);
|
LIB_FUNCTION("JeNX5F-NzQU", "libSceFiber", 1, "libSceFiber", 1, 1, sceFiberFinalize);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue