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

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