diff options
Diffstat (limited to 'payloads/libpayload/arch/mips/string.c')
-rw-r--r-- | payloads/libpayload/arch/mips/string.c | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/payloads/libpayload/arch/mips/string.c b/payloads/libpayload/arch/mips/string.c new file mode 100644 index 0000000000..0f0c7c3529 --- /dev/null +++ b/payloads/libpayload/arch/mips/string.c @@ -0,0 +1,72 @@ + /* + * 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; +} |