X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Fbinary.c;h=20da5c4eb70e81259d084452ddc8b91f1429d842;hb=3ab2857efdcb81ce34dabf4d07b39ad6f5ab0b4a;hp=76893a38b73cd5aa09d8467121234be7689b49e4;hpb=61c8b3334fb9bb3c1fb48d9f1f3508ffbe5341bf;p=tpg%2Facess2.git diff --git a/Kernel/binary.c b/Kernel/binary.c index 76893a38..20da5c4e 100644 --- a/Kernel/binary.c +++ b/Kernel/binary.c @@ -91,7 +91,6 @@ int Proc_Spawn(const char *Path) } /** - * \fn int Proc_Execve(char *File, char **ArgV, char **EnvP) * \brief Replace the current user image with another * \param File File to load as the next image * \param ArgV Arguments to pass to user @@ -118,6 +117,7 @@ int Proc_Execve(const char *File, const char **ArgV, const char **EnvP) argenvBytes += strlen(ArgV[argc])+1; for( envc = 0; EnvP && EnvP[envc]; envc++ ) argenvBytes += strlen(EnvP[envc])+1; + LOG("argc = %i, envc = %i", envc); argenvBytes = (argenvBytes + sizeof(void*)-1) & ~(sizeof(void*)-1); argenvBytes += (argc+1)*sizeof(void*) + (envc+1)*sizeof(void*); @@ -136,6 +136,7 @@ int Proc_Execve(const char *File, const char **ArgV, const char **EnvP) { argvSaved[i] = strBuf; strcpy(argvSaved[i], ArgV[i]); + LOG("argv[%i] = '%s'", i, strBuf); strBuf += strlen(ArgV[i])+1; } argvSaved[i] = NULL; @@ -143,6 +144,7 @@ int Proc_Execve(const char *File, const char **ArgV, const char **EnvP) for( i = 0; i < envc; i++ ) { envpSaved[i] = strBuf; + LOG("envp[%i] = '%s'", i, strBuf); strcpy(envpSaved[i], EnvP[i]); strBuf += strlen(EnvP[i])+1; } @@ -262,26 +264,29 @@ tVAddr Binary_Load(const char *Path, tVAddr *EntryPoint) /** * \brief Finds a matching binary entry - * \param TruePath File Identifier (True path name) + * \param MountID Mountpoint ID of binary file + * \param InodeID Inode ID of the file + * \return Pointer to the binary definition (if already loaded) */ tBinary *Binary_GetInfo(tMount MountID, tInode InodeID) { tBinary *pBinary; - pBinary = glLoadedBinaries; - while(pBinary) + for(pBinary = glLoadedBinaries; pBinary; pBinary = pBinary->Next) { if(pBinary->MountID == MountID && pBinary->Inode == InodeID) return pBinary; - pBinary = pBinary->Next; } return NULL; } /** - \fn Uint Binary_MapIn(tBinary *binary) - \brief Maps an already-loaded binary into an address space. - \param binary Pointer to globally stored data. -*/ + * \brief Maps an already-loaded binary into an address space. + * \param Binary Pointer to globally stored binary definition + * \param Path Path to the binary's file (for debug) + * \param LoadMin Lowest location to map to + * \param LoadMax Highest location to map to + * \return Base load address + */ tVAddr Binary_MapIn(tBinary *Binary, const char *Path, tVAddr LoadMin, tVAddr LoadMax) { tVAddr base; @@ -299,7 +304,7 @@ tVAddr Binary_MapIn(tBinary *Binary, const char *Path, tVAddr LoadMin, tVAddr Lo if(base != 0) { LOG("Checking base %p", base); - for(i=0;iNumSections;i++) + for( i = 0; i < Binary->NumSections; i ++ ) { if( Binary_int_CheckMemFree( Binary->LoadSections[i].Virtual, Binary->LoadSections[i].MemSize ) ) { @@ -352,6 +357,7 @@ tVAddr Binary_MapIn(tBinary *Binary, const char *Path, tVAddr LoadMin, tVAddr Lo if( sect->Flags & BIN_SECTFLAG_EXEC ) protflags |= MMAP_PROT_EXEC; + // Read only pages are COW if( sect->Flags & BIN_SECTFLAG_RO ) { VFS_MMap( (void*)addr, sect->FileSize, protflags, MMAP_MAP_SHARED|mapflags, fd, sect->Offset ); } @@ -359,6 +365,8 @@ tVAddr Binary_MapIn(tBinary *Binary, const char *Path, tVAddr LoadMin, tVAddr Lo protflags |= MMAP_PROT_WRITE; VFS_MMap( (void*)addr, sect->FileSize, protflags, MMAP_MAP_PRIVATE|mapflags, fd, sect->Offset ); } + + // Apply anonymous memory for BSS if( sect->FileSize < sect->MemSize ) { mapflags |= MMAP_MAP_ANONYMOUS; VFS_MMap( @@ -366,15 +374,12 @@ tVAddr Binary_MapIn(tBinary *Binary, const char *Path, tVAddr LoadMin, tVAddr Lo protflags, MMAP_MAP_PRIVATE|mapflags, 0, 0 ); -// memset((void*)(addr + sect->FileSize), 0, sect->MemSize - sect->FileSize); } } - Log_Debug("Binary", "PID %i - Mapped '%s' to 0x%x", Threads_GetPID(), Path, base); + Log_Debug("Binary", "PID %i - Mapped '%s' to %p", Threads_GetPID(), Path, base); VFS_Close(fd); - //LOG("*0x%x = 0x%x\n", binary->Pages[0].Virtual, *(Uint*)binary->Pages[0].Virtual); - LEAVE('p', base); return base; } @@ -447,8 +452,6 @@ tBinary *Binary_DoLoad(tMount MountID, tInode Inode, const char *Path) break; } - LOG("pBinary = %p", pBinary); - // Close File VFS_Close(fp); @@ -460,6 +463,8 @@ tBinary *Binary_DoLoad(tMount MountID, tInode Inode, const char *Path) return NULL; } + LOG("pBinary = %p", pBinary); + // Error Check if(pBinary == NULL) { LEAVE('n');