another thing to try: instead of exiting after hexdumping, do a while (1). then cat /proc/PID/maps. that memory is probably mapped, but it's worth checking out. then you can kill -9 PID.
barret On 2016-10-31 at 15:55 "Ronald G. Minnich" <[email protected]> wrote: > I've gotten rid of the uint8_t kernel[] and am using mmap to back the > image. > > The image starts and runs UNTIL it tries to load its own cr3 and run > from that. Then it dies: > > Map 0x1000000 for 20426752 bytes > p512 0x100000049000 p512[0] is 0x10000004a003 p1 0x10000004a000 p1[0] > is 0x4b003 Don't know how to handle exit 2 > RIP 0xffffffff81000147, shutdown 0x2 > vmm: handle_vmexit returned false > Note: this may be a kernel module, not the kernel > RIP was 0xffffffff81000147: > 01000147: b8 01 00 00 80 0f a2 89 d7 b9 80 00 00 c0 0f > 32 ...............2 02008000: 63 90 00 02 00 00 00 00 63 90 00 02 00 > 00 00 00 c.......c....... 02008010: 00 00 00 00 00 00 00 00 00 00 00 > 00 00 00 00 00 ................ ... > 02008ff0: 00 00 00 00 00 00 00 00 67 e0 e0 01 00 00 00 > 00 ........g....... 01e0e000: 00 00 00 00 00 00 00 00 00 00 00 00 00 > 00 00 00 ................ ... > Shutdown: core 0, exit due to TRIPLE_FAULT(0x2); ret code 0x2 > gva 0xffffffff81000147 gpa (nil) cr3 0x2008000 > rax 0xffffffff81000147 > rbx 0x000000000200a000 > rcx 0x00000000000000a0 > rdx 0x000000000200a063 > rbp 0x0000000000000000 > rsi 0x00000000000e4000 > rdi 0x0000000001e10000 > r8 0x0000000001e10000 > r9 0x0000000000000000 > r10 0x0000000000000000 > r11 0x0000000000000000 > r12 0x0000000000000000 > r13 0x0000000000000000 > r14 0x0000000000000000 > r15 0x0000000000000000 > > So, note the cr3 is 2008000, and the last 64-bit word in that page > (ff8) points to 01e0e000. This all makes sense, save that page table > is all zeros. Damn. > > I think I had this problem earlier and it's why I went to the > pre-allocated part-of-.date kernel[] array, but it's time we fixed > this. > > Change-Id: I90a90cf7ffe6abcb5666e1648ecf1d41ceb17fc9 > Signed-off-by: Ronald G. Minnich <[email protected]> > --- > tests/vmm/vmrunkernel.c | 76 > +++++++++++++++++++++++++------------------------ > user/vmm/sched.c | 2 ++ 2 files changed, 41 insertions(+), 37 > deletions(-) > > diff --git a/tests/vmm/vmrunkernel.c b/tests/vmm/vmrunkernel.c > index 5f2787f..04082c6 100644 > --- a/tests/vmm/vmrunkernel.c > +++ b/tests/vmm/vmrunkernel.c > @@ -14,7 +14,6 @@ > #include <string.h> > #include <ros/syscall.h> > #include <sys/mman.h> > -#include <vmm/coreboot_tables.h> > #include <vmm/vmm.h> > #include <vmm/acpi/acpi.h> > #include <vmm/acpi/vmm_simple_dsdt.h> > @@ -38,8 +37,8 @@ > #include <sys/eventfd.h> > #include <sys/uio.h> > > -#define DBG(format, ...) if (debug)\ > - fprintf(stderr, format, __VA_ARGS__) > +#define DBG(args...) if (debug) \ > + fprintf(stderr, args) > > struct virtual_machine local_vm, *vm = &local_vm; > > @@ -136,9 +135,6 @@ unsigned int maxresume = (unsigned int) -1; > > #define MiB 0x100000ull > #define GiB (1ull << 30) > -#define GKERNBASE (16*MiB) > -#define KERNSIZE (1024 * MiB + GKERNBASE) > -uint8_t _kernel[KERNSIZE]; > > unsigned long long *p512, *p1, *p2m; > > @@ -176,7 +172,7 @@ void timer_thread(void *arg) > vmm_interrupt_guest(vm, 0, vector); > uthread_usleep(100000); > } > - fprintf(stderr, "SENDING TIMER\n"); > + DBG("SENDING TIMER\n"); > } > > > @@ -300,7 +296,7 @@ static uint8_t acpi_tb_checksum(uint8_t *buffer, > uint32_t length) DBG("tbchecksum %p for %d", buffer, length); > while (buffer < end) { > if (0 && end - buffer < 2) > - fprintf(stderr, "%02x\n", sum); > + DBG( "%02x\n", sum); > sum = (uint8_t)(sum + *(buffer++)); > } > DBG(" is %02x\n", sum); > @@ -338,6 +334,7 @@ load_kernel(char *filename, uintptr_t *kernstart, > uintptr_t *kernend) size_t phnum = 0; > Elf64_Phdr *hdrs; > int fd; > + uint64_t align, start, end, size; > > elf_version(EV_CURRENT); > fd = open(filename, O_RDONLY); > @@ -359,14 +356,14 @@ load_kernel(char *filename, uintptr_t > *kernstart, uintptr_t *kernend) __func__, filename); > goto fail; > } > - fprintf(stderr, "%s ELF entry point is %p\n", filename, > ehdr->e_entry); > + DBG( "%s ELF entry point is %p\n", filename, ehdr->e_entry); > > if (elf_getphdrnum(elf, &phnum) < 0) { > fprintf(stderr, "%s: cannot get program header num > of %s.\n", __func__, filename); > goto fail; > } > - fprintf(stderr, "%s has %d program headers\n", filename, > phnum); > + DBG( "%s has %d program headers\n", filename, phnum); > > hdrs = elf64_getphdr(elf); > if (hdrs == NULL) { > @@ -380,7 +377,7 @@ load_kernel(char *filename, uintptr_t *kernstart, > uintptr_t *kernend) Elf64_Phdr *h = &hdrs[i]; > uintptr_t pa; > > - fprintf(stderr, > + DBG( > "%d: type 0x%lx flags 0x%lx offset 0x%lx > vaddr 0x%lx paddr 0x%lx size 0x%lx memsz 0x%lx align 0x%lx\n", i, > h->p_type, /* Segment type */ > @@ -396,16 +393,37 @@ load_kernel(char *filename, uintptr_t > *kernstart, uintptr_t *kernend) if ((h->p_flags & (PF_R|PF_W|PF_X)) > == 0) continue; > > - /* we do the memset purely to ensure everything gets > paged in. */ > + /* compute the end with the unaligned address and > size. > + * Figure out the alignment for the start. > + * The size is the computed end minus the aligned > start. */ > + end = h->p_paddr + h->p_memsz; > + align = h->p_align; > + start = h->p_paddr & ~(align-1); > + size = end - start; > + > /* compute the offset from the desired address. */ > /* this ONLY works now if kernaddr > h->p_paddr */ > + pa = (uintptr_t)mmap((uint8_t *)start, size, > + PROT_READ|PROT_WRITE|PROT_EXEC, > + MAP_ANONYMOUS|MAP_POPULATE|MAP_FIXED, -1, > 0); > + if (-1 == (int64_t) pa) { > + fprintf(stderr, "Can't mmap(%p, %d, 0x%x, > 0x%x, -1, 0): %r\n", > + start, size, > + PROT_READ|PROT_WRITE|PROT_EXEC); > + goto fail; > + } > + > + /* we do the memset purely to ensure everything gets > paged in, > + * i.e. we don't want to assume MAP_POPULATE always > works. > + * If it does the memset is superfluous but cheap. */ > pa = h->p_paddr; > memset((void *)pa, 0, h->p_memsz); > + DBG("memset(%p, 0, %d)\n", (void *)pa, h->p_memsz); > if (*kernstart > pa) > *kernstart = pa; > if (*kernend < pa+h->p_memsz) > *kernend = pa+h->p_memsz; > - fprintf(stderr, > + DBG( > "Read header %d @offset %p to %p (elf PA is > %p) %d bytes:", i, h->p_offset, pa, h->p_paddr, h->p_filesz); > tot = 0; > @@ -416,7 +434,7 @@ load_kernel(char *filename, uintptr_t *kernstart, > uintptr_t *kernend) break; > tot += amt; > } > - fprintf(stderr, "read a total of %d bytes\n", tot); > + DBG( "read a total of %d bytes\n", tot); > if (tot < h->p_filesz) { > fprintf(stderr, "%s: got %d bytes, wanted %d > bytes\n", filename, tot, h->p_filesz); > @@ -455,7 +473,6 @@ int main(int argc, char **argv) > static char cmd[512]; > int i; > uint8_t csum; > - void *coreboot_tables = (void *) 0x1165000; > void *a_page; > struct vm_trapframe *vm_tf; > uint64_t tsc_freq_khz; > @@ -481,16 +498,9 @@ int main(int argc, char **argv) > {0, 0, 0, 0} > }; > > - fprintf(stderr, "%p %p %p %p\n", PGSIZE, PGSHIFT, PML1_SHIFT, > + DBG( "%p %p %p %p\n", PGSIZE, PGSHIFT, PML1_SHIFT, > PML1_PTE_REACH); > > - > - // mmap is not working for us at present. > - if ((uint64_t)_kernel > GKERNBASE) { > - fprintf(stderr, "kernel array @%p is above , > GKERNBASE@%p sucks\n", _kernel, GKERNBASE); > - exit(1); > - } > - memset(_kernel, 0, sizeof(_kernel)); > vm->low4k = malloc(PGSIZE); > memset(vm->low4k, 0xff, PGSIZE); > vm->low4k[0x40e] = 0; > @@ -499,7 +509,7 @@ int main(int argc, char **argv) > //Place mmap(Gan) > a_page = mmap((void *)0xfee00000, PGSIZE, PROT_READ | > PROT_WRITE, MAP_POPULATE | MAP_ANONYMOUS, -1, 0); > - fprintf(stderr, "a_page mmap pointer %p\n", a_page); > + DBG( "a_page mmap pointer %p\n", a_page); > > if (a_page == (void *) -1) { > perror("Could not mmap APIC"); > @@ -585,13 +595,10 @@ int main(int argc, char **argv) > argc -= optind; > argv += optind; > if (argc < 1) { > - fprintf(stderr, "Usage: %s vmimage [-n (no vmcall > printf)] [coreboot_tables [loadaddress [entrypoint]]]\n", argv[0]); > + fprintf(stderr, "Usage: %s vmimage [-n (no vmcall > printf)] \n", argv[0]); exit(1); > } > > - if (argc > 1) > - coreboot_tables = (void *) strtoull(argv[1], 0, 0); > - > entry = load_kernel(argv[0], &kernstart, &kernend); > if (entry == 0) { > fprintf(stderr, "Unable to load kernel %s\n", > argv[0]); @@ -683,7 +690,7 @@ int main(int argc, char **argv) > exit(1); > } > > - fprintf(stderr, "allchecksums ok\n"); > + DBG( "allchecksums ok\n"); > > if (debug) { > fprintf(stderr, "ACPI tables:\n"); > @@ -832,7 +839,7 @@ int main(int argc, char **argv) > p2m = &p512[2 * NPTENTRIES]; > > size = kernend - kernstart; > - fprintf(stderr, "Map %p for %zu bytes\n", kernstart, size); > + DBG( "Map %p for %zu bytes\n", kernstart, size); > p512[PML4(kernstart)] = (uint64_t)p1 | PTE_KERN_RW; > p1[PML3(kernstart)] = (uint64_t)p2m | PTE_KERN_RW; > for (uintptr_t i = 0; i < size; i += PML2_PTE_REACH) { > @@ -840,13 +847,7 @@ int main(int argc, char **argv) > (uint64_t)(kernstart + i) | PTE_KERN_RW | PTE_PS; > } > > - uint8_t *kernel = (void *)GKERNBASE; > - //write_coreboot_table(coreboot_tables, ((void > *)VIRTIOBASE) /*kernel*/, KERNSIZE + 1048576); > - if (debug) { > - fprintf(stderr, "Coreboot tables\n"); > - hexdump(stderr, coreboot_tables, 512); > - } > - fprintf(stderr, "p512 %p p512[0] is 0x%lx p1 %p p1[0] is > 0x%x\n", p512, p512[0], p1, p1[0]); > + DBG( "p512 %p p512[0] is 0x%lx p1 %p p1[0] is 0x%x\n", p512, > p512[0], p1, p1[0]); > vmm_run_task(vm, timer_thread, 0); > > @@ -858,5 +859,6 @@ int main(int argc, char **argv) > start_guest_thread(vm->gths[0]); > > uthread_sleep_forever(); > +printf("hit the any key to continue\n"); (void)getchar(); > return 0; > } > diff --git a/user/vmm/sched.c b/user/vmm/sched.c > index 5286796..dba4217 100644 > --- a/user/vmm/sched.c > +++ b/user/vmm/sched.c > @@ -343,6 +343,8 @@ static void __ctlr_entry(void) > * enough. > */ > hexdump(stderr, (void *)(vm_tf->tf_rip & > 0x3fffffff), 16); > + hexdump(stderr, (void *)(vm_tf->tf_cr3), 4096); > + hexdump(stderr, (void *)(0x01e0e000), 4096); > showstatus(stderr, cth->buddy); > exit(0); > } -- You received this message because you are subscribed to the Google Groups "Akaros" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. For more options, visit https://groups.google.com/d/optout.
