}
-
-
-
+/* The IRQ number is the number returned by pic_get_intr_number(), not the pin number */
static int pic_begin_irq(void * private_data, int irq) {
struct pic_internal * state = (struct pic_internal*)private_data;
+ if ((irq >= state->master_icw2) && (irq <= state->master_icw2 + 7)) {
+ irq &= 0x7;
+ } else if ((irq >= state->slave_icw2) && (irq <= state->slave_icw2 + 7)) {
+ irq &= 0x7;
+ irq += 8;
+ } else {
+ return -1;
+ }
+
if (irq <= 7) {
if (((state->master_irr & ~(state->master_imr)) >> irq) == 0x01) {
state->master_isr |= (0x1 << irq);
#include <palacios/vmm_intr.h>
-extern struct vmm_os_hooks * os_hooks;
-
int handle_svm_exit(struct guest_info * info) {
vmcb_ctrl_t * guest_ctrl = 0;
info->rip = guest_state->rip;
info->vm_regs.rsp = guest_state->rsp;
info->vm_regs.rax = guest_state->rax;
- info->vm_regs.rsp = guest_state->rsp;
+
info->ctrl_regs.cr0 = guest_state->cr0;
PrintDebug("PageFault at %x (error=%d)\n", fault_addr, *error_code);
-
-
- if (handle_shadow_pagefault(info, fault_addr, *error_code) == -1) {
+ if (info->page_mode == SHADOW_PAGING) {
+ if (handle_shadow_pagefault(info, fault_addr, *error_code) == -1) {
+ return -1;
+ }
+ } else {
+ PrintDebug("Page fault in un implemented paging mode\n");
return -1;
}
/*
- } else if (( (exit_code == VMEXIT_CR3_READ) ||
- (exit_code == VMEXIT_CR3_WRITE) ||
(exit_code == VMEXIT_INVLPG) ||
(exit_code == VMEXIT_INVLPGA) ||
- (exit_code == VMEXIT_EXCP14)) &&
- (info->page_mode == SHADOW_PAGING)) {
- handle_shadow_paging(info);
*/
} else if (exit_code == VMEXIT_INTR) {
return -1;
}
-
PrintDebug("Injecting Interrupt %d (EIP=%x)\n", guest_ctrl->EVENTINJ.vector, info->rip);
-
-
- // IMPORTANT TODO
- // We need to figure out stack parameters....
-
- //EVENTINJ.error_code
-
}
return 0;
}
-
-
-
-int handle_shadow_paging(struct guest_info * info) {
- vmcb_ctrl_t * guest_ctrl = GET_VMCB_CTRL_AREA((vmcb_t*)(info->vmm_data));
- // vmcb_saved_state_t * guest_state = GET_VMCB_SAVE_STATE_AREA((vmcb_t*)(info->vmm_data));
-
- if (guest_ctrl->exit_code == VMEXIT_CR3_READ) {
-
- }
-
- return 0;
-}
-
-
-
-int handle_svm_intr(struct guest_info * info) {
- vmcb_ctrl_t * guest_ctrl = GET_VMCB_CTRL_AREA((vmcb_t*)(info->vmm_data));
- // vmcb_saved_state_t * guest_state = GET_VMCB_SAVE_STATE_AREA((vmcb_t*)(info->vmm_data));
-
- //struct Interrupt_Info * int_info = &(guest_ctrl->exit_int_info);
-
- //struct vmm_irq_hook * get_irq_hook(&(info->irq_map), int_info->vector);
-
- PrintDebug("SVM Returned: Exit Code: %x\n",guest_ctrl->exit_code);
- PrintDebug("V_INTR_VECTOR: 0x%x\n", guest_ctrl->guest_ctrl.V_INTR_VECTOR);
-
- while(1);
-
- return 0;
-}
pte32_t * shadow_pte = (pte32_t *)PDE32_T_ADDR((*shadow_pde_entry));
pte32_t * guest_pte = NULL;
- // Page Table entry fault
+ // Page Table Entry fault
if (guest_pa_to_host_va(info, PDE32_T_ADDR((*guest_pde_entry)), (addr_t*)&guest_pte) == -1) {
PrintDebug("Invalid Guest PTE Address: 0x%x\n", PDE32_T_ADDR((*guest_pde_entry)));
+/* Deprecated */
+/*
addr_t setup_shadow_pt32(struct guest_info * info, addr_t virt_cr3) {
addr_t cr3_guest_addr = CR3_TO_PDE32(virt_cr3);
pde32_t * guest_pde;
return (addr_t)host_pte;
}
-
+*/