From 706243ac48cf646d503a3f1ec9e6a28c916694bd Mon Sep 17 00:00:00 2001 From: Patrick Williams Date: Sat, 5 Mar 2011 10:01:45 -0600 Subject: Merge of PowerHAL project up to commit: dd45c30bd53d8e6c123165b83842d08117558a3c --- src/lib/assert.C | 8 ++++ src/lib/makefile | 2 +- src/lib/stdio.C | 44 +++++++++++++++++ src/lib/string.C | 144 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/lib/string.c | 45 ----------------- 5 files changed, 197 insertions(+), 46 deletions(-) create mode 100644 src/lib/assert.C create mode 100644 src/lib/stdio.C create mode 100644 src/lib/string.C delete mode 100644 src/lib/string.c (limited to 'src/lib') diff --git a/src/lib/assert.C b/src/lib/assert.C new file mode 100644 index 000000000..edf4ea0d4 --- /dev/null +++ b/src/lib/assert.C @@ -0,0 +1,8 @@ + +extern "C" void __assert(bool expr, const char *exprStr, + const char *file, int line) +{ + // TODO + while (true); +} + diff --git a/src/lib/makefile b/src/lib/makefile index ee750951a..d15ca3bef 100644 --- a/src/lib/makefile +++ b/src/lib/makefile @@ -1,6 +1,6 @@ ROOTPATH = ../.. -OBJS = string.o stdlib.o +OBJS = string.o stdlib.o assert.o stdio.o OBJS += syscall_stub.o syscall_task.o syscall_mutex.o syscall_msg.o OBJS += syscall_mmio.o syscall_time.o diff --git a/src/lib/stdio.C b/src/lib/stdio.C new file mode 100644 index 000000000..2cdd23d85 --- /dev/null +++ b/src/lib/stdio.C @@ -0,0 +1,44 @@ +#include +#include +#include +#include + +class SprintfBuffer +{ + public: + int putc(int c) + { + if ('\b' == c) + { + iv_pos--; + } + else + { + iv_buffer[iv_pos++] = c; + } + return c; + } + + explicit SprintfBuffer(char* buf) : iv_pos(0), iv_buffer(buf) {}; + + private: + size_t iv_pos; + char * iv_buffer; +}; + +int sprintf(char *str, const char * format, ...) +{ + using Util::mem_ptr_fun; + using Util::vasprintf; + + va_list args; + va_start(args, format); + + SprintfBuffer console(str); + size_t count = vasprintf(mem_ptr_fun(console, &SprintfBuffer::putc), + format, args); + + va_end(args); + + return count; +} diff --git a/src/lib/string.C b/src/lib/string.C new file mode 100644 index 000000000..0444a19bc --- /dev/null +++ b/src/lib/string.C @@ -0,0 +1,144 @@ +#include + +extern "C" void *memset(void *vdest, int64_t ch, size_t len) +{ + // TODO: align to an 8-byte boundary + // Loop, storing 8 bytes every 3 instructions + long *ldest = reinterpret_cast(vdest); + if (len >= sizeof(long)) + { + long lch = ch & 0xFF; + lch |= lch<<8; + lch |= lch<<16; + lch |= lch<<32; + size_t len8 = len / sizeof(long); + size_t i = len8; + do + { + ldest[--i] = lch; + } + while( i > 0 ); + ldest += len8; + len -= len8 * sizeof(long); + } + + // Loop, storing 1 byte every 3 instructions + char *cdest = reinterpret_cast(ldest); + while (len >= sizeof(char)) + { + *cdest++ = ch; + len -= sizeof(char); + } + + return vdest; +} + +extern "C" void bzero(void *vdest, size_t len) +{ + memset(vdest, 0, len); +} + +extern "C" void *memcpy(void *vdest, const void *vsrc, size_t len) +{ + // TODO: align to an 8-byte boundary? + + // Loop, copying 8 bytes every 5 instructions (TODO: 8/4 should be possible) + long *ldest = reinterpret_cast(vdest); + const long *lsrc = reinterpret_cast(vsrc); + + while (len >= sizeof(long)) + { + *ldest++ = *lsrc++; + len -= sizeof(long); + } + + // Loop, copying 1 byte every 4 instructions + char *cdest = reinterpret_cast(ldest); + const char *csrc = reinterpret_cast(lsrc); + for (size_t i = 0; i < len; ++i) + { + cdest[i] = csrc[i]; + } + + return vdest; +} + +extern "C" void *memmove(void *vdest, const void *vsrc, size_t len) +{ + // Copy first-to-last + if (vdest <= vsrc) + { + return memcpy(vdest,vsrc,len); + } + + // Copy last-to-first (TO_DO: optimize) + char *dest = reinterpret_cast(vdest); + const char *src = reinterpret_cast(vsrc); + for (size_t i = len; i > 0;) + { + --i; + dest[i] = src[i]; + } + + return vdest; +} + +extern "C" int64_t memcmp(const void *p1, const void *p2, size_t len) +{ + const char *c1 = reinterpret_cast(p1); + const char *c2 = reinterpret_cast(p2); + + for (size_t i = 0; i < len; ++i) + { + long n = static_cast(c1[i]) - static_cast(c2[i]); + if (n != 0) + { + return n; + } + } + + return 0; +} + +extern "C" char* strcpy(char* d, const char* s) +{ + char* d1 = d; + + do + { + *d1 = *s; + if (*s == '\0') return d; + d1++; s++; + } while(1); +} + +extern "C" int strcmp(const char* a, const char* b) +{ + while((*a != '\0') && (*b != '\0')) + { + if (*a == *b) + { + a++; b++; + } + else + { + return (*a > *b) ? 1 : -1; + } + } + if (*a == *b) + return 0; + if (*a == '\0') + return -1; + else + return 1; +} + +extern "C" size_t strlen(const char* a) +{ + size_t length = 0; + while(*a++) + { + length++; + } + return length; +} diff --git a/src/lib/string.c b/src/lib/string.c deleted file mode 100644 index c267c11d7..000000000 --- a/src/lib/string.c +++ /dev/null @@ -1,45 +0,0 @@ -#include - -void* memset(void* s, int c, size_t n) -{ - char* _s = s; - while(n) - { - *_s = c; - _s++; n--; - } - return s; -} - -char* strcpy(char* d, const char* s) -{ - char* d1 = d; - - do - { - *d1 = *s; - if (*s == '\0') return d; - d1++; s++; - } while(1); -} - -int strcmp(const char* a, const char* b) -{ - while((*a != '\0') && (*b != '\0')) - { - if (*a == *b) - { - a++; b++; - } - else - { - return (*a > *b) ? 1 : -1; - } - } - if (*a == *b) - return 0; - if (*a == '\0') - return -1; - else - return 1; -} -- cgit v1.2.1