vm_access() treats the start of every VMA as the beginning of the GEM
object. After a VMA split, vm_pgoff identifies a later part of the
object. Debugger reads and writes through ptrace or /proc/<pid>/mem then
access the wrong bytes.

Properly consider vm_pgoff just like the fault handlers already do.

Fixes: 9f909e215fea ("drm/i915: Implement vm_ops->access for gdb access into 
mmaps")
Cc: [email protected]
Signed-off-by: David Hildenbrand (Arm) <[email protected]>
---
 drivers/gpu/drm/i915/gem/i915_gem_mman.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/gem/i915_gem_mman.c 
b/drivers/gpu/drm/i915/gem/i915_gem_mman.c
index 6b337684dbfe8..e3b24dc8e94f5 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_mman.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_mman.c
@@ -511,13 +511,15 @@ vm_access(struct vm_area_struct *area, unsigned long addr,
        struct i915_mmap_offset *mmo = area->vm_private_data;
        struct drm_i915_gem_object *obj = mmo->obj;
        struct i915_gem_ww_ctx ww;
+       unsigned long obj_offset;
        void *vaddr;
        int err = 0;
 
        if (i915_gem_object_is_readonly(obj) && write)
                return -EACCES;
 
-       addr -= area->vm_start;
+       obj_offset = area->vm_pgoff - drm_vma_node_start(&mmo->vma_node);
+       addr += (obj_offset << PAGE_SHIFT) - area->vm_start;
        if (range_overflows_t(u64, addr, len, obj->base.size))
                return -EINVAL;
 

-- 
2.43.0


Reply via email to