Skip to content

Instantly share code, notes, and snippets.

@shahzore-qureshi
Created April 8, 2013 18:37
Show Gist options
  • Select an option

  • Save shahzore-qureshi/5339304 to your computer and use it in GitHub Desktop.

Select an option

Save shahzore-qureshi/5339304 to your computer and use it in GitHub Desktop.
magic
elfhdr *eh = (elfhdr *)ROOTEXE_START;
// Load each program segment
proghdr *ph = (proghdr *) ((void *) eh + eh->e_phoff);
proghdr *eph = ph + eh->e_phnum;
int ptypechk = 1;
while(ph < eph)
{
if (ph->p_type != ELF_PROG_LOAD)
{
ph++;
ptypechk = 0;
}
if(ptypechk == 1)
{
void *fa = (void *) eh + ROUNDDOWN(ph->p_offset, PAGESIZE);
uint32_t va = ROUNDDOWN(ph->p_va, PAGESIZE);
uint32_t zva = ph->p_va + ph->p_filesz;
uint32_t eva = ROUNDUP(ph->p_va + ph->p_memsz, PAGESIZE);
uint32_t perm = SYS_READ | PTE_P | PTE_U;
if (ph->p_flags & ELF_PROG_FLAG_WRITE)
perm |= SYS_WRITE | PTE_W;
while(va < eva)
{
pageinfo *pi = mem_alloc(); assert(pi != NULL);
if (va < ROUNDDOWN(zva, PAGESIZE))
memmove(mem_pi2ptr(pi), fa, PAGESIZE);
else if (va < zva && ph->p_filesz)
{
memset(mem_pi2ptr(pi), 0, PAGESIZE);
memmove(mem_pi2ptr(pi), fa, zva-va);
}
else
memset(mem_pi2ptr(pi), 0, PAGESIZE); //No need to allocate pages
pte_t *pte = pmap_insert(p->pdir, pi, va, perm);
va += PAGESIZE;
fa += PAGESIZE;
}
}
ptypechk = 1;
ph++;
}
p->sv.tf.eip = eh->e_entry; //set to run at vmtest
p->sv.tf.eflags |= FL_IF; // enable interrupts
//Allocate page and add to pagetable with appropriate permissions
pageinfo *pi = mem_alloc();
pte_t *pte = pmap_insert(p->pdir, pi, VM_STACKHI-PAGESIZE, SYS_READ | SYS_WRITE | PTE_P | PTE_U | PTE_W);
p->sv.tf.esp = VM_STACKHI;
proc_ready(p);
proc_sched();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment