x86/pvh: do not allow 32-bit PVH guests to clear CR4's PAE bit
authorBoris Ostrovsky <boris.ostrovsky@oracle.com>
Wed, 9 Sep 2015 15:08:56 +0000 (17:08 +0200)
committerJan Beulich <jbeulich@suse.com>
Wed, 9 Sep 2015 15:08:56 +0000 (17:08 +0200)
.. since we only support 32-bit PV(H) guests in PAE mode.

Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
xen/arch/x86/hvm/hvm.c

index a38c302aa7a256b17a28cb9f0bc2763719eeb9d0..c6d2e59169a17690d6013324f33b3635443f1121 100644 (file)
@@ -3522,11 +3522,19 @@ int hvm_set_cr4(unsigned long value, bool_t may_defer)
         goto gpf;
     }
 
-    if ( !(value & X86_CR4_PAE) && hvm_long_mode_enabled(v) )
+    if ( !(value & X86_CR4_PAE) )
     {
-        HVM_DBG_LOG(DBG_LEVEL_1, "Guest cleared CR4.PAE while "
-                    "EFER.LMA is set");
-        goto gpf;
+        if ( hvm_long_mode_enabled(v) )
+        {
+            HVM_DBG_LOG(DBG_LEVEL_1, "Guest cleared CR4.PAE while "
+                        "EFER.LMA is set");
+            goto gpf;
+        }
+        if ( is_pvh_vcpu(v) )
+        {
+            HVM_DBG_LOG(DBG_LEVEL_1, "32-bit PVH guest cleared CR4.PAE");
+            goto gpf;
+        }
     }
 
     old_cr = v->arch.hvm_vcpu.guest_cr[4];