#include <geekos/svm_handler.h>
#include <geekos/vmm.h>
#include <geekos/svm_ctrl_regs.h>
+#include <geekos/svm_io.h>
extern struct vmm_os_hooks * os_hooks;
PrintDebug("io_info2 low = 0x%.8x\n", *(uint_t*)&(guest_ctrl->exit_info2));
PrintDebug("io_info2 high = 0x%.8x\n", *(uint_t *)(((uchar_t *)&(guest_ctrl->exit_info2)) + 4));
+
if (exit_code == VMEXIT_IOIO) {
- handle_svm_io(info);
-
+ struct svm_io_info * io_info = (struct svm_io_info *)&(guest_ctrl->exit_info1);
+
+ if (io_info->type == 0) {
+ if (io_info->str) {
+ handle_svm_io_outs(info);
+ } else {
+ handle_svm_io_out(info);
+ }
+ } else {
+ if (io_info->str) {
+ handle_svm_io_ins(info);
+ } else {
+ handle_svm_io_in(info);
+ }
+ }
} else if (exit_code == VMEXIT_CR0_WRITE) {
PrintDebug("CR0 Write\n");
-// This should package up an IO request and call vmm_handle_io
-int handle_svm_io(struct guest_info * info) {
- vmcb_ctrl_t * ctrl_area = 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));
-
- PrintDebug("Ctrl Area=%x\n", ctrl_area);
-
- // struct svm_io_info * io_info = (struct svm_io_info *)&(ctrl_area->exit_info1);
-
-
-
- // PrintDebugVMCB((vmcb_t*)(info->vmm_data));
-
- guest_state->rip = ctrl_area->exit_info2;
-
-
-
-
- // PrintDebug("Exit On Port %d\n", io_info->port);
-
- return 0;
-}
-
int handle_shadow_paging(struct guest_info * info) {
vmcb_ctrl_t * guest_ctrl = GET_VMCB_CTRL_AREA((vmcb_t*)(info->vmm_data));