x86/PV: don't commit debug register values early in arch_set_info_guest()
authorJan Beulich <jbeulich@suse.com>
Wed, 11 Dec 2013 09:33:19 +0000 (10:33 +0100)
committerJan Beulich <jbeulich@suse.com>
Wed, 11 Dec 2013 09:33:19 +0000 (10:33 +0100)
They're being taken care of later (via set_debugreg()), and temporarily
copying them into struct vcpu means that bad values may end up getting
loaded during context switch if the vCPU is already running and the
function errors out between the premature and real commit step, leading
to the same issue that XSA-12 dealt with.

Signed-off-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Ian Campbell <ian.campbell@citrix.com>
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
Release-acked-by: George Dunlap <george.dunlap@eu.citrix.com>
Acked-by: Keir Fraser <keir@xen.org>
xen/arch/x86/domain.c

index c0ac5d6d7362e4cd4df9d1a13ddbf4d7c7e0396f..da8e52291c65dc7100840fca49ff26d22703f7b8 100644 (file)
@@ -743,11 +743,12 @@ int arch_set_info_guest(
             XLAT_trap_info(v->arch.pv_vcpu.trap_ctxt + i,
                            c.cmp->trap_ctxt + i);
     }
-    for ( i = 0; i < ARRAY_SIZE(v->arch.debugreg); ++i )
-        v->arch.debugreg[i] = c(debugreg[i]);
 
     if ( has_hvm_container_vcpu(v) )
     {
+        for ( i = 0; i < ARRAY_SIZE(v->arch.debugreg); ++i )
+            v->arch.debugreg[i] = c(debugreg[i]);
+
         hvm_set_info_guest(v);
 
         if ( is_hvm_vcpu(v) || v->is_initialised )