On 03/28/2017 10:57 AM, Florian Fainelli wrote: > Provide hooks to intercept bad usages of virt_to_phys() and > __pa_symbol() throughout the kernel. To make this possible, we need to > rename the current implement of virt_to_phys() into > __virt_to_phys_nodebug() and wrap it around depending on > CONFIG_DEBUG_VIRTUAL. > > A similar thing is needed for __pa_symbol() which is now aliased to > __phys_addr_symbol() whose implementation is either the direct return of > RELOC_HIDE or goes through the debug version. Ping? This may not longer apply cleanly against arch/mips/Kconfig, but the conflicts should be trivial to resolve. Thanks. > > Signed-off-by: Florian Fainelli <f.fainelli@xxxxxxxxx> > --- > arch/mips/Kconfig | 1 + > arch/mips/include/asm/io.h | 14 +++++++++++++- > arch/mips/include/asm/page.h | 9 ++++++++- > arch/mips/mm/Makefile | 2 ++ > arch/mips/mm/physaddr.c | 40 ++++++++++++++++++++++++++++++++++++++++ > 5 files changed, 64 insertions(+), 2 deletions(-) > create mode 100644 arch/mips/mm/physaddr.c > > diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig > index 2afb41c52ba0..724457b5a7eb 100644 > --- a/arch/mips/Kconfig > +++ b/arch/mips/Kconfig > @@ -70,6 +70,7 @@ config MIPS > select HAVE_EXIT_THREAD > select HAVE_REGS_AND_STACK_ACCESS_API > select HAVE_ARCH_HARDENED_USERCOPY > + select ARCH_HAS_DEBUG_VIRTUAL > > menu "Machine selection" > > diff --git a/arch/mips/include/asm/io.h b/arch/mips/include/asm/io.h > index ecabc00c1e66..016e12161c9d 100644 > --- a/arch/mips/include/asm/io.h > +++ b/arch/mips/include/asm/io.h > @@ -116,11 +116,23 @@ static inline void set_io_port_base(unsigned long base) > * almost all conceivable cases a device driver should not be using > * this function > */ > -static inline unsigned long virt_to_phys(volatile const void *address) > +static inline unsigned long __virt_to_phys_nodebug(volatile const void *address) > { > return __pa(address); > } > > +#ifdef CONFIG_DEBUG_VIRTUAL > +extern phys_addr_t __virt_to_phys(volatile const void *x); > +#else > +#define __virt_to_phys(x) __virt_to_phys_nodebug(x) > +#endif > + > +#define virt_to_phys virt_to_phys > +static inline phys_addr_t virt_to_phys(const volatile void *x) > +{ > + return __virt_to_phys(x); > +} > + > /* > * phys_to_virt - map physical address to virtual > * @address: address to remap > diff --git a/arch/mips/include/asm/page.h b/arch/mips/include/asm/page.h > index 5f987598054f..bf8bd7d77fce 100644 > --- a/arch/mips/include/asm/page.h > +++ b/arch/mips/include/asm/page.h > @@ -205,9 +205,16 @@ static inline unsigned long ___pa(unsigned long x) > * until GCC 3.x has been retired before we can apply > * https://patchwork.linux-mips.org/patch/1541/ > */ > +#define __pa_symbol_nodebug(x) __pa(RELOC_HIDE((unsigned long)(x), 0)) > + > +#ifdef CONFIG_DEBUG_VIRTUAL > +extern phys_addr_t __phys_addr_symbol(unsigned long x); > +#else > +#define __phys_addr_symbol(x) __pa_symbol_nodebug(x) > +#endif > > #ifndef __pa_symbol > -#define __pa_symbol(x) __pa(RELOC_HIDE((unsigned long)(x), 0)) > +#define __pa_symbol(x) __phys_addr_symbol((unsigned long)(x)) > #endif > > #define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT) > diff --git a/arch/mips/mm/Makefile b/arch/mips/mm/Makefile > index b4cc8811a664..0a1d241c50fb 100644 > --- a/arch/mips/mm/Makefile > +++ b/arch/mips/mm/Makefile > @@ -29,3 +29,5 @@ obj-$(CONFIG_R5000_CPU_SCACHE) += sc-r5k.o > obj-$(CONFIG_RM7000_CPU_SCACHE) += sc-rm7k.o > obj-$(CONFIG_MIPS_CPU_SCACHE) += sc-mips.o > obj-$(CONFIG_SCACHE_DEBUGFS) += sc-debugfs.o > + > +obj-$(CONFIG_DEBUG_VIRTUAL) += physaddr.o > diff --git a/arch/mips/mm/physaddr.c b/arch/mips/mm/physaddr.c > new file mode 100644 > index 000000000000..6123a9b3b3c0 > --- /dev/null > +++ b/arch/mips/mm/physaddr.c > @@ -0,0 +1,40 @@ > +#include <linux/bug.h> > +#include <linux/export.h> > +#include <linux/types.h> > +#include <linux/mmdebug.h> > +#include <linux/mm.h> > + > +#include <asm/sections.h> > +#include <asm/io.h> > +#include <asm/page.h> > +#include <asm/dma.h> > + > +static inline bool __debug_virt_addr_valid(unsigned long x) > +{ > + if (x >= PAGE_OFFSET && x < (unsigned long)high_memory) > + return true; > + > + return false; > +} > + > +phys_addr_t __virt_to_phys(volatile const void *x) > +{ > + WARN(!__debug_virt_addr_valid((unsigned long)x), > + "virt_to_phys used for non-linear address: %pK (%pS)\n", > + x, x); > + > + return __virt_to_phys_nodebug(x); > +} > +EXPORT_SYMBOL(__virt_to_phys); > + > +phys_addr_t __phys_addr_symbol(unsigned long x) > +{ > + /* This is bounds checking against the kernel image only. > + * __pa_symbol should only be used on kernel symbol addresses. > + */ > + VIRTUAL_BUG_ON(x < (unsigned long)_text || > + x > (unsigned long)_end); > + > + return __pa_symbol_nodebug(x); > +} > +EXPORT_SYMBOL(__phys_addr_symbol); > -- Florian