forked from Mirrors/opensbi
		
	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:
		
							
								
								
									
										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;
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user