load_elf now returns the elf64_ehdr if requested.
authorZach Zimmerman <zpzimmerman@gmail.com>
Wed, 30 Aug 2017 23:51:48 +0000 (16:51 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 31 Aug 2017 13:18:14 +0000 (09:18 -0400)
Added parameter #4 to load_elf, which if not NULL
will contain the ehdr information from the loaded
file upon a successful return from load_elf.

Change-Id: I3429d73ac2f396873e3c02dcf0d6757d02f57716
Signed-off-by: Zach Zimmerman <zpzimmerman@gmail.com>
[ added back in the newline after #includes ]
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 e5446b6..5ae8c4c 100644 (file)
@@ -442,7 +442,7 @@ int main(int argc, char **argv)
        auxc = auxc + extrac;
 
        if (!test) {
-               entry = load_elf(argv[0], MinMemory, NULL);
+               entry = load_elf(argv[0], MinMemory, NULL, NULL);
                if (entry == 0) {
                        fprintf(stderr, "Unable to load kernel %s\n", argv[0]);
                        exit(1);
index 61879b5..ff8c36a 100644 (file)
@@ -556,7 +556,7 @@ int main(int argc, char **argv)
 
        mmap_memory(vm, memstart, memsize);
 
-       entry = load_elf(argv[0], 0, &kernel_max_address);
+       entry = load_elf(argv[0], 0, &kernel_max_address, NULL);
        if (entry == 0) {
                fprintf(stderr, "Unable to load kernel %s\n", argv[0]);
                exit(1);
index 3806de4..d4e4784 100644 (file)
@@ -10,6 +10,7 @@
 #include <vmm/sched.h>
 #include <vmm/linux_bootparam.h>
 #include <parlib/stdio.h>
+#include <libelf.h>
 
 // We need to reserve an area of the low 4G for thinks like tables, APIC, and
 // so on. So far, 256 MiB has been more than enough, so ...
@@ -95,7 +96,8 @@ 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, uint64_t offset, uint64_t *highest);
+uintptr_t load_elf(char *filename, uint64_t offset, uint64_t *highest,
+                   Elf64_Ehdr *ehdr_out);
 ssize_t setup_initrd(char *filename, void *membase, size_t memsize);
 /* Lookup helpers */
 
index 69cfdbf..4f9601b 100644 (file)
@@ -13,7 +13,8 @@
  * with you if it is not. The reference parameter records the highest
  * address we wrote. The initrd can go there.*/
 uintptr_t
-load_elf(char *filename, uint64_t offset, uint64_t *highest)
+load_elf(char *filename, uint64_t offset, uint64_t *highest,
+         Elf64_Ehdr *ehdr_out)
 {
        Elf64_Ehdr *ehdr;
        Elf *elf;
@@ -106,6 +107,11 @@ load_elf(char *filename, uint64_t offset, uint64_t *highest)
 
        close(fd);
        ret = ehdr->e_entry + offset;
+
+       // Save the values in the header, if the caller wanted them
+       if (ehdr_out)
+               *ehdr_out = *ehdr;
+
        elf_end(elf);
        if (highest)
                *highest = kern_end;