* Acess2
* Common Binary Loader
*/
-#define DEBUG 1
+#define DEBUG 0
#include <acess.h>
#include <binary.h>
#include <mm_virt.h>
strcpy(stackPath, Path);
- LOG("stackPath = '%s'\n", stackPath);
+ LOG("stackPath = '%s'", stackPath);
if(Proc_Clone(CLONE_VM) == 0)
{
// CHILD
const char *args[2] = {stackPath, NULL};
- LOG("stackPath = '%s'\n", stackPath);
+ LOG("stackPath = '%s'", stackPath);
Proc_Execve(stackPath, args, &args[1]);
for(;;);
}
}
LOG("entry = 0x%x, bases[0] = 0x%x", entry, bases[0]);
+
+// MM_DumpTables(0, KERNEL_BASE);
+
LEAVE('-');
// --- And... Jump to it
Proc_StartUser(entry, bases, argc, argvSaved, envpSaved, argenvBytes);
{
tVAddr base;
int i, fd;
+
+ ENTER("pBinary sPath pLoadMin pLoadMax", Binary, Path, LoadMin, LoadMax);
+
// Reference Executable (Makes sure that it isn't unloaded)
Binary->ReferenceCount ++;
// Check if base is free
if(base != 0)
{
+ LOG("Checking base %p", base);
for(i=0;i<Binary->NumSections;i++)
{
if( Binary_int_CheckMemFree( Binary->LoadSections[i].Virtual, Binary->LoadSections[i].MemSize ) )
// Else decrement pointer and try again
base -= BIN_GRANUALITY;
}
+ LOG("Allocated base %p", base);
}
// Error Check
if(base < LoadMin) {
Log_Warning("Binary", "Executable '%s' cannot be loaded, no space", Path);
+ LEAVE('i', 0);
return 0;
}
tBinarySection *sect = &Binary->LoadSections[i];
Uint protflags, mapflags;
tVAddr addr = sect->Virtual - Binary->Base + base;
- LOG("%i - 0x%x to 0x%x", i, addr, sect->Offset);
+ LOG("%i - %p to 0x%llx (%x)", i, addr, sect->Offset, sect->Flags);
protflags = MMAP_PROT_READ;
mapflags = MMAP_MAP_FIXED;
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);
+ VFS_Close(fd);
//LOG("*0x%x = 0x%x\n", binary->Pages[0].Virtual, *(Uint*)binary->Pages[0].Virtual);
+ LEAVE('p', base);
return base;
}
Uint ident;
tBinaryType *bt = gRegBinTypes;
- ENTER("iMountID XInode sPath", Path);
+ ENTER("iMountID XInode sPath", MountID, Inode, Path);
// Open File
fp = VFS_OpenInode(MountID, Inode, VFS_OPENFLAG_READ);
int Binary_int_CheckMemFree( tVAddr _start, size_t _len )
{
_len += _start & (PAGE_SIZE-1);
+ _len = (_len + PAGE_SIZE - 1) & ~(PAGE_SIZE-1);
_start &= ~(PAGE_SIZE-1);
for( ; _len > PAGE_SIZE; _len -= PAGE_SIZE, _start += PAGE_SIZE ) {
if( MM_GetPhysAddr(_start) != 0 )