aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIan Campbell <ian.campbell@xensource.com>2007-05-25 15:28:52 +0100
committerIan Campbell <ian.campbell@xensource.com>2007-05-25 15:28:52 +0100
commitcf71bfc68ecd9430354cce668836537458fa44a0 (patch)
tree2bb83146ce36d5244422c8127c9e83976fa01665
parentf91feaa0fde1c4da44c87cd8ea0baeeb1a20550e (diff)
downloadxen-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.c4
-rw-r--r--linux-2.6-xen-sparse/arch/ia64/kernel/time.c4
-rw-r--r--xen/arch/x86/x86_64/domain.c4
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 ||