Merge tag 'efi-2019-10-rc2' of https://gitlab.denx.de/u-boot/custodians/u-boot-efi
[platform/kernel/u-boot.git] / lib / efi_loader / efi_freestanding.c
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 }