Commit 827a4381 authored by Vincent Chen's avatar Vincent Chen Committed by Palmer Dabbelt

RISC-V: Avoid corrupting the upper 32-bit of phys_addr_t in ioremap

For 32bit, the upper 32-bit of phys_addr_t will be flushed to zero
after AND with PAGE_MASK because the data type of PAGE_MASK is
unsigned long. To fix this problem, the page alignment is done by
subtracting the page offset instead of AND with PAGE_MASK.
Signed-off-by: default avatarVincent Chen <vincentc@andestech.com>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarPalmer Dabbelt <palmer@sifive.com>
parent 757331db
...@@ -42,7 +42,7 @@ static void __iomem *__ioremap_caller(phys_addr_t addr, size_t size, ...@@ -42,7 +42,7 @@ static void __iomem *__ioremap_caller(phys_addr_t addr, size_t size,
/* Page-align mappings */ /* Page-align mappings */
offset = addr & (~PAGE_MASK); offset = addr & (~PAGE_MASK);
addr &= PAGE_MASK; addr -= offset;
size = PAGE_ALIGN(size + offset); size = PAGE_ALIGN(size + offset);
area = get_vm_area_caller(size, VM_IOREMAP, caller); area = get_vm_area_caller(size, VM_IOREMAP, caller);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment