diff options
| author | Casey Connolly <[email protected]> | 2026-04-01 16:15:19 +0200 |
|---|---|---|
| committer | Tom Rini <[email protected]> | 2026-04-21 11:19:49 -0600 |
| commit | 139f5292e7985d0326a1d18eee88720255e423dc (patch) | |
| tree | 2afe47245a7f32ae921123b6394f547a949ffb0c /lib | |
| parent | f5e96fdffc024552944776848bd5570e1b2caa9b (diff) | |
string: add strdup_const and kstrdup_const
Extend Linux compat by adding kstrdup_const(), backed by lib/string.c.
This leverages U-Boots .rodata section on ARM64 to avoid pointlessly
duplicating const strings.
This is used by the Linux CCF_FULL port and may be useful elsewhere
in U-Boot.
Signed-off-by: Casey Connolly <[email protected]>
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/string.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/lib/string.c b/lib/string.c index d56f88d4a84..302efe048b0 100644 --- a/lib/string.c +++ b/lib/string.c @@ -379,6 +379,37 @@ char * strndup(const char *s, size_t n) return new; } + +/** + * strdup_const - conditionally duplicate an existing const string + * @s: the string to duplicate + * + * Note: Strings allocated by kstrdup_const should be freed by kfree_const and + * must not be passed to krealloc(). + * + * Return: source string if it is in .rodata section otherwise + * fallback to kstrdup. + */ +const char *strdup_const(const char *s) +{ + if (is_kernel_rodata((unsigned long)s)) + return s; + + return strdup(s); +} + +/** + * kfree_const - conditionally free memory + * @x: pointer to the memory + * + * Function calls kfree only if @x is not in .rodata section. + */ +void kfree_const(const void *x) +{ + if (!is_kernel_rodata((unsigned long)x)) + free((void *)x); +} + #endif #ifndef __HAVE_ARCH_STRSPN |
