diff --git a/userspace/units/interface/static_analysis/static_analysis.c b/userspace/units/interface/static_analysis/static_analysis.c index 003ed1b87..ebbddce5f 100644 --- a/userspace/units/interface/static_analysis/static_analysis.c +++ b/userspace/units/interface/static_analysis/static_analysis.c @@ -57,6 +57,31 @@ unit_assert(err != 0, return UNIT_FAIL); \ } while (0) +/** + * wrapping unsigned addition tests + * + * parameters: + * type_name: type (u8, u32 etc.) + * type_max : Maximum value of the type. + * tmp_operand: random value in the set (1, Maximum value) + * + * Boundary values: (0, 1, max-1, max) + * + * Valid tests: Addition result within range for each boundary value and + * random value. Addition result wrapping for each boundary + * and random value. + */ +#define GENERATE_ARITHMETIC_WRAPPING_ADD_TESTS(type_name, type_max, tmp_operand) do {\ + unit_assert(nvgpu_wrapping_add_##type_name(type_max, 0) == type_max, return UNIT_FAIL); \ + unit_assert(nvgpu_wrapping_add_##type_name(type_max - 1, 1) == type_max, return UNIT_FAIL); \ + unit_assert(nvgpu_wrapping_add_##type_name(type_max - tmp_operand, tmp_operand) == type_max, \ + return UNIT_FAIL); \ + unit_assert(nvgpu_wrapping_add_##type_name(1, type_max) == 0, return UNIT_FAIL); \ + unit_assert(nvgpu_wrapping_add_##type_name(tmp_operand, type_max - tmp_operand + 1) == 0, return UNIT_FAIL); \ + unit_assert(nvgpu_wrapping_add_##type_name(type_max - 1, 2) == 0, return UNIT_FAIL); \ + unit_assert(nvgpu_wrapping_add_##type_name(type_max, type_max) == (type_max - 1), return UNIT_FAIL); \ +} while (0) + /** * signed addition tests * @@ -329,6 +354,9 @@ int test_arithmetic(struct unit_module *m, struct gk20a *g, void *args) /* U32 add */ GENERATE_ARITHMETIC_ADD_TESTS(u32, U32_MAX, tmp_u32); + /* wrapping U32 add */ + GENERATE_ARITHMETIC_WRAPPING_ADD_TESTS(u32, U32_MAX, tmp_u32); + /* S32 add */ GENERATE_ARITHMETIC_SIGNED_ADD_TESTS(s32, INT_MIN, INT_MAX, tmp_s32, tmp_s32_neg); diff --git a/userspace/units/interface/static_analysis/static_analysis.h b/userspace/units/interface/static_analysis/static_analysis.h index 48d308520..c3195dbf9 100644 --- a/userspace/units/interface/static_analysis/static_analysis.h +++ b/userspace/units/interface/static_analysis/static_analysis.h @@ -42,7 +42,8 @@ struct unit_module; * Targets: nvgpu_safe_sub_u8, nvgpu_safe_add_u32, nvgpu_safe_add_s32, * nvgpu_safe_sub_u32, nvgpu_safe_sub_s32, nvgpu_safe_mult_u32, * nvgpu_safe_add_u64, nvgpu_safe_add_s64, nvgpu_safe_sub_u64, - * nvgpu_safe_sub_s64, nvgpu_safe_mult_u64, nvgpu_safe_mult_s64 + * nvgpu_safe_sub_s64, nvgpu_safe_mult_u64, nvgpu_safe_mult_s64, + * nvgpu_wrapping_add_u32 * * Input: None *