#include <linux/mmdebug.h> #include <linux/module.h> #include <linux/mm.h> #include <asm/page.h> #include "physaddr.h" #ifdef CONFIG_X86_64 unsigned long __phys_addr(unsigned long x) { if (x >= __START_KERNEL_map) { x -= __START_KERNEL_map; VIRTUAL_BUG_ON(x >= KERNEL_IMAGE_SIZE); x += phys_base; } else { VIRTUAL_BUG_ON(x < PAGE_OFFSET); x -= PAGE_OFFSET; VIRTUAL_BUG_ON(!phys_addr_valid(x)); } return x; } EXPORT_SYMBOL(__phys_addr); bool __virt_addr_valid(unsigned long x) { if (x >= __START_KERNEL_map) { x -= __START_KERNEL_map; if (x >= KERNEL_IMAGE_SIZE) return false; x += phys_base; } else { if (x < PAGE_OFFSET) return false; x -= PAGE_OFFSET; if (!phys_addr_valid(x)) return false; } return pfn_valid(x >> PAGE_SHIFT); } EXPORT_SYMBOL(__virt_addr_valid); #else #ifdef CONFIG_DEBUG_VIRTUAL unsigned long __phys_addr(unsigned long x) { /* VMALLOC_* aren't constants */ VIRTUAL_BUG_ON(x < PAGE_OFFSET); VIRTUAL_BUG_ON(__vmalloc_start_set && is_vmalloc_addr((void *) x)); return x - PAGE_OFFSET; } EXPORT_SYMBOL(__phys_addr); #endif bool __virt_addr_valid(unsigned long x) { if (x < PAGE_OFFSET) return false; if (__vmalloc_start_set && is_vmalloc_addr((void *) x)) return false; if (x >= FIXADDR_START) return false; return pfn_valid((x - PAGE_OFFSET) >> PAGE_SHIFT); } EXPORT_SYMBOL(__virt_addr_valid); #endif /* CONFIG_X86_64 */