summaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorAlex Waterman <alexw@nvidia.com>2018-01-02 19:57:36 -0500
committermobile promotions <svcmobile_promotions@nvidia.com>2018-01-25 17:25:43 -0500
commitee9694a67b221fd0884af62b0b1fa31aba176785 (patch)
treebc798ecdc8e15bd1e3f1442ebf3d6ae4b1231f8e /drivers/gpu
parent496757003302994f1136225b2f25e7599fc14eb5 (diff)
gpu: nvgpu: add speculative load barrier (dbg IOCTLs)
Data can be speculatively loaded from memory and stay in cache even when bound check fails. This can lead to unintended information disclosure via side-channel analysis. To mitigate this problem insert a speculation barrier. bug 2039126 CVE-2017-5753 Change-Id: I982225e754cc5d430c19f4cc542302e52243bd38 Signed-off-by: Alex Waterman <alexw@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/1640501 Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com> Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/nvgpu/common/linux/ioctl_dbg.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/drivers/gpu/nvgpu/common/linux/ioctl_dbg.c b/drivers/gpu/nvgpu/common/linux/ioctl_dbg.c
index ebb869c3..eb6156da 100644
--- a/drivers/gpu/nvgpu/common/linux/ioctl_dbg.c
+++ b/drivers/gpu/nvgpu/common/linux/ioctl_dbg.c
@@ -256,6 +256,8 @@ static int nvgpu_dbg_gpu_ioctl_write_single_sm_error_state(
256 if (sm_id >= gr->no_of_sm) 256 if (sm_id >= gr->no_of_sm)
257 return -EINVAL; 257 return -EINVAL;
258 258
259 nvgpu_speculation_barrier();
260
259 if (args->sm_error_state_record_size > 0) { 261 if (args->sm_error_state_record_size > 0) {
260 size_t read_size = sizeof(sm_error_state_record); 262 size_t read_size = sizeof(sm_error_state_record);
261 263
@@ -312,6 +314,8 @@ static int nvgpu_dbg_gpu_ioctl_read_single_sm_error_state(
312 if (sm_id >= gr->no_of_sm) 314 if (sm_id >= gr->no_of_sm)
313 return -EINVAL; 315 return -EINVAL;
314 316
317 nvgpu_speculation_barrier();
318
315 sm_error_state = gr->sm_error_states + sm_id; 319 sm_error_state = gr->sm_error_states + sm_id;
316 sm_error_state_record.hww_global_esr = 320 sm_error_state_record.hww_global_esr =
317 sm_error_state->hww_global_esr; 321 sm_error_state->hww_global_esr;
@@ -1432,10 +1436,11 @@ static int nvgpu_dbg_gpu_ioctl_clear_single_sm_error_state(
1432 return -EINVAL; 1436 return -EINVAL;
1433 1437
1434 sm_id = args->sm_id; 1438 sm_id = args->sm_id;
1435
1436 if (sm_id >= gr->no_of_sm) 1439 if (sm_id >= gr->no_of_sm)
1437 return -EINVAL; 1440 return -EINVAL;
1438 1441
1442 nvgpu_speculation_barrier();
1443
1439 err = gk20a_busy(g); 1444 err = gk20a_busy(g);
1440 if (err) 1445 if (err)
1441 return err; 1446 return err;