diff options
author | Ranjanikar Nikhil Prabhakarrao <rprabhakarra@nvidia.com> | 2018-12-13 06:59:20 -0500 |
---|---|---|
committer | mobile promotions <svcmobile_promotions@nvidia.com> | 2020-06-30 13:07:26 -0400 |
commit | f56874aec2ec61f2c341b813cc76de5acc51ea12 (patch) | |
tree | efd3d6a3921c930a76bf0cb7011ca6b9809ed5f3 /drivers/gpu/nvgpu/os/linux/ioctl_ctrl.c | |
parent | bbef4c6927a13a24821c43cb2b6af72f859f7deb (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.c | 11 |
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 | ||
1630 | out: | 1639 | out: |
@@ -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++) { |