X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fsvm.c;h=59af9a72ccf76b5aee78ffcfa83bc8844613138c;hb=603e4c1a451138080ded3d4e3cd3b8716741db89;hp=89e33d35453311429700c820789c200d90e47a8c;hpb=e02cc15e36e8f5d7ee66390986351748dd9a16a1;p=palacios.git diff --git a/palacios/src/palacios/svm.c b/palacios/src/palacios/svm.c index 89e33d3..59af9a7 100644 --- a/palacios/src/palacios/svm.c +++ b/palacios/src/palacios/svm.c @@ -135,6 +135,12 @@ static void Init_VMCB_BIOS(vmcb_t * vmcb, struct guest_info * core) { ctrl_area->instrs.PAUSE = 1; ctrl_area->instrs.shutdown_evts = 1; + /* KCH: intercept writes to IDTR and SW Interrupts (INT) */ +#ifdef CONFIG_SYSCALL_HIJACK + ctrl_area->instrs.WR_IDTR = 0; + ctrl_area->instrs.INTn = 1; +#endif + /* DEBUG FOR RETURN CODE */ ctrl_area->exit_code = 1; @@ -223,6 +229,22 @@ static void Init_VMCB_BIOS(vmcb_t * vmcb, struct guest_info * core) { &v3_handle_efer_write, core); +#ifdef CONFIG_HIJACK_MSR + /* KCH: for syscall interposition */ + v3_hook_msr(core->vm_info, STAR_MSR, + &v3_handle_star_read, + &v3_handle_star_write, + core); + v3_hook_msr(core->vm_info, LSTAR_MSR, + &v3_handle_lstar_read, + &v3_handle_lstar_write, + core); + v3_hook_msr(core->vm_info, CSTAR_MSR, + &v3_handle_cstar_read, + &v3_handle_cstar_write, + core); +#endif + if (core->shdw_pg_mode == SHADOW_PAGING) { PrintDebug("Creating initial shadow page table\n"); @@ -422,9 +444,18 @@ static int update_irq_entry_state(struct guest_info * info) { case V3_NMI: guest_ctrl->EVENTINJ.type = SVM_INJECTION_NMI; break; - case V3_SOFTWARE_INTR: - guest_ctrl->EVENTINJ.type = SVM_INJECTION_SOFT_INTR; - break; + case V3_SOFTWARE_INTR: { + PrintDebug("KCH: Caught an injected software interrupt\n"); + PrintDebug("\ttype: %d, vector: %d\n", SVM_INJECTION_SOFT_INTR, info->intr_core_state.sw_intr_vector); + guest_ctrl->EVENTINJ.type = SVM_INJECTION_SOFT_INTR; + guest_ctrl->EVENTINJ.vector = info->intr_core_state.sw_intr_vector; + guest_ctrl->EVENTINJ.valid = 1; + + // clear out stuff? + info->intr_core_state.sw_intr_pending = 0; + info->intr_core_state.sw_intr_vector = 0; + break; + } case V3_VIRTUAL_IRQ: guest_ctrl->EVENTINJ.type = SVM_INJECTION_IRQ; break; @@ -459,12 +490,12 @@ int v3_svm_enter(struct guest_info * info) { // Perform any additional yielding needed for time adjustment v3_adjust_time(info); - // Update timer devices prior to entering VM. - v3_update_timers(info); - // disable global interrupts for vm state transition v3_clgi(); + // Update timer devices prior to entering VM. + v3_update_timers(info); + // Synchronize the guest state to the VMCB guest_state->cr0 = info->ctrl_regs.cr0; guest_state->cr2 = info->ctrl_regs.cr2; @@ -514,7 +545,7 @@ int v3_svm_enter(struct guest_info * info) { //V3_Print("Calling v3_svm_launch\n"); - v3_svm_launch((vmcb_t *)V3_PAddr(info->vmm_data), &(info->vm_regs), (vmcb_t *)host_vmcbs[info->host_cpu_id]); + v3_svm_launch((vmcb_t *)V3_PAddr(info->vmm_data), &(info->vm_regs), (vmcb_t *)host_vmcbs[V3_Get_CPU()]); //V3_Print("SVM Returned: Exit Code: %x, guest_rip=%lx\n", (uint32_t)(guest_ctrl->exit_code), (unsigned long)guest_state->rip); @@ -574,6 +605,7 @@ int v3_svm_enter(struct guest_info * info) { if (v3_handle_svm_exit(info, exit_code, exit_info1, exit_info2) != 0) { PrintError("Error in SVM exit handler\n"); + PrintError(" last exit was %d\n", v3_last_exit); return -1; }