From af3de6cd042c89ae2e8d07d503e0a07129e1296c Mon Sep 17 00:00:00 2001 From: Bowen Wang Date: Thu, 16 Nov 2023 14:52:48 +0800 Subject: [PATCH] libmetal/nuttx/io.c: align access when read/write size = 1, 2, 4, 8 Signed-off-by: Bowen Wang --- lib/system/nuttx/io.c | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/lib/system/nuttx/io.c libmetal/lib/system/nuttx/io.c index 4fa4727..3ce9cbe 100644 --- a/lib/system/nuttx/io.c +++ libmetal/lib/system/nuttx/io.c @@ -37,7 +37,17 @@ static int metal_io_block_read_(struct metal_io_region *io, void *va = metal_io_virt(io, offset); metal_cache_invalidate(va, len); - memcpy(dst, va, len); + if (len == 1) + *(uint8_t *)dst = *(uint8_t *)va; + else if (len == 2) + *(uint16_t *)dst = *(uint16_t *)va; + else if (len == 4) + *(uint32_t *)dst = *(uint32_t *)va; + else if (len == 8) { + *(uint32_t *)dst = *(uint32_t *)va; + *(uint32_t *)(dst + 4) = *(uint32_t *)(va + 4); + } else + memcpy(dst, va, len); return len; } @@ -50,7 +60,18 @@ static int metal_io_block_write_(struct metal_io_region *io, { void *va = metal_io_virt(io, offset); - memcpy(va, src, len); + if (len == 1) + *(uint8_t *)va = *(uint8_t *)src; + else if (len == 2) + *(uint16_t *)va = *(uint16_t *)src; + else if (len == 4) + *(uint32_t *)va = *(uint32_t *)src; + else if (len == 8) { + *(uint32_t *)va = *(uint32_t *)src; + *(uint32_t *)(va + 4) = *(uint32_t *)(src + 4); + } else + memcpy(va, src, len); + metal_cache_flush(va, len); return len; -- 2.34.1