Created
April 8, 2013 18:37
-
-
Save shahzore-qureshi/5339304 to your computer and use it in GitHub Desktop.
magic
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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