Skip to content

Commit e5f10d6

Browse files
mikuintjnikula
authored andcommitted
drm/i915: Fix cmd parser desc matching with masks
Our variety of defined gpu commands have the actual command id field and possibly length and flags applied. We did start to apply the mask during initialization of the cmd descriptors but forgot to also apply it on comparisons. Fix comparisons in order to properly deny access with associated commands. v2: fix lri with correct mask (Chris) References: 926abff ("drm/i915/cmdparser: Ignore Length operands during command matching") Reported-by: Nicolai Stange <nstange@suse.de> Cc: stable@vger.kernel.org # v5.4+ Cc: Miroslav Benes <mbenes@suse.cz> Cc: Takashi Iwai <tiwai@suse.de> Cc: Tyler Hicks <tyhicks@canonical.com> Cc: Jon Bloomfield <jon.bloomfield@intel.com> Cc: Chris Wilson <chris.p.wilson@intel.com> Signed-off-by: Mika Kuoppala <mika.kuoppala@linux.intel.com> Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> Link: https://patchwork.freedesktop.org/patch/msgid/20200817195926.12671-1-mika.kuoppala@linux.intel.com (cherry picked from commit 3b4efa1) Signed-off-by: Jani Nikula <jani.nikula@intel.com>
1 parent d012a71 commit e5f10d6

File tree

1 file changed

+10
-4
lines changed

1 file changed

+10
-4
lines changed

drivers/gpu/drm/i915/i915_cmd_parser.c

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1204,6 +1204,12 @@ static u32 *copy_batch(struct drm_i915_gem_object *dst_obj,
12041204
return dst;
12051205
}
12061206

1207+
static inline bool cmd_desc_is(const struct drm_i915_cmd_descriptor * const desc,
1208+
const u32 cmd)
1209+
{
1210+
return desc->cmd.value == (cmd & desc->cmd.mask);
1211+
}
1212+
12071213
static bool check_cmd(const struct intel_engine_cs *engine,
12081214
const struct drm_i915_cmd_descriptor *desc,
12091215
const u32 *cmd, u32 length)
@@ -1242,19 +1248,19 @@ static bool check_cmd(const struct intel_engine_cs *engine,
12421248
* allowed mask/value pair given in the whitelist entry.
12431249
*/
12441250
if (reg->mask) {
1245-
if (desc->cmd.value == MI_LOAD_REGISTER_MEM) {
1251+
if (cmd_desc_is(desc, MI_LOAD_REGISTER_MEM)) {
12461252
DRM_DEBUG("CMD: Rejected LRM to masked register 0x%08X\n",
12471253
reg_addr);
12481254
return false;
12491255
}
12501256

1251-
if (desc->cmd.value == MI_LOAD_REGISTER_REG) {
1257+
if (cmd_desc_is(desc, MI_LOAD_REGISTER_REG)) {
12521258
DRM_DEBUG("CMD: Rejected LRR to masked register 0x%08X\n",
12531259
reg_addr);
12541260
return false;
12551261
}
12561262

1257-
if (desc->cmd.value == MI_LOAD_REGISTER_IMM(1) &&
1263+
if (cmd_desc_is(desc, MI_LOAD_REGISTER_IMM(1)) &&
12581264
(offset + 2 > length ||
12591265
(cmd[offset + 1] & reg->mask) != reg->value)) {
12601266
DRM_DEBUG("CMD: Rejected LRI to masked register 0x%08X\n",
@@ -1478,7 +1484,7 @@ int intel_engine_cmd_parser(struct intel_engine_cs *engine,
14781484
break;
14791485
}
14801486

1481-
if (desc->cmd.value == MI_BATCH_BUFFER_START) {
1487+
if (cmd_desc_is(desc, MI_BATCH_BUFFER_START)) {
14821488
ret = check_bbstart(cmd, offset, length, batch_length,
14831489
batch_addr, shadow_addr,
14841490
jump_whitelist);

0 commit comments

Comments
 (0)