mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-25 06:00:43 +00:00
efi_loader: provide freestanding library
GCC requires that freestanding programs provide memcpy(), memmove(), memset(), and memcmp(). Provide the required library functions. Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de> Signed-off-by: Alexander Graf <agraf@suse.de>
This commit is contained in:
parent
1170fee695
commit
f51a226436
1 changed files with 90 additions and 0 deletions
90
lib/efi_loader/efi_freestanding.c
Normal file
90
lib/efi_loader/efi_freestanding.c
Normal file
|
@ -0,0 +1,90 @@
|
||||||
|
// 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;
|
||||||
|
}
|
Loading…
Reference in a new issue