user/vmm: add translation helpers for guest kernel va to pa.
authorRonald G. Minnich <rminnich@gmail.com>
Mon, 6 Jun 2016 17:36:40 +0000 (10:36 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Mon, 6 Jun 2016 17:51:07 +0000 (13:51 -0400)
These are two simple translation helpers, one for converting
an arbitrary guest kernel virtual address to a physical
address (and hence host process virtual address); and one
to return the guest kernel RIP as a physical address (and hence
host virtual address).

Currently, they just blow the upper 34 bits of the guest
VA to zero, since the high part of the negative address
space is low physical memory.

Longer term, we may need to walk page tables, but so
far there has been no need.

Change-Id: I6f3875b03b7b33edd223615bd4678e6f2641d90a
Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
user/vmm/include/vmm/vmm.h
user/vmm/vmx.c

index 8dedb28..fbc12b7 100644 (file)
@@ -36,6 +36,8 @@ int decode(struct guest_thread *vm_thread, uint64_t *gpa, uint8_t *destreg,
            uint64_t **regp, int *store, int *size, int *advance);
 bool io(struct guest_thread *vm_thread);
 void showstatus(FILE *f, struct guest_thread *vm_thread);
+uint64_t gvatogpa(struct guest_thread *vm_thread, uint64_t va);
+uint64_t rippa(struct guest_thread *vm_thread);
 int msrio(struct guest_thread *vm_thread, struct vmm_gpcore_init *gpci,
           uint32_t opcode);
 int do_ioapic(struct guest_thread *vm_thread, uint64_t gpa,
index cf3e6fa..d024537 100644 (file)
@@ -57,3 +57,22 @@ void showstatus(FILE *f, struct guest_thread *vm_thread)
        fprintf(f, "  r14  0x%016lx\n",           vm_tf->tf_r14);
        fprintf(f, "  r15  0x%016lx\n",           vm_tf->tf_r15);
 }
+
+/* Convert a kernel guest virtual address to physical address.
+ * Assumes that the guest VA is in the high negative address space.
+ * TODO: Takes the vm_thread argument so that we can walk the page tables
+ * instead of just coercing the pointer. Therefore, this is not in vmm.h
+ * since it may get complex. */
+uint64_t gvatogpa(struct guest_thread *vm_thread, uint64_t va)
+{
+       assert(vm_thread != NULL);
+       assert(va >= 0xffffffffc0000000ULL);
+       return va & 0x3fffffff;
+}
+
+/* Get the RIP as a physical address. */
+uint64_t rippa(struct guest_thread *vm_thread)
+{
+       assert(vm_thread != NULL);
+       return gvatogpa(vm_thread, gth_to_vmtf(vm_thread)->tf_rip);
+}