Message ID | 20210326221449.153483-1-f.fainelli@gmail.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | [v3] MIPS: Add support for CONFIG_DEBUG_VIRTUAL | expand |
Hi Florian, I love your patch! Perhaps something to improve: [auto build test WARNING on linus/master] [also build test WARNING on v5.12-rc4 next-20210326] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch] url: https://github.com/0day-ci/linux/commits/Florian-Fainelli/MIPS-Add-support-for-CONFIG_DEBUG_VIRTUAL/20210327-061711 base: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 0f4498cef9f5cd18d7c6639a2a902ec1edc5be4e config: mips-randconfig-s032-20210326 (attached as .config) compiler: mipsel-linux-gcc (GCC) 9.3.0 reproduce: wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # apt-get install sparse # sparse version: v0.6.3-277-gc089cd2d-dirty # https://github.com/0day-ci/linux/commit/ee0c68ff98559388eac4d40c8f8724e21f7ba5f6 git remote add linux-review https://github.com/0day-ci/linux git fetch --no-tags linux-review Florian-Fainelli/MIPS-Add-support-for-CONFIG_DEBUG_VIRTUAL/20210327-061711 git checkout ee0c68ff98559388eac4d40c8f8724e21f7ba5f6 # save the attached .config to linux build tree COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' ARCH=mips If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <lkp@intel.com> sparse warnings: (new ones prefixed by >>) command-line: note: in included file: builtin:1:9: sparse: sparse: preprocessor token __ATOMIC_ACQUIRE redefined builtin:0:0: sparse: this was the original definition builtin:1:9: sparse: sparse: preprocessor token __ATOMIC_SEQ_CST redefined builtin:0:0: sparse: this was the original definition builtin:1:9: sparse: sparse: preprocessor token __ATOMIC_ACQ_REL redefined builtin:0:0: sparse: this was the original definition builtin:1:9: sparse: sparse: preprocessor token __ATOMIC_RELEASE redefined builtin:0:0: sparse: this was the original definition >> arch/mips/kernel/vdso.c:161:41: sparse: sparse: cast removes address space '__iomem' of expression vim +/__iomem +161 arch/mips/kernel/vdso.c 88 89 int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) 90 { 91 struct mips_vdso_image *image = current->thread.abi->vdso; 92 struct mm_struct *mm = current->mm; 93 unsigned long gic_size, vvar_size, size, base, data_addr, vdso_addr, gic_pfn; 94 struct vm_area_struct *vma; 95 int ret; 96 97 if (mmap_write_lock_killable(mm)) 98 return -EINTR; 99 100 if (IS_ENABLED(CONFIG_MIPS_FP_SUPPORT)) { 101 /* Map delay slot emulation page */ 102 base = mmap_region(NULL, STACK_TOP, PAGE_SIZE, 103 VM_READ | VM_EXEC | 104 VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC, 105 0, NULL); 106 if (IS_ERR_VALUE(base)) { 107 ret = base; 108 goto out; 109 } 110 } 111 112 /* 113 * Determine total area size. This includes the VDSO data itself, the 114 * data page, and the GIC user page if present. Always create a mapping 115 * for the GIC user area if the GIC is present regardless of whether it 116 * is the current clocksource, in case it comes into use later on. We 117 * only map a page even though the total area is 64K, as we only need 118 * the counter registers at the start. 119 */ 120 gic_size = mips_gic_present() ? PAGE_SIZE : 0; 121 vvar_size = gic_size + PAGE_SIZE; 122 size = vvar_size + image->size; 123 124 /* 125 * Find a region that's large enough for us to perform the 126 * colour-matching alignment below. 127 */ 128 if (cpu_has_dc_aliases) 129 size += shm_align_mask + 1; 130 131 base = get_unmapped_area(NULL, vdso_base(), size, 0, 0); 132 if (IS_ERR_VALUE(base)) { 133 ret = base; 134 goto out; 135 } 136 137 /* 138 * If we suffer from dcache aliasing, ensure that the VDSO data page 139 * mapping is coloured the same as the kernel's mapping of that memory. 140 * This ensures that when the kernel updates the VDSO data userland 141 * will observe it without requiring cache invalidations. 142 */ 143 if (cpu_has_dc_aliases) { 144 base = __ALIGN_MASK(base, shm_align_mask); 145 base += ((unsigned long)vdso_data - gic_size) & shm_align_mask; 146 } 147 148 data_addr = base + gic_size; 149 vdso_addr = data_addr + PAGE_SIZE; 150 151 vma = _install_special_mapping(mm, base, vvar_size, 152 VM_READ | VM_MAYREAD, 153 &vdso_vvar_mapping); 154 if (IS_ERR(vma)) { 155 ret = PTR_ERR(vma); 156 goto out; 157 } 158 159 /* Map GIC user page. */ 160 if (gic_size) { > 161 gic_pfn = virt_to_phys((void *)mips_gic_base + MIPS_GIC_USER_OFS) >> PAGE_SHIFT; --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index d89efba3d8a4..0904d6351808 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig @@ -4,6 +4,7 @@ config MIPS default y select ARCH_32BIT_OFF_T if !64BIT select ARCH_BINFMT_ELF_STATE if MIPS_FP_SUPPORT + select ARCH_HAS_DEBUG_VIRTUAL if !64BIT select ARCH_HAS_FORTIFY_SOURCE select ARCH_HAS_KCOV select ARCH_HAS_PTE_SPECIAL if !(32BIT && CPU_HAS_RIXI) diff --git a/arch/mips/include/asm/io.h b/arch/mips/include/asm/io.h index 78537aa23500..2c138450ad3b 100644 --- a/arch/mips/include/asm/io.h +++ b/arch/mips/include/asm/io.h @@ -100,11 +100,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 65acab9c41f9..195ff4e9771f 100644 --- a/arch/mips/include/asm/page.h +++ b/arch/mips/include/asm/page.h @@ -210,9 +210,16 @@ static inline unsigned long ___pa(unsigned long x) * also affect MIPS so we keep this one 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/kernel/vdso.c b/arch/mips/kernel/vdso.c index 7d0b91ad2581..e3fd93ca480a 100644 --- a/arch/mips/kernel/vdso.c +++ b/arch/mips/kernel/vdso.c @@ -158,7 +158,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) /* Map GIC user page. */ if (gic_size) { - gic_pfn = virt_to_phys(mips_gic_base + MIPS_GIC_USER_OFS) >> PAGE_SHIFT; + gic_pfn = virt_to_phys((void *)mips_gic_base + MIPS_GIC_USER_OFS) >> PAGE_SHIFT; ret = io_remap_pfn_range(vma, base, gic_pfn, gic_size, pgprot_noncached(vma->vm_page_prot)); diff --git a/arch/mips/mm/Makefile b/arch/mips/mm/Makefile index 865926a37775..fa1f729e0700 100644 --- a/arch/mips/mm/Makefile +++ b/arch/mips/mm/Makefile @@ -40,3 +40,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..a1ced5e44951 --- /dev/null +++ b/arch/mips/mm/physaddr.c @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: GPL-2.0 +#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) +{ + /* high_memory does not get immediately defined, and there + * are early callers of __pa() against PAGE_OFFSET + */ + if (!high_memory && x >= PAGE_OFFSET) + return true; + + if (high_memory && x >= PAGE_OFFSET && x < (unsigned long)high_memory) + return true; + + /* + * MAX_DMA_ADDRESS is a virtual address that may not correspond to an + * actual physical address. Enough code relies on + * virt_to_phys(MAX_DMA_ADDRESS) that we just need to work around it + * and always return true. + */ + if (x == MAX_DMA_ADDRESS) + 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);
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. Signed-off-by: Florian Fainelli <f.fainelli@gmail.com> --- Changes in v3: - added missing SDPX license tag in physaddr.c Changes in v2: - fixed sparse warning in arch/mips/kernel/vdso.c arch/mips/Kconfig | 1 + arch/mips/include/asm/io.h | 14 ++++++++- arch/mips/include/asm/page.h | 9 +++++- arch/mips/kernel/vdso.c | 2 +- arch/mips/mm/Makefile | 2 ++ arch/mips/mm/physaddr.c | 56 ++++++++++++++++++++++++++++++++++++ 6 files changed, 81 insertions(+), 3 deletions(-) create mode 100644 arch/mips/mm/physaddr.c