#define __pte_to_swp_entry(pte)        ((swp_entry_t) { pte_val(pte) })
 #define __swp_entry_to_pte(x)  ((pte_t) { (x).val })
 
-#define kern_addr_valid(addr)  (1)
-
 #define pte_ERROR(e) \
        printk("%s:%d: bad pte %016lx.\n", __FILE__, __LINE__, pte_val(e))
 #define pmd_ERROR(e) \
 
 #define __pte_to_swp_entry(pte)                ((swp_entry_t) { pte_val(pte) })
 #define __swp_entry_to_pte(x)          ((pte_t) { (x).val })
 
-#define kern_addr_valid(addr)  (1)
-
 #ifdef CONFIG_TRANSPARENT_HUGEPAGE
 #include <asm/hugepage.h>
 #endif
 
 #define pgd_none(pgd)          (0)
 #define pgd_bad(pgd)           (0)
 #define pgd_clear(pgdp)
-#define kern_addr_valid(addr)  (1)
-/* FIXME */
 /*
  * PMD_SHIFT determines the size of the area a second-level page table can map
  * PGDIR_SHIFT determines what a third-level page table entry can map
 
  */
 #define MAX_SWAPFILES_CHECK() BUILD_BUG_ON(MAX_SWAPFILES_SHIFT > __SWP_TYPE_BITS)
 
-/* Needs to be defined here and not in linux/mm.h, as it is arch dependent */
-/* FIXME: this is not correct */
-#define kern_addr_valid(addr)  (1)
-
 /*
  * We provide our own arch_get_unmapped_area to cope with VIPT caches.
  */
 
  */
 #define MAX_SWAPFILES_CHECK() BUILD_BUG_ON(MAX_SWAPFILES_SHIFT > __SWP_TYPE_BITS)
 
-extern int kern_addr_valid(unsigned long addr);
-
 #ifdef CONFIG_ARM64_MTE
 
 #define __HAVE_ARCH_PREPARE_TO_SWAP
 
        create_idmap();
 }
 
-/*
- * Check whether a kernel address is valid (derived from arch/x86/).
- */
-int kern_addr_valid(unsigned long addr)
-{
-       pgd_t *pgdp;
-       p4d_t *p4dp;
-       pud_t *pudp, pud;
-       pmd_t *pmdp, pmd;
-       pte_t *ptep, pte;
-
-       addr = arch_kasan_reset_tag(addr);
-       if ((((long)addr) >> VA_BITS) != -1UL)
-               return 0;
-
-       pgdp = pgd_offset_k(addr);
-       if (pgd_none(READ_ONCE(*pgdp)))
-               return 0;
-
-       p4dp = p4d_offset(pgdp, addr);
-       if (p4d_none(READ_ONCE(*p4dp)))
-               return 0;
-
-       pudp = pud_offset(p4dp, addr);
-       pud = READ_ONCE(*pudp);
-       if (pud_none(pud))
-               return 0;
-
-       if (pud_sect(pud))
-               return pfn_valid(pud_pfn(pud));
-
-       pmdp = pmd_offset(pudp, addr);
-       pmd = READ_ONCE(*pmdp);
-       if (pmd_none(pmd))
-               return 0;
-
-       if (pmd_sect(pmd))
-               return pfn_valid(pmd_pfn(pmd));
-
-       ptep = pte_offset_kernel(pmdp, addr);
-       pte = READ_ONCE(*ptep);
-       if (pte_none(pte))
-               return 0;
-
-       return pfn_valid(pte_pfn(pte));
-}
-
 #ifdef CONFIG_MEMORY_HOTPLUG
 static void free_hotplug_page_range(struct page *page, size_t size,
                                    struct vmem_altmap *altmap)
 
 
 /*
  * This function is used to determine if a linear map page has been marked as
- * not-valid. Walk the page table and check the PTE_VALID bit. This is based
- * on kern_addr_valid(), which almost does what we need.
+ * not-valid. Walk the page table and check the PTE_VALID bit.
  *
  * Because this is only called on the kernel linear map,  p?d_sect() implies
  * p?d_present(). When debug_pagealloc is enabled, sections mappings are
 
 void update_mmu_cache(struct vm_area_struct *vma, unsigned long address,
                      pte_t *pte);
 
-/* Needs to be defined here and not in linux/mm.h, as it is arch dependent */
-#define kern_addr_valid(addr)  (1)
-
 #define io_remap_pfn_range(vma, vaddr, pfn, size, prot) \
        remap_pfn_range(vma, vaddr, pfn, size, prot)
 
 
 
 #define page_to_virt(page)     __va(page_to_phys(page))
 
-/*
- * For port to Hexagon Virtual Machine, MAYBE we check for attempts
- * to reference reserved HVM space, but in any case, the VM will be
- * protected.
- */
-#define kern_addr_valid(addr)   (1)
-
 #include <asm/mem-layout.h>
 #include <asm-generic/memory_model.h>
 /* XXX Todo: implement assembly-optimized version of getorder. */
 
        return (addr & (local_cpu_data->unimpl_pa_mask)) == 0;
 }
 
-/*
- * kern_addr_valid(ADDR) tests if ADDR is pointing to valid kernel
- * memory.  For the return value to be meaningful, ADDR must be >=
- * PAGE_OFFSET.  This operation can be relatively expensive (e.g.,
- * require a hash-, or multi-level tree-lookup or something of that
- * sort) but it guarantees to return TRUE only if accessing the page
- * at that address does not cause an error.  Note that there may be
- * addresses for which kern_addr_valid() returns FALSE even though an
- * access would not cause an error (e.g., this is typically true for
- * memory mapped I/O regions.
- *
- * XXX Need to implement this for IA-64.
- */
-#define kern_addr_valid(addr)  (1)
-
-
 /*
  * Now come the defines and routines to manage and access the three-level
  * page table.
 
        __update_tlb(vma, address, (pte_t *)pmdp);
 }
 
-#define kern_addr_valid(addr)  (1)
-
 static inline unsigned long pmd_pfn(pmd_t pmd)
 {
        return (pmd_val(pmd) & _PFN_MASK) >> _PFN_SHIFT;
 
 
 #endif /* !__ASSEMBLY__ */
 
-#define kern_addr_valid(addr)  (1)
-
 /* MMU-specific headers */
 
 #ifdef CONFIG_SUN3
 
 #define pgd_none(pgd)          (0)
 #define pgd_bad(pgd)           (0)
 #define pgd_clear(pgdp)
-#define kern_addr_valid(addr)  (1)
 #define        pmd_offset(a, b)        ((void *)0)
 
 #define PAGE_NONE      __pgprot(0)
 
 #define        IOMAP_NOCACHE_NONSER    2
 #define        IOMAP_NO_COPYBACK       3
 
-/* Needs to be defined here and not in linux/mm.h, as it is arch dependent */
-#define kern_addr_valid(addr)  (1)
-
 void do_page_fault(struct pt_regs *regs, unsigned long address,
                   unsigned long error_code);
 
 
        __update_tlb(vma, address, pte);
 }
 
-#define kern_addr_valid(addr)  (1)
-
 /*
  * Allow physical addresses to be fixed up to help 36-bit peripherals.
  */
 
 #define __swp_entry_to_pte(swp)        ((pte_t) { (swp).val })
 #define __pte_to_swp_entry(pte)        ((swp_entry_t) { pte_val(pte) })
 
-#define kern_addr_valid(addr)          (1)
-
 extern void __init paging_init(void);
 extern void __init mmu_init(void);
 
 
 #define __pte_to_swp_entry(pte)                ((swp_entry_t) { pte_val(pte) })
 #define __swp_entry_to_pte(x)          ((pte_t) { (x).val })
 
-#define kern_addr_valid(addr)           (1)
-
 typedef pte_t *pte_addr_t;
 
 #endif /* __ASSEMBLY__ */
 
 #include <asm/processor.h>
 #include <asm/cache.h>
 
-/*
- * kern_addr_valid(ADDR) tests if ADDR is pointing to valid kernel
- * memory.  For the return value to be meaningful, ADDR must be >=
- * PAGE_OFFSET.  This operation can be relatively expensive (e.g.,
- * require a hash-, or multi-level tree-lookup or something of that
- * sort) but it guarantees to return TRUE only if accessing the page
- * at that address does not cause an error.  Note that there may be
- * addresses for which kern_addr_valid() returns FALSE even though an
- * access would not cause an error (e.g., this is typically true for
- * memory mapped I/O regions.
- *
- * XXX Need to implement this for parisc.
- */
-#define kern_addr_valid(addr)  (1)
-
 /* This is for the serialization of PxTLB broadcasts. At least on the N class
  * systems, only one PxTLB inter processor broadcast can be active at any one
  * time on the Merced bus. */
 
 extern unsigned long ioremap_bot;
 extern const pgprot_t protection_map[16];
 
-/*
- * kern_addr_valid is intended to indicate whether an address is a valid
- * kernel address.  Most 32-bit archs define it as always true (like this)
- * but most 64-bit archs actually perform a test.  What should we do here?
- */
-#define kern_addr_valid(addr)  (1)
-
 #ifndef CONFIG_TRANSPARENT_HUGEPAGE
 #define pmd_large(pmd)         0
 #endif
 
 
 #endif /* !CONFIG_MMU */
 
-#define kern_addr_valid(addr)   (1) /* FIXME */
-
 extern char _start[];
 extern void *_dtb_early_va;
 extern uintptr_t _dtb_early_pa;
 
 #define __pte_to_swp_entry(pte)        ((swp_entry_t) { pte_val(pte) })
 #define __swp_entry_to_pte(x)  ((pte_t) { (x).val })
 
-#define kern_addr_valid(addr)   (1)
-
 extern int vmem_add_mapping(unsigned long start, unsigned long size);
 extern void vmem_remove_mapping(unsigned long start, unsigned long size);
 extern int __vmem_map_4k_page(unsigned long addr, unsigned long phys, pgprot_t prot, bool alloc);
 
 
 typedef pte_t *pte_addr_t;
 
-#define kern_addr_valid(addr)  (1)
-
 #define pte_pfn(x)             ((unsigned long)(((x).pte_low >> PAGE_SHIFT)))
 
 struct vm_area_struct;
 
        }
 }
 
-extern unsigned long *sparc_valid_addr_bitmap;
-
-/* Needs to be defined here and not in linux/mm.h, as it is arch dependent */
-#define kern_addr_valid(addr) \
-       (test_bit(__pa((unsigned long)(addr))>>20, sparc_valid_addr_bitmap))
-
 /*
  * For sparc32&64, the pfn in io_remap_pfn_range() carries <iospace> in
  * its high 4 bits.  These macros/functions put it there or get it from there.
 
 
 #include "mm_32.h"
 
-unsigned long *sparc_valid_addr_bitmap;
-EXPORT_SYMBOL(sparc_valid_addr_bitmap);
+static unsigned long *sparc_valid_addr_bitmap;
 
 unsigned long phys_base;
 EXPORT_SYMBOL(phys_base);
 
 
        return pfn_valid(pte_pfn(*pte));
 }
-EXPORT_SYMBOL(kern_addr_valid);
 
 static unsigned long __ref kernel_map_hugepud(unsigned long vstart,
                                              unsigned long vend,
 
        ((swp_entry_t) { pte_val(pte_mkuptodate(pte)) })
 #define __swp_entry_to_pte(x)          ((pte_t) { (x).val })
 
-#define kern_addr_valid(addr) (1)
-
 /* Clear a kernel PTE and flush it from the TLB */
 #define kpte_clear_flush(ptep, vaddr)          \
 do {                                           \
 
 
 #endif /* !__ASSEMBLY__ */
 
-/*
- * kern_addr_valid() is (1) for FLATMEM and (0) for SPARSEMEM
- */
-#ifdef CONFIG_FLATMEM
-#define kern_addr_valid(addr)  (1)
-#else
-#define kern_addr_valid(kaddr) (0)
-#endif
-
 /*
  * This is used to calculate the .brk reservation for initial pagetables.
  * Enough space is reserved to allocate pagetables sufficient to cover all
 
 #define __swp_entry_to_pte(x)          ((pte_t) { .pte = (x).val })
 #define __swp_entry_to_pmd(x)          ((pmd_t) { .pmd = (x).val })
 
-extern int kern_addr_valid(unsigned long addr);
 extern void cleanup_highmap(void);
 
 #define HAVE_ARCH_UNMAPPED_AREA
 
        debug_checkwx();
 }
 
-int kern_addr_valid(unsigned long addr)
-{
-       unsigned long above = ((long)addr) >> __VIRTUAL_MASK_SHIFT;
-       pgd_t *pgd;
-       p4d_t *p4d;
-       pud_t *pud;
-       pmd_t *pmd;
-       pte_t *pte;
-
-       if (above != 0 && above != -1UL)
-               return 0;
-
-       pgd = pgd_offset_k(addr);
-       if (pgd_none(*pgd))
-               return 0;
-
-       p4d = p4d_offset(pgd, addr);
-       if (!p4d_present(*p4d))
-               return 0;
-
-       pud = pud_offset(p4d, addr);
-       if (!pud_present(*pud))
-               return 0;
-
-       if (pud_large(*pud))
-               return pfn_valid(pud_pfn(*pud));
-
-       pmd = pmd_offset(pud, addr);
-       if (!pmd_present(*pmd))
-               return 0;
-
-       if (pmd_large(*pmd))
-               return pfn_valid(pmd_pfn(*pmd));
-
-       pte = pte_offset_kernel(pmd, addr);
-       if (pte_none(*pte))
-               return 0;
-
-       return pfn_valid(pte_pfn(*pte));
-}
-
 /*
  * Block size is the minimum amount of memory which can be hotplugged or
  * hotremoved. It must be power of two and must be equal or larger than
 
 
 #else
 
-#define kern_addr_valid(addr)  (1)
-
 extern  void update_mmu_cache(struct vm_area_struct * vma,
                              unsigned long address, pte_t *ptep);
 
 
                        fallthrough;
                case KCORE_VMEMMAP:
                case KCORE_TEXT:
-                       if (kern_addr_valid(start)) {
-                               /*
-                                * Using bounce buffer to bypass the
-                                * hardened user copy kernel text checks.
-                                */
-                               if (copy_from_kernel_nofault(buf, (void *)start,
-                                               tsz)) {
-                                       if (clear_user(buffer, tsz)) {
-                                               ret = -EFAULT;
-                                               goto out;
-                                       }
-                               } else {
-                                       if (copy_to_user(buffer, buf, tsz)) {
-                                               ret = -EFAULT;
-                                               goto out;
-                                       }
+                       /*
+                        * Using bounce buffer to bypass the
+                        * hardened user copy kernel text checks.
+                        */
+                       if (copy_from_kernel_nofault(buf, (void *)start, tsz)) {
+                               if (clear_user(buffer, tsz)) {
+                                       ret = -EFAULT;
+                                       goto out;
                                }
                        } else {
-                               if (clear_user(buffer, tsz)) {
+                               if (copy_to_user(buffer, buf, tsz)) {
                                        ret = -EFAULT;
                                        goto out;
                                }