1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Library for freestanding binary
4  *
5  * Copyright 2019, Heinrich Schuchardt <xypron.glpk@gmx.de>
6  *
7  * GCC requires that freestanding programs provide memcpy(), memmove(),
8  * memset(), and memcmp().
9  */
10 
11 #include <common.h>
12 
13 /**
14  * memcmp() - compare memory areas
15  *
16  * @s1:		pointer to first area
17  * @s2:		pointer to second area
18  * @n:		number of bytes to compare
19  * Return:	0 if both memory areas are the same, otherwise the sign of the
20  *		result value is the same as the sign of the difference between
21  *		the first differing pair of bytes taken as u8.
22  */
23 int memcmp(const void *s1, const void *s2, size_t n)
24 {
25 	const u8 *pos1 = s1;
26 	const u8 *pos2 = s2;
27 
28 	for (; n; --n) {
29 		if (*pos1 != *pos2)
30 			return *pos1 - *pos2;
31 		++pos1;
32 		++pos2;
33 	}
34 	return 0;
35 }
36 
37 /**
38  * memcpy() - copy memory area
39  *
40  * @dest:	destination buffer
41  * @src:	source buffer
42  * @n:		number of bytes to copy
43  * Return:	pointer to destination buffer
44  */
45 void *memmove(void *dest, const void *src, size_t n)
46 {
47 	u8 *d = dest;
48 	const u8 *s = src;
49 
50 	if (d >= s) {
51 		for (; n; --n)
52 			*d++ = *s++;
53 	} else {
54 		d += n;
55 		s += n;
56 		for (; n; --n)
57 			*--d = *--s;
58 	}
59 	return dest;
60 }
61 
62 /**
63  * memcpy() - copy memory area
64  *
65  * @dest:	destination buffer
66  * @src:	source buffer
67  * @n:		number of bytes to copy
68  * Return:	pointer to destination buffer
69  */
70 void *memcpy(void *dest, const void *src, size_t n)
71 {
72 	return memmove(dest, src, n);
73 }
74 
75 /**
76  * memset() - fill memory with a constant byte
77  *
78  * @s:		destination buffer
79  * @c:		byte value
80  * @n:		number of bytes to set
81  * Return:	pointer to destination buffer
82  */
83 void *memset(void *s, int c, size_t n)
84 {
85 	u8 *d = s;
86 
87 	for (; n; --n)
88 		*d++ = c;
89 	return s;
90 }
91