Nicholas Piggin <npig...@gmail.com> writes: > Ensure __va is given a physical address below PAGE_OFFSET, and __pa is > given a virtual address above PAGE_OFFSET. >
Reviewed-by: Aneesh Kumar K.V <aneesh.ku...@linux.ibm.com> > Signed-off-by: Nicholas Piggin <npig...@gmail.com> > --- > arch/powerpc/include/asm/page.h | 14 ++++++++++++-- > 1 file changed, 12 insertions(+), 2 deletions(-) > > diff --git a/arch/powerpc/include/asm/page.h b/arch/powerpc/include/asm/page.h > index 0d52f57fca04..c8bb14ff4713 100644 > --- a/arch/powerpc/include/asm/page.h > +++ b/arch/powerpc/include/asm/page.h > @@ -215,9 +215,19 @@ static inline bool pfn_valid(unsigned long pfn) > /* > * gcc miscompiles (unsigned long)(&static_var) - PAGE_OFFSET > * with -mcmodel=medium, so we use & and | instead of - and + on 64-bit. > + * This also results in better code generation. > */ > -#define __va(x) ((void *)(unsigned long)((phys_addr_t)(x) | PAGE_OFFSET)) > -#define __pa(x) ((unsigned long)(x) & 0x0fffffffffffffffUL) > +#define __va(x) > \ > +({ \ > + VIRTUAL_BUG_ON((unsigned long)(x) >= PAGE_OFFSET); \ > + (void *)(unsigned long)((phys_addr_t)(x) | PAGE_OFFSET); \ > +}) Can we make that static inline? Is there a need for __pa and __va to be #define like we do #ifndef anywhere? > + > +#define __pa(x) > \ > +({ \ > + VIRTUAL_BUG_ON((unsigned long)(x) < PAGE_OFFSET); \ > + (unsigned long)(x) & 0x0fffffffffffffffUL; \ > +}) > > #else /* 32-bit, non book E */ > #define __va(x) ((void *)(unsigned long)((phys_addr_t)(x) + PAGE_OFFSET - > MEMORY_START)) > -- > 2.22.0