]> git.baikalelectronics.ru Git - kernel.git/commitdiff
MIPS: Fixed __debug_virt_addr_valid()
authorFlorian Fainelli <f.fainelli@gmail.com>
Thu, 14 Jul 2022 22:25:12 +0000 (15:25 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 17 Aug 2022 12:24:08 +0000 (14:24 +0200)
[ Upstream commit 9472906ac8da6db6a5227a6365fe95ebacb7ffd7 ]

It is permissible for kernel code to call virt_to_phys() against virtual
addresses that are in KSEG0 or KSEG1 and we need to be dealing with both
types. Rewrite the test condition to ensure that the kernel virtual
addresses are above PAGE_OFFSET which they must be, and below KSEG2
where the non-linear mapping starts.

For EVA, there is not much that we can do given the linear address range
that is offered, so just return any virtual address as being valid.

Finally, when HIGHMEM is not enabled, all virtual addresses are assumed
to be valid as well.

Fixes: f6c79b8d8bc7 ("MIPS: Add support for CONFIG_DEBUG_VIRTUAL")
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
Reviewed-by: Serge Semin <fancer.lancer@gmail.com>
Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
Signed-off-by: Sasha Levin <sashal@kernel.org>
arch/mips/mm/physaddr.c

index a1ced5e4495116d4a3c02ad33b3768fb907670f2..f9b8c85e984334dedd23ff7acc8c39e5e14f040a 100644 (file)
@@ -5,6 +5,7 @@
 #include <linux/mmdebug.h>
 #include <linux/mm.h>
 
+#include <asm/addrspace.h>
 #include <asm/sections.h>
 #include <asm/io.h>
 #include <asm/page.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
@@ -30,7 +22,9 @@ static inline bool __debug_virt_addr_valid(unsigned long x)
        if (x == MAX_DMA_ADDRESS)
                return true;
 
-       return false;
+       return x >= PAGE_OFFSET && (KSEGX(x) < KSEG2 ||
+              IS_ENABLED(CONFIG_EVA) ||
+              !IS_ENABLED(CONFIG_HIGHMEM));
 }
 
 phys_addr_t __virt_to_phys(volatile const void *x)