vmm: Modifed load_elf to allow an offset
authorZach Zimmerman <zpzim@google.com>
Fri, 30 Jun 2017 22:36:36 +0000 (15:36 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Sat, 1 Jul 2017 21:22:30 +0000 (17:22 -0400)
Change-Id: I897abff7b8bcbcaf9743eeed51d67da9a09a0afc
Signed-off-by: Zach Zimmerman <zpzim@google.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
tests/dune/dune.c
tests/vmm/vmrunkernel.c
user/vmm/include/vmm/vmm.h
user/vmm/load_elf.c

index e7470cc..808c90f 100644 (file)
@@ -458,7 +458,7 @@ int main(int argc, char **argv)
        auxc = auxc + extrac;
 
        if (!test) {
-               entry = load_elf(argv[0]);
+               entry = load_elf(argv[0], MinMemory);
                if (entry == 0) {
                        fprintf(stderr, "Unable to load kernel %s\n", argv[0]);
                        exit(1);
index 9a46cac..e9c55f5 100644 (file)
@@ -476,7 +476,7 @@ int main(int argc, char **argv)
 
        mmap_memory(memstart, memsize);
 
-       entry = load_elf(argv[0]);
+       entry = load_elf(argv[0], 0);
        if (entry == 0) {
                fprintf(stderr, "Unable to load kernel %s\n", argv[0]);
                exit(1);
index 9d09b59..388c2e5 100644 (file)
@@ -88,7 +88,7 @@ int __apic_access(struct guest_thread *vm_thread, uint64_t gpa, int destreg,
                   uint64_t *regp, int store);
 int vmm_interrupt_guest(struct virtual_machine *vm, unsigned int gpcoreid,
                         unsigned int vector);
-uintptr_t load_elf(char *filename);
+uintptr_t load_elf(char *filename, uint64_t offset);
 
 /* Lookup helpers */
 
index dae09dd..e16baee 100644 (file)
@@ -12,7 +12,7 @@
  * We assume that memory is set up correctly, and it will go hard
  * with you if it is not. */
 uintptr_t
-load_elf(char *filename)
+load_elf(char *filename, uint64_t offset)
 {
        Elf64_Ehdr *ehdr;
        Elf *elf;
@@ -85,7 +85,7 @@ load_elf(char *filename)
                        i, h->p_offset, pa, h->p_paddr, h->p_filesz);
                tot = 0;
                while (tot < h->p_filesz) {
-                       int amt = pread(fd, (void *)(pa + tot), h->p_filesz - tot,
+                       int amt = pread(fd, (void *)(pa + tot + offset), h->p_filesz - tot,
                                        h->p_offset + tot);
 
                        if (amt < 1)
@@ -101,7 +101,7 @@ load_elf(char *filename)
        }
 
        close(fd);
-       ret = ehdr->e_entry;
+       ret = ehdr->e_entry + offset;
        elf_end(elf);
        return ret;
 fail: