@@ -3394,6 +3394,22 @@ static bool check_buffer_count(size_t count)
return !(count < 1 || count > INT_MAX || count > SIZE_MAX / sz - 1);
}
+static bool check_objects_correctness(const struct drm_i915_private *i915,
+ const struct drm_i915_gem_exec_object2 *objs,
+ uint32_t buffer_count)
+{
+ uint32_t i;
+
+ if (INTEL_GEN(i915) < 9 || IS_TIGERLAKE(i915))
+ return true;
+
+ for (i = 0; i < buffer_count; i++)
+ if (objs[i].relocation_count)
+ return false;
+
+ return true;
+}
+
/*
* Legacy execbuffer just creates an exec2 list from the original exec object
* list array and passes it to the real function.
@@ -3529,6 +3545,12 @@ i915_gem_execbuffer2_ioctl(struct drm_device *dev, void *data,
return -EFAULT;
}
+ if (!check_objects_correctness(i915, exec2_list, count)) {
+ drm_dbg(&i915->drm, "Relocations are not supported\n");
+ kvfree(exec2_list);
+ return -EINVAL;
+ }
+
err = i915_gem_do_execbuffer(dev, file, args, exec2_list);
/*
Ensure we don't pass any relocation data in execbuf for any new hardware. Patch likely is not optimal but is doing hard cut before entering execbuf. Signed-off-by: Zbigniew Kempczyński <zbigniew.kempczynski@intel.com> Cc: Jason Ekstrand <jason@jlekstrand.net> Cc: Daniel Vetter <daniel.vetter@ffwll.ch> --- .../gpu/drm/i915/gem/i915_gem_execbuffer.c | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+)