diff options
-rw-r--r-- | include/lib/mem.h | 4 | ||||
-rw-r--r-- | src/lib/mem.c | 28 |
2 files changed, 32 insertions, 0 deletions
diff --git a/include/lib/mem.h b/include/lib/mem.h index 166dfdc..eff6445 100644 --- a/include/lib/mem.h +++ b/include/lib/mem.h @@ -12,15 +12,19 @@ struct MemTab { void* data; } __attribute__((packed)); +void memset(unsigned char* dest, unsigned char value, unsigned int n); void memcpy(unsigned char* src, unsigned char* dest, unsigned int n); unsigned char memcmp(unsigned char* a, unsigned char* b, unsigned int n); void memshow32(unsigned long* addr, unsigned int n); +void memset32(unsigned long* dest, unsigned long value, unsigned int n); void memcpy32(unsigned long* src, unsigned long* dest, unsigned int n); unsigned char memcmp32(unsigned long* a, unsigned long* b, unsigned int n); void* malloc(unsigned char size); +void* calloc(unsigned char size); void* malloca(unsigned char size, unsigned char amnt); +void* calloca(unsigned char size, unsigned char amnt); void free(void* memloc); void* heap_base(void); void* heap_top(void); diff --git a/src/lib/mem.c b/src/lib/mem.c index ac5db4d..91fed94 100644 --- a/src/lib/mem.c +++ b/src/lib/mem.c @@ -11,6 +11,13 @@ void memshow32(unsigned long* addr, unsigned int n) uart_char(0x0a); } +void memset(unsigned char* dest, unsigned char value, unsigned int n) +{ + for(unsigned int i = 0; i < n; i++) { + dest[i] = value; + } +} + void memcpy(unsigned char* src, unsigned char* dest, unsigned int n) { for(unsigned int i = 0; i < n; i++) { @@ -27,6 +34,13 @@ unsigned char memcmp(unsigned char* a, unsigned char* b, unsigned int n) return 1; } +void memset32(unsigned long* dest, unsigned long value, unsigned int n) +{ + for(unsigned int i = 0; i < n; i++) { + dest[i] = value; + } +} + void memcpy32(unsigned long* src, unsigned long* dest, unsigned int n) { for(unsigned int i = 0; i < n; i++) { @@ -66,6 +80,13 @@ void* malloc(unsigned char size) return (void*)&mem[i + MEM_BASE_SIZE]; } +void* calloc(unsigned char size) +{ + void* addr = malloc(size); + memset(addr, 0, size); + return addr; +} + void* malloca(unsigned char size, unsigned char amnt) { // Return malloc if alignment size is 0 or 1 - trivial alignment @@ -113,6 +134,13 @@ void* malloca(unsigned char size, unsigned char amnt) } } +void* calloca(unsigned char size, unsigned char amnt) +{ + void* addr = malloca(size, amnt); + memset(addr, 0, size); + return addr; +} + void free(void* memloc) { // Don't try to free memory outside of heap |