72291a9d83
For EFI binaries we have to provide an implementation of memmove() in efi_freestanding.c. Before this patch the memmove() function was copying in the wrong direction. Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
123 lines
2.5 KiB
C
123 lines
2.5 KiB
C
// 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.
|
|
*
|
|
* @param func_ptr Pointer to function being entered
|
|
* @param 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.
|
|
*
|
|
* @param func_ptr Pointer to function being entered
|
|
* @param caller Pointer to function which called this function
|
|
*/
|
|
void __attribute__((no_instrument_function))
|
|
__cyg_profile_func_exit(void *func_ptr, void *caller)
|
|
{
|
|
}
|