physaddr.c 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #include <linux/mmdebug.h>
  2. #include <linux/module.h>
  3. #include <linux/mm.h>
  4. #include <asm/page.h>
  5. #include "physaddr.h"
  6. #ifdef CONFIG_X86_64
  7. unsigned long __phys_addr(unsigned long x)
  8. {
  9. if (x >= __START_KERNEL_map) {
  10. x -= __START_KERNEL_map;
  11. VIRTUAL_BUG_ON(x >= KERNEL_IMAGE_SIZE);
  12. x += phys_base;
  13. } else {
  14. VIRTUAL_BUG_ON(x < PAGE_OFFSET);
  15. x -= PAGE_OFFSET;
  16. VIRTUAL_BUG_ON(!phys_addr_valid(x));
  17. }
  18. return x;
  19. }
  20. EXPORT_SYMBOL(__phys_addr);
  21. bool __virt_addr_valid(unsigned long x)
  22. {
  23. if (x >= __START_KERNEL_map) {
  24. x -= __START_KERNEL_map;
  25. if (x >= KERNEL_IMAGE_SIZE)
  26. return false;
  27. x += phys_base;
  28. } else {
  29. if (x < PAGE_OFFSET)
  30. return false;
  31. x -= PAGE_OFFSET;
  32. if (!phys_addr_valid(x))
  33. return false;
  34. }
  35. return pfn_valid(x >> PAGE_SHIFT);
  36. }
  37. EXPORT_SYMBOL(__virt_addr_valid);
  38. #else
  39. #ifdef CONFIG_DEBUG_VIRTUAL
  40. unsigned long __phys_addr(unsigned long x)
  41. {
  42. /* VMALLOC_* aren't constants */
  43. VIRTUAL_BUG_ON(x < PAGE_OFFSET);
  44. VIRTUAL_BUG_ON(__vmalloc_start_set && is_vmalloc_addr((void *) x));
  45. return x - PAGE_OFFSET;
  46. }
  47. EXPORT_SYMBOL(__phys_addr);
  48. #endif
  49. bool __virt_addr_valid(unsigned long x)
  50. {
  51. if (x < PAGE_OFFSET)
  52. return false;
  53. if (__vmalloc_start_set && is_vmalloc_addr((void *) x))
  54. return false;
  55. if (x >= FIXADDR_START)
  56. return false;
  57. return pfn_valid((x - PAGE_OFFSET) >> PAGE_SHIFT);
  58. }
  59. EXPORT_SYMBOL(__virt_addr_valid);
  60. #endif /* CONFIG_X86_64 */