Modify device to take a binary struct.
[akaros.git] / kern / arch / x86 / vmm / intel / vmx.c
index 41982d0..ae634bd 100644 (file)
@@ -93,8 +93,8 @@
  * We divide this into two things: vmm_proc_init and vm_run.
  * Currently, on Intel, vmm_proc_init does nothing.
  *
- * vm_run is really complicated. It is called with a coreid, rip, rsp,
- * cr3, and flags.  On intel, it calls vmx_launch. vmx_launch is set
+ * vm_run is really complicated. It is called with a coreid, and
+ * vmctl struct. On intel, it calls vmx_launch. vmx_launch is set
  * up for a few test cases. If rip is 1, it sets the guest rip to
  * a function which will deref 0 and should exit with failure 2. If rip is 0,
  * it calls an infinite loop in the guest.
@@ -1803,7 +1803,7 @@ static int vmx_handle_nmi_exception(struct vmx_vcpu *vcpu) {
  * vmx_launch - the main loop for a VMX Dune process
  * @conf: the launch configuration
  */
-int vmx_launch(uint64_t rip, uint64_t rsp, uint64_t cr3) {
+int vmx_launch(struct vmctl *v) {
        int ret;
        struct vmx_vcpu *vcpu;
        int errors = 0;
@@ -1822,14 +1822,28 @@ int vmx_launch(uint64_t rip, uint64_t rsp, uint64_t cr3) {
         * core is the KERN_GS_BASE). */
        rdmsrl(MSR_KERNEL_GS_BASE, vcpu->msr_autoload.host[0].value);
        /* if cr3 is set, means 'set everything', else means 'start where you left off' */
-       if (cr3) {
-               vmx_get_cpu(vcpu);
-               vmcs_writel(GUEST_RIP, rip);
-               vmcs_writel(GUEST_RSP, rsp);
-               vmcs_writel(GUEST_CR3, cr3);
-               vmx_put_cpu(vcpu);
+       vmx_get_cpu(vcpu);
+       switch(v->command) {
+       case REG_ALL:
+               printk("REG_ALL\n");
+               // fallthrough
+               vcpu->regs = v->regs;
+       case REG_RSP_RIP_CR3:
+               printk("REG_RSP_RIP_CR3\n");
+               vmcs_writel(GUEST_RSP, v->regs.tf_rsp);
+               vmcs_writel(GUEST_CR3, v->cr3);
+               // fallthrough
+       case REG_RIP:
+               printk("REG_RIP\n");
+               vmcs_writel(GUEST_RIP, v->regs.tf_rip);
+               break;
+       case RESUME:
+               printk("RESUME\n");
+               break;
+       default: 
+               error(EINVAL, "Bad command in vmx_launch");
        }
-
+       vmx_put_cpu(vcpu);
        vcpu->ret_code = -1;
 
        while (1) {
@@ -1919,6 +1933,7 @@ int vmx_launch(uint64_t rip, uint64_t rsp, uint64_t cr3) {
 
        printd("RETURN. ip %016lx sp %016lx\n",
               vcpu->regs.tf_rip, vcpu->regs.tf_rsp);
+       v->regs = vcpu->regs;
 //  hexdump((void *)vcpu->regs.tf_rsp, 128 * 8);
        /*
         * Return both the reason for the shutdown and a status value.