summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/os/linux/ioctl_ctrl.c
diff options
context:
space:
mode:
authorRanjanikar Nikhil Prabhakarrao <rprabhakarra@nvidia.com>2018-12-13 06:59:20 -0500
committermobile promotions <svcmobile_promotions@nvidia.com>2020-06-30 13:07:26 -0400
commitf56874aec2ec61f2c341b813cc76de5acc51ea12 (patch)
treeefd3d6a3921c930a76bf0cb7011ca6b9809ed5f3 /drivers/gpu/nvgpu/os/linux/ioctl_ctrl.c
parentbbef4c6927a13a24821c43cb2b6af72f859f7deb (diff)
gpu: nvgpu: add speculative barrier
Data can be speculativerly stored and code flow can be hijacked. To mitigate this problem insert a speculation barrier. Bug 200447167 Change-Id: Ia865ff2add8b30de49aa970715625b13e8f71c08 Signed-off-by: Ranjanikar Nikhil Prabhakarrao <rprabhakarra@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/1972221 (cherry picked from commit f0762ed4831b3fe6cc953a4a4ec26c2537dcb69f) Reviewed-on: https://git-master.nvidia.com/r/c/linux-nvgpu/+/1996052 Reviewed-by: automaticguardword <automaticguardword@nvidia.com> Reviewed-by: Deepak Nibade <dnibade@nvidia.com> Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com> GVS: Gerrit_Virtual_Submit Tested-by: Deepak Nibade <dnibade@nvidia.com> Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/os/linux/ioctl_ctrl.c')
-rw-r--r--drivers/gpu/nvgpu/os/linux/ioctl_ctrl.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/gpu/nvgpu/os/linux/ioctl_ctrl.c b/drivers/gpu/nvgpu/os/linux/ioctl_ctrl.c
index 271c5d92..954b08b5 100644
--- a/drivers/gpu/nvgpu/os/linux/ioctl_ctrl.c
+++ b/drivers/gpu/nvgpu/os/linux/ioctl_ctrl.c
@@ -366,6 +366,7 @@ gk20a_ctrl_ioctl_gpu_characteristics(
366 if (request->gpu_characteristics_buf_size > 0) { 366 if (request->gpu_characteristics_buf_size > 0) {
367 size_t write_size = sizeof(gpu); 367 size_t write_size = sizeof(gpu);
368 368
369 nvgpu_speculation_barrier();
369 if (write_size > request->gpu_characteristics_buf_size) 370 if (write_size > request->gpu_characteristics_buf_size)
370 write_size = request->gpu_characteristics_buf_size; 371 write_size = request->gpu_characteristics_buf_size;
371 372
@@ -556,6 +557,7 @@ static int gk20a_ctrl_get_tpc_masks(struct gk20a *g,
556 if (args->mask_buf_size > 0) { 557 if (args->mask_buf_size > 0) {
557 size_t write_size = gpc_tpc_mask_size; 558 size_t write_size = gpc_tpc_mask_size;
558 559
560 nvgpu_speculation_barrier();
559 if (write_size > args->mask_buf_size) 561 if (write_size > args->mask_buf_size)
560 write_size = args->mask_buf_size; 562 write_size = args->mask_buf_size;
561 563
@@ -580,6 +582,7 @@ static int gk20a_ctrl_get_fbp_l2_masks(
580 if (args->mask_buf_size > 0) { 582 if (args->mask_buf_size > 0) {
581 size_t write_size = fbp_l2_mask_size; 583 size_t write_size = fbp_l2_mask_size;
582 584
585 nvgpu_speculation_barrier();
583 if (write_size > args->mask_buf_size) 586 if (write_size > args->mask_buf_size)
584 write_size = args->mask_buf_size; 587 write_size = args->mask_buf_size;
585 588
@@ -1245,6 +1248,7 @@ static int nvgpu_gpu_clk_set_info(struct gk20a *g,
1245 nvgpu_gpu_convert_clk_domain(clk_info.clk_domain))) 1248 nvgpu_gpu_convert_clk_domain(clk_info.clk_domain)))
1246 return -EINVAL; 1249 return -EINVAL;
1247 } 1250 }
1251 nvgpu_speculation_barrier();
1248 1252
1249 entry = (struct nvgpu_gpu_clk_info __user *) 1253 entry = (struct nvgpu_gpu_clk_info __user *)
1250 (uintptr_t)args->clk_info_entries; 1254 (uintptr_t)args->clk_info_entries;
@@ -1264,6 +1268,7 @@ static int nvgpu_gpu_clk_set_info(struct gk20a *g,
1264 nvgpu_gpu_convert_clk_domain(clk_info.clk_domain), freq_mhz); 1268 nvgpu_gpu_convert_clk_domain(clk_info.clk_domain), freq_mhz);
1265 } 1269 }
1266 1270
1271 nvgpu_speculation_barrier();
1267 ret = nvgpu_clk_arb_commit_request_fd(g, session, fd); 1272 ret = nvgpu_clk_arb_commit_request_fd(g, session, fd);
1268 if (ret < 0) 1273 if (ret < 0)
1269 return ret; 1274 return ret;
@@ -1333,6 +1338,7 @@ static int nvgpu_gpu_clk_get_info(struct gk20a *g,
1333 clk_info.clk_type = args->clk_type; 1338 clk_info.clk_type = args->clk_type;
1334 } 1339 }
1335 1340
1341 nvgpu_speculation_barrier();
1336 switch (clk_info.clk_type) { 1342 switch (clk_info.clk_type) {
1337 case NVGPU_GPU_CLK_TYPE_TARGET: 1343 case NVGPU_GPU_CLK_TYPE_TARGET:
1338 err = nvgpu_clk_arb_get_session_target_mhz(session, 1344 err = nvgpu_clk_arb_get_session_target_mhz(session,
@@ -1366,6 +1372,7 @@ static int nvgpu_gpu_clk_get_info(struct gk20a *g,
1366 return -EFAULT; 1372 return -EFAULT;
1367 } 1373 }
1368 1374
1375 nvgpu_speculation_barrier();
1369 args->num_entries = num_entries; 1376 args->num_entries = num_entries;
1370 1377
1371 return 0; 1378 return 0;
@@ -1403,6 +1410,7 @@ static int nvgpu_gpu_get_voltage(struct gk20a *g,
1403 if (err) 1410 if (err)
1404 return err; 1411 return err;
1405 1412
1413 nvgpu_speculation_barrier();
1406 switch (args->which) { 1414 switch (args->which) {
1407 case NVGPU_GPU_VOLTAGE_CORE: 1415 case NVGPU_GPU_VOLTAGE_CORE:
1408 err = volt_get_voltage(g, CTRL_VOLT_DOMAIN_LOGIC, &args->voltage); 1416 err = volt_get_voltage(g, CTRL_VOLT_DOMAIN_LOGIC, &args->voltage);
@@ -1625,6 +1633,7 @@ static int nvgpu_gpu_set_deterministic_opts(struct gk20a *g,
1625 break; 1633 break;
1626 } 1634 }
1627 1635
1636 nvgpu_speculation_barrier();
1628 nvgpu_rwsem_up_read(&g->deterministic_busy); 1637 nvgpu_rwsem_up_read(&g->deterministic_busy);
1629 1638
1630out: 1639out:
@@ -1668,6 +1677,7 @@ long gk20a_ctrl_dev_ioctl(struct file *filp, unsigned int cmd, unsigned long arg
1668 gk20a_idle(g); 1677 gk20a_idle(g);
1669 } 1678 }
1670 1679
1680 nvgpu_speculation_barrier();
1671 switch (cmd) { 1681 switch (cmd) {
1672 case NVGPU_GPU_IOCTL_ZCULL_GET_CTX_SIZE: 1682 case NVGPU_GPU_IOCTL_ZCULL_GET_CTX_SIZE:
1673 get_ctx_size_args = (struct nvgpu_gpu_zcull_get_ctx_size_args *)buf; 1683 get_ctx_size_args = (struct nvgpu_gpu_zcull_get_ctx_size_args *)buf;
@@ -1713,6 +1723,7 @@ long gk20a_ctrl_dev_ioctl(struct file *filp, unsigned int cmd, unsigned long arg
1713 zbc_val->format = set_table_args->format; 1723 zbc_val->format = set_table_args->format;
1714 zbc_val->type = set_table_args->type; 1724 zbc_val->type = set_table_args->type;
1715 1725
1726 nvgpu_speculation_barrier();
1716 switch (zbc_val->type) { 1727 switch (zbc_val->type) {
1717 case GK20A_ZBC_TYPE_COLOR: 1728 case GK20A_ZBC_TYPE_COLOR:
1718 for (i = 0; i < GK20A_ZBC_COLOR_VALUE_SIZE; i++) { 1729 for (i = 0; i < GK20A_ZBC_COLOR_VALUE_SIZE; i++) {