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 <tfleury@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/2117019
GVS: Gerrit_Virtual_Submit
Reviewed-by: Philip Elcan <pelcan@nvidia.com>
Reviewed-by: Vaibhav Kachore <vkachore@nvidia.com>
Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com>
Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
This commit is contained in:
Thomas Fleury
2019-05-10 16:21:00 -07:00
committed by mobile promotions
parent 9b2f6925ca
commit 1fd2e43a3f
3 changed files with 58 additions and 2 deletions

View File

@@ -28,6 +28,7 @@
#include <nvgpu/vm.h> #include <nvgpu/vm.h>
#include <nvgpu/log2.h> #include <nvgpu/log2.h>
#include <nvgpu/gk20a.h> #include <nvgpu/gk20a.h>
#include <nvgpu/string.h>
/* dumb allocator... */ /* dumb allocator... */
static int generate_as_share_id(struct gk20a_as *as) 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 mm_gk20a *mm = &g->mm;
struct vm_gk20a *vm; struct vm_gk20a *vm;
char name[32]; char name[32];
char *p;
const bool userspace_managed = const bool userspace_managed =
(flags & NVGPU_AS_ALLOC_USERSPACE_MANAGED) != 0U; (flags & NVGPU_AS_ALLOC_USERSPACE_MANAGED) != 0U;
const bool unified_va = 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, vm = nvgpu_vm_init(g, big_page_size,
U64(big_page_size) << U64(10), U64(big_page_size) << U64(10),

View File

@@ -21,6 +21,7 @@
*/ */
#include <nvgpu/string.h> #include <nvgpu/string.h>
#include <nvgpu/log.h>
void void
nvgpu_memcpy(u8 *destb, const u8 *srcb, size_t n) 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); 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;
}

View File

@@ -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 * Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"), * 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); 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 */ #endif /* NVGPU_STRING_H */