66fc77d3af
The default string functions work with multiple of 4 bytes (sizeof(unsinged long)); MIPS will use LW/SW instructions for these operations and if the source and destination addresses are not aligned it will trigger an exception. Therefore, this implementation does all data access operations per byte, because there is no guarantee that the provided strings are properly aligned. BUG=chrome-os-partner:31438 TEST=tested on Pistachio bring up board; behaves as expected BRANCH=none Change-Id: I05b43673deb954f022d12cb9c3d7baac26be2a34 Signed-off-by: Patrick Georgi <pgeorgi@chromium.org> Original-Commit-Id: 8e13b3d31726404abd8c8e5c8780d3d3e16e032d Original-Change-Id: I456e312eb6b7fee2eff10e461af7f578aed07648 Original-Signed-off-by: Ionela Voinescu <ionela.voinescu@imgtec.com> Original-Reviewed-on: https://chromium-review.googlesource.com/241885 Original-Reviewed-by: David Hendricks <dhendrix@chromium.org> Reviewed-on: http://review.coreboot.org/8743 Tested-by: build bot (Jenkins) Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org> Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net>
82 lines
2 KiB
C
82 lines
2 KiB
C
/*
|
|
* This file is part of the libpayload project.
|
|
*
|
|
* Copyright (C) 2014 Imagination Technologies
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; version 2 of the License.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
|
|
#include <stdint.h>
|
|
#include "string.h"
|
|
|
|
/*
|
|
* Alternative string functions to the default ones are added
|
|
* because there is no guarantee that the provided source and
|
|
* destination addresses are properly aligned;
|
|
* The default string functions work with multiple of 4 bytes
|
|
* (sizeof(unsinged long)); MIPS will use LW/SW instructions
|
|
* for these operations and if the source and destination
|
|
* addresses are not aligned it will trigger an exception.
|
|
*/
|
|
|
|
void *memcpy(void *dest, const void *src, size_t n)
|
|
{
|
|
u8 *ptr_d = dest;
|
|
const u8 *ptr_s = src;
|
|
size_t i;
|
|
|
|
for (i = 0; i < n; i++)
|
|
*ptr_d++ = *ptr_s++;
|
|
|
|
return dest;
|
|
}
|
|
|
|
void *memmove(void *dest, const void *src, size_t n)
|
|
{
|
|
if ((src < dest) && (dest - src < n)) {
|
|
u8 *ptr_d = dest;
|
|
const u8 *ptr_s = src;
|
|
size_t i;
|
|
|
|
/* copy backwards */
|
|
for (i = n - 1; i >= 0; i--)
|
|
ptr_d[i] = ptr_s[i];
|
|
|
|
return dest;
|
|
}
|
|
|
|
/* copy forwards */
|
|
return memcpy(dest, src, n);
|
|
}
|
|
|
|
void *memset(void *s, int c, size_t n)
|
|
{
|
|
u8 *ptr = s;
|
|
size_t i;
|
|
|
|
for (i = 0; i < n; i++)
|
|
*ptr++ = c;
|
|
|
|
return s;
|
|
}
|
|
|
|
int memcmp(const void *s1, const void *s2, size_t n)
|
|
{
|
|
size_t i;
|
|
|
|
for (i = 0; i < n; i++)
|
|
if (((u8 *)s1)[i] != ((u8 *)s2)[i])
|
|
return ((u8 *)s1)[i] - ((u8 *)s2)[i];
|
|
return 0;
|
|
}
|