Messages in this thread Patch in this message | | | From | wubian <> | Subject | [PATCH] uio: Fix bus error that access memory mapped by physical | Date | Wed, 23 Jun 2021 14:52:14 +0800 |
| |
On the arm64, register the uio driver and map a physical space on the pci device to user space, then use memset write data to the address space, a bus error will occur. This error is due to the dc instruction(cache operation) used in the assembly of memset, uio mapping physical memory will call pgprot_noncached() to set non-cached and non-buffered, while pgprot_writecombine() has fewer restrictions. It does not prohibit write buffer, so replacing pgprot_noncached() with pgprot_writecombine() can solve this problem.
Signed-off-by: wubian <wubian@uniontech.com> --- drivers/uio/uio.c | 4 ++++ 1 file changed, 4 insertions(+)
diff --git a/drivers/uio/uio.c b/drivers/uio/uio.c index ea96e319c8a0..09b04b20fa30 100644 --- a/drivers/uio/uio.c +++ b/drivers/uio/uio.c @@ -739,7 +739,11 @@ static int uio_mmap_physical(struct vm_area_struct *vma) vma->vm_ops = &uio_physical_vm_ops; if (idev->info->mem[mi].memtype == UIO_MEM_PHYS) +#if defined(CONFIG_ARM64) + vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot); +#else vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); +#endif /* * We cannot use the vm_iomap_memory() helper here, -- 2.20.1
| |