mirror of
git://nv-tegra.nvidia.com/linux-nv-oot.git
synced 2025-12-24 10:11:26 +03:00
dla: linux: add speculation barrieir in linux driver
Bug 200483495 Add speculation barriers for if and for loops to prevent spectre variant 1-S type attacks Change-Id: If44a2c96047899accecf9604f3893daf681656c7 Signed-off-by: Gunjan Mehta <gmehta@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/2230039 Reviewed-by: Arvind M <am@nvidia.com> Tested-by: Arvind M <am@nvidia.com> Reviewed-by: Bharat Nihalani <bnihalani@nvidia.com> GVS: Gerrit_Virtual_Submit Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com> Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
This commit is contained in:
committed by
Laxman Dewangan
parent
31a4285b17
commit
59fe8f5aef
@@ -212,6 +212,7 @@ struct nvdla_queue_pool *nvdla_queue_init(struct platform_device *pdev,
|
||||
queue->task_pool = (void *)&task_pool[i];
|
||||
nvdla_queue_get_task_size(queue);
|
||||
}
|
||||
speculation_barrier(); /* break_spec_p#5_1 */
|
||||
|
||||
return pool;
|
||||
|
||||
@@ -302,6 +303,7 @@ struct nvdla_queue *nvdla_queue_alloc(struct nvdla_queue_pool *pool,
|
||||
err = -ENOMEM;
|
||||
goto err_alloc_queue;
|
||||
}
|
||||
speculation_barrier(); /* break_spec_p#1 */
|
||||
|
||||
/* reserve the queue */
|
||||
queue = &queues[index];
|
||||
@@ -478,6 +480,7 @@ int nvdla_queue_submit_to_host1x(struct nvdla_queue *queue,
|
||||
job->waitchk[i].thresh = wait_syncpt_thresholds[i];
|
||||
job->waitchk[i].mem = 0;
|
||||
}
|
||||
speculation_barrier(); /* break_spec_p#5_1 */
|
||||
|
||||
/* Initialize syncpoint increments */
|
||||
job->sp->id = queue->syncpt_id;
|
||||
|
||||
@@ -574,6 +574,7 @@ int nvdla_send_gos_region(struct platform_device *pdev)
|
||||
gos_region->grid_size = MAX_GRID_SIZE;
|
||||
for (i = 0; i < num_grids; i++)
|
||||
gos_region->address[i] = dla_grid[i];
|
||||
speculation_barrier(); /* break_spec_p#5_1 */
|
||||
|
||||
/* set cmd info */
|
||||
cmd_data.method_id = DLA_CMD_SET_REGIONS;
|
||||
|
||||
@@ -261,6 +261,7 @@ int nvdla_buffer_submit_pin(struct nvdla_buffers *nvdla_buffers,
|
||||
if (heap != NULL)
|
||||
heap[i] = vm->heap;
|
||||
}
|
||||
speculation_barrier(); /* break_spec_p#5_1 */
|
||||
|
||||
mutex_unlock(&nvdla_buffers->mutex);
|
||||
return 0;
|
||||
@@ -304,6 +305,7 @@ int nvdla_buffer_pin(struct nvdla_buffers *nvdla_buffers,
|
||||
|
||||
nvdla_buffer_insert_map_buffer(nvdla_buffers, vm);
|
||||
}
|
||||
speculation_barrier(); /* break_spec_p#5_1 */
|
||||
|
||||
mutex_unlock(&nvdla_buffers->mutex);
|
||||
return err;
|
||||
@@ -362,6 +364,7 @@ void nvdla_buffer_unpin(struct nvdla_buffers *nvdla_buffers,
|
||||
vm->user_map_count = 0;
|
||||
nvdla_buffer_unmap(nvdla_buffers, vm);
|
||||
}
|
||||
speculation_barrier(); /* break_spec_p#5_1 */
|
||||
|
||||
mutex_unlock(&nvdla_buffers->mutex);
|
||||
}
|
||||
|
||||
@@ -207,6 +207,7 @@ static int nvdla_pin(struct nvdla_private *priv, void *arg)
|
||||
goto fail_to_get_dma_buf;
|
||||
}
|
||||
}
|
||||
speculation_barrier(); /* break_spec_p#5_1 */
|
||||
|
||||
err = nvdla_buffer_pin(priv->buffers, dmabufs, count);
|
||||
|
||||
@@ -260,6 +261,7 @@ static int nvdla_unpin(struct nvdla_private *priv, void *arg)
|
||||
if (IS_ERR_OR_NULL(dmabufs[i]))
|
||||
continue;
|
||||
}
|
||||
speculation_barrier(); /* break_spec_p#5_1 */
|
||||
|
||||
nvdla_buffer_unpin(priv->buffers, dmabufs, count);
|
||||
|
||||
@@ -465,6 +467,7 @@ static int nvdla_send_emu_signal_fences(struct nvdla_emu_task *task,
|
||||
}
|
||||
}
|
||||
}
|
||||
speculation_barrier(); /* break_spec_p#5_1 */
|
||||
|
||||
nvdla_dbg_fn(dla_pdev, "copy prefences to user");
|
||||
/* send pre fences */
|
||||
@@ -506,6 +509,7 @@ static int nvdla_send_emu_signal_fences(struct nvdla_emu_task *task,
|
||||
}
|
||||
}
|
||||
}
|
||||
speculation_barrier(); /* break_spec_p#5_1 */
|
||||
|
||||
nvdla_dbg_fn(dla_pdev, "copy postfences to user");
|
||||
/* send post fences */
|
||||
@@ -567,6 +571,7 @@ static int nvdla_update_signal_fences(struct nvdla_task *task,
|
||||
}
|
||||
}
|
||||
}
|
||||
speculation_barrier(); /* break_spec_p#5_1 */
|
||||
|
||||
nvdla_dbg_fn(dla_pdev, "copy prefences to user");
|
||||
/* copy pre fences */
|
||||
@@ -608,6 +613,7 @@ static int nvdla_update_signal_fences(struct nvdla_task *task,
|
||||
}
|
||||
}
|
||||
}
|
||||
speculation_barrier(); /* break_spec_p#5_1 */
|
||||
|
||||
nvdla_dbg_fn(dla_pdev, "copy postfences to user");
|
||||
/* copy post fences */
|
||||
@@ -838,6 +844,7 @@ static void nvdla_dump_task(struct nvdla_task *task)
|
||||
i, task->memory_handles[i].handle,
|
||||
task->memory_handles[i].offset);
|
||||
}
|
||||
speculation_barrier(); /* break_spec_p#5_1 */
|
||||
}
|
||||
|
||||
static int nvdla_emu_task_submit(struct nvdla_private *priv, void *arg)
|
||||
@@ -924,6 +931,7 @@ static int nvdla_emu_task_submit(struct nvdla_private *priv, void *arg)
|
||||
}
|
||||
nvdla_dbg_info(pdev, "signal fences of task[%d] sent", i + 1);
|
||||
}
|
||||
speculation_barrier(); /* break_spec_p#5_1 */
|
||||
nvdla_dbg_fn(pdev, "Emulator task submitted, done!");
|
||||
|
||||
exit:
|
||||
|
||||
@@ -78,6 +78,7 @@ static void nvdla_queue_dump_op(struct nvdla_queue *queue, struct seq_file *s)
|
||||
|
||||
|
||||
}
|
||||
speculation_barrier(); /* break_spec_p#5_1 */
|
||||
mutex_unlock(&queue->list_lock);
|
||||
}
|
||||
|
||||
@@ -246,6 +247,7 @@ static int nvdla_unmap_task_memory(struct nvdla_task *task)
|
||||
}
|
||||
nvdla_dbg_fn(pdev, "all out timestamps unmaped");
|
||||
|
||||
speculation_barrier(); /* break_spec_p#5_1 */
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -547,6 +549,7 @@ static int nvdla_map_task_memory(struct nvdla_task *task)
|
||||
next = add_address(next,
|
||||
dma_addr + task->memory_handles[jj].offset);
|
||||
}
|
||||
speculation_barrier(); /* break_spec_p#5_1 */
|
||||
|
||||
fail_to_pin_mem:
|
||||
return err;
|
||||
@@ -1071,6 +1074,7 @@ static int nvdla_fill_postactions(struct nvdla_task *task)
|
||||
postactionl->offset = postactionlist_of;
|
||||
postactionl->size = next - start;
|
||||
|
||||
speculation_barrier(); /* break_spec_p#5_1 */
|
||||
fail:
|
||||
return err;
|
||||
}
|
||||
@@ -1179,6 +1183,7 @@ static int nvdla_fill_preactions(struct nvdla_task *task)
|
||||
preactionl->offset = preactionlist_of;
|
||||
preactionl->size = next - start;
|
||||
|
||||
speculation_barrier(); /* break_spec_p#5_1 */
|
||||
fail:
|
||||
return err;
|
||||
}
|
||||
@@ -1300,6 +1305,7 @@ static int nvdla_send_cmd_channel(struct platform_device *pdev,
|
||||
syncpt_wait_thresh[i] =
|
||||
task->prefences[i].syncpoint_value;
|
||||
}
|
||||
speculation_barrier(); /* break_spec_p#5_1 */
|
||||
|
||||
cmdbuf[0] = nvhost_opcode_incr(NV_DLA_THI_METHOD_ID >> 2, 2);
|
||||
cmdbuf[1] = method_id;
|
||||
@@ -1431,6 +1437,7 @@ int nvdla_emulator_submit(struct nvdla_queue *queue, struct nvdla_emu_task *task
|
||||
}
|
||||
}
|
||||
|
||||
speculation_barrier(); /* break_spec_p#5_1 */
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1491,6 +1498,7 @@ int nvdla_get_signal_fences(struct nvdla_queue *queue, void *in_task)
|
||||
counter = counter - 1;
|
||||
}
|
||||
}
|
||||
speculation_barrier(); /* break_spec_p#5_1 */
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user