[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH RFC 03/14] xen: vmx: Introduce the SPPTP and SPP page table.
From: Zhang Yi Z <yi.z.zhang@xxxxxxxxxxxxxxx> SPPT has 4-level paging structure that is similar to EPT except L1E. The sub-page permission table is referenced via a 64-bit control field called Sub-Page Permission Table Pointer (SPPTP) which contains a 4K-aligned physical address, the index and encoding for this VMCS field is defined 0x2030 at this time. The format of SPPTP is shown in below figure ---------------------------------------------------------------| | Bit | Contents | :--------------------------------------------------------------| | 11:0 | Reserved (0) | | N-1:12 | Physical address of 4KB aligned SPPT L4E Table | | 51:N | Reserved (0) | | 63:52 | Reserved (0) | ---------------------------------------------------------------| Note: N is the physical address width supported by the processor. This patch introduced the Spp paging structures, which root page will created at p2m_alloc_table. and free at p2m_teardown. Same as EPT page table, We initialized the SPPT, and write the SPPT point into VMCS field. Signed-off-by: Zhang Yi Z <yi.z.zhang@xxxxxxxxxxxxxxx> --- xen/arch/x86/hvm/vmx/vmcs.c | 6 ++++++ xen/arch/x86/mm/p2m.c | 12 +++++++++++- xen/include/asm-x86/hvm/vmx/vmcs.h | 11 +++++++++++ xen/include/asm-x86/p2m.h | 8 +++++++- 4 files changed, 35 insertions(+), 2 deletions(-) diff --git a/xen/arch/x86/hvm/vmx/vmcs.c b/xen/arch/x86/hvm/vmx/vmcs.c index bee5d74..e2a1f1f 100644 --- a/xen/arch/x86/hvm/vmx/vmcs.c +++ b/xen/arch/x86/hvm/vmx/vmcs.c @@ -1273,6 +1273,12 @@ static int construct_vmcs(struct vcpu *v) ept->mfn = pagetable_get_pfn(p2m_get_pagetable(p2m)); __vmwrite(EPT_POINTER, ept->eptp); + + if ( cpu_has_vmx_ept_spp ) { + struct spp_data *spp = &p2m->spptp; + spp->mfn = pagetable_get_pfn(p2m_get_spp_pagetable(p2m)); + __vmwrite(SPPT_POINT, spp->sppt_point); + } } if ( paging_mode_hap(d) ) diff --git a/xen/arch/x86/mm/p2m.c b/xen/arch/x86/mm/p2m.c index e8a57d1..3d618e9 100644 --- a/xen/arch/x86/mm/p2m.c +++ b/xen/arch/x86/mm/p2m.c @@ -609,7 +609,7 @@ void p2m_free_ptp(struct p2m_domain *p2m, struct page_info *pg) */ int p2m_alloc_table(struct p2m_domain *p2m) { - struct page_info *p2m_top; + struct page_info *p2m_top, *p2m_spp; struct domain *d = p2m->domain; int rc = 0; @@ -639,8 +639,17 @@ int p2m_alloc_table(struct p2m_domain *p2m) return -ENOMEM; } + p2m_spp = p2m_alloc_ptp(p2m, PGT_l4_page_table); + if ( p2m_spp == NULL ) + { + p2m_unlock(p2m); + return -ENOMEM; + } + p2m->phys_table = pagetable_from_mfn(page_to_mfn(p2m_top)); + p2m->spp_phys_table = pagetable_from_mfn(page_to_mfn(p2m_spp)); + if ( hap_enabled(d) ) iommu_share_p2m_table(d); @@ -678,6 +687,7 @@ void p2m_teardown(struct p2m_domain *p2m) p2m_lock(p2m); ASSERT(atomic_read(&d->shr_pages) == 0); p2m->phys_table = pagetable_null(); + p2m->spp_phys_table = pagetable_null(); while ( (pg = page_list_remove_head(&p2m->pages)) ) d->arch.paging.free_page(d, pg); diff --git a/xen/include/asm-x86/hvm/vmx/vmcs.h b/xen/include/asm-x86/hvm/vmx/vmcs.h index 139f590..4843bc4 100644 --- a/xen/include/asm-x86/hvm/vmx/vmcs.h +++ b/xen/include/asm-x86/hvm/vmx/vmcs.h @@ -56,6 +56,16 @@ struct ept_data { cpumask_var_t invalidate; }; +struct spp_data { + union { + struct { + u32 reserved:12; + u64 mfn:52; + }; + u64 sppt_point; + }; +}; + #define _VMX_DOMAIN_PML_ENABLED 0 #define VMX_DOMAIN_PML_ENABLED (1ul << _VMX_DOMAIN_PML_ENABLED) struct vmx_domain { @@ -391,6 +401,7 @@ enum vmcs_field { VMWRITE_BITMAP = 0x00002028, VIRT_EXCEPTION_INFO = 0x0000202a, XSS_EXIT_BITMAP = 0x0000202c, + SPPT_POINT = 0x00002030, TSC_MULTIPLIER = 0x00002032, GUEST_PHYSICAL_ADDRESS = 0x00002400, VMCS_LINK_POINTER = 0x00002800, diff --git a/xen/include/asm-x86/p2m.h b/xen/include/asm-x86/p2m.h index 6395e8f..0561643 100644 --- a/xen/include/asm-x86/p2m.h +++ b/xen/include/asm-x86/p2m.h @@ -193,6 +193,8 @@ struct p2m_domain { /* Shadow translated domain: p2m mapping */ pagetable_t phys_table; + pagetable_t spp_phys_table; + /* Same as domain_dirty_cpumask but limited to * this p2m and those physical cpus whose vcpu's are in * guestmode. @@ -339,6 +341,9 @@ struct p2m_domain { struct ept_data ept; /* NPT-equivalent structure could be added here. */ }; + union { + struct spp_data spptp; + }; struct { spinlock_t lock; @@ -385,7 +390,8 @@ static inline bool_t p2m_is_altp2m(const struct p2m_domain *p2m) return p2m->p2m_class == p2m_alternate; } -#define p2m_get_pagetable(p2m) ((p2m)->phys_table) +#define p2m_get_pagetable(p2m) ((p2m)->phys_table) +#define p2m_get_spp_pagetable(p2m) ((p2m)->spp_phys_table) /* * Ensure any deferred p2m TLB flush has been completed on all VCPUs. -- 2.7.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |