From: Peter Dinda Date: Wed, 2 Jul 2008 17:51:40 +0000 (+0000) Subject: *** empty log message *** X-Git-Tag: boot386puppy-26-to-ide~4 X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=commitdiff_plain;h=c502aac6baf363d633aca6ec883b05476634e854 *** empty log message *** --- diff --git a/palacios/include/palacios/svm_halt.h b/palacios/include/palacios/svm_halt.h new file mode 100644 index 0000000..7ffce50 --- /dev/null +++ b/palacios/include/palacios/svm_halt.h @@ -0,0 +1,12 @@ +#ifndef __SVM_HALT_H +#define __SVM_HALT_H +#include +#include +#include + + +int handle_svm_halt(struct guest_info * info); + + + +#endif diff --git a/palacios/src/palacios/svm_halt.c b/palacios/src/palacios/svm_halt.c new file mode 100644 index 0000000..299421c --- /dev/null +++ b/palacios/src/palacios/svm_halt.c @@ -0,0 +1,25 @@ +#include + +// 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; + +} diff --git a/palacios/src/palacios/svm_handler.c b/palacios/src/palacios/svm_handler.c index fa71162..b9d124f 100644 --- a/palacios/src/palacios/svm_handler.c +++ b/palacios/src/palacios/svm_handler.c @@ -4,6 +4,7 @@ #include #include #include +#include #include @@ -133,7 +134,9 @@ int handle_svm_exit(struct guest_info * info) { } 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]; diff --git a/palacios/src/palacios/svm_io.c b/palacios/src/palacios/svm_io.c index ce12669..ece437a 100644 --- a/palacios/src/palacios/svm_io.c +++ b/palacios/src/palacios/svm_io.c @@ -20,7 +20,6 @@ int handle_svm_io_in(struct guest_info * info) { return -1; } - PrintDebug("IN on port %d (0x%x)\n", io_info->port, io_info->port); if (io_info->sz8) { read_size = 1; @@ -30,6 +29,7 @@ int handle_svm_io_in(struct guest_info * info) { 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..... @@ -161,7 +161,6 @@ int handle_svm_io_out(struct guest_info * info) { return -1; } - PrintDebug("OUT on port %d (0x%x)\n", io_info->port, io_info->port); if (io_info->sz8) { write_size = 1; @@ -171,6 +170,7 @@ int handle_svm_io_out(struct guest_info * info) { 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.....