From 908cda6943cef3c380884172fa2a3220814a5d6f Mon Sep 17 00:00:00 2001 From: Markus Stockhausen Date: Fri, 22 Aug 2025 04:41:29 -0400 Subject: [PATCH] realtek: rt-loader: memory library enhancements Provide a crc32 function (will be needed later). Do some minor naming and coding cleanups Signed-off-by: Markus Stockhausen Link: https://github.com/openwrt/openwrt/pull/19832 Signed-off-by: Hauke Mehrtens --- .../realtek/image/rt-loader/include/memory.h | 5 +-- .../realtek/image/rt-loader/src/memory.c | 35 ++++++++++++++----- 2 files changed, 29 insertions(+), 11 deletions(-) diff --git a/target/linux/realtek/image/rt-loader/include/memory.h b/target/linux/realtek/image/rt-loader/include/memory.h index 80d0f8a283..a43c83219e 100644 --- a/target/linux/realtek/image/rt-loader/include/memory.h +++ b/target/linux/realtek/image/rt-loader/include/memory.h @@ -15,14 +15,15 @@ #define ioread32(reg) (*(volatile int *)(reg)) #define iowrite32(val, reg) (*(volatile int *)(reg) = val) -void flush_cache(void *start_addr, unsigned long size); +void flush_cache(void *start_addr, size_t count); void free(void *ptr); -void *malloc(size_t size); +void *malloc(size_t count); int memcmp(const void *s1, const void *s2, size_t count); void *memmove(void *dst, const void *src, size_t count); void *memcpy(void *dst, const void *src, size_t count); void *memset(void *dst, int value, size_t count); size_t strlen(const char *s); +unsigned int crc32(void *m, size_t count); extern void *_heap_addr; extern void *_heap_addr_max; diff --git a/target/linux/realtek/image/rt-loader/src/memory.c b/target/linux/realtek/image/rt-loader/src/memory.c index 6ff5a44897..2e16d8afaa 100644 --- a/target/linux/realtek/image/rt-loader/src/memory.c +++ b/target/linux/realtek/image/rt-loader/src/memory.c @@ -21,7 +21,7 @@ : \ : "i" (op), "R" (*(unsigned char *)(addr))) -void flush_cache(void *start_addr, unsigned long size) +void flush_cache(void *start_addr, size_t count) { /* * MIPS cores may have different cache lines. Most common are 16 and 32 bytes. Avoid @@ -31,7 +31,7 @@ void flush_cache(void *start_addr, unsigned long size) unsigned long lsize = 16; unsigned long addr = (unsigned long)start_addr & ~(lsize - 1); - unsigned long aend = ((unsigned long)start_addr + size - 1) & ~(lsize - 1); + unsigned long aend = ((unsigned long)start_addr + count - 1) & ~(lsize - 1); while (1) { CACHE_OP(CACHE_HIT_INVALIDATE_I, addr); @@ -96,27 +96,44 @@ void *memset(void *dst, int c, size_t count) return (void *)d; } -void *malloc(size_t size) +void *malloc(size_t count) { void *start; start = (void *)(((unsigned int)_heap_addr + MEMORY_ALIGNMENT - 1) & ~(MEMORY_ALIGNMENT - 1)); - if ((start + size) > _heap_addr_max) { + if ((start + count) > _heap_addr_max) { printf("malloc(%d) failed. Only %dkB of %dkB heap left.\n", - size, (_heap_addr_max - start) >> 10, HEAP_SIZE >> 10); + count, (_heap_addr_max - start) >> 10, HEAP_SIZE >> 10); board_panic(); } - _heap_addr += size; + _heap_addr += count; return start; } size_t strlen(const char *s) { - const char *p = s; + size_t len = 0; - while (*p) ++p; + while (s[len]) len++; - return (size_t)(p - s); + return len; +} + +unsigned int crc32(void *m, size_t count) +{ + unsigned int crc = 0xffffffff; + unsigned char *data = m; + + for (size_t i = 0; i < count; i++) { + crc ^= data[i]; + for (int j = 0; j < 8; j++) + if (crc & 1) + crc = (crc >> 1) ^ 0xEDB88320; + else + crc >>= 1; + } + + return ~crc; } -- 2.30.2