// SPDX-FileCopyrightText: Copyright 2025-2026 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later

#pragma once

#include "common/types.h"
#include "core/libraries/kernel/process.h"

namespace Core::Loader {
class SymbolsResolver;
}

namespace Libraries::SysModule {

using OrbisSysModule = u16;
using OrbisSysModuleInternal = u32;

s32 PS4_SYSV_ABI sceSysmoduleGetModuleHandleInternal(OrbisSysModuleInternal id, s32* handle);
s32 PS4_SYSV_ABI sceSysmoduleGetModuleInfoForUnwind(VAddr addr, s32 flags,
                                                    Kernel::OrbisModuleInfoForUnwind* info);
s32 PS4_SYSV_ABI sceSysmoduleIsCalledFromSysModule();
s32 PS4_SYSV_ABI sceSysmoduleIsCameraPreloaded();
s32 PS4_SYSV_ABI sceSysmoduleIsLoaded(OrbisSysModule id);
s32 PS4_SYSV_ABI sceSysmoduleIsLoadedInternal(OrbisSysModuleInternal id);
s32 PS4_SYSV_ABI sceSysmoduleLoadModule(OrbisSysModule id);
s32 PS4_SYSV_ABI sceSysmoduleLoadModuleByNameInternal();
s32 PS4_SYSV_ABI sceSysmoduleLoadModuleInternal(OrbisSysModuleInternal id);
s32 PS4_SYSV_ABI sceSysmoduleLoadModuleInternalWithArg(OrbisSysModuleInternal id, s32 argc,
                                                       const void* argv, u64 unk, s32* res_out);
s32 PS4_SYSV_ABI sceSysmoduleMapLibcForLibkernel();
s32 PS4_SYSV_ABI sceSysmodulePreloadModuleForLibkernel();
s32 PS4_SYSV_ABI sceSysmoduleUnloadModule(OrbisSysModule id);
s32 PS4_SYSV_ABI sceSysmoduleUnloadModuleByNameInternal();
s32 PS4_SYSV_ABI sceSysmoduleUnloadModuleInternal();
s32 PS4_SYSV_ABI sceSysmoduleUnloadModuleInternalWithArg();

void RegisterLib(Core::Loader::SymbolsResolver* sym);
} // namespace Libraries::SysModule
