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

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