aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/lguest/x86
diff options
context:
space:
mode:
authorRusty Russell <rusty@rustcorp.com.au>2007-10-21 21:03:30 -0400
committerRusty Russell <rusty@rustcorp.com.au>2007-10-23 01:49:52 -0400
commitcc6d4fbcef328acdc9fa7023e69f39f753f72fe1 (patch)
tree860672e7da1a3516e36dd40f962552451ef0bcf2 /drivers/lguest/x86
parent4614a3a3b638dfd7a67d0237944f6a76331af61d (diff)
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/x86')
-rw-r--r--drivers/lguest/x86/core.c13
1 files changed, 7 insertions, 6 deletions
diff --git a/drivers/lguest/x86/core.c b/drivers/lguest/x86/core.c
index e2f46b16ce31..0cc251cbc72a 100644
--- a/drivers/lguest/x86/core.c
+++ b/drivers/lguest/x86/core.c
@@ -316,13 +316,14 @@ void lguest_arch_handle_trap(struct lguest *lg)
316 return; 316 return;
317 break; 317 break;
318 case 32 ... 255: 318 case 32 ... 255:
319 /* These values mean a real interrupt occurred, in 319 /* These values mean a real interrupt occurred, in which case
320 * which case the Host handler has already been run. 320 * the Host handler has already been run. We just do a
321 * We just do a friendly check if another process 321 * friendly check if another process should now be run, then
322 * should now be run, then fall through to loop 322 * return to run the Guest again */
323 * around: */
324 cond_resched(); 323 cond_resched();
325 case LGUEST_TRAP_ENTRY: /* Handled before re-entering Guest */ 324 return;
325 case LGUEST_TRAP_ENTRY:
326 lg->hcall = lg->regs;
326 return; 327 return;
327 } 328 }
328 329