Skip to content

Commit

Permalink
microblaze: Use simple memset implementation from lib/string.c
Browse files Browse the repository at this point in the history
On microblaze systems which are not using OPT_LIB_FUNCTION only simple
memset is used. This function is already implemented in lib/string.c that's
why it should be used instead.
This change is done in respect of issue fixed by commit 33d0f96
("lib/string.c: Use freestanding environment") where gcc-10.x moved
-ftree-loop-distribute-patterns optimization is to O2 optimization level.
This optimization causes GCC to convert the while loop in memset.c into a
call to memset. So This optimization is transforming a loop in a
memset/memcpy into a call to the function itself. This makes the memset
implementation as recursive.

Based on fix above -ffreestanding was used and it needs to be used on
Microblaze too but the patch is not adding this flag it removes simple
implementation to cause that generic implementation is used where this flag
is already setup.

Signed-off-by: Michal Simek <michal.simek@xilinx.com>
Signed-off-by: Mahesh Bodapati <mbodapat@xilinx.com>
Link: https://lore.kernel.org/r/4a143e7654f72ee893dcea9769946e17d3570b16.1645797329.git.michal.simek@xilinx.com
  • Loading branch information
Michal Simek committed Apr 21, 2022
1 parent 3123109 commit 8f0f265
Show file tree
Hide file tree
Showing 2 changed files with 4 additions and 18 deletions.
2 changes: 2 additions & 0 deletions arch/microblaze/include/asm/string.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@

#ifdef __KERNEL__

#ifdef CONFIG_OPT_LIB_FUNCTION
#define __HAVE_ARCH_MEMSET
#endif
#define __HAVE_ARCH_MEMCPY
#define __HAVE_ARCH_MEMMOVE

Expand Down
20 changes: 2 additions & 18 deletions arch/microblaze/lib/memset.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,22 +30,7 @@
#include <linux/compiler.h>
#include <linux/string.h>

#ifdef __HAVE_ARCH_MEMSET
#ifndef CONFIG_OPT_LIB_FUNCTION
void *memset(void *v_src, int c, __kernel_size_t n)
{
char *src = v_src;

/* Truncate c to 8 bits */
c = (c & 0xFF);

/* Simple, byte oriented memset or the rest of count. */
while (n--)
*src++ = c;

return v_src;
}
#else /* CONFIG_OPT_LIB_FUNCTION */
#ifdef CONFIG_OPT_LIB_FUNCTION
void *memset(void *v_src, int c, __kernel_size_t n)
{
char *src = v_src;
Expand Down Expand Up @@ -94,6 +79,5 @@ void *memset(void *v_src, int c, __kernel_size_t n)

return v_src;
}
#endif /* CONFIG_OPT_LIB_FUNCTION */
EXPORT_SYMBOL(memset);
#endif /* __HAVE_ARCH_MEMSET */
#endif /* CONFIG_OPT_LIB_FUNCTION */

0 comments on commit 8f0f265

Please sign in to comment.