FILE
physaddr.c
File preview with syntax highlighting.
linux-6.19.14/arch/x86/mm/physaddr.c
1// SPDX-License-Identifier: GPL-2.0 2#include <linux/memblock.h> 3#include <linux/mmdebug.h> 4#include <linux/export.h> 5#include <linux/mm.h> 6 7#include <asm/page.h> 8#include <linux/vmalloc.h> 9 10#include "physaddr.h" 11 12#ifdef CONFIG_X86_64 13 14#ifdef CONFIG_DEBUG_VIRTUAL 15unsigned long __phys_addr(unsigned long x) 16{ 17 unsigned long y = x - __START_KERNEL_map; 18 19 /* use the carry flag to determine if x was < __START_KERNEL_map */ 20 if (unlikely(x > y)) { 21 x = y + phys_base; 22 23 VIRTUAL_BUG_ON(y >= KERNEL_IMAGE_SIZE); 24 } else { 25 x = y + (__START_KERNEL_map - PAGE_OFFSET); 26 27 /* carry flag will be set if starting x was >= PAGE_OFFSET */ 28 VIRTUAL_BUG_ON((x > y) || !phys_addr_valid(x)); 29 } 30 31 return x; 32} 33EXPORT_SYMBOL(__phys_addr); 34#endif 35 36bool __virt_addr_valid(unsigned long x) 37{ 38 unsigned long y = x - __START_KERNEL_map; 39 40 /* use the carry flag to determine if x was < __START_KERNEL_map */ 41 if (unlikely(x > y)) { 42 x = y + phys_base; 43 44 if (y >= KERNEL_IMAGE_SIZE) 45 return false; 46 } else { 47 x = y + (__START_KERNEL_map - PAGE_OFFSET); 48 49 /* carry flag will be set if starting x was >= PAGE_OFFSET */ 50 if ((x > y) || !phys_addr_valid(x)) 51 return false; 52 } 53 54 return pfn_valid(x >> PAGE_SHIFT); 55} 56EXPORT_SYMBOL(__virt_addr_valid); 57 58#else 59 60#ifdef CONFIG_DEBUG_VIRTUAL 61unsigned long __phys_addr(unsigned long x) 62{ 63 unsigned long phys_addr = x - PAGE_OFFSET; 64 /* VMALLOC_* aren't constants */ 65 VIRTUAL_BUG_ON(x < PAGE_OFFSET); 66 VIRTUAL_BUG_ON(__vmalloc_start_set && is_vmalloc_addr((void *) x)); 67 /* max_low_pfn is set early, but not _that_ early */ 68 if (max_low_pfn) { 69 VIRTUAL_BUG_ON((phys_addr >> PAGE_SHIFT) > max_low_pfn); 70 BUG_ON(slow_virt_to_phys((void *)x) != phys_addr); 71 } 72 return phys_addr; 73} 74EXPORT_SYMBOL(__phys_addr); 75#endif 76 77bool __virt_addr_valid(unsigned long x) 78{ 79 if (x < PAGE_OFFSET) 80 return false; 81 if (__vmalloc_start_set && is_vmalloc_addr((void *) x)) 82 return false; 83 if (x >= FIXADDR_START) 84 return false; 85 return pfn_valid((x - PAGE_OFFSET) >> PAGE_SHIFT); 86} 87EXPORT_SYMBOL(__virt_addr_valid); 88 89#endif /* CONFIG_X86_64 */
~/
Read-only file preview.