162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci#include <stddef.h>
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci/*
562306a36Sopenharmony_ci * Override the "basic" built-in string helpers so that they can be used in
662306a36Sopenharmony_ci * guest code.  KVM selftests don't support dynamic loading in guest code and
762306a36Sopenharmony_ci * will jump into the weeds if the compiler decides to insert an out-of-line
862306a36Sopenharmony_ci * call via the PLT.
962306a36Sopenharmony_ci */
1062306a36Sopenharmony_ciint memcmp(const void *cs, const void *ct, size_t count)
1162306a36Sopenharmony_ci{
1262306a36Sopenharmony_ci	const unsigned char *su1, *su2;
1362306a36Sopenharmony_ci	int res = 0;
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci	for (su1 = cs, su2 = ct; 0 < count; ++su1, ++su2, count--) {
1662306a36Sopenharmony_ci		if ((res = *su1 - *su2) != 0)
1762306a36Sopenharmony_ci			break;
1862306a36Sopenharmony_ci	}
1962306a36Sopenharmony_ci	return res;
2062306a36Sopenharmony_ci}
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_civoid *memcpy(void *dest, const void *src, size_t count)
2362306a36Sopenharmony_ci{
2462306a36Sopenharmony_ci	char *tmp = dest;
2562306a36Sopenharmony_ci	const char *s = src;
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci	while (count--)
2862306a36Sopenharmony_ci		*tmp++ = *s++;
2962306a36Sopenharmony_ci	return dest;
3062306a36Sopenharmony_ci}
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_civoid *memset(void *s, int c, size_t count)
3362306a36Sopenharmony_ci{
3462306a36Sopenharmony_ci	char *xs = s;
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci	while (count--)
3762306a36Sopenharmony_ci		*xs++ = c;
3862306a36Sopenharmony_ci	return s;
3962306a36Sopenharmony_ci}
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_cisize_t strnlen(const char *s, size_t count)
4262306a36Sopenharmony_ci{
4362306a36Sopenharmony_ci	const char *sc;
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci	for (sc = s; count-- && *sc != '\0'; ++sc)
4662306a36Sopenharmony_ci		/* nothing */;
4762306a36Sopenharmony_ci	return sc - s;
4862306a36Sopenharmony_ci}
49