physaddr.c 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  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. #ifdef CONFIG_DEBUG_VIRTUAL
  8. unsigned long __phys_addr(unsigned long x)
  9. {
  10. unsigned long y = x - __START_KERNEL_map;
  11. /* use the carry flag to determine if x was < __START_KERNEL_map */
  12. if (unlikely(x > y)) {
  13. x = y + phys_base;
  14. VIRTUAL_BUG_ON(y >= KERNEL_IMAGE_SIZE);
  15. } else {
  16. x = y + (__START_KERNEL_map - PAGE_OFFSET);
  17. /* carry flag will be set if starting x was >= PAGE_OFFSET */
  18. VIRTUAL_BUG_ON((x > y) || !phys_addr_valid(x));
  19. }
  20. return x;
  21. }
  22. EXPORT_SYMBOL(__phys_addr);
  23. #endif
  24. bool __virt_addr_valid(unsigned long x)
  25. {
  26. unsigned long y = x - __START_KERNEL_map;
  27. /* use the carry flag to determine if x was < __START_KERNEL_map */
  28. if (unlikely(x > y)) {
  29. x = y + phys_base;
  30. if (y >= KERNEL_IMAGE_SIZE)
  31. return false;
  32. } else {
  33. x = y + (__START_KERNEL_map - PAGE_OFFSET);
  34. /* carry flag will be set if starting x was >= PAGE_OFFSET */
  35. if ((x > y) || !phys_addr_valid(x))
  36. return false;
  37. }
  38. return pfn_valid(x >> PAGE_SHIFT);
  39. }
  40. EXPORT_SYMBOL(__virt_addr_valid);
  41. #else
  42. #ifdef CONFIG_DEBUG_VIRTUAL
  43. unsigned long __phys_addr(unsigned long x)
  44. {
  45. /* VMALLOC_* aren't constants */
  46. VIRTUAL_BUG_ON(x < PAGE_OFFSET);
  47. VIRTUAL_BUG_ON(__vmalloc_start_set && is_vmalloc_addr((void *) x));
  48. return x - PAGE_OFFSET;
  49. }
  50. EXPORT_SYMBOL(__phys_addr);
  51. #endif
  52. bool __virt_addr_valid(unsigned long x)
  53. {
  54. if (x < PAGE_OFFSET)
  55. return false;
  56. if (__vmalloc_start_set && is_vmalloc_addr((void *) x))
  57. return false;
  58. if (x >= FIXADDR_START)
  59. return false;
  60. return pfn_valid((x - PAGE_OFFSET) >> PAGE_SHIFT);
  61. }
  62. EXPORT_SYMBOL(__virt_addr_valid);
  63. #endif /* CONFIG_X86_64 */