diff options
author | Ian Campbell <ian.campbell@xensource.com> | 2007-05-25 15:28:52 +0100 |
---|---|---|
committer | Ian Campbell <ian.campbell@xensource.com> | 2007-05-25 15:28:52 +0100 |
commit | cf71bfc68ecd9430354cce668836537458fa44a0 (patch) | |
tree | 2bb83146ce36d5244422c8127c9e83976fa01665 | |
parent | f91feaa0fde1c4da44c87cd8ea0baeeb1a20550e (diff) | |
download | xen-cf71bfc68ecd9430354cce668836537458fa44a0.tar.gz xen-cf71bfc68ecd9430354cce668836537458fa44a0.tar.bz2 xen-cf71bfc68ecd9430354cce668836537458fa44a0.zip |
Correct 32on64 handling of VCPUOP_register_runstate_memory_area. We
were copying too many bytes from the guest so the test for
area.addr.h.c != area.addr.p was failing.
Added a WARN_ON to the kernel to catch this case. It would be a BUG_ON
but this would break the new kernel on older hypervisors and the only
real problem is that stolen time is not updated, which we can live
with.
Signed-off-by: Ian Campbell <ian.campbell@xensource.com>
-rw-r--r-- | linux-2.6-xen-sparse/arch/i386/kernel/time-xen.c | 4 | ||||
-rw-r--r-- | linux-2.6-xen-sparse/arch/ia64/kernel/time.c | 4 | ||||
-rw-r--r-- | xen/arch/x86/x86_64/domain.c | 4 |
3 files changed, 9 insertions, 3 deletions
diff --git a/linux-2.6-xen-sparse/arch/i386/kernel/time-xen.c b/linux-2.6-xen-sparse/arch/i386/kernel/time-xen.c index c19008a6bf..b2ffaa920c 100644 --- a/linux-2.6-xen-sparse/arch/i386/kernel/time-xen.c +++ b/linux-2.6-xen-sparse/arch/i386/kernel/time-xen.c @@ -732,11 +732,13 @@ static void init_missing_ticks_accounting(int cpu) { struct vcpu_register_runstate_memory_area area; struct vcpu_runstate_info *runstate = &per_cpu(runstate, cpu); + int rc; memset(runstate, 0, sizeof(*runstate)); area.addr.v = runstate; - HYPERVISOR_vcpu_op(VCPUOP_register_runstate_memory_area, cpu, &area); + rc = HYPERVISOR_vcpu_op(VCPUOP_register_runstate_memory_area, cpu, &area); + WARN_ON(rc && rc != -ENOSYS); per_cpu(processed_blocked_time, cpu) = runstate->time[RUNSTATE_blocked]; diff --git a/linux-2.6-xen-sparse/arch/ia64/kernel/time.c b/linux-2.6-xen-sparse/arch/ia64/kernel/time.c index cec97e3069..b73cffa94f 100644 --- a/linux-2.6-xen-sparse/arch/ia64/kernel/time.c +++ b/linux-2.6-xen-sparse/arch/ia64/kernel/time.c @@ -257,11 +257,13 @@ static void init_missing_ticks_accounting(int cpu) { struct vcpu_register_runstate_memory_area area; struct vcpu_runstate_info *runstate = &per_cpu(runstate, cpu); + int rc; memset(runstate, 0, sizeof(*runstate)); area.addr.v = runstate; - HYPERVISOR_vcpu_op(VCPUOP_register_runstate_memory_area, cpu, &area); + rc = HYPERVISOR_vcpu_op(VCPUOP_register_runstate_memory_area, cpu, &area); + WARN_ON(rc && rc != -ENOSYS); per_cpu(processed_blocked_time, cpu) = runstate->time[RUNSTATE_blocked]; per_cpu(processed_stolen_time, cpu) = runstate->time[RUNSTATE_runnable] diff --git a/xen/arch/x86/x86_64/domain.c b/xen/arch/x86/x86_64/domain.c index 775e536f4d..48cfec7423 100644 --- a/xen/arch/x86/x86_64/domain.c +++ b/xen/arch/x86/x86_64/domain.c @@ -22,8 +22,10 @@ arch_compat_vcpu_op( struct compat_vcpu_register_runstate_memory_area area; struct compat_vcpu_runstate_info info; + area.addr.p = 0; + rc = -EFAULT; - if ( copy_from_guest(&area, arg, 1) ) + if ( copy_from_guest(&area.addr.h, arg, 1) ) break; if ( area.addr.h.c != area.addr.p || |