mirror of
https://github.com/Fishwaldo/opensbi.git
synced 2025-07-07 13:39:00 +00:00
platform: Add minimal libc support.
libfdt requires minimal libc support. Absoultely minimum functions are added in libc. Signed-off-by: Atish Patra <atish.patra@wdc.com>
This commit is contained in:
parent
3298251f0c
commit
1901e8a287
2 changed files with 185 additions and 0 deletions
15
platform/common/libc/objects.mk
Normal file
15
platform/common/libc/objects.mk
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
#
|
||||||
|
# Copyright (c) 2018 Western Digital Corporation or its affiliates.
|
||||||
|
#
|
||||||
|
# Authors:
|
||||||
|
# Atish Patra<atish.patra@wdc.com>
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: BSD-2-Clause
|
||||||
|
#
|
||||||
|
|
||||||
|
libc_files = string.o
|
||||||
|
|
||||||
|
$(foreach file, $(libc_files), \
|
||||||
|
$(eval CFLAGS_$(file) = -I$(src)/../../common/libc))
|
||||||
|
|
||||||
|
platform-common-objs-$(PLATFORM_INCLUDE_LIBC) += $(addprefix libc/,$(libc_files))
|
170
platform/common/libc/string.c
Normal file
170
platform/common/libc/string.c
Normal file
|
@ -0,0 +1,170 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2018 Western Digital Corporation or its affiliates.
|
||||||
|
*
|
||||||
|
* Authors:
|
||||||
|
* Atish Patra <atish.patra@wdc.com>
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-2-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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 <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;
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue