|
@@ -98,17 +98,19 @@ ssize_t copy_oldmem_page(unsigned long pfn, char *buf,
|
|
|
size_t csize, unsigned long offset, int userbuf)
|
|
size_t csize, unsigned long offset, int userbuf)
|
|
|
{
|
|
{
|
|
|
void *vaddr;
|
|
void *vaddr;
|
|
|
|
|
+ phys_addr_t paddr;
|
|
|
|
|
|
|
|
if (!csize)
|
|
if (!csize)
|
|
|
return 0;
|
|
return 0;
|
|
|
|
|
|
|
|
csize = min_t(size_t, csize, PAGE_SIZE);
|
|
csize = min_t(size_t, csize, PAGE_SIZE);
|
|
|
|
|
+ paddr = pfn << PAGE_SHIFT;
|
|
|
|
|
|
|
|
- if ((min_low_pfn < pfn) && (pfn < max_pfn)) {
|
|
|
|
|
- vaddr = __va(pfn << PAGE_SHIFT);
|
|
|
|
|
|
|
+ if (memblock_is_region_memory(paddr, csize)) {
|
|
|
|
|
+ vaddr = __va(paddr);
|
|
|
csize = copy_oldmem_vaddr(vaddr, buf, csize, offset, userbuf);
|
|
csize = copy_oldmem_vaddr(vaddr, buf, csize, offset, userbuf);
|
|
|
} else {
|
|
} else {
|
|
|
- vaddr = __ioremap(pfn << PAGE_SHIFT, PAGE_SIZE, 0);
|
|
|
|
|
|
|
+ vaddr = __ioremap(paddr, PAGE_SIZE, 0);
|
|
|
csize = copy_oldmem_vaddr(vaddr, buf, csize, offset, userbuf);
|
|
csize = copy_oldmem_vaddr(vaddr, buf, csize, offset, userbuf);
|
|
|
iounmap(vaddr);
|
|
iounmap(vaddr);
|
|
|
}
|
|
}
|