|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH RFC 08/14] xen: vmx: Added setup spp page structure.
On Thu, Oct 19, 2017 at 2:12 AM, Zhang Yi <yi.z.zhang@xxxxxxxxxxxxxxx> wrote:
> From: Zhang Yi Z <yi.z.zhang@xxxxxxxxxxxxxxx>
>
> The hardware uses the guest-physical address and bits 11:7 of the
> address accessed to lookup the SPPT to fetch a write permission bit for
> the 128 byte wide sub-page region being accessed within the 4K
> guest-physical page. If the sub-page region write permission bit is set,
> the write is allowed; otherwise the write is disallowed and results in
> an EPT violation.
>
> Guest-physical pages mapped via leaf EPT-paging-structures for which the
> accumulated write-access bit and the SPP bits are both clear (0)
> generate
> EPT violations on memory writes accesses. Guest-physical pages mapped
> via EPT-paging-structure for which the accumulated write-access bit is
> set (1) allow writes, effectively ignoring the SPP bit on the leaf
> EPT-paging structure.
>
> Software will setup the spp page table level4,3,2 as well as EPT page
> structure, and fill the level1 via the 32 bit bitmap per a single 4K
> page.
> Now it could be divided to 32 x 128 sub-pages.
>
> Signed-off-by: Zhang Yi Z <yi.z.zhang@xxxxxxxxxxxxxxx>
> ---
> xen/arch/x86/mm/mem_access.c | 35 +++++++++++++++
> xen/arch/x86/mm/p2m-ept.c | 94
> +++++++++++++++++++++++++++++++++++++++
> xen/include/asm-x86/hvm/vmx/vmx.h | 10 +++++
> xen/include/asm-x86/p2m.h | 3 ++
> 4 files changed, 142 insertions(+)
>
> diff --git a/xen/arch/x86/mm/mem_access.c b/xen/arch/x86/mm/mem_access.c
> index a471c74..1b97469 100644
> --- a/xen/arch/x86/mm/mem_access.c
> +++ b/xen/arch/x86/mm/mem_access.c
> @@ -490,6 +490,41 @@ unlock_exit:
> return rc;
> }
>
> +static u64 format_spp_spte(u32 spp_wp_bitmap)
> +{
> + u64 new_spte = 0;
> + int i = 0;
> +
> + /*
> + * One 4K page contains 32 sub-pages, in SPP table L4E, old bits
> + * are reserved, so we need to transfer u32 subpage write
> + * protect bitmap to u64 SPP L4E format.
> + */
> + while ( i < 32 ) {
> + if ( spp_wp_bitmap & (1ULL << i) )
> + new_spte |= 1ULL << (i * 2);
> +
> + i++;
> + }
> +
> + return new_spte;
> +}
> +
> +int p2m_set_spp_page_st(struct domain *d, gfn_t gfn, uint32_t access_map)
So nothing in this patch makes use of this function. Could you please
re-organize the patchset so this is included with the patch that
starts using it?
> +{
> + struct p2m_domain *p2m = p2m_get_hostp2m(d);
> + u64 access = format_spp_spte(access_map);
> + unsigned long gfn_l = gfn_x(gfn);
> + int ret = -1;
> +
> + p2m_lock(p2m);
> + if ( p2m->spp_set_entry )
> + ret = p2m->spp_set_entry(p2m, gfn_l, access);
> + p2m_unlock(p2m);
> +
> + return ret;
> +}
> +
> /*
> * Local variables:
> * mode: C
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |