# HG changeset patch # User wei.huang2@xxxxxxx # Date 1176391257 18000 # Node ID 9ec0700a92acef48effa397e72894b4303e8cc37 # Parent ddccacc54b21f685984d653d9c0468b0c20e08d6 fix domain save and restore for nested paging. diff -r ddccacc54b21 -r 9ec0700a92ac xen/arch/x86/hvm/svm/svm.c --- a/xen/arch/x86/hvm/svm/svm.c Thu Apr 12 09:31:43 2007 -0500 +++ b/xen/arch/x86/hvm/svm/svm.c Thu Apr 12 10:20:57 2007 -0500 @@ -320,9 +320,7 @@ int svm_vmcb_restore(struct vcpu *v, str vmcb->rflags = c->eflags; v->arch.hvm_svm.cpu_shadow_cr0 = c->cr0; - vmcb->cr0 = c->cr0 | X86_CR0_WP | X86_CR0_ET; - if ( !paging_mode_hap(v->domain) ) - vmcb->cr0 |= X86_CR0_PG; + vmcb->cr0 = c->cr0 | X86_CR0_WP | X86_CR0_ET | X86_CR0_PG; #ifdef HVM_DEBUG_SUSPEND printk("%s: cr3=0x%"PRIx64", cr0=0x%"PRIx64", cr4=0x%"PRIx64".\n", @@ -420,6 +418,16 @@ int svm_vmcb_restore(struct vcpu *v, str vmcb->sysenter_cs = c->sysenter_cs; vmcb->sysenter_esp = c->sysenter_esp; vmcb->sysenter_eip = c->sysenter_eip; + + /* update VMCB for nested paging restore */ + if ( paging_mode_hap(v->domain) ) { + vmcb->cr0 = v->arch.hvm_svm.cpu_shadow_cr0; + vmcb->cr4 = v->arch.hvm_svm.cpu_shadow_cr4; + vmcb->cr3 = c->cr3; + vmcb->np_enable = 1; + vmcb->g_pat = 0x0007040600070406ULL; /* guest PAT */ + vmcb->h_cr3 = pagetable_get_paddr(v->domain->arch.phys_table); + } paging_update_paging_modes(v); return 0;