Message ID | 20190514123125.29086-8-julien.grall@arm.com |
---|---|
State | Superseded |
Headers | show |
Series | xen/arm: Provide a generic function to update Xen PT | expand |
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 >
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; }