|
@@ -132,7 +132,19 @@ extern long long virt_phys_offset;
|
|
#define virt_to_pfn(kaddr) (__pa(kaddr) >> PAGE_SHIFT)
|
|
#define virt_to_pfn(kaddr) (__pa(kaddr) >> PAGE_SHIFT)
|
|
#define virt_to_page(kaddr) pfn_to_page(virt_to_pfn(kaddr))
|
|
#define virt_to_page(kaddr) pfn_to_page(virt_to_pfn(kaddr))
|
|
#define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT)
|
|
#define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT)
|
|
|
|
+
|
|
|
|
+#ifdef CONFIG_PPC_BOOK3S_64
|
|
|
|
+/*
|
|
|
|
+ * On hash the vmalloc and other regions alias to the kernel region when passed
|
|
|
|
+ * through __pa(), which virt_to_pfn() uses. That means virt_addr_valid() can
|
|
|
|
+ * return true for some vmalloc addresses, which is incorrect. So explicitly
|
|
|
|
+ * check that the address is in the kernel region.
|
|
|
|
+ */
|
|
|
|
+#define virt_addr_valid(kaddr) (REGION_ID(kaddr) == KERNEL_REGION_ID && \
|
|
|
|
+ pfn_valid(virt_to_pfn(kaddr)))
|
|
|
|
+#else
|
|
#define virt_addr_valid(kaddr) pfn_valid(virt_to_pfn(kaddr))
|
|
#define virt_addr_valid(kaddr) pfn_valid(virt_to_pfn(kaddr))
|
|
|
|
+#endif
|
|
|
|
|
|
/*
|
|
/*
|
|
* On Book-E parts we need __va to parse the device tree and we can't
|
|
* On Book-E parts we need __va to parse the device tree and we can't
|