henanwxr
2011-May-21 16:08 UTC
[Xen-devel] Is the Guest OS in non-paging protected mode when VM first execute vmlaunch?
1、Is the Guest OS in non-paging protected mode when VM first execute
vmlaunch?
If it is so, why not set it in paging protected mode, could I do this?
2、I found guest os was set in paging and protected mode in function of
construct_vmcs().
The flow is:
//Xen-4.0/arch/x86/hvm/vmx/vmcs.c
construct_vmcs()
{
………………..
//here set CR0.PE
v->arch.hvm_vcpu.guest_cr[0] = X86_CR0_PE | X86_CR0_ET;
hvm_update_guest_cr(v, 0);
…………………
}
// Then it calls function of hvm_update_guest_cr() in
/xen/include/asm-x86/hvm.h
static inline void hvm_update_guest_cr(struct vcpu *v, unsigned int cr)
{
hvm_funcs.update_guest_cr(v, cr);
}
//hvm_funcs.update_guest_cr calls function of vmx_updata_guest_cr()
//in /arch/x86/hvm/vmx/vmx.c
static struct hvm_function_table __read_mostly vmx_function_table = {
.name = "VMX",
…………………………
.update_host_cr3 = vmx_update_host_cr3,
.update_guest_cr = vmx_update_guest_cr,
……………………..
}
static void vmx_update_guest_cr(struct vcpu *v, unsigned int cr)
{
vmx_vmcs_enter(v);
switch ( cr )
{
case 0: {
int realmode;
unsigned long hw_cr0_mask = X86_CR0_NE;
//here set CR0.PG and CR0.PE
if ( !vmx_unrestricted_guest(v) )
hw_cr0_mask |= X86_CR0_PG | X86_CR0_PE;
…………………………..
…………………………..
v->arch.hvm_vcpu.hw_cr[0] = v->arch.hvm_vcpu.guest_cr[0] |
hw_cr0_mask;
//here write GUEST_CR0, is it in paging and protected mode ??
__vmwrite(GUEST_CR0, v->arch.hvm_vcpu.hw_cr[0]);
__vmwrite(CR0_READ_SHADOW, v->arch.hvm_vcpu.guest_cr[0]);
………….
}
--
View this message in context:
http://xen.1045712.n5.nabble.com/Is-the-Guest-OS-in-non-paging-protected-mode-when-VM-first-execute-vmlaunch-tp4415142p4415142.html
Sent from the Xen - Dev mailing list archive at Nabble.com.
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
Keir Fraser
2011-May-21 22:08 UTC
Re: [Xen-devel] Is the Guest OS in non-paging protected mode when VM first execute vmlaunch?
On 21/05/2011 17:08, "henanwxr" <henanwxr@163.com> wrote:> 1、Is the Guest OS in non-paging protected mode when VM first execute > vmlaunch? > If it is so, why not set it in paging protected mode, could I do this?I suppose, if you had reason to. Seems pointless though as you could set it up more easily from within the guest.> 2、I found guest os was set in paging and protected mode in function of > construct_vmcs().You are mixing up two things: the CR0 the guest *thinks* it is running with, and the CR0 value it is *actually* running with. Actually we must always run non-root mode with paging enabled, but we hide that from the guest by running it on a hidden page table with 1:1 virt:phys mappings. So the v->arch.hvm_vcpu.guest_cr[0] value in the code below is the cr0 value the guest manages and sees. The v->arch.hvm_vcpu.hw_cr[0] is the value it actually runs with. If you don''t understand the difference between these values, you''ll get very confused! -- Keir> The flow is: > > //Xen-4.0/arch/x86/hvm/vmx/vmcs.c > construct_vmcs() > { > ……………….. > //here set CR0.PE > v->arch.hvm_vcpu.guest_cr[0] = X86_CR0_PE | X86_CR0_ET; > hvm_update_guest_cr(v, 0); > ………………… > } > > > > > // Then it calls function of hvm_update_guest_cr() in > /xen/include/asm-x86/hvm.h > static inline void hvm_update_guest_cr(struct vcpu *v, unsigned int cr) > { > hvm_funcs.update_guest_cr(v, cr); > } > > > > //hvm_funcs.update_guest_cr calls function of vmx_updata_guest_cr() > //in /arch/x86/hvm/vmx/vmx.c > static struct hvm_function_table __read_mostly vmx_function_table = { > .name = "VMX", > ………………………… > .update_host_cr3 = vmx_update_host_cr3, > .update_guest_cr = vmx_update_guest_cr, > …………………….. > } > > static void vmx_update_guest_cr(struct vcpu *v, unsigned int cr) > { > vmx_vmcs_enter(v); > > switch ( cr ) > { > case 0: { > int realmode; > unsigned long hw_cr0_mask = X86_CR0_NE; > > //here set CR0.PG and CR0.PE > if ( !vmx_unrestricted_guest(v) ) > hw_cr0_mask |= X86_CR0_PG | X86_CR0_PE; > ………………………….. > ………………………….. > v->arch.hvm_vcpu.hw_cr[0] = v->arch.hvm_vcpu.guest_cr[0] | > hw_cr0_mask; > //here write GUEST_CR0, is it in paging and protected mode ?? > __vmwrite(GUEST_CR0, v->arch.hvm_vcpu.hw_cr[0]); > __vmwrite(CR0_READ_SHADOW, v->arch.hvm_vcpu.guest_cr[0]); > …………. > } > > > -- > View this message in context: > http://xen.1045712.n5.nabble.com/Is-the-Guest-OS-in-non-paging-protected-mode- > when-VM-first-execute-vmlaunch-tp4415142p4415142.html > Sent from the Xen - Dev mailing list archive at Nabble.com. > > _______________________________________________ > Xen-devel mailing list > Xen-devel@lists.xensource.com > http://lists.xensource.com/xen-devel_______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel