mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-01-19 04:58:27 +00:00
c4506da0ae
* libkernel: Cleanup some function places * kernel: Refactor thread functions * kernel: It builds * kernel: Fix a bunch of bugs, kernel thread heap * kernel: File cleanup pt1 * File cleanup pt2 * File cleanup pt3 * File cleanup pt4 * kernel: Add missing funcs * kernel: Add basic exceptions for linux * gnmdriver: Add workload functions * kernel: Fix new pthreads code on macOS. (#1441) * kernel: Downgrade edeadlk to log * gnmdriver: Add sceGnmSubmitCommandBuffersForWorkload * exception: Add context register population for macOS. (#1444) * kernel: Pthread rewrite touchups for Windows * kernel: Multiplatform thread implementation * mutex: Remove spamming log * pthread_spec: Make assert into a log * pthread_spec: Zero initialize array * Attempt to fix non-Windows builds * hotfix: change incorrect NID for scePthreadAttrSetaffinity * scePthreadAttrSetaffinity implementation * Attempt to fix Linux * windows: Address a bunch of address space problems * address_space: Fix unmap of region surrounded by placeholders * libs: Reduce logging * pthread: Implement condvar with waitable atomics and sleepqueue * sleepq: Separate and make faster * time: Remove delay execution * Causes high cpu usage in Tohou Luna Nights * kernel: Cleanup files again * pthread: Add missing include * semaphore: Use binary_semaphore instead of condvar * Seems more reliable * libraries/sysmodule: log module on `sceSysmoduleIsLoaded` * libraries/kernel: implement `scePthreadSetPrio` --------- Co-authored-by: squidbus <175574877+squidbus@users.noreply.github.com> Co-authored-by: Daniel R. <47796739+polybiusproxy@users.noreply.github.com>
155 lines
3.8 KiB
C++
155 lines
3.8 KiB
C++
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
#pragma once
|
|
|
|
#include <algorithm>
|
|
#include <mutex>
|
|
#include <vector>
|
|
#include "core/libraries/kernel/threads.h"
|
|
#include "core/module.h"
|
|
|
|
namespace Core {
|
|
|
|
struct DynamicModuleInfo;
|
|
class Linker;
|
|
class MemoryManager;
|
|
|
|
struct OrbisKernelMemParam {
|
|
u64 size;
|
|
u64* extended_page_table;
|
|
u64* flexible_memory_size;
|
|
u8* extended_memory_1;
|
|
u64* extended_gpu_page_table;
|
|
u8* extended_memory_2;
|
|
u64* exnteded_cpu_page_table;
|
|
};
|
|
|
|
struct OrbisProcParam {
|
|
u64 size;
|
|
u32 magic;
|
|
u32 entry_count;
|
|
u64 sdk_version;
|
|
char* process_name;
|
|
char* main_thread_name;
|
|
u32* main_thread_prio;
|
|
u32* main_thread_stack_size;
|
|
void* libc_param;
|
|
OrbisKernelMemParam* mem_param;
|
|
void* fs_param;
|
|
u32* process_preload_enable;
|
|
u64 unknown1;
|
|
};
|
|
|
|
using ExitFunc = PS4_SYSV_ABI void (*)();
|
|
|
|
class Linker;
|
|
|
|
struct EntryParams {
|
|
int argc;
|
|
u32 padding;
|
|
const char* argv[3];
|
|
VAddr entry_addr;
|
|
};
|
|
|
|
struct HeapAPI {
|
|
PS4_SYSV_ABI void* (*heap_malloc)(size_t);
|
|
PS4_SYSV_ABI void (*heap_free)(void*);
|
|
PS4_SYSV_ABI void* (*heap_calloc)(size_t, size_t);
|
|
PS4_SYSV_ABI void* (*heap_realloc)(void*, size_t);
|
|
PS4_SYSV_ABI void* (*heap_memalign)(size_t, size_t);
|
|
PS4_SYSV_ABI int (*heap_posix_memalign)(void**, size_t, size_t);
|
|
// NOTE: Fields below may be inaccurate
|
|
PS4_SYSV_ABI int (*heap_reallocalign)(void);
|
|
PS4_SYSV_ABI void (*heap_malloc_stats)(void);
|
|
PS4_SYSV_ABI int (*heap_malloc_stats_fast)(void);
|
|
PS4_SYSV_ABI size_t (*heap_malloc_usable_size)(void*);
|
|
};
|
|
|
|
using AppHeapAPI = HeapAPI*;
|
|
|
|
class Linker {
|
|
public:
|
|
explicit Linker();
|
|
~Linker();
|
|
|
|
Loader::SymbolsResolver& GetHLESymbols() {
|
|
return m_hle_symbols;
|
|
}
|
|
|
|
OrbisProcParam* GetProcParam() const {
|
|
return m_modules[0]->GetProcParam<OrbisProcParam*>();
|
|
}
|
|
|
|
Module* GetModule(s32 index) const {
|
|
return m_modules.at(index).get();
|
|
}
|
|
|
|
u32 MaxTlsIndex() const {
|
|
return max_tls_index;
|
|
}
|
|
|
|
u32 GenerationCounter() const {
|
|
return dtv_generation_counter;
|
|
}
|
|
|
|
size_t StaticTlsSize() const noexcept {
|
|
return static_tls_size;
|
|
}
|
|
|
|
void RelocateAnyImports(Module* m) {
|
|
Relocate(m);
|
|
for (auto& module : m_modules) {
|
|
const auto imports = module->GetImportModules();
|
|
if (std::ranges::contains(imports, m->name, &ModuleInfo::name)) {
|
|
Relocate(module.get());
|
|
}
|
|
}
|
|
}
|
|
|
|
void LoadSharedLibraries() {
|
|
for (auto& module : m_modules) {
|
|
if (module->IsSharedLib()) {
|
|
module->Start(0, nullptr, nullptr);
|
|
}
|
|
}
|
|
}
|
|
|
|
void SetHeapAPI(void* func[]) {
|
|
heap_api = reinterpret_cast<AppHeapAPI>(func);
|
|
}
|
|
|
|
void AdvanceGenerationCounter() noexcept {
|
|
dtv_generation_counter++;
|
|
}
|
|
|
|
void* TlsGetAddr(u64 module_index, u64 offset);
|
|
void* AllocateTlsForThread(bool is_primary);
|
|
void FreeTlsForNonPrimaryThread(void* pointer);
|
|
|
|
s32 LoadModule(const std::filesystem::path& elf_name, bool is_dynamic = false);
|
|
Module* FindByAddress(VAddr address);
|
|
|
|
void Relocate(Module* module);
|
|
bool Resolve(const std::string& name, Loader::SymbolType type, Module* module,
|
|
Loader::SymbolRecord* return_info);
|
|
void Execute();
|
|
void DebugDump();
|
|
|
|
private:
|
|
const Module* FindExportedModule(const ModuleInfo& m, const LibraryInfo& l);
|
|
|
|
MemoryManager* memory;
|
|
Libraries::Kernel::Thread main_thread;
|
|
std::mutex mutex;
|
|
u32 dtv_generation_counter{1};
|
|
size_t static_tls_size{};
|
|
u32 max_tls_index{};
|
|
u32 num_static_modules{};
|
|
AppHeapAPI heap_api{};
|
|
std::vector<std::unique_ptr<Module>> m_modules;
|
|
Loader::SymbolsResolver m_hle_symbols{};
|
|
};
|
|
|
|
} // namespace Core
|