]> xenbits.xensource.com Git - xen.git/commitdiff
hvm: Fix task switch update of TR state.
authorKeir Fraser <keir@xensource.com>
Wed, 26 Sep 2007 15:50:28 +0000 (16:50 +0100)
committerKeir Fraser <keir@xensource.com>
Wed, 26 Sep 2007 15:50:28 +0000 (16:50 +0100)
Also remove unneeded duplicate paging_update_cr3().
Signed-off-by: Keir Fraser <keir@xensource.com>
xen/arch/x86/hvm/hvm.c

index fe3c8b385acbfab8522cba7ee5cb88b718ef9c5e..d77262eb3932567fd61716b3a9b23fc26de00fea 100644 (file)
@@ -943,9 +943,11 @@ void hvm_task_switch(
     tr.base = (((tss_desc.b <<  0) & 0xff000000u) |
                ((tss_desc.b << 16) & 0x00ff0000u) |
                ((tss_desc.a >> 16) & 0x0000ffffu));
-    tr.limit = (tss_desc.b & 0x000f0000u) | (tss_desc.a & 0x0000ffffu);
     tr.attr.bytes = (((tss_desc.b >>  8) & 0x00ffu) |
-                     ((tss_desc.b >> 20) & 0x0f00u));
+                     ((tss_desc.b >> 12) & 0x0f00u));
+    tr.limit = (tss_desc.b & 0x000f0000u) | (tss_desc.a & 0x0000ffffu);
+    if ( tr.attr.fields.g )
+        tr.limit = (tr.limit << 12) | 0xfffu;
 
     if ( !tr.attr.fields.p )
     {
@@ -1048,7 +1050,6 @@ void hvm_task_switch(
 
     tr.attr.fields.type = 0xb; /* busy 32-bit tss */
     hvm_set_segment_register(v, x86_seg_tr, &tr);
-    paging_update_cr3(v);
 
     v->arch.hvm_vcpu.guest_cr[0] |= X86_CR0_TS;
     hvm_update_guest_cr(v, 0);