summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Glass <sjg@chromium.org>2017-04-02 09:50:28 -0600
committerSimon Glass <sjg@chromium.org>2017-04-04 20:01:57 -0600
commitab4458bdb5074ababe09f2538cb9f25901121ebb (patch)
treea995262be8e740ca6964852434e81c599e753be7
parent3c00a2c8b5e22e3eff9afb291e555b4bcba17d77 (diff)
downloadu-boot-ab4458bdb5074ababe09f2538cb9f25901121ebb.tar.gz
u-boot-ab4458bdb5074ababe09f2538cb9f25901121ebb.tar.bz2
u-boot-ab4458bdb5074ababe09f2538cb9f25901121ebb.zip
string: Provide a slimmed-down memset()
Most of the time the optimised memset() is what we want. For extreme situations such as TPL it may be too large. For example on the 'rock' board, using a simple loop saves a useful 48 bytes. With gcc 4.9 and the rodata bug, this patch is enough to reduce the TPL image below the limit. Signed-off-by: Simon Glass <sjg@chromium.org> Reviewed-by: Heiko Stuebner <heiko@sntech.de>
-rw-r--r--lib/Kconfig9
-rw-r--r--lib/string.c6
2 files changed, 13 insertions, 2 deletions
diff --git a/lib/Kconfig b/lib/Kconfig
index 65c01573e1..5115d047f8 100644
--- a/lib/Kconfig
+++ b/lib/Kconfig
@@ -52,6 +52,15 @@ config LIB_RAND
help
This library provides pseudo-random number generator functions.
+config SPL_TINY_MEMSET
+ bool "Use a very small memset() in SPL"
+ help
+ The faster memset() is the arch-specific one (if available) enabled
+ by CONFIG_USE_ARCH_MEMSET. If that is not enabled, we can still get
+ better performance by writing a word at a time. But in very
+ size-constrained envrionments even this may be too big. Enable this
+ option to reduce code size slightly at the cost of some speed.
+
source lib/dhry/Kconfig
source lib/rsa/Kconfig
diff --git a/lib/string.c b/lib/string.c
index 67d5f6a421..c1a28c14ce 100644
--- a/lib/string.c
+++ b/lib/string.c
@@ -437,8 +437,10 @@ char *strswab(const char *s)
void * memset(void * s,int c,size_t count)
{
unsigned long *sl = (unsigned long *) s;
- unsigned long cl = 0;
char *s8;
+
+#if !CONFIG_IS_ENABLED(TINY_MEMSET)
+ unsigned long cl = 0;
int i;
/* do it one word at a time (32 bits or 64 bits) while possible */
@@ -452,7 +454,7 @@ void * memset(void * s,int c,size_t count)
count -= sizeof(*sl);
}
}
- /* fill 8 bits at a time */
+#endif /* fill 8 bits at a time */
s8 = (char *)sl;
while (count--)
*s8++ = c;