// SPDX-License-Identifier: GPL-2.0+
/*
 * Library for freestanding binary
 *
 * Copyright 2019, Heinrich Schuchardt <xypron.glpk@gmx.de>
 *
 * GCC requires that freestanding programs provide memcpy(), memmove(),
 * memset(), and memcmp().
 */

#include <common.h>

/**
 * memcmp() - compare memory areas
 *
 * @s1:		pointer to first area
 * @s2:		pointer to second area
 * @n:		number of bytes to compare
 * Return:	0 if both memory areas are the same, otherwise the sign of the
 *		result value is the same as the sign of the difference between
 *		the first differing pair of bytes taken as u8.
 */
int memcmp(const void *s1, const void *s2, size_t n)
{
	const u8 *pos1 = s1;
	const u8 *pos2 = s2;

	for (; n; --n) {
		if (*pos1 != *pos2)
			return *pos1 - *pos2;
		++pos1;
		++pos2;
	}
	return 0;
}

/**
 * memcpy() - copy memory area
 *
 * @dest:	destination buffer
 * @src:	source buffer
 * @n:		number of bytes to copy
 * Return:	pointer to destination buffer
 */
void *memmove(void *dest, const void *src, size_t n)
{
	u8 *d = dest;
	const u8 *s = src;

	if (d <= s) {
		for (; n; --n)
			*d++ = *s++;
	} else {
		d += n;
		s += n;
		for (; n; --n)
			*--d = *--s;
	}
	return dest;
}

/**
 * memcpy() - copy memory area
 *
 * @dest:	destination buffer
 * @src:	source buffer
 * @n:		number of bytes to copy
 * Return:	pointer to destination buffer
 */
void *memcpy(void *dest, const void *src, size_t n)
{
	return memmove(dest, src, n);
}

/**
 * memset() - fill memory with a constant byte
 *
 * @s:		destination buffer
 * @c:		byte value
 * @n:		number of bytes to set
 * Return:	pointer to destination buffer
 */
void *memset(void *s, int c, size_t n)
{
	u8 *d = s;

	for (; n; --n)
		*d++ = c;
	return s;
}

/**
 * __cyg_profile_func_enter() - record function entry
 *
 * This is called on every function entry when compiling with
 * -finstrument-functions.
 *
 * We do nothing here.
 *
 * func_ptr:	Pointer to function being entered
 * caller:	Pointer to function which called this function
 */
void notrace
__cyg_profile_func_enter(void *func_ptr, void *caller)
{
}

/**
 * __cyg_profile_func_exit() - record function exit
 *
 * This is called on every function exit when compiling with
 * -finstrument-functions.
 *
 * We do nothing here.
 *
 * func_ptr:	Pointer to function being entered
 * caller:	Pointer to function which called this function
 */
void notrace
__cyg_profile_func_exit(void *func_ptr, void *caller)
{
}
