Initial commit

This commit is contained in:
InoriRus
2021-12-01 19:29:27 +10:00
parent b1e7dcdc5d
commit 43f49c8763
1843 changed files with 1111694 additions and 0 deletions
+560
View File
@@ -0,0 +1,560 @@
#include "Kyty/Core/Common.h"
#include "Kyty/Core/DbgAssert.h"
#include "Kyty/Core/Singleton.h"
#include "Kyty/Core/String.h"
#include "Kyty/Math/Rand.h"
#include "Emulator/Common.h"
#include "Emulator/Config.h"
#include "Emulator/Kernel/EventFlag.h"
#include "Emulator/Kernel/EventQueue.h"
#include "Emulator/Kernel/FileSystem.h"
#include "Emulator/Kernel/Memory.h"
#include "Emulator/Kernel/Pthread.h"
#include "Emulator/Libs/Errno.h"
#include "Emulator/Libs/Libs.h"
#include "Emulator/RuntimeLinker.h"
#include "Emulator/SymbolDatabase.h"
#include <cstdlib>
#ifdef KYTY_EMU_ENABLED
namespace Kyty::Libs {
LIB_VERSION("libkernel", 1, "libkernel", 1, 1);
namespace LibKernel {
using KernelModule = int32_t;
using get_thread_atexit_count_func_t = KYTY_SYSV_ABI int (*)(KernelModule);
using thread_atexit_report_func_t = KYTY_SYSV_ABI void (*)(KernelModule);
#pragma pack(1)
struct KernelLoadModuleOpt
{
size_t size;
};
struct KernelUnloadModuleOpt
{
size_t size;
};
struct TlsInfo
{
Loader::Program* program;
uint64_t offset;
};
struct MallocReplace
{
uint64_t size = sizeof(MallocReplace);
void* malloc_initialize = nullptr;
void* malloc_finalize = nullptr;
void* malloc = nullptr;
void* free = nullptr;
void* calloc = nullptr;
void* realloc = nullptr;
void* memalign = nullptr;
void* reallocalign = nullptr;
void* posix_memalign = nullptr;
void* malloc_stats = nullptr;
void* malloc_stats_fast = nullptr;
void* malloc_usable_size = nullptr;
void* aligned_alloc = nullptr;
};
struct NewReplace
{
uint64_t size = sizeof(NewReplace);
void* new_p = nullptr;
void* new_nothrow = nullptr;
void* new_array = nullptr;
void* new_array_nothrow = nullptr;
void* delete_p = nullptr;
void* delete_nothrow = nullptr;
void* delete_array = nullptr;
void* delete_array_nothrow = nullptr;
void* delete_with_size = nullptr;
void* delete_with_size_nothrow = nullptr;
void* delete_array_with_size = nullptr;
void* delete_array_with_size_nothrow = nullptr;
};
struct ModuleInfo
{
uint64_t size;
uint64_t info[32];
KernelModule handle;
uint8_t pad[156];
};
#pragma pack()
constexpr size_t PROGNAME_MAX_SIZE = 511;
static uint64_t g_stack_chk_guard = 0xDeadBeef5533CCAA;
static char g_progname_buf[PROGNAME_MAX_SIZE + 1] = {0};
static const char* g_progname = g_progname_buf;
static get_thread_atexit_count_func_t g_get_thread_atexit_count_func = nullptr;
static thread_atexit_report_func_t g_thread_atexit_report_func = nullptr;
static thread_local int g_errno = 0;
void SetProgName(const String& name)
{
strncpy(g_progname_buf, name.C_Str(), PROGNAME_MAX_SIZE);
}
// struct KernelContext
//{
// Vector<Loader::Program*> programs;
//};
static KYTY_SYSV_ABI int* get_error_addr()
{
PRINT_NAME();
return &g_errno;
}
static KYTY_SYSV_ABI void stack_chk_fail()
{
PRINT_NAME();
EXIT("stack fail!!!");
}
static KYTY_SYSV_ABI KernelModule KernelLoadStartModule(const char* module_file_name, size_t args, const void* argp, uint32_t flags,
const KernelLoadModuleOpt* opt, int* res)
{
PRINT_NAME();
// EXIT_NOT_IMPLEMENTED(!Core::Thread::IsMainThread());
printf("\tmodule_file_name = %s\n", module_file_name);
EXIT_NOT_IMPLEMENTED(flags != 0);
EXIT_NOT_IMPLEMENTED(opt != nullptr);
auto* rt = Core::Singleton<Loader::RuntimeLinker>::Instance();
auto* program = rt->LoadProgram(FileSystem::GetRealFilename(String::FromUtf8(module_file_name)));
auto handle = program->unique_id;
program->dbg_print_reloc = true;
rt->RelocateAll();
int result = rt->StartModule(program, args, argp, nullptr);
printf("\tmodule_start() result = %d\n", result);
EXIT_NOT_IMPLEMENTED(result < 0);
if (res != nullptr)
{
*res = result;
}
return static_cast<KernelModule>(handle);
}
static int KYTY_SYSV_ABI KernelStopUnloadModule(KernelModule handle, size_t args, const void* argp, uint32_t flags,
const KernelUnloadModuleOpt* opt, int* res)
{
PRINT_NAME();
// EXIT_NOT_IMPLEMENTED(!Core::Thread::IsMainThread());
auto* rt = Core::Singleton<Loader::RuntimeLinker>::Instance();
EXIT_NOT_IMPLEMENTED(flags != 0);
EXIT_NOT_IMPLEMENTED(opt != nullptr);
auto* program = rt->FindProgramById(handle);
EXIT_NOT_IMPLEMENTED(program == nullptr);
if (g_get_thread_atexit_count_func != nullptr && g_get_thread_atexit_count_func(program->unique_id) > 0)
{
printf("KernelStopUnloadModule: cannot unload %s\n", program->file_name.C_Str());
if (g_thread_atexit_report_func != nullptr)
{
g_thread_atexit_report_func(program->unique_id);
}
return KERNEL_ERROR_EBUSY;
}
int result = rt->StopModule(program, args, argp, nullptr);
printf("\tmodule_stop() result = %d\n", result);
EXIT_NOT_IMPLEMENTED(result < 0);
if (res != nullptr)
{
*res = result;
}
rt->UnloadProgram(program);
return OK;
}
static void* KYTY_SYSV_ABI tls_get_addr(TlsInfo* info)
{
PRINT_NAME();
// EXIT_NOT_IMPLEMENTED(!Core::Thread::IsMainThread());
return Loader::RuntimeLinker::TlsGetAddr(info->program) + info->offset;
}
static void* KYTY_SYSV_ABI KernelGetProcParam()
{
PRINT_NAME();
auto* rt = Core::Singleton<Loader::RuntimeLinker>::Instance();
return reinterpret_cast<void*>(rt->GetProcParam());
}
static void KYTY_SYSV_ABI KernelRtldSetApplicationHeapAPI(void* api[])
{
PRINT_NAME();
for (int i = 0; i < 10; i++)
{
printf("\tapi[%d] = 0x%016" PRIx64 "\n", i, reinterpret_cast<uint64_t>(api[i]));
}
[[maybe_unused]] auto* heap_malloc = api[0];
[[maybe_unused]] auto* heap_free = api[1];
[[maybe_unused]] auto* heap_posix_memalign = api[6];
}
static int KYTY_SYSV_ABI write(int d, const char* str, int64_t size)
{
// PRINT_NAME();
EXIT_NOT_IMPLEMENTED(d < 0 || d > 2);
int size_int = static_cast<int>(size);
printf(FG_BRIGHT_MAGENTA "%.*s" DEFAULT, size_int, str);
return size_int;
}
static int KYTY_SYSV_ABI KernelGetModuleInfoFromAddr(uint64_t addr, int n, ModuleInfo* r)
{
PRINT_NAME();
printf("\taddr = %016" PRIx64 "\n", addr);
printf("\tn = %d\n", n);
EXIT_NOT_IMPLEMENTED(n != 2);
EXIT_NOT_IMPLEMENTED(r == nullptr);
auto* rt = Core::Singleton<Loader::RuntimeLinker>::Instance();
auto* p = rt->FindProgramByAddr(addr);
if (p == nullptr)
{
printf("\thandle: not found\n");
r->handle = 0;
return -1;
}
r->handle = p->unique_id;
printf("\thandle: %d\n", r->handle);
return 0;
}
static void KYTY_SYSV_ABI KernelDebugRaiseExceptionOnReleaseMode(int /*c1*/, int /*c2*/)
{
PRINT_NAME();
}
static void KYTY_SYSV_ABI KernelDebugRaiseException(int /*c1*/, int /*c2*/)
{
PRINT_NAME();
}
static void KYTY_SYSV_ABI exit(int code)
{
PRINT_NAME();
::exit(code);
}
static KYTY_SYSV_ABI MallocReplace* KernelGetSanitizerMallocReplaceExternal()
{
PRINT_NAME();
static MallocReplace ret;
return &ret;
}
static KYTY_SYSV_ABI NewReplace* KernelGetSanitizerNewReplaceExternal()
{
PRINT_NAME();
static NewReplace ret;
return &ret;
}
static KYTY_SYSV_ABI int elf_phdr_match_addr(ModuleInfo* m, uint64_t dtor_vaddr)
{
PRINT_NAME();
EXIT_NOT_IMPLEMENTED(m == nullptr);
auto* rt = Core::Singleton<Loader::RuntimeLinker>::Instance();
auto* p = rt->FindProgramByAddr(dtor_vaddr);
int result = (p != nullptr && p->unique_id == m->handle) ? 1 : 0;
printf("\thandle = %" PRId32 "\n", m->handle);
printf("\tdtor_vaddr = %016" PRIx64 "\n", dtor_vaddr);
printf("\tmatch = %s\n", result == 1 ? "true" : "false");
return result;
}
int KYTY_SYSV_ABI KernelUuidCreate(uint32_t* uuid)
{
PRINT_NAME();
if (uuid == nullptr)
{
return KERNEL_ERROR_EINVAL;
}
uuid[0] = Kyty::Math::Rand::Uint();
uuid[1] = Kyty::Math::Rand::Uint();
uuid[2] = Kyty::Math::Rand::Uint();
uuid[3] = Kyty::Math::Rand::Uint();
return OK;
}
static KYTY_SYSV_ABI void pthread_cxa_finalize(void* /*p*/)
{
PRINT_NAME();
}
void KYTY_SYSV_ABI KernelSetThreadAtexitCount(get_thread_atexit_count_func_t func)
{
PRINT_NAME();
EXIT_NOT_IMPLEMENTED(g_get_thread_atexit_count_func != nullptr);
g_get_thread_atexit_count_func = func;
}
void KYTY_SYSV_ABI KernelSetThreadAtexitReport(thread_atexit_report_func_t func)
{
PRINT_NAME();
EXIT_NOT_IMPLEMENTED(g_thread_atexit_report_func != nullptr);
g_thread_atexit_report_func = func;
}
int KYTY_SYSV_ABI KernelRtldThreadAtexitIncrement(uint64_t* /*c*/)
{
PRINT_NAME();
//__sync_fetch_and_add(c, 1);
return 0;
}
int KYTY_SYSV_ABI KernelRtldThreadAtexitDecrement(uint64_t* /*c*/)
{
PRINT_NAME();
//__sync_fetch_and_sub(c, 1);
return 0;
}
int KYTY_SYSV_ABI KernelIsNeoMode()
{
PRINT_NAME();
return (Config::IsNeo() ? 1 : 0);
}
} // namespace LibKernel
namespace Posix {
LIB_VERSION("Posix", 1, "libkernel", 1, 1);
int KYTY_SYSV_ABI clock_gettime(int clock_id, LibKernel::KernelTimespec* time)
{
PRINT_NAME();
if (LibKernel::KernelClockGettime(clock_id, time) < 0)
{
return -1;
}
return 0;
}
LIB_DEFINE(InitLibKernel_1_Posix)
{
LIB_FUNC("lLMT9vJAck0", clock_gettime);
}
} // namespace Posix
namespace FileSystem = LibKernel::FileSystem;
namespace Memory = LibKernel::Memory;
namespace EventQueue = LibKernel::EventQueue;
namespace EventFlag = LibKernel::EventFlag;
LIB_DEFINE(InitLibKernel_1_FS)
{
LIB_FUNC("1G3lF1Gg1k8", FileSystem::KernelOpen);
LIB_FUNC("UK2Tl2DWUns", FileSystem::KernelClose);
LIB_FUNC("Cg4srZ6TKbU", FileSystem::KernelRead);
LIB_FUNC("4wSze92BhLI", FileSystem::KernelWrite);
LIB_FUNC("+r3rMFwItV4", FileSystem::KernelPread);
LIB_FUNC("nKWi-N2HBV4", FileSystem::KernelPwrite);
LIB_FUNC("eV9wAD2riIA", FileSystem::KernelStat);
LIB_FUNC("kBwCPsYX-m4", FileSystem::KernelFstat);
LIB_FUNC("AUXVxWeJU-A", FileSystem::KernelUnlink);
LIB_FUNC("taRWhTJFTgE", FileSystem::KernelGetdirentries);
LIB_FUNC("oib76F-12fk", FileSystem::KernelLseek);
}
LIB_DEFINE(InitLibKernel_1_Mem)
{
LIB_FUNC("mL8NDH86iQI", Memory::KernelMapNamedFlexibleMemory);
LIB_FUNC("cQke9UuBQOk", Memory::KernelMunmap);
LIB_FUNC("pO96TwzOm5E", Memory::KernelGetDirectMemorySize);
LIB_FUNC("rTXw65xmLIA", Memory::KernelAllocateDirectMemory);
LIB_FUNC("L-Q3LEjIbgA", Memory::KernelMapDirectMemory);
LIB_FUNC("MBuItvba6z8", Memory::KernelReleaseDirectMemory);
LIB_FUNC("WFcfL2lzido", Memory::KernelQueryMemoryProtection);
}
LIB_DEFINE(InitLibKernel_1_Equeue)
{
LIB_FUNC("D0OdFMjp46I", EventQueue::KernelCreateEqueue);
LIB_FUNC("jpFjmgAC5AE", EventQueue::KernelDeleteEqueue);
LIB_FUNC("fzyMKs9kim0", EventQueue::KernelWaitEqueue);
}
LIB_DEFINE(InitLibKernel_1_EventFlag)
{
LIB_FUNC("BpFoboUJoZU", EventFlag::KernelCreateEventFlag);
LIB_FUNC("JTvBflhYazQ", EventFlag::KernelWaitEventFlag);
}
LIB_DEFINE(InitLibKernel_1_Pthread)
{
LIB_FUNC("9UK1vLZQft4", LibKernel::PthreadMutexLock);
LIB_FUNC("tn3VlD0hG60", LibKernel::PthreadMutexUnlock);
LIB_FUNC("2Of0f+3mhhE", LibKernel::PthreadMutexDestroy);
LIB_FUNC("cmo1RIYva9o", LibKernel::PthreadMutexInit);
LIB_FUNC("upoVrzMHFeE", LibKernel::PthreadMutexTrylock);
LIB_FUNC("smWEktiyyG0", LibKernel::PthreadMutexattrDestroy);
LIB_FUNC("F8bUHwAG284", LibKernel::PthreadMutexattrInit);
LIB_FUNC("iMp8QpE+XO4", LibKernel::PthreadMutexattrSettype);
LIB_FUNC("1FGvU0i9saQ", LibKernel::PthreadMutexattrSetprotocol);
LIB_FUNC("aI+OeCz8xrQ", LibKernel::PthreadSelf);
LIB_FUNC("6UgtwV+0zb4", LibKernel::PthreadCreate);
LIB_FUNC("3PtV6p3QNX4", LibKernel::PthreadEqual);
LIB_FUNC("onNY9Byn-W8", LibKernel::PthreadJoin);
LIB_FUNC("How7B8Oet6k", LibKernel::PthreadGetname);
LIB_FUNC("62KCwEMmzcM", LibKernel::PthreadAttrDestroy);
LIB_FUNC("x1X76arYMxU", LibKernel::PthreadAttrGet);
LIB_FUNC("8+s5BzZjxSg", LibKernel::PthreadAttrGetaffinity);
LIB_FUNC("nsYoNRywwNg", LibKernel::PthreadAttrInit);
LIB_FUNC("JaRMy+QcpeU", LibKernel::PthreadAttrGetdetachstate);
LIB_FUNC("UTXzJbWhhTE", LibKernel::PthreadAttrSetstacksize);
LIB_FUNC("-Wreprtu0Qs", LibKernel::PthreadAttrSetdetachstate);
LIB_FUNC("eXbUSpEaTsA", LibKernel::PthreadAttrSetinheritsched);
LIB_FUNC("DzES9hQF4f4", LibKernel::PthreadAttrSetschedparam);
LIB_FUNC("4+h9EzwKF4I", LibKernel::PthreadAttrSetschedpolicy);
LIB_FUNC("6ULAa0fq4jA", LibKernel::PthreadRwlockInit);
LIB_FUNC("BB+kb08Tl9A", LibKernel::PthreadRwlockDestroy);
LIB_FUNC("Ox9i0c7L5w0", LibKernel::PthreadRwlockRdlock);
LIB_FUNC("+L98PIbGttk", LibKernel::PthreadRwlockUnlock);
LIB_FUNC("mqdNorrB+gI", LibKernel::PthreadRwlockWrlock);
LIB_FUNC("2Tb92quprl0", LibKernel::PthreadCondInit);
LIB_FUNC("g+PZd2hiacg", LibKernel::PthreadCondDestroy);
LIB_FUNC("WKAXJ4XBPQ4", LibKernel::PthreadCondWait);
LIB_FUNC("JGgj7Uvrl+A", LibKernel::PthreadCondBroadcast);
LIB_FUNC("BmMjYxmew1w", LibKernel::PthreadCondTimedwait);
LIB_FUNC("QBi7HCK03hw", LibKernel::KernelClockGettime);
LIB_FUNC("ejekcaNQNq0", LibKernel::KernelGettimeofday);
LIB_FUNC("1j3S3n-tTW4", LibKernel::KernelGetTscFrequency);
LIB_FUNC("7H0iTOciTLo", LibKernel::pthread_mutex_lock_s);
LIB_FUNC("2Z+PpY6CaJg", LibKernel::pthread_mutex_unlock_s);
LIB_FUNC("mkx2fVhNMsg", LibKernel::pthread_cond_broadcast_s);
LIB_FUNC("Op8TBGY5KHg", LibKernel::pthread_cond_wait_s);
}
LIB_DEFINE(InitLibKernel_1)
{
InitLibKernel_1_FS(s);
InitLibKernel_1_Mem(s);
InitLibKernel_1_Equeue(s);
InitLibKernel_1_EventFlag(s);
InitLibKernel_1_Pthread(s);
Posix::InitLibKernel_1_Posix(s);
LIB_OBJECT("f7uOxY9mM1U", &LibKernel::g_stack_chk_guard);
LIB_OBJECT("djxxOmW6-aw", &LibKernel::g_progname);
LIB_FUNC("Ou3iL1abvng", LibKernel::stack_chk_fail);
LIB_FUNC("wzvqT4UqKX8", LibKernel::KernelLoadStartModule);
LIB_FUNC("QKd0qM58Qes", LibKernel::KernelStopUnloadModule);
LIB_FUNC("vNe1w4diLCs", LibKernel::tls_get_addr);
LIB_FUNC("959qrazPIrg", LibKernel::KernelGetProcParam);
LIB_FUNC("p5EcQeEeJAE", LibKernel::KernelRtldSetApplicationHeapAPI);
LIB_FUNC("FxVZqBAA7ks", LibKernel::write);
LIB_FUNC("f7KBOafysXo", LibKernel::KernelGetModuleInfoFromAddr);
LIB_FUNC("zE-wXIZjLoM", LibKernel::KernelDebugRaiseExceptionOnReleaseMode);
LIB_FUNC("OMDRKKAZ8I4", LibKernel::KernelDebugRaiseException);
LIB_FUNC("6Z83sYWFlA8", LibKernel::exit);
LIB_FUNC("py6L8jiVAN8", LibKernel::KernelGetSanitizerMallocReplaceExternal);
LIB_FUNC("bnZxYgAFeA0", LibKernel::KernelGetSanitizerNewReplaceExternal);
LIB_FUNC("Fjc4-n1+y2g", LibKernel::elf_phdr_match_addr);
LIB_FUNC("kbw4UHHSYy0", LibKernel::pthread_cxa_finalize);
LIB_FUNC("Xjoosiw+XPI", LibKernel::KernelUuidCreate);
LIB_FUNC("WslcK1FQcGI", LibKernel::KernelIsNeoMode);
LIB_FUNC("9BcDykPmo1I", LibKernel::get_error_addr);
LIB_FUNC("1jfXLRVzisc", LibKernel::KernelUsleep);
LIB_FUNC("rNhWz+lvOMU", LibKernel::KernelSetThreadDtors);
LIB_FUNC("WhCc1w3EhSI", LibKernel::KernelSetThreadAtexitReport);
LIB_FUNC("pB-yGZ2nQ9o", LibKernel::KernelSetThreadAtexitCount);
LIB_FUNC("Tz4RNUCBbGI", LibKernel::KernelRtldThreadAtexitIncrement);
LIB_FUNC("8OnWXlgQlvo", LibKernel::KernelRtldThreadAtexitDecrement);
}
} // namespace Kyty::Libs
#endif // KYTY_EMU_ENABLED