40 lines
1.3 KiB
C
40 lines
1.3 KiB
C
#include "elf.h"
|
|
#include "mmgr.h"
|
|
#include "string.h"
|
|
#include "types/status.h"
|
|
|
|
const uint32_t elf_magic_number = 0x464c457f;
|
|
|
|
int load_program(struct elf_file_header_t *elf)
|
|
{
|
|
struct elf_program_header_t *program_header = (struct elf_program_header_t*)((void*)elf + elf->phoffset);
|
|
unsigned int count = elf->phcount;
|
|
while(count > 0)
|
|
{
|
|
if(program_header->type == ELF_LOAD)
|
|
{
|
|
void *d = program_header->vaddr, *s = (void*)elf + program_header->offset;
|
|
for(size_t n = 0; n < program_header->memsize; n += page_size)
|
|
{
|
|
physaddr_t page = reserve_page();
|
|
if(page == S_OUT_OF_MEMORY)
|
|
{
|
|
return S_OUT_OF_MEMORY;
|
|
}
|
|
int status = map_page(d + n, page, PAGE_RW | PAGE_USERMODE | PAGE_EXECUTABLE);
|
|
switch(status)
|
|
{
|
|
case S_OUT_OF_MEMORY:
|
|
return status;
|
|
case S_OUT_OF_BOUNDS:
|
|
return status;
|
|
case S_OK:
|
|
memcpy(d + n, s + n, n + page_size < program_header->memsize ? page_size : program_header->memsize - n);
|
|
}
|
|
}
|
|
}
|
|
count--;
|
|
program_header = (struct elf_program_header_t*)((void*)program_header + elf->phsize);
|
|
}
|
|
return S_OK;
|
|
} |