--- /dev/null
+#ifndef __SVM_HALT_H
+#define __SVM_HALT_H
+#include <palacios/vm_guest.h>
+#include <palacios/vmcb.h>
+#include <palacios/vmm.h>
+
+
+int handle_svm_halt(struct guest_info * info);
+
+
+
+#endif
--- /dev/null
+#include <palacios/svm_halt.h>
+
+// From GeekOS
+void Yield(void);
+
+
+int handle_svm_halt(struct guest_info * info)
+{
+ // What we should do is starting waiting on an OS event that will
+ // result in an injection of an interrupt.
+
+ // What we will hackishly do instead is resume on any event
+ // Plus is this totally GeekOS specific
+
+ PrintDebug("GeekOS Yield\n");
+
+ Yield();
+
+ PrintDebug("GeekOS Yield Done\n");
+
+ info->rip+=1;
+
+ return 0;
+
+}
#include <palacios/vmm_decoder.h>
#include <palacios/vmm_ctrl_regs.h>
#include <palacios/svm_io.h>
+#include <palacios/svm_halt.h>
#include <palacios/vmm_intr.h>
} else if (exit_code == VMEXIT_HLT) {
PrintDebug("Guest halted\n");
- return -1;
+ if (handle_svm_halt(info) == -1) {
+ return -1;
+ }
} else {
addr_t rip_addr;
char buf[15];
return -1;
}
- PrintDebug("IN on port %d (0x%x)\n", io_info->port, io_info->port);
if (io_info->sz8) {
read_size = 1;
read_size = 4;
}
+ PrintDebug("IN of %d bytes on port %d (0x%x)\n", read_size, io_info->port, io_info->port);
if (hook->read(io_info->port, &(info->vm_regs.rax), read_size, hook->priv_data) != read_size) {
// not sure how we handle errors.....
return -1;
}
- PrintDebug("OUT on port %d (0x%x)\n", io_info->port, io_info->port);
if (io_info->sz8) {
write_size = 1;
write_size = 4;
}
+ PrintDebug("OUT of %d bytes on port %d (0x%x)\n", write_size, io_info->port, io_info->port);
if (hook->write(io_info->port, &(info->vm_regs.rax), write_size, hook->priv_data) != write_size) {
// not sure how we handle errors.....