c3a7c278c8eb0a74a9b10e505e53df24090c8ed3
[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 "common.h"\r
6 \r
7 // === PROTOTYPES ===\r
8  int    DoRelocate( Uint base, char **envp, char *Filename );\r
9  int    CallUser(Uint entry, Uint SP);\r
10  int    ElfRelocate(void *Base, char *envp[], char *Filename);\r
11  int    PE_Relocate(void *Base, char *envp[], char *Filename);\r
12 \r
13 // === Imports ===\r
14 extern void     gLinkedBase;\r
15  \r
16 // === CODE ===\r
17 /**\r
18  \fn int SoMain(Uint base, int argc, char *argv[], char **envp)\r
19  \brief Library entry point\r
20  \note This is the entrypoint for the library\r
21 */\r
22 int SoMain(Uint base, int arg1)\r
23 {\r
24          int    ret;\r
25          \r
26         // - Assume that the file pointer will be less than 4096\r
27         if(base < 0x1000) {\r
28                 SysDebug("ld-acess - SoMain: Passed file pointer %i\n", base);\r
29                 _exit(-1);\r
30                 for(;;);\r
31         }\r
32         // Check if we are being called directly\r
33         if(base == (Uint)&gLinkedBase) {\r
34                 SysDebug("ld-acess should not be directly called\n");\r
35                 _exit(1);\r
36                 for(;;);\r
37         }\r
38         \r
39         // Otherwise do relocations\r
40         //ret = DoRelocate( base, envp, "Executable" );\r
41         ret = DoRelocate( base, NULL, "Executable" );\r
42         if( ret == 0 ) {\r
43                 SysDebug("ld-acess - SoMain: Relocate failed, base=0x%x\n", base);\r
44                 _exit(-1);\r
45                 for(;;);\r
46         }\r
47         \r
48         // And call user\r
49         //SysDebug("Calling User at 0x%x\n", ret);\r
50         CallUser( ret, (Uint)&arg1 );\r
51         \r
52         return 0;\r
53 }\r
54 \r
55 /**\r
56  \fn int DoRelocate(Uint base, char **envp)\r
57  \brief Relocates an in-memory image\r
58 */\r
59 int DoRelocate( Uint base, char **envp, char *Filename )\r
60 {\r
61         // Load Executable\r
62         if(*(Uint*)base == (0x7F|('E'<<8)|('L'<<16)|('F'<<24)))\r
63                 return ElfRelocate((void*)base, envp, Filename);\r
64         if(*(Uint16*)base == ('M'|('Z'<<8)))\r
65                 return PE_Relocate((void*)base, envp, Filename);\r
66         \r
67         SysDebug("ld-acess - DoRelocate: Unkown file format '0x%x 0x%x 0x%x 0x%x'\n",\r
68                 *(Uint8*)(base), *(Uint8*)(base+1), *(Uint8*)(base+2), *(Uint8*)(base+3) );\r
69         SysDebug("ld-acess - DoRelocate: File '%s'\n", Filename);\r
70         _exit(-1);\r
71         for(;;);\r
72 }\r
73 \r
74 /**\r
75  \fn int CallUser(Uint entry, Uint sp)\r
76 */\r
77 int CallUser(Uint entry, Uint sp)\r
78 {\r
79         //SysDebug("CallUser: (entry=0x%x, sp=0x%x)", entry, sp);\r
80         *(Uint*)(sp-4) = 0;     // Clear return address\r
81         __asm__ __volatile__ (\r
82         "mov %%eax, %%esp;\n\t"\r
83         "jmp *%%ecx"\r
84         : : "a"(sp), "c"(entry));\r
85         for(;;);\r
86 }\r

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