| // 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 __attribute__((no_instrument_function)) |
| __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 __attribute__((no_instrument_function)) |
| __cyg_profile_func_exit(void *func_ptr, void *caller) |
| { |
| } |