summaryrefslogtreecommitdiff
path: root/payloads/libpayload/arch
diff options
context:
space:
mode:
authorIonela Voinescu <ionela.voinescu@imgtec.com>2015-01-21 01:11:56 +0000
committerPatrick Georgi <pgeorgi@google.com>2015-03-21 11:08:16 +0100
commit66fc77d3afbefa7b755bf0f025556b23ae4cff2c (patch)
tree921c2ad04928bf3a0aa3f9e4d1fd4a8acd542672 /payloads/libpayload/arch
parentce22c023878d2b2e5963f379857ccec4815aeede (diff)
downloadcoreboot-66fc77d3afbefa7b755bf0f025556b23ae4cff2c.tar.xz
libpayload: mips: add memcmp to the MIPS string functions
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>
Diffstat (limited to 'payloads/libpayload/arch')
-rw-r--r--payloads/libpayload/arch/mips/string.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/payloads/libpayload/arch/mips/string.c b/payloads/libpayload/arch/mips/string.c
index 0f0c7c3529..0563cf82ac 100644
--- a/payloads/libpayload/arch/mips/string.c
+++ b/payloads/libpayload/arch/mips/string.c
@@ -70,3 +70,13 @@ void *memset(void *s, int c, size_t n)
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;
+}