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