* [PATCH v3] MIPS: Add support for CONFIG_DEBUG_VIRTUAL
@ 2021-03-26 22:14 Florian Fainelli
2021-03-27 3:33 ` kernel test robot
0 siblings, 1 reply; 3+ messages in thread
From: Florian Fainelli @ 2021-03-26 22:14 UTC (permalink / raw)
To: linux-mips
Cc: Florian Fainelli, Thomas Bogendoerfer, Jiaxun Yang, Randy Dunlap,
Kees Cook, Liangliang Huang, Anshuman Khandual, Andrew Morton,
Jinyang He, Daniel Jordan, Michel Lespinasse, Laurent Dufour,
open list
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
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);
--
2.25.1
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH v3] MIPS: Add support for CONFIG_DEBUG_VIRTUAL
2021-03-26 22:14 [PATCH v3] MIPS: Add support for CONFIG_DEBUG_VIRTUAL Florian Fainelli
@ 2021-03-27 3:33 ` kernel test robot
0 siblings, 0 replies; 3+ messages in thread
From: kernel test robot @ 2021-03-27 3:33 UTC (permalink / raw)
To: Florian Fainelli, linux-mips
Cc: kbuild-all, Florian Fainelli, Thomas Bogendoerfer, Jiaxun Yang,
Randy Dunlap, Kees Cook, Liangliang Huang, Anshuman Khandual,
Andrew Morton, Linux Memory Management List
[-- Attachment #1: Type: text/plain, Size: 5176 bytes --]
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
[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 27722 bytes --]
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH v3] MIPS: Add support for CONFIG_DEBUG_VIRTUAL
@ 2021-03-27 3:33 ` kernel test robot
0 siblings, 0 replies; 3+ messages in thread
From: kernel test robot @ 2021-03-27 3:33 UTC (permalink / raw)
To: kbuild-all
[-- Attachment #1: Type: text/plain, Size: 5300 bytes --]
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(a)lists.01.org
[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 27722 bytes --]
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2021-03-27 3:35 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-03-26 22:14 [PATCH v3] MIPS: Add support for CONFIG_DEBUG_VIRTUAL Florian Fainelli
2021-03-27 3:33 ` kernel test robot
2021-03-27 3:33 ` kernel test robot
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.