diff options
author | Rusty Russell <rusty@rustcorp.com.au> | 2007-10-21 21:03:30 -0400 |
---|---|---|
committer | Rusty Russell <rusty@rustcorp.com.au> | 2007-10-23 01:49:52 -0400 |
commit | cc6d4fbcef328acdc9fa7023e69f39f753f72fe1 (patch) | |
tree | 860672e7da1a3516e36dd40f962552451ef0bcf2 /drivers/lguest/x86 | |
parent | 4614a3a3b638dfd7a67d0237944f6a76331af61d (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.c | 13 |
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 | ||