Usermode/ld-acess - Fixing Elf64 support (and incorrect Uint* sizes)
[tpg/acess2.git] / Usermode / Libraries / ld-acess.so_src / main.c
1 /*\r
2  AcessOS 1 - Dynamic Loader\r
3  By thePowersGang\r
4 */\r
5 #include <stdint.h>\r
6 #include <stddef.h>\r
7 #include "common.h"\r
8 \r
9 // === PROTOTYPES ===\r
10 void    *DoRelocate(void *base, char **envp, const char *Filename);\r
11  int    CallUser(void *Entry, void *SP);\r
12 void    *ElfRelocate(void *Base, char **envp, const char *Filename);\r
13 void    *PE_Relocate(void *Base, char **envp, const char *Filename);\r
14 \r
15 // === Imports ===\r
16 extern char     gLinkedBase[];\r
17 extern tLoadedLib       gLoadedLibraries[];\r
18  \r
19 // === CODE ===\r
20 /**\r
21  \fn int SoMain(Uint base, int argc, char *argv[], char **envp)\r
22  \brief Library entry point\r
23  \note This is the entrypoint for the library\r
24 */\r
25 void *SoMain(void *base)\r
26 {\r
27         void    *ret;\r
28          \r
29         // - Assume that the file pointer will be less than 4096\r
30         if((intptr_t)base < 0x1000) {\r
31                 SysDebug("ld-acess - SoMain: Passed file pointer %i\n", base);\r
32                 _exit(-1);\r
33                 for(;;);\r
34         }\r
35         // Check if we are being called directly\r
36         if(base == &gLinkedBase) {\r
37                 SysDebug("ld-acess should not be directly called\n");\r
38                 _exit(1);\r
39                 for(;;);\r
40         }\r
41 \r
42         gLoadedLibraries[0].Base = &gLinkedBase;\r
43         // 'libld-acess.so' because that is what applications link against\r
44         gLoadedLibraries[0].Name = "/Acess/Libs/libld-acess.so";\r
45         \r
46         // Otherwise do relocations\r
47         //ret = DoRelocate( base, envp, "Executable" );\r
48         ret = DoRelocate( base, NULL, "Executable" );\r
49         if( ret == 0 ) {\r
50                 SysDebug("ld-acess - SoMain: Relocate failed, base=0x%x\n", base);\r
51                 _exit(-1);\r
52                 for(;;);\r
53         }\r
54 \r
55         SysDebug("ld-acess - SoMain: ret = %p", ret);   \r
56         return ret;\r
57 }\r
58 \r
59 /**\r
60  \fn int DoRelocate(void *base, char **envp)\r
61  \brief Relocates an in-memory image\r
62 */\r
63 void *DoRelocate(void *base, char **envp, const char *Filename)\r
64 {\r
65         uint8_t *hdr = base;\r
66         // Load Executable\r
67         if(memcmp(base, "\x7F""ELF", 4) == 0)\r
68                 return ElfRelocate(base, envp, Filename);\r
69         if(hdr[0] == 0x7F && hdr[1] == 'E' && hdr[2] == 'L' && hdr[3] == 'F')\r
70                 return ElfRelocate(base, envp, Filename);\r
71 \r
72         if(hdr[0] == 'M' && hdr[1] == 'Z')\r
73                 return PE_Relocate(base, envp, Filename);\r
74         \r
75         SysDebug("ld-acess - DoRelocate: Unkown file format '0x%x 0x%x 0x%x 0x%x'\n",\r
76                 hdr[0], hdr[1], hdr[2], hdr[3] );\r
77         SysDebug("ld-acess - DoRelocate: File '%s'\n", Filename);\r
78         _exit(-1);\r
79         for(;;);\r
80 }\r
81 \r
82 /**\r
83  \fn int CallUser(Uint entry, Uint sp)\r
84 */\r
85 int CallUser(void *entry, void *sp)\r
86 {\r
87         #if ARCHDIR_IS_x86_64\r
88         ((void **)sp)[-1] = 0;  // Clear return address\r
89         __asm__ __volatile__ (\r
90         "mov %%rax, %%rsp;\n\t"\r
91         "jmp *%%rcx"\r
92         : : "a"(sp), "c"(entry));\r
93         #elif ARCHDIR_IS_x86\r
94         ((void **)sp)[-1] = 0;  // Clear return address\r
95         __asm__ __volatile__ (\r
96         "mov %%eax, %%esp;\n\t"\r
97         "jmp *%%ecx"\r
98         : : "a"(sp), "c"(entry));\r
99         #endif\r
100         for(;;);\r
101 }\r

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