From b05a529219454f5079af294f1172bfdfcdba1189 Mon Sep 17 00:00:00 2001 From: ajesh Date: Mon, 10 Jun 2019 19:41:08 +0530 Subject: [PATCH] gpu: nvgpu: Add safe ops for s64 Add safe addition and multiplication functions for s64. Jira NVGPU-3607 Change-Id: I8078679ee906dfcfcdab24ca221ec4e6b27e58db Signed-off-by: ajesh Reviewed-on: https://git-master.nvidia.com/r/2133656 Reviewed-by: Alex Waterman Reviewed-by: Nitin Kumbhar GVS: Gerrit_Virtual_Submit Reviewed-by: Vijayakumar Subbu Reviewed-by: mobile promotions Tested-by: mobile promotions --- drivers/gpu/nvgpu/include/nvgpu/safe_ops.h | 37 ++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/drivers/gpu/nvgpu/include/nvgpu/safe_ops.h b/drivers/gpu/nvgpu/include/nvgpu/safe_ops.h index ef2782186..64dfefe12 100644 --- a/drivers/gpu/nvgpu/include/nvgpu/safe_ops.h +++ b/drivers/gpu/nvgpu/include/nvgpu/safe_ops.h @@ -54,6 +54,16 @@ static inline u64 nvgpu_safe_add_u64(u64 ul_a, u64 ul_b) } } +static inline s64 nvgpu_safe_add_s64(s64 sl_a, s64 sl_b) +{ + if (((sl_b > 0) && (sl_a > (LONG_MAX - sl_b))) || + ((sl_b < 0) && (sl_a < (LONG_MIN - sl_b)))) { + BUG(); + } else { + return sl_a + sl_b; + } +} + static inline u32 nvgpu_safe_sub_u32(u32 ui_a, u32 ui_b) { if (ui_a < ui_b) { @@ -104,6 +114,33 @@ static inline u64 nvgpu_safe_mult_u64(u64 ul_a, u64 ul_b) } } +static inline s64 nvgpu_safe_mult_s64(s64 sl_a, s64 sl_b) +{ + if (sl_a > 0) { + if (sl_b > 0) { + if (sl_a > (LONG_MAX / sl_b)) { + BUG(); + } + } else { + if (sl_b < (LONG_MIN / sl_a)) { + BUG(); + } + } + } else { + if (sl_b > 0) { + if (sl_a < (LONG_MIN / sl_b)) { + BUG(); + } + } else { + if ((sl_a != 0) && (sl_b < (LONG_MAX / sl_a))) { + BUG(); + } + } + } + + return sl_a * sl_b; +} + static inline u16 nvgpu_safe_cast_u64_to_u16(u64 ul_a) { if (ul_a > USHRT_MAX) {