summaryrefslogtreecommitdiff
path: root/sys/kern/kern_loader.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/kern/kern_loader.c')
-rw-r--r--sys/kern/kern_loader.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/sys/kern/kern_loader.c b/sys/kern/kern_loader.c
index 23249ea..e62e2b4 100644
--- a/sys/kern/kern_loader.c
+++ b/sys/kern/kern_loader.c
@@ -54,7 +54,7 @@ __KERNEL_META("$Hyra$: kern_loader.c, Ian Marco Moffett, "
(void *)((uintptr_t)hdr + (hdrptr)->e_phoff + (hdrptr->e_phentsize*IDX))
int loader_load(struct vas vas, const void *dataptr, struct auxval *auxv,
- size_t load_base, char **ld_path)
+ size_t load_base, char **ld_path, struct vm_range *prog_range)
{
const Elf64_Ehdr *hdr = dataptr;
Elf64_Phdr *phdr;
@@ -64,6 +64,9 @@ int loader_load(struct vas vas, const void *dataptr, struct auxval *auxv,
size_t misalign, page_count, map_len;
int status;
+ uintptr_t start_addr = (uintptr_t)-1;
+ uintptr_t end_addr = 0;
+
const size_t GRANULE = vm_get_page_size();
void *tmp_ptr;
@@ -94,6 +97,16 @@ int loader_load(struct vas vas, const void *dataptr, struct auxval *auxv,
physmem = vm_alloc_pageframe(page_count);
map_len = page_count * GRANULE;
+ /*
+ * Now we want to compute the start address of the
+ * program and the end address.
+ */
+ if (start_addr == (uintptr_t)-1) {
+ start_addr = phdr->p_vaddr;
+ }
+
+ end_addr = __MAX(end_addr, phdr->p_vaddr + page_count*GRANULE);
+
/* Do we not have enough page frames? */
if (physmem == 0) {
DBG("Failed to allocate physical memory\n");
@@ -134,5 +147,7 @@ int loader_load(struct vas vas, const void *dataptr, struct auxval *auxv,
auxv->at_entry = hdr->e_entry + load_base;
auxv->at_phent = hdr->e_phentsize;
auxv->at_phnum = hdr->e_phnum;
+ prog_range->start = start_addr;
+ prog_range->end = end_addr;
return 0;
}