coreboot/payloads/libpayload/libc/memory.c
<<
>>
Prefs
   1/*
   2 * This file is part of the libpayload project.
   3 *
   4 * It has originally been taken from the HelenOS project
   5 * (http://www.helenos.eu), and slightly modified for our purposes.
   6 *
   7 * Copyright (c) 2005 Martin Decky
   8 * All rights reserved.
   9 *
  10 * Redistribution and use in source and binary forms, with or without
  11 * modification, are permitted provided that the following conditions
  12 * are met:
  13 *
  14 * - Redistributions of source code must retain the above copyright
  15 *   notice, this list of conditions and the following disclaimer.
  16 * - Redistributions in binary form must reproduce the above copyright
  17 *   notice, this list of conditions and the following disclaimer in the
  18 *   documentation and/or other materials provided with the distribution.
  19 * - The name of the author may not be used to endorse or promote products
  20 *   derived from this software without specific prior written permission.
  21 *
  22 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
  23 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  24 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  25 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
  26 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  27 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  31 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  32 */
  33
  34#include <libpayload.h>
  35
  36void *memset(void *s, int c, size_t n)
  37{
  38        char *os = s;
  39
  40        while (n--)
  41                *(os++) = c;
  42
  43        return s;
  44}
  45
  46void *memcpy(void *dst, const void *src, size_t n)
  47{
  48        int i;
  49        void *ret = dst;
  50
  51        for(i = 0; i < n % sizeof(unsigned long); i++)
  52                ((unsigned char *) dst)[i] = ((unsigned char *) src)[i];
  53
  54        n -= i;
  55        src += i;
  56        dst += i;
  57
  58        for(i = 0; i < n / sizeof(unsigned long); i++)
  59                ((unsigned long *) dst)[i] = ((unsigned long *) src)[i];
  60
  61        return ret;
  62}
  63
  64void *memmove(void *dst, const void *src, size_t n)
  65{
  66        int i;
  67        unsigned long offs;
  68
  69        if (src > dst)
  70                return memcpy(dst, src, n);
  71
  72        offs = n - (n % sizeof(unsigned long));
  73
  74        for (i = (n % sizeof(unsigned long)) - 1; i >= 0; i--)
  75                ((unsigned char *)dst)[i + offs] =
  76                        ((unsigned char *)src)[i + offs];
  77
  78        for (i = n / sizeof(unsigned long) - 1; i >= 0; i--)
  79                ((unsigned long *)dst)[i] = ((unsigned long *)src)[i];
  80
  81        return dst;
  82}
  83
  84/**
  85 * Compare two memory areas.
  86 *
  87 * @param s1 Pointer to the first area to compare.
  88 * @param s2 Pointer to the second area to compare.
  89 * @param len Size of the first area in bytes (both must have the same length).
  90 * @return If len is 0, return zero. If the areas match, return zero.
  91 *         Otherwise return non-zero.
  92 */
  93int memcmp(const void *s1, const void *s2, size_t len)
  94{
  95        for (; len && *(char *)s1++ == *(char *)s2++; len--) ;
  96        return len;
  97}
  98
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.