X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Fbinary.c;h=5a919e177b8fb9f48baa744b45db9c99d951337b;hb=54bf151b1a05b74debdb5f3baec02c18406b74d1;hp=b3040a5d6e3080e106f4562d2c7b28acd38ce9cf;hpb=7d881c2e5fef91a6570e46ef69a5d4a5cf0e8b4d;p=tpg%2Facess2.git diff --git a/Kernel/binary.c b/Kernel/binary.c index b3040a5d..5a919e17 100644 --- a/Kernel/binary.c +++ b/Kernel/binary.c @@ -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;