From d641f7b6c474df15ce363f945181479aa434bb3d Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Thu, 20 Jul 2023 12:18:43 +0300 Subject: [PATCH] we can now execute code (reaches init_env() function ) --- src/Core/PS4/HLE/Kernel/ThreadManagement.cpp | 2 +- src/Core/PS4/HLE/Kernel/ThreadManagement.h | 6 ++++- src/Core/PS4/HLE/LibC.cpp | 2 +- src/Core/PS4/Linker.cpp | 24 ++++++++++++++++++++ src/Core/PS4/Linker.h | 9 +++++++- src/main.cpp | 9 ++++---- 6 files changed, 44 insertions(+), 8 deletions(-) diff --git a/src/Core/PS4/HLE/Kernel/ThreadManagement.cpp b/src/Core/PS4/HLE/Kernel/ThreadManagement.cpp index 0c7fccc3..31a380da 100644 --- a/src/Core/PS4/HLE/Kernel/ThreadManagement.cpp +++ b/src/Core/PS4/HLE/Kernel/ThreadManagement.cpp @@ -27,7 +27,7 @@ int scePthreadAttrInit(ScePthreadAttr* attr) { SceKernelSchedParam param{}; param.sched_priority = 700; - result = (result == 0 ? scePthreadAttrSetinheritsched(attr, PTHREAD_INHERIT_SCHED) : result); + result = (result == 0 ? scePthreadAttrSetinheritsched(attr, 4) : result); result = (result == 0 ? scePthreadAttrSetschedparam(attr, ¶m) : result); result = (result == 0 ? scePthreadAttrSetschedpolicy(attr, SCHED_OTHER) : result); result = (result == 0 ? scePthreadAttrSetdetachstate(attr, PTHREAD_CREATE_JOINABLE) : result); diff --git a/src/Core/PS4/HLE/Kernel/ThreadManagement.h b/src/Core/PS4/HLE/Kernel/ThreadManagement.h index 5bc92036..bda43cf3 100644 --- a/src/Core/PS4/HLE/Kernel/ThreadManagement.h +++ b/src/Core/PS4/HLE/Kernel/ThreadManagement.h @@ -1,4 +1,6 @@ #pragma once +#define _TIMESPEC_DEFINED + #include #include #include "../../../../types.h" @@ -28,7 +30,9 @@ struct PthreadAttrInternal { class PThreadCxt {}; -//HLE FUNCTIONS +void Pthread_Init_Self_MainThread(); + + //HLE FUNCTIONS int scePthreadAttrInit(ScePthreadAttr* attr); int scePthreadAttrSetdetachstate(ScePthreadAttr* attr, int detachstate); int scePthreadAttrSetinheritsched(ScePthreadAttr* attr, int inheritSched); diff --git a/src/Core/PS4/HLE/LibC.cpp b/src/Core/PS4/HLE/LibC.cpp index db58b9df..41c1c8c0 100644 --- a/src/Core/PS4/HLE/LibC.cpp +++ b/src/Core/PS4/HLE/LibC.cpp @@ -9,7 +9,7 @@ namespace HLE::Libs::LibC { static void init_env() //every game/demo should probably { for(;;) { - printf("__debugbreak\n"); + printf("life is a bitch but it did reach here\n"); } //__debugbreak();//if we reach here it will be a great progress :D } diff --git a/src/Core/PS4/Linker.cpp b/src/Core/PS4/Linker.cpp index e7461690..f9f27fff 100644 --- a/src/Core/PS4/Linker.cpp +++ b/src/Core/PS4/Linker.cpp @@ -5,6 +5,7 @@ #include "../../Util/StringUtil.h" #include "Util/aerolib.h" #include "Loader/SymbolsResolver.h" +#include "HLE/Kernel/ThreadManagement.h" constexpr bool debug_loader = true; @@ -628,4 +629,27 @@ void Linker::Resolve(const std::string& name, int Symtype, Module* m, SymbolReco __debugbreak();//oute edo mallon } +} + +using exit_func_t = void (*)(); +using entry_func_t = void (*)(EntryParams* params, exit_func_t atexit_func); + +static void ProgramExitFunc() { + + printf("exit function called\n"); +} + +static void run_main_entry(u64 addr, EntryParams* params, exit_func_t exit_func) { + reinterpret_cast(addr)(params, exit_func); +} + +void Linker::Execute() +{ + HLE::Libs::LibKernel::ThreadManagement::Pthread_Init_Self_MainThread(); + EntryParams p{}; + p.argc = 1; + p.argv[0] = "eboot.bin"; //hmm should be ok? + + run_main_entry(m_modules.at(0)->elf->GetElfEntry()+m_modules.at(0)->base_virtual_addr, &p, ProgramExitFunc); + } \ No newline at end of file diff --git a/src/Core/PS4/Linker.h b/src/Core/PS4/Linker.h index e2e33019..13f45acf 100644 --- a/src/Core/PS4/Linker.h +++ b/src/Core/PS4/Linker.h @@ -7,6 +7,12 @@ struct DynamicModuleInfo; class Linker; +struct EntryParams { + int argc; + u32 padding; + const char* argv[3]; +}; + /*this struct keeps neccesary info about loaded modules.Main executeable is included too as well*/ struct Module { @@ -115,8 +121,9 @@ public: SymbolsResolver* getHLESymbols() { return m_HLEsymbols; } void Relocate(Module* m); void Resolve(const std::string& name, int Symtype, Module* m, SymbolRecord* return_info); + void Execute(); -private: + private: const ModuleInfo* FindModule(const Module& m, const std::string& id); const LibraryInfo* FindLibrary(const Module& program, const std::string& id); diff --git a/src/main.cpp b/src/main.cpp index e4d8e493..4d715777 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -33,17 +33,18 @@ // Main code int main(int argc, char* argv[]) { - if (argc == 1) { + /* if (argc == 1) { printf("Usage: %s \n", argv[0]); return -1; - } + }*/ logging::init(true);//init logging - const char* const path = argv[1]; //argument 1 is the path of self file to boot + const char* const path = argv[1]; // argument 1 is the path of self file to boot auto* linker = Singleton::Instance(); HLE::Libs::Init_HLE_Libs(linker->getHLESymbols()); auto *module =linker->LoadModule(path);//load main executable - + + linker->Execute(); #if 0 // Setup SDL if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER | SDL_INIT_GAMEPAD) != 0)