| From af3de6cd042c89ae2e8d07d503e0a07129e1296c Mon Sep 17 00:00:00 2001 |
| From: Bowen Wang <wangbowen6@xiaomi.com> |
| 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 <wangbowen6@xiaomi.com> |
| --- |
| 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 |
| |