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
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 New Issue
Block a user