aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/lguest/core.c
diff options
context:
space:
mode:
authorRusty Russell <rusty@rustcorp.com.au>2007-10-22 11:03:30 +1000
committerRusty Russell <rusty@rustcorp.com.au>2007-10-23 15:49:52 +1000
commitcc6d4fbcef328acdc9fa7023e69f39f753f72fe1 (patch)
tree860672e7da1a3516e36dd40f962552451ef0bcf2 /drivers/lguest/core.c
parent4614a3a3b638dfd7a67d0237944f6a76331af61d (diff)
downloadkernel_samsung_aries-cc6d4fbcef328acdc9fa7023e69f39f753f72fe1.zip
kernel_samsung_aries-cc6d4fbcef328acdc9fa7023e69f39f753f72fe1.tar.gz
kernel_samsung_aries-cc6d4fbcef328acdc9fa7023e69f39f753f72fe1.tar.bz2
Introduce "hcall" pointer to indicate pending hypercall.
Currently we look at the "trapnum" to see if the Guest wants a hypercall. But once the hypercall is done we have to reset trapnum to a bogus value, otherwise if we exit to userspace and return, we'd run the same hypercall twice (that was a nasty bug to find!). This has two main effects: 1) When Jes's patch changes the hypercall args to be a generic "struct hcall_args" we simply change the type of "lg->hcall". It's set by arch code, so if it has to copy args or something it can do so, and point "hcall" into lg->arch somewhere. 2) Async hypercalls only get run when an actual hypercall is pending. This simplfies the code a little and is a more logical semantic. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Diffstat (limited to 'drivers/lguest/core.c')
-rw-r--r--drivers/lguest/core.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/drivers/lguest/core.c b/drivers/lguest/core.c
index 06869a2..02556ba 100644
--- a/drivers/lguest/core.c
+++ b/drivers/lguest/core.c
@@ -198,10 +198,10 @@ int run_guest(struct lguest *lg, unsigned long __user *user)
{
/* We stop running once the Guest is dead. */
while (!lg->dead) {
- /* First we run any hypercalls the Guest wants done: either in
- * the hypercall ring in "struct lguest_data", or directly by
- * using int 31 (LGUEST_TRAP_ENTRY). */
- do_hypercalls(lg);
+ /* First we run any hypercalls the Guest wants done. */
+ if (lg->hcall)
+ do_hypercalls(lg);
+
/* It's possible the Guest did a SEND_DMA hypercall to the
* Launcher, in which case we return from the read() now. */
if (lg->dma_is_pending) {