976ceec445a3c6483d3020ca50129d93d14290a5
[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 #undef SoMain\r
9 \r
10 // === PROTOTYPES ===\r
11 void    *DoRelocate(void *base, char **envp, const char *Filename);\r
12  int    CallUser(void *Entry, void *SP);\r
13 \r
14 // === Imports ===\r
15 extern char     gLinkedBase[];\r
16 char    **gEnvP;\r
17 extern int      memcmp(const void *m1, const void *m2, size_t size);\r
18 extern void     CallQueuedEntrypoints(char **EnvP);\r
19  \r
20 // === CODE ===\r
21 /**\r
22  \fn int SoMain(Uint base, int argc, char *argv[], char **envp)\r
23  \brief Library entry point\r
24  \note This is the entrypoint for the library\r
25 */\r
26 void *SoMain(void *base, int argc, char **argv, char **envp)\r
27 {\r
28         void    *ret;\r
29          \r
30         gEnvP = envp;\r
31 \r
32         // - Assume that the file pointer will be less than 4096\r
33         if((intptr_t)base < 0x1000) {\r
34                 SysDebug("ld-acess - SoMain: Passed file pointer %i\n", base);\r
35                 _exit(-1);\r
36                 for(;;);\r
37         }\r
38         // Check if we are being called directly\r
39         if(base == &gLinkedBase) {\r
40                 SysDebug("ld-acess should not be directly called\n");\r
41                 _exit(1);\r
42                 for(;;);\r
43         }\r
44 \r
45         // Otherwise do relocations\r
46         ret = DoRelocate( base, NULL, "Executable" );\r
47         if( ret == 0 ) {\r
48                 SysDebug("ld-acess - SoMain: Relocate failed, base=0x%x\n", base);\r
49                 _exit(-1);\r
50                 for(;;);\r
51         }\r
52 \r
53         // Call queued entry points (from libraries)\r
54         CallQueuedEntrypoints(envp);\r
55 \r
56         SysDebug("ld-acess - SoMain: Program entry %p", ret);   \r
57         return ret;\r
58 }\r
59 \r
60 /**\r
61  \fn int DoRelocate(void *base, char **envp)\r
62  \brief Relocates an in-memory image\r
63 */\r
64 void *DoRelocate(void *base, char **envp, const char *Filename)\r
65 {\r
66         uint8_t *hdr = base;\r
67         // Load Executable\r
68         if(memcmp(base, "\x7F""ELF", 4) == 0)\r
69                 return ElfRelocate(base, envp, Filename);\r
70         if(hdr[0] == 0x7F && hdr[1] == 'E' && hdr[2] == 'L' && hdr[3] == 'F')\r
71                 return ElfRelocate(base, envp, Filename);\r
72 \r
73         if(hdr[0] == 'M' && hdr[1] == 'Z')\r
74                 return PE_Relocate(base, envp, Filename);\r
75         \r
76         SysDebug("ld-acess - DoRelocate: Unkown file format '0x%x 0x%x 0x%x 0x%x'\n",\r
77                 hdr[0], hdr[1], hdr[2], hdr[3] );\r
78         SysDebug("ld-acess - DoRelocate: File '%s'\n", Filename);\r
79         _exit(-1);\r
80         for(;;);\r
81 }\r
82 \r
83 /**\r
84  \fn int CallUser(Uint entry, Uint sp)\r
85 */\r
86 int CallUser(void *entry, void *sp)\r
87 {\r
88         #if ARCHDIR_IS_x86_64\r
89         ((void **)sp)[-1] = 0;  // Clear return address\r
90         __asm__ __volatile__ (\r
91         "mov %%rax, %%rsp;\n\t"\r
92         "jmp *%%rcx"\r
93         : : "a"(sp), "c"(entry));\r
94         #elif ARCHDIR_IS_x86\r
95         ((void **)sp)[-1] = 0;  // Clear return address\r
96         __asm__ __volatile__ (\r
97         "mov %%eax, %%esp;\n\t"\r
98         "jmp *%%ecx"\r
99         : : "a"(sp), "c"(entry));\r
100         #endif\r
101         for(;;);\r
102 }\r
103 \r
104 void exit(int val)\r
105 {\r
106         _exit(val);\r
107 }\r
108 \r
109 void abort(void)\r
110 {\r
111         _exit(-4);\r
112 }\r

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