On 15/10/18 10:56, Stefano Stabellini wrote: > Introduce a macro, __symbol, which is a simple wrapper around RELOC_HIDE > to be used everywhere symbols such as _stext and _etext are used in the > code. > > RELOC_HIDE is needed when accessing symbols such as _stext and _etext > because the C standard forbids comparisons between pointers pointing to > different objects. _stext, _etext, etc. are all pointers to different > objects from ANCI C point of view. > > To work around potential C compiler issues (which have actually > been found, see the comment on top of RELOC_HIDE in Linux), and to help > with certifications, let's introduce some syntactic sugar to be used in > following patches. > > Signed-off-by: Stefano Stabellini <stefa...@xilinx.com> > --- > xen/include/asm-arm/mm.h | 6 ++++++ > xen/include/asm-x86/page.h | 6 ++++++ > 2 files changed, 12 insertions(+) > > diff --git a/xen/include/asm-arm/mm.h b/xen/include/asm-arm/mm.h > index 940b74b..02ce05a 100644 > --- a/xen/include/asm-arm/mm.h > +++ b/xen/include/asm-arm/mm.h > @@ -284,6 +284,12 @@ static inline uint64_t gvirt_to_maddr(vaddr_t va, > paddr_t *pa, > #define __mfn_to_virt(mfn) (maddr_to_virt((paddr_t)(mfn) << PAGE_SHIFT)) > > /* > + * Use RELOC_HIDE with symbols such as _stext and _etext to avoid errors > + * on comparing pointers to different objects > + */ > +#define __symbol(x) ((char *)RELOC_HIDE((unsigned long)(x), 0))
Casting to char * isn't correct. It breaks pointer arithmetic for some of the uses you didn't convert in the following patch, and the unsigned long cast isn't necessary either. Dropping both of them will keep everything working correctly, as RELOC_HIDE() already has the correct return type. ~Andrew _______________________________________________ Xen-devel mailing list Xen-devel@lists.xenproject.org https://lists.xenproject.org/mailman/listinfo/xen-devel