From 1fd2e43a3f46e6e8ff8fdffee7a7f75ab1c725a1 Mon Sep 17 00:00:00 2001 From: Thomas Fleury Date: Fri, 10 May 2019 16:21:00 -0700 Subject: [PATCH] gpu: nvgpu: fix MISRA 21.6 violation in nvgpu.common.mm.as Below MISRA 21.6 violation is reported in nvgpu.common.mm.as ${TEGRA_TOP}/kernel/nvgpu/drivers/gpu/nvgpu/common/mm/as.c:79: misra_violation: Using function "snprintf". Fix this by replacing snprintf with strncpy. Add nvgpu_strnadd_u32 function to convert u32 to string The function supports radix from 2 to 16. Jira NVGPU-3333 Change-Id: Idee739dfdedeabb74d0d9f7d4cddd798445f0ee1 Signed-off-by: Thomas Fleury Reviewed-on: https://git-master.nvidia.com/r/2117019 GVS: Gerrit_Virtual_Submit Reviewed-by: Philip Elcan Reviewed-by: Vaibhav Kachore Reviewed-by: mobile promotions Tested-by: mobile promotions --- drivers/gpu/nvgpu/common/mm/as.c | 5 ++- drivers/gpu/nvgpu/common/string.c | 44 ++++++++++++++++++++++++ drivers/gpu/nvgpu/include/nvgpu/string.h | 11 +++++- 3 files changed, 58 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/nvgpu/common/mm/as.c b/drivers/gpu/nvgpu/common/mm/as.c index 2f202569a..28008dbbd 100644 --- a/drivers/gpu/nvgpu/common/mm/as.c +++ b/drivers/gpu/nvgpu/common/mm/as.c @@ -28,6 +28,7 @@ #include #include #include +#include /* dumb allocator... */ static int generate_as_share_id(struct gk20a_as *as) @@ -55,6 +56,7 @@ static int gk20a_vm_alloc_share(struct gk20a_as_share *as_share, struct mm_gk20a *mm = &g->mm; struct vm_gk20a *vm; char name[32]; + char *p; const bool userspace_managed = (flags & NVGPU_AS_ALLOC_USERSPACE_MANAGED) != 0U; const bool unified_va = @@ -76,7 +78,8 @@ static int gk20a_vm_alloc_share(struct gk20a_as_share *as_share, } } - (void) snprintf(name, sizeof(name), "as_%d", as_share->id); + p = strncpy(name, "as_", sizeof(name) - 1); + (void) nvgpu_strnadd_u32(p, as_share->id, sizeof(name) - (p-name), 10U); vm = nvgpu_vm_init(g, big_page_size, U64(big_page_size) << U64(10), diff --git a/drivers/gpu/nvgpu/common/string.c b/drivers/gpu/nvgpu/common/string.c index 5c0b00541..0e8754f8b 100644 --- a/drivers/gpu/nvgpu/common/string.c +++ b/drivers/gpu/nvgpu/common/string.c @@ -21,6 +21,7 @@ */ #include +#include void nvgpu_memcpy(u8 *destb, const u8 *srcb, size_t n) @@ -33,3 +34,46 @@ nvgpu_memcmp(const u8 *b1, const u8 *b2, size_t n) { return memcmp(b1, b2, n); } + +int nvgpu_strnadd_u32(char *dst, const u32 value, size_t size, u32 radix) +{ + int n; + u32 v; + char *p; + u32 digit; + + if (radix < 2U || radix > 16U) { + return 0; + } + + /* how many digits do we need ? */ + n = 0; + v = value; + do { + n++; + v = v / radix; + } while (v > 0U); + + /* bail out if there is not room for '\0' */ + if (n >= (int)size) { + return 0; + } + + /* number of digits (not including '\0') */ + p = dst + n; + + /* terminate with '\0' */ + *p = '\0'; + p--; + + v = value; + do { + digit = v % radix; + *p = "0123456789abdcef"[digit]; + v = v / radix; + p--; + } + while (v > 0U); + + return n; +} diff --git a/drivers/gpu/nvgpu/include/nvgpu/string.h b/drivers/gpu/nvgpu/include/nvgpu/string.h index 2ab2380f2..310787133 100644 --- a/drivers/gpu/nvgpu/include/nvgpu/string.h +++ b/drivers/gpu/nvgpu/include/nvgpu/string.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, NVIDIA CORPORATION. All rights reserved. + * Copyright (c) 2018-2019, NVIDIA CORPORATION. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -54,4 +54,13 @@ void nvgpu_memcpy(u8 *destb, const u8 *srcb, size_t n); */ int nvgpu_memcmp(const u8 *b1, const u8 *b2, size_t n); +/** + * nvgpu_strnadd_u32 - formats u32 into null-terminated string + * + * Returns number of digits added to string (not including '\0') + * Returns 0 in case of invalid dst or radix, or insufficient space. + * Returns 0 if there was no room to add '\0' + */ +int nvgpu_strnadd_u32(char *dst, const u32 value, size_t size, u32 radix); + #endif /* NVGPU_STRING_H */