summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/buffering.c5
-rw-r--r--firmware/export/system.h3
2 files changed, 8 insertions, 0 deletions
diff --git a/apps/buffering.c b/apps/buffering.c
index e37b053..123c7bc 100644
--- a/apps/buffering.c
+++ b/apps/buffering.c
@@ -1572,6 +1572,11 @@ void buffering_init(void)
/* Initialise the buffering subsystem */
bool buffering_reset(char *buf, size_t buflen)
{
+ /* Wraps of storage-aligned data must also be storage aligned,
+ thus buf and buflen must be a aligned to an integer multiple of
+ the storage alignment */
+ STORAGE_ALIGN_BUFFER(buf, buflen);
+
if (!buf || !buflen)
return false;
diff --git a/firmware/export/system.h b/firmware/export/system.h
index 65db721..78bddae 100644
--- a/firmware/export/system.h
+++ b/firmware/export/system.h
@@ -388,11 +388,14 @@ static inline void cpucache_flush(void)
#define STORAGE_PAD(x) ((x) + CACHEALIGN_SIZE - 1)
/* Number of bytes in the last cacheline assuming buffer of size x is aligned */
#define STORAGE_OVERLAP(x) ((x) & (CACHEALIGN_SIZE - 1))
+ #define STORAGE_ALIGN_BUFFER(start, size) \
+ ALIGN_BUFFER((start), (size), CACHEALIGN_SIZE)
#else
#define STORAGE_ALIGN_ATTR
#define STORAGE_ALIGN_DOWN(x) (x)
#define STORAGE_PAD(x) (x)
#define STORAGE_OVERLAP(x) 0
+ #define STORAGE_ALIGN_BUFFER(start, size)
#endif
/* Double-cast to avoid 'dereferencing type-punned pointer will