X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FLibraries%2Flibc.so_src%2Fstub.c;h=922943e1e71a7d4a120e583f85ca0e07c5e58d1c;hb=b5f8fa2dea9d6a67ac5c8a3a442ee4570deaa56c;hp=55f4ca66f7f50c5badeaf9eb657001896bba9703;hpb=814b2d0009da73b56c6def5d70a9dd97c7b17e2e;p=tpg%2Facess2.git diff --git a/Usermode/Libraries/libc.so_src/stub.c b/Usermode/Libraries/libc.so_src/stub.c index 55f4ca66..922943e1 100644 --- a/Usermode/Libraries/libc.so_src/stub.c +++ b/Usermode/Libraries/libc.so_src/stub.c @@ -4,22 +4,31 @@ #include "stdio_int.h" #include "lib.h" #include -#include +#include +#include #define USE_CPUID 0 +// === TYPES === +typedef struct { + intptr_t Base; + char *Name; +} tLoadedLib; + // === PROTOTYPES === #if USE_CPUID static void cpuid(uint32_t Num, uint32_t *EAX, uint32_t *EBX, uint32_t *EDX, uint32_t *ECX); #endif -void ErrorHandler(int Fault); + int ErrorHandler(int Fault); + +// === IMPORTS === +extern tLoadedLib gLoadedLibraries[64]; +extern void *_crt0_exit_handler; +extern void _stdio_init(void); +extern void _call_atexit_handlers(void); // === GLOBALS === -extern char **_envp; -extern struct sFILE _iob[]; -extern struct sFILE *stdin; -extern struct sFILE *stdout; -extern struct sFILE *stderr; +extern char **environ; // --- CPU Features --- #if USE_CPUID tCPUID gCPU_Features; @@ -34,18 +43,11 @@ tCPUID gCPU_Features; * \param argv Unused - Arguments (NULL for current version of ld-acess) * \param envp Environment Pointer */ -int SoMain(unsigned int BaseAddress, int argc, char **argv, char **envp) +int SoMain(UNUSED(uintptr_t, BaseAddress), UNUSED(int, argc), UNUSED(char **, argv), char **envp) { - // Init for env.c - _envp = envp; - - // Init FileIO Pointers - stdin = &_iob[0]; - stdin->FD = 0; stdin->Flags = FILE_FLAG_MODE_READ; - stdout = &_iob[1]; - stdout->FD = 1; stdout->Flags = FILE_FLAG_MODE_WRITE; - stderr = &_iob[2]; - stderr->FD = 2; stderr->Flags = FILE_FLAG_MODE_WRITE; + environ = envp; + + _stdio_init(); #if USE_CPUID { @@ -56,14 +58,31 @@ int SoMain(unsigned int BaseAddress, int argc, char **argv, char **envp) } #endif + _crt0_exit_handler = _call_atexit_handlers; + + // Set Error handler _SysSetFaultHandler(ErrorHandler); - return 1; + return 0; } -void ErrorHandler(int Fault) +int ErrorHandler(int Fault) { - fprintf(stderr, "Fault = %i\n", Fault); + int i; + + extern void ldacess_DumpLoadedLibraries(void); + ldacess_DumpLoadedLibraries(); + + fprintf(stderr, "ErrorHandler: (Fault = %i)\n", Fault); + fprintf(stderr, "Loaded Libraries:\n"); + for( i = 0; i < 64; i ++ ) + { + //if(gLoadedLibraries[i].Base == 0) continue; + // fprintf(stderr, "%02i: %p %s\n", i, gLoadedLibraries[i].Base, gLoadedLibraries[i].Name); + } + fprintf(stderr, "\n"); + exit(-1); + return -1; } #if USE_CPUID