uboot/lib/efi_loader/efi_freestanding.c
<<
>>
Prefs
   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 */
  23int 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 */
  45void *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 */
  70void *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 */
  83void *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}
  91
  92/**
  93 * __cyg_profile_func_enter() - record function entry
  94 *
  95 * This is called on every function entry when compiling with
  96 * -finstrument-functions.
  97 *
  98 * We do nothing here.
  99 *
 100 * @param func_ptr      Pointer to function being entered
 101 * @param caller        Pointer to function which called this function
 102 */
 103void __attribute__((no_instrument_function))
 104__cyg_profile_func_enter(void *func_ptr, void *caller)
 105{
 106}
 107
 108/**
 109 * __cyg_profile_func_exit() - record function exit
 110 *
 111 * This is called on every function exit when compiling with
 112 * -finstrument-functions.
 113 *
 114 * We do nothing here.
 115 *
 116 * @param func_ptr      Pointer to function being entered
 117 * @param caller        Pointer to function which called this function
 118 */
 119void __attribute__((no_instrument_function))
 120__cyg_profile_func_exit(void *func_ptr, void *caller)
 121{
 122}
 123