summaryrefslogtreecommitdiff
path: root/lib/sbi
diff options
context:
space:
mode:
authorAtish Patra <atish.patra@wdc.com>2019-06-19 00:54:02 +0300
committerAnup Patel <anup.patel@wdc.com>2019-06-19 07:18:54 +0300
commit98aaf8317b74414afa78078bc056670f46c45f41 (patch)
treee26aa71b9e3ea232f246fd10a7cfd3fd94578f7a /lib/sbi
parent749b0b093242a4c27f7c4f66121afd7852b2de48 (diff)
downloadopensbi-98aaf8317b74414afa78078bc056670f46c45f41.tar.xz
lib: Include helper libc functions directly in libsbi.
libsbi needs some of the custom libc functions. It should be directly included in libsbi instead of platform specific libraries. Signed-off-by: Atish Patra <atish.patra@wdc.com> Acked-by: Anup Patel <anup.patel@wdc.com>
Diffstat (limited to 'lib/sbi')
-rw-r--r--lib/sbi/libc/objects.mk15
-rw-r--r--lib/sbi/libc/string.c175
-rw-r--r--lib/sbi/objects.mk3
-rw-r--r--lib/sbi/sbi_fifo.c2
-rw-r--r--lib/sbi/sbi_ipi.c2
-rw-r--r--lib/sbi/sbi_tlb.c2
6 files changed, 193 insertions, 6 deletions
diff --git a/lib/sbi/libc/objects.mk b/lib/sbi/libc/objects.mk
new file mode 100644
index 0000000..7a6ebbe
--- /dev/null
+++ b/lib/sbi/libc/objects.mk
@@ -0,0 +1,15 @@
+#
+# SPDX-License-Identifier: BSD-2-Clause
+#
+# Copyright (c) 2019 Western Digital Corporation or its affiliates.
+#
+# Authors:
+# Atish Patra<atish.patra@wdc.com>
+#
+
+libc_files = string.o
+
+$(foreach file, $(libc_files), \
+ $(eval CFLAGS_$(file) = -I$(src)/../../sbi/libc))
+
+libsbi-objs-y += $(addprefix libc/,$(libc_files))
diff --git a/lib/sbi/libc/string.c b/lib/sbi/libc/string.c
new file mode 100644
index 0000000..b5743fe
--- /dev/null
+++ b/lib/sbi/libc/string.c
@@ -0,0 +1,175 @@
+/*
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (c) 2019 Western Digital Corporation or its affiliates.
+ *
+ * Authors:
+ * Atish Patra <atish.patra@wdc.com>
+ */
+
+/*
+ * Simple libc functions. These are not optimized at all and might have some
+ * bugs as well. Use any optimized routines from newlib or glibc if required.
+ */
+
+#include <sbi/string.h>
+
+int strcmp(const char *a, const char *b)
+{
+ /* search first diff or end of string */
+ for (; *a == *b && *a != '\0'; a++, b++)
+ ;
+
+ return *a - *b;
+}
+
+size_t strlen(const char *str)
+{
+ unsigned long ret = 0;
+
+ while (*str != '\0') {
+ ret++;
+ str++;
+ }
+
+ return ret;
+}
+
+size_t strnlen(const char *str, size_t count)
+{
+ unsigned long ret = 0;
+
+ while (*str != '\0' && ret < count) {
+ ret++;
+ str++;
+ count--;
+ }
+
+ return ret;
+}
+
+char *strcpy(char *dest, const char *src)
+{
+ char *ret = dest;
+
+ while (*src != '\0') {
+ *dest++ = *src++;
+ }
+
+ return ret;
+}
+
+char *strncpy(char *dest, const char *src, size_t count)
+{
+ char *ret = dest;
+
+ while (count-- && *src != '\0') {
+ *dest++ = *src++;
+ }
+
+ return ret;
+}
+
+char *strchr(const char *s, int c)
+{
+ while (*s != '\0' && *s != (char)c)
+ s++;
+
+ if (*s == '\0')
+ return NULL;
+ else
+ return (char *)s;
+}
+
+char *strrchr(const char *s, int c)
+{
+ const char *last = s + strlen(s);
+
+ while (last > s && *last != (char)c)
+ last--;
+
+ if (*last != (char)c)
+ return NULL;
+ else
+ return (char *)last;
+}
+void *memset(void *s, int c, size_t count)
+{
+ char *temp = s;
+
+ while (count > 0) {
+ count--;
+ *temp++ = c;
+ }
+
+ return s;
+}
+
+void *memcpy(void *dest, const void *src, size_t count)
+{
+ char *temp1 = dest;
+ const char *temp2 = src;
+
+ while (count > 0) {
+ *temp1++ = *temp2++;
+ count--;
+ }
+
+ return dest;
+}
+
+void *memmove(void *dest, const void *src, size_t count)
+{
+ char *temp1 = (char *)dest;
+ const char *temp2 = (char *)src;
+
+ if (src == dest)
+ return dest;
+
+ if (dest < src) {
+ while (count > 0) {
+ *temp1++ = *temp2++;
+ count--;
+ }
+ } else {
+ temp1 = dest + count - 1;
+ temp2 = src + count - 1;
+
+ while (count > 0) {
+ *temp1-- = *temp2--;
+ count--;
+ }
+ }
+
+ return dest;
+}
+
+int memcmp(const void *s1, const void *s2, size_t count)
+{
+ const char *temp1 = s1;
+ const char *temp2 = s2;
+
+ for (; count > 0 && (*temp1 == *temp2); count--) {
+ temp1++;
+ temp2++;
+ }
+
+ if (count > 0)
+ return *(unsigned char *)temp1 - *(unsigned char *)temp2;
+ else
+ return 0;
+}
+
+void *memchr(const void *s, int c, size_t count)
+{
+ const unsigned char *temp = s;
+
+ while (count > 0) {
+ if ((unsigned char)c == *temp++) {
+ return (void *)(temp - 1);
+ }
+ count--;
+ }
+
+ return NULL;
+}
diff --git a/lib/sbi/objects.mk b/lib/sbi/objects.mk
index 817e805..d0fd856 100644
--- a/lib/sbi/objects.mk
+++ b/lib/sbi/objects.mk
@@ -27,6 +27,3 @@ libsbi-objs-y += sbi_system.o
libsbi-objs-y += sbi_timer.o
libsbi-objs-y += sbi_tlb.o
libsbi-objs-y += sbi_trap.o
-
-# External Libraries to include
-PLATFORM_INCLUDE_LIBC=y
diff --git a/lib/sbi/sbi_fifo.c b/lib/sbi/sbi_fifo.c
index a92b46c..e823d2a 100644
--- a/lib/sbi/sbi_fifo.c
+++ b/lib/sbi/sbi_fifo.c
@@ -10,7 +10,7 @@
#include <sbi/riscv_locks.h>
#include <sbi/sbi_error.h>
#include <sbi/sbi_fifo.h>
-#include <plat/string.h>
+#include <sbi/string.h>
void sbi_fifo_init(struct sbi_fifo *fifo, void *queue_mem, u16 entries,
u16 entry_size)
diff --git a/lib/sbi/sbi_ipi.c b/lib/sbi/sbi_ipi.c
index 48d5b22..19da029 100644
--- a/lib/sbi/sbi_ipi.c
+++ b/lib/sbi/sbi_ipi.c
@@ -19,7 +19,7 @@
#include <sbi/sbi_platform.h>
#include <sbi/sbi_timer.h>
#include <sbi/sbi_tlb.h>
-#include <plat/string.h>
+#include <sbi/string.h>
static unsigned long ipi_data_off;
diff --git a/lib/sbi/sbi_tlb.c b/lib/sbi/sbi_tlb.c
index 814d402..1031df3 100644
--- a/lib/sbi/sbi_tlb.c
+++ b/lib/sbi/sbi_tlb.c
@@ -16,7 +16,7 @@
#include <sbi/sbi_bitops.h>
#include <sbi/sbi_scratch.h>
#include <sbi/sbi_tlb.h>
-#include <plat/string.h>
+#include <sbi/string.h>
static unsigned long ipi_tlb_fifo_off;
static unsigned long ipi_tlb_fifo_mem_off;