Modify macros to evaluate all the arguments and make sure the arguments are evaluated only once. Introduce following intermediate macros: gnttab_status_gfn_, gnttab_shared_gfn_ that do not take domain as a parameter. These are to be used locally and allow us to avoid passing NULL from gnttab_get_frame_gfn to the respective macros (without _ suffix). Make use of a domain parameter from gnttab_shared_gfn and gnttab_status_gfn by adding an ASSERT.
Signed-off-by: Michal Orzel <michal.or...@arm.com> --- Changes since v1: - use typeof for all data types - introduce intermediate macros --- xen/arch/arm/include/asm/grant_table.h | 75 ++++++++++++++++++-------- 1 file changed, 54 insertions(+), 21 deletions(-) diff --git a/xen/arch/arm/include/asm/grant_table.h b/xen/arch/arm/include/asm/grant_table.h index 5ccaf6d51f..3550990ceb 100644 --- a/xen/arch/arm/include/asm/grant_table.h +++ b/xen/arch/arm/include/asm/grant_table.h @@ -58,54 +58,87 @@ int replace_grant_host_mapping(unsigned long gpaddr, mfn_t mfn, #define gnttab_init_arch(gt) \ ({ \ - unsigned int ngf_ = (gt)->max_grant_frames; \ + typeof(gt) gt_ = (gt); \ + unsigned int ngf_ = gt_->max_grant_frames; \ unsigned int nsf_ = grant_to_status_frames(ngf_); \ \ - (gt)->arch.shared_gfn = xmalloc_array(gfn_t, ngf_); \ - (gt)->arch.status_gfn = xmalloc_array(gfn_t, nsf_); \ - if ( (gt)->arch.shared_gfn && (gt)->arch.status_gfn ) \ + gt_->arch.shared_gfn = xmalloc_array(gfn_t, ngf_); \ + gt_->arch.status_gfn = xmalloc_array(gfn_t, nsf_); \ + if ( gt_->arch.shared_gfn && gt_->arch.status_gfn ) \ { \ while ( ngf_-- ) \ - (gt)->arch.shared_gfn[ngf_] = INVALID_GFN; \ + gt_->arch.shared_gfn[ngf_] = INVALID_GFN; \ while ( nsf_-- ) \ - (gt)->arch.status_gfn[nsf_] = INVALID_GFN; \ + gt_->arch.status_gfn[nsf_] = INVALID_GFN; \ } \ else \ - gnttab_destroy_arch(gt); \ - (gt)->arch.shared_gfn ? 0 : -ENOMEM; \ + gnttab_destroy_arch(gt_); \ + gt_->arch.shared_gfn ? 0 : -ENOMEM; \ }) #define gnttab_destroy_arch(gt) \ do { \ - XFREE((gt)->arch.shared_gfn); \ - XFREE((gt)->arch.status_gfn); \ + typeof(gt) gt_ = (gt); \ + XFREE(gt_->arch.shared_gfn); \ + XFREE(gt_->arch.status_gfn); \ } while ( 0 ) #define gnttab_set_frame_gfn(gt, st, idx, gfn, mfn) \ ({ \ int rc_ = 0; \ - gfn_t ogfn = gnttab_get_frame_gfn(gt, st, idx); \ - if ( gfn_eq(ogfn, INVALID_GFN) || gfn_eq(ogfn, gfn) || \ - (rc_ = guest_physmap_remove_page((gt)->domain, ogfn, mfn, \ + const typeof(gt) gt_ = (gt); \ + const typeof(st) st_ = (st); \ + const typeof(idx) idx_ = (idx); \ + const typeof(gfn) gfn_ = (gfn); \ + const gfn_t ogfn_ = gnttab_get_frame_gfn(gt_, st_, idx_); \ + if ( gfn_eq(ogfn_, INVALID_GFN) || gfn_eq(ogfn_, gfn_) || \ + (rc_ = guest_physmap_remove_page(gt_->domain, ogfn_, mfn, \ 0)) == 0 ) \ - ((st) ? (gt)->arch.status_gfn \ - : (gt)->arch.shared_gfn)[idx] = (gfn); \ + (st_ ? gt_->arch.status_gfn \ + : gt_->arch.shared_gfn)[idx_] = gfn_; \ rc_; \ }) #define gnttab_get_frame_gfn(gt, st, idx) ({ \ - (st) ? gnttab_status_gfn(NULL, gt, idx) \ - : gnttab_shared_gfn(NULL, gt, idx); \ + (st) ? gnttab_status_gfn_(gt, idx) \ + : gnttab_shared_gfn_(gt, idx); \ }) +#define gnttab_shared_gfn_(t, i) \ + ({ \ + const typeof(t) t_ = (t); \ + const typeof(i) i_ = (i); \ + (i_ >= nr_grant_frames(t_)) ? INVALID_GFN \ + : t_->arch.shared_gfn[i_]; \ + }) + +#define gnttab_status_gfn_(t, i) \ + ({ \ + const typeof(t) t_ = (t); \ + const typeof(i) i_ = (i); \ + (i_ >= nr_status_frames(t_)) ? INVALID_GFN \ + : t_->arch.status_gfn[i_]; \ + }) + #define gnttab_shared_gfn(d, t, i) \ - (((i) >= nr_grant_frames(t)) ? INVALID_GFN : (t)->arch.shared_gfn[i]) + ({ \ + const typeof(t) t_ = (t); \ + ASSERT((d)->grant_table == t_); \ + gnttab_shared_gfn_(t_, i); \ + }) #define gnttab_status_gfn(d, t, i) \ - (((i) >= nr_status_frames(t)) ? INVALID_GFN : (t)->arch.status_gfn[i]) + ({ \ + const typeof(t) t_ = (t); \ + ASSERT((d)->grant_table == t_); \ + gnttab_status_gfn_(t_, i); \ + }) -#define gnttab_need_iommu_mapping(d) \ - (is_domain_direct_mapped(d) && is_iommu_enabled(d)) +#define gnttab_need_iommu_mapping(d) \ + ({ \ + const typeof(d) d_ = (d); \ + is_domain_direct_mapped(d_) && is_iommu_enabled(d_); \ + }) #endif /* __ASM_GRANT_TABLE_H__ */ /* -- 2.25.1