On Tue, 14 May 2019, Julien Grall wrote:
> With the newly introduced flags, it is now possible to know how the page
> will be updated through the flags.
>
> All the use of xenmap_operation are now replaced with the flags. At the
> same time, validity check are now removed as they are gathered in
> xen_pt_check_entry().
>
> Signed-off-by: Julien Grall <julien.grall@arm.com>
> Reviewed-by: Andrii Anisov <andrii_anisov@epam.com>
Reviewed-by: Stefano Stabellini <sstabellini@kernel.org>
> ---
>
> Changes in v2:
> - Fix typo in the commit message
> - Add Andrii's reviewed-by
> ---
> xen/arch/arm/mm.c | 47 +++++++++++++++++++++++------------------------
> 1 file changed, 23 insertions(+), 24 deletions(-)
>
> diff --git a/xen/arch/arm/mm.c b/xen/arch/arm/mm.c
> index 45a6f9287f..86e1faeeb5 100644
> --- a/xen/arch/arm/mm.c
> +++ b/xen/arch/arm/mm.c
> @@ -1067,34 +1067,33 @@ static int xen_pt_update_entry(enum xenmap_operation op, unsigned long addr,
> if ( !xen_pt_check_entry(*entry, mfn, flags) )
> return -EINVAL;
>
> - switch ( op ) {
> - case INSERT:
> - case RESERVE:
> - if ( op == RESERVE )
> - break;
> + /* If we are only populating page-table, then we are done. */
> + if ( flags & _PAGE_POPULATE )
> + return 0;
> +
> + /* We are removing the page */
> + if ( !(flags & _PAGE_PRESENT) )
> + memset(&pte, 0x00, sizeof(pte));
> + else
> + {
> + /* We are inserting a mapping => Create new pte. */
> + if ( !mfn_eq(mfn, INVALID_MFN) )
> + {
> pte = mfn_to_xen_entry(mfn, PAGE_AI_MASK(flags));
> - pte.pt.ro = PAGE_RO_MASK(flags);
> - pte.pt.xn = PAGE_XN_MASK(flags);
> - BUG_ON(!pte.pt.ro && !pte.pt.xn);
> +
> + /* Third level entries set pte.pt.table = 1 */
> pte.pt.table = 1;
> - write_pte(entry, pte);
> - break;
> - case MODIFY:
> - case REMOVE:
> - if ( op == REMOVE )
> - pte.bits = 0;
> - else
> - {
> - pte = *entry;
> - pte.pt.ro = PAGE_RO_MASK(flags);
> - pte.pt.xn = PAGE_XN_MASK(flags);
> - }
> - write_pte(entry, pte);
> - break;
> - default:
> - BUG();
> + }
> + else /* We are updating the permission => Copy the current pte. */
> + pte = *entry;
> +
> + /* Set permission */
> + pte.pt.ro = PAGE_RO_MASK(flags);
> + pte.pt.xn = PAGE_XN_MASK(flags);
> }
>
> + write_pte(entry, pte);
> +
> return 0;
> }
>
> --
> 2.11.0
>
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel