From: Peter Dinda Date: Tue, 8 Sep 2015 22:41:34 +0000 (-0500) Subject: HVM support for forwarding events to ROS X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=commitdiff_plain;h=bf732d7c9e2940ed8dddcb30ff70bdc06bbfdc3b HVM support for forwarding events to ROS Protocol and hypercall logic to support forwarding of system calls and page faults from the HRT to the ROS This allows an HRT with a merged address space to rely on the ROS for page faults on the shared part of the address space, and it allows the HRT to make system calls on the ROS, provided all arguments, directly or indirectly, are in the shared part of the address space. --- diff --git a/palacios/include/palacios/vmm_hvm.h b/palacios/include/palacios/vmm_hvm.h index cb37225..a206d54 100644 --- a/palacios/include/palacios/vmm_hvm.h +++ b/palacios/include/palacios/vmm_hvm.h @@ -26,6 +26,21 @@ #include #include +struct v3_ros_event { + enum { ROS_NONE=0, ROS_PAGE_FAULT=1, ROS_SYSCALL=2 } event_type; + uint64_t last_ros_event_result; // valid when ROS_NONE + union { + struct { // valid when ROS_PAGE_FAULT + uint64_t rip; + uint64_t cr2; + enum {ROS_READ, ROS_WRITE} action; + } page_fault; + struct { // valid when ROS_SYSCALL + uint64_t args[8]; + } syscall; + }; +}; + struct v3_vm_hvm { uint8_t is_hvm; uint32_t first_hrt_core; @@ -50,6 +65,10 @@ struct v3_vm_hvm { enum {HRT_IDLE=0, HRT_CALL=1, HRT_PARCALL=2, HRT_SYNCSETUP=3, HRT_SYNC=4, HRT_SYNCTEARDOWN=5, HRT_MERGE=6} trans_state; uint64_t trans_count; + + // the ROS event to be handed back + struct v3_ros_event ros_event; + }; struct v3_core_hvm { @@ -173,7 +192,14 @@ int v3_handle_hvm_reset(struct guest_info *core); 0x1 => Reboot ROS 0x2 => Reboot HRT 0x3 => Reboot Both - 0xf => Get HRT transaction state + 0xf => Get HRT transaction state and current ROS event + first argument is pointer to the ROS event state + to be filled out + + 0x10 => ROS event request (HRT->ROS) + first argument is pointer where to write the ROS event state + 0x1f => ROS event completion (ROS->HRT) + first argument is the result code 0x20 => Invoke function (ROS->HRT) first argument is pointer to structure describing call diff --git a/palacios/src/palacios/vmm_hvm.c b/palacios/src/palacios/vmm_hvm.c index 26d3298..ff5b34f 100644 --- a/palacios/src/palacios/vmm_hvm.c +++ b/palacios/src/palacios/vmm_hvm.c @@ -157,9 +157,34 @@ static int hvm_hcall_handler(struct guest_info * core , hcall_id_t hcall_id, voi case 0xf: // get HRT state core->vm_regs.rax = h->trans_state; + if (v3_write_gva_memory(core, a2, sizeof(h->ros_event), (uint8_t*) &h->ros_event)!=sizeof(h->ros_event)) { + PrintError(core->vm_info, core, "hvm: cannot write back ROS event state to %p - continuing\n",(void*)a2); + } //PrintDebug(core->vm_info,core,"hvm: get HRT transaction state 0x%llx\n",core->vm_regs.rax); break; + case 0x10: + PrintDebug(core->vm_info, core, "hvm: ROS event request\n"); + if (h->ros_event.event_type!=ROS_NONE) { + PrintError(core->vm_info, core, "hvm: ROS event is already in progress\n"); + core->vm_regs.rax = -1; + } else { + if (v3_read_gva_memory(core, a2, sizeof(h->ros_event), (uint8_t*)&h->ros_event)!=sizeof(h->ros_event)) { + PrintError(core->vm_info, core, "hvm: cannot read ROS event from %p\n",(void*)a2); + core->vm_regs.rax = -1; + } else { + core->vm_regs.rax = 0; + } + } + + break; + + case 0x1f: + PrintDebug(core->vm_info, core, "hvm: completion of ROS event (rc=0x%llx)\n",a2); + h->ros_event.event_type=ROS_NONE; + h->ros_event.last_ros_event_result = a2; + break; + case 0x20: // invoke function (ROS->HRT) case 0x21: // invoke parallel function (ROS->HRT) if (v3_is_hvm_hrt_core(core)) {