Debugging a segfault in ELF loader (when loading CLIShell)
[tpg/acess2.git] / Kernel / binary.c
index b3040a5..5a919e1 100644 (file)
@@ -25,7 +25,6 @@ typedef struct sKernelBin {
 // === IMPORTS ===
 extern int     Proc_Clone(Uint *Err, Uint Flags);
 extern char    *Threads_GetName(int ID);
-extern void    Threads_Exit(int, int);
 extern Uint    MM_ClearUser(void);
 extern void    Proc_StartUser(Uint Entrypoint, Uint *Bases, int ArgC, char **ArgV, char **EnvP, int DataSize);
 extern tKernelSymbol   gKernelSymbols[];
@@ -33,16 +32,20 @@ extern void         gKernelSymbolsEnd;
 extern tBinaryType     gELF_Info;
 
 // === PROTOTYPES ===
- int   Proc_Execve(char *File, char **ArgV, char **EnvP);
-Uint   Binary_Load(char *file, Uint *entryPoint);
-tBinary *Binary_GetInfo(char *truePath);
+ int   Proc_Execve(const char *File, const char **ArgV, const char **EnvP);
+Uint   Binary_Load(const char *file, Uint *entryPoint);
+tBinary *Binary_GetInfo(const char *truePath);
 Uint   Binary_MapIn(tBinary *binary);
 Uint   Binary_IsMapped(tBinary *binary);
-tBinary *Binary_DoLoad(char *truePath);
+tBinary *Binary_DoLoad(const char *truePath);
 void   Binary_Dereference(tBinary *Info);
+#if 0
 Uint   Binary_Relocate(void *Base);
-Uint   Binary_GetSymbolEx(char *Name, Uint *Value);
-Uint   Binary_FindSymbol(void *Base, char *Name, Uint *Val);
+#endif
+Uint   Binary_GetSymbolEx(const char *Name, Uint *Value);
+#if 0
+Uint   Binary_FindSymbol(void *Base, const char *Name, Uint *Val);
+#endif
 
 // === GLOBALS ===
 tShortSpinlock glBinListLock;
@@ -78,7 +81,7 @@ int Proc_Spawn(char *Path)
        if(Proc_Clone(NULL, CLONE_VM) == 0)
        {
                // CHILD
-               char    *args[2] = {stackPath, NULL};
+               const char      *args[2] = {stackPath, NULL};
                LOG("stackPath = '%s'\n", stackPath);
                Proc_Execve(stackPath, args, &args[1]);
                for(;;);
@@ -94,7 +97,7 @@ int Proc_Spawn(char *Path)
  * \param EnvP User's environment
  * \note Called Proc_ for historical reasons
  */
-int Proc_Execve(char *File, char **ArgV, char **EnvP)
+int Proc_Execve(const char *File, const char **ArgV, const char **EnvP)
 {
         int    argc, envc, i;
         int    argenvBytes;
@@ -121,6 +124,7 @@ int Proc_Execve(char *File, char **ArgV, char **EnvP)
        argenvBuf = malloc(argenvBytes);
        if(argenvBuf == NULL) {
                Log_Error("BIN", "Proc_Execve - What the hell? The kernel is out of heap space");
+               LEAVE('i', 0);
                return 0;
        }
        strBuf = argenvBuf + (argc+1)*sizeof(void*) + (envc+1)*sizeof(void*);
@@ -158,7 +162,8 @@ int Proc_Execve(char *File, char **ArgV, char **EnvP)
        if(bases[0] == 0)
        {
                Log_Warning("BIN", "Proc_Execve - Unable to load '%s'", Threads_GetName(-1));
-               Threads_Exit(0, 0);
+               LEAVE('-');
+               Threads_Exit(0, -10);
                for(;;);
        }
        
@@ -171,14 +176,17 @@ int Proc_Execve(char *File, char **ArgV, char **EnvP)
 
 /**
  * \fn Uint Binary_Load(char *file, Uint *entryPoint)
+ * \brief Load a binary into the current address space
+ * \param file Path to binary to load
+ * \param entryPoint   Pointer for exectuable entry point
  */
-Uint Binary_Load(char *file, Uint *entryPoint)
+Uint Binary_Load(const char *file, Uint *entryPoint)
 {
        char    *sTruePath;
        tBinary *pBinary;
        Uint    base = -1;
 
-       ENTER("sfile", file);
+       ENTER("sfile pentryPoint", file, entryPoint);
        
        // Sanity Check Argument
        if(file == NULL) {
@@ -188,6 +196,7 @@ Uint Binary_Load(char *file, Uint *entryPoint)
 
        // Get True File Path
        sTruePath = VFS_GetTruePath(file);
+       LOG("sTruePath = %p", sTruePath);
        
        if(sTruePath == NULL) {
                Log_Warning("BIN", "'%s' does not exist.", file);
@@ -196,6 +205,8 @@ Uint Binary_Load(char *file, Uint *entryPoint)
        }
        
        LOG("sTruePath = '%s'", sTruePath);
+       
+       // TODO: Also get modifcation time
 
        // Check if the binary has already been loaded
        if( !(pBinary = Binary_GetInfo(sTruePath)) )
@@ -248,7 +259,7 @@ Uint Binary_Load(char *file, Uint *entryPoint)
  * \brief Finds a matching binary entry
  * \param TruePath     File Identifier (True path name)
  */
-tBinary *Binary_GetInfo(char *TruePath)
+tBinary *Binary_GetInfo(const char *TruePath)
 {
        tBinary *pBinary;
        pBinary = glLoadedBinaries;
@@ -381,7 +392,7 @@ Uint Binary_IsMapped(tBinary *binary)
  * \brief Loads a binary file into memory
  * \param truePath     Absolute filename of binary
  */
-tBinary *Binary_DoLoad(char *truePath)
+tBinary *Binary_DoLoad(const char *truePath)
 {
        tBinary *pBinary;
         int    fp, i;
@@ -424,8 +435,7 @@ tBinary *Binary_DoLoad(char *truePath)
        
        // Initialise Structure
        pBinary->ReferenceCount = 0;
-       pBinary->TruePath = malloc( strlen(truePath) + 1 );
-       strcpy(pBinary->TruePath, truePath);
+       pBinary->TruePath = strdup(truePath);
        
        // Debug Information
        LOG("Interpreter: '%s'", pBinary->Interpreter);
@@ -607,12 +617,12 @@ char *Binary_RegInterp(char *Path)
 // Kernel Binary Handling
 // ============
 /**
- * \fn void *Binary_LoadKernel(char *File)
+ * \fn void *Binary_LoadKernel(const char *File)
  * \brief Load a binary into kernel space
  * \note This function shares much with #Binary_Load, but does it's own mapping
  * \param File File to load into the kernel
  */
-void *Binary_LoadKernel(char *File)
+void *Binary_LoadKernel(const char *File)
 {
        char    *sTruePath;
        tBinary *pBinary;
@@ -621,7 +631,7 @@ void *Binary_LoadKernel(char *File)
        Uint    addr;
         int    i;
 
-       ENTER("sfile", File);
+       ENTER("sFile", File);
        
        // Sanity Check Argument
        if(File == NULL) {
@@ -784,7 +794,7 @@ Uint Binary_Relocate(void *Base)
  * Gets the value of a symbol from either the currently loaded
  * libraries or the kernel's exports.
  */
-int Binary_GetSymbol(char *Name, Uint *Val)
+int Binary_GetSymbol(const char *Name, Uint *Val)
 {
        if( Binary_GetSymbolEx(Name, Val) )     return 1;
        return 0;
@@ -797,7 +807,7 @@ int Binary_GetSymbol(char *Name, Uint *Val)
  * Gets the value of a symbol from either the currently loaded
  * libraries or the kernel's exports.
  */
-Uint Binary_GetSymbolEx(char *Name, Uint *Value)
+Uint Binary_GetSymbolEx(const char *Name, Uint *Value)
 {
         int    i;
        tKernelBin      *pKBin;
@@ -833,7 +843,7 @@ Uint Binary_GetSymbolEx(char *Name, Uint *Value)
  * \param Name Name of symbol to find
  * \param Val  Pointer to place final value
  */
-Uint Binary_FindSymbol(void *Base, char *Name, Uint *Val)
+Uint Binary_FindSymbol(void *Base, const char *Name, Uint *Val)
 {
        Uint32  ident = *(Uint32*) Base;
        tBinaryType     *bt = gRegBinTypes;

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