Usermode/ld-acess - Implemented R_836_COPY and R_X86_64_COPY
[tpg/acess2.git] / Usermode / Libraries / ld-acess.so_src / main.c
index c3a7c27..ff715bb 100644 (file)
@@ -2,16 +2,17 @@
  AcessOS 1 - Dynamic Loader\r
  By thePowersGang\r
 */\r
+#include <stdint.h>\r
+#include <stddef.h>\r
 #include "common.h"\r
 \r
 // === PROTOTYPES ===\r
- int   DoRelocate( Uint base, char **envp, char *Filename );\r
- int   CallUser(Uint entry, Uint SP);\r
- int   ElfRelocate(void *Base, char *envp[], char *Filename);\r
- int   PE_Relocate(void *Base, char *envp[], char *Filename);\r
+void   *DoRelocate(void *base, char **envp, const char *Filename);\r
+ int   CallUser(void *Entry, void *SP);\r
 \r
 // === Imports ===\r
-extern void    gLinkedBase;\r
+extern char    gLinkedBase[];\r
+extern tLoadedLib      gLoadedLibraries[];\r
  \r
 // === CODE ===\r
 /**\r
@@ -19,22 +20,26 @@ extern void gLinkedBase;
  \brief Library entry point\r
  \note This is the entrypoint for the library\r
 */\r
-int SoMain(Uint base, int arg1)\r
+void *SoMain(void *base)\r
 {\r
-        int    ret;\r
+       void    *ret;\r
         \r
        // - Assume that the file pointer will be less than 4096\r
-       if(base < 0x1000) {\r
+       if((intptr_t)base < 0x1000) {\r
                SysDebug("ld-acess - SoMain: Passed file pointer %i\n", base);\r
                _exit(-1);\r
                for(;;);\r
        }\r
        // Check if we are being called directly\r
-       if(base == (Uint)&gLinkedBase) {\r
+       if(base == &gLinkedBase) {\r
                SysDebug("ld-acess should not be directly called\n");\r
                _exit(1);\r
                for(;;);\r
        }\r
+\r
+       gLoadedLibraries[0].Base = &gLinkedBase;\r
+       // 'libld-acess.so' because that is what applications link against\r
+       gLoadedLibraries[0].Name = "/Acess/Libs/libld-acess.so";\r
        \r
        // Otherwise do relocations\r
        //ret = DoRelocate( base, envp, "Executable" );\r
@@ -44,28 +49,29 @@ int SoMain(Uint base, int arg1)
                _exit(-1);\r
                for(;;);\r
        }\r
-       \r
-       // And call user\r
-       //SysDebug("Calling User at 0x%x\n", ret);\r
-       CallUser( ret, (Uint)&arg1 );\r
-       \r
-       return 0;\r
+\r
+       SysDebug("ld-acess - SoMain: ret = %p", ret);   \r
+       return ret;\r
 }\r
 \r
 /**\r
- \fn int DoRelocate(Uint base, char **envp)\r
+ \fn int DoRelocate(void *base, char **envp)\r
  \brief Relocates an in-memory image\r
 */\r
-int DoRelocate( Uint base, char **envp, char *Filename )\r
+void *DoRelocate(void *base, char **envp, const char *Filename)\r
 {\r
+       uint8_t *hdr = base;\r
        // Load Executable\r
-       if(*(Uint*)base == (0x7F|('E'<<8)|('L'<<16)|('F'<<24)))\r
-               return ElfRelocate((void*)base, envp, Filename);\r
-       if(*(Uint16*)base == ('M'|('Z'<<8)))\r
-               return PE_Relocate((void*)base, envp, Filename);\r
+       if(memcmp(base, "\x7F""ELF", 4) == 0)\r
+               return ElfRelocate(base, envp, Filename);\r
+       if(hdr[0] == 0x7F && hdr[1] == 'E' && hdr[2] == 'L' && hdr[3] == 'F')\r
+               return ElfRelocate(base, envp, Filename);\r
+\r
+       if(hdr[0] == 'M' && hdr[1] == 'Z')\r
+               return PE_Relocate(base, envp, Filename);\r
        \r
        SysDebug("ld-acess - DoRelocate: Unkown file format '0x%x 0x%x 0x%x 0x%x'\n",\r
-               *(Uint8*)(base), *(Uint8*)(base+1), *(Uint8*)(base+2), *(Uint8*)(base+3) );\r
+               hdr[0], hdr[1], hdr[2], hdr[3] );\r
        SysDebug("ld-acess - DoRelocate: File '%s'\n", Filename);\r
        _exit(-1);\r
        for(;;);\r
@@ -74,13 +80,20 @@ int DoRelocate( Uint base, char **envp, char *Filename )
 /**\r
  \fn int CallUser(Uint entry, Uint sp)\r
 */\r
-int CallUser(Uint entry, Uint sp)\r
+int CallUser(void *entry, void *sp)\r
 {\r
-       //SysDebug("CallUser: (entry=0x%x, sp=0x%x)", entry, sp);\r
-       *(Uint*)(sp-4) = 0;     // Clear return address\r
+       #if ARCHDIR_IS_x86_64\r
+       ((void **)sp)[-1] = 0;  // Clear return address\r
+       __asm__ __volatile__ (\r
+       "mov %%rax, %%rsp;\n\t"\r
+       "jmp *%%rcx"\r
+       : : "a"(sp), "c"(entry));\r
+       #elif ARCHDIR_IS_x86\r
+       ((void **)sp)[-1] = 0;  // Clear return address\r
        __asm__ __volatile__ (\r
        "mov %%eax, %%esp;\n\t"\r
        "jmp *%%ecx"\r
        : : "a"(sp), "c"(entry));\r
+       #endif\r
        for(;;);\r
 }\r

UCC git Repository :: git.ucc.asn.au