summaryrefslogtreecommitdiff
path: root/firmware/export/system.h
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/export/system.h')
-rw-r--r--firmware/export/system.h18
1 files changed, 18 insertions, 0 deletions
diff --git a/firmware/export/system.h b/firmware/export/system.h
index 505b167af9..fee188802b 100644
--- a/firmware/export/system.h
+++ b/firmware/export/system.h
@@ -312,6 +312,16 @@ static inline void cpucache_flush(void)
/* Aligns a buffer pointer and size to proper boundaries */
#define CACHEALIGN_BUFFER(start, size) \
ALIGN_BUFFER((start), (size), CACHEALIGN_SIZE)
+/* Pad a size so the buffer can be aligned later */
+#define CACHE_PAD(x) ((x) + CACHEALIGN_SIZE - 1)
+/* Number of bytes in the last cacheline assuming buffer of size x is aligned */
+#define CACHE_OVERLAP(x) (x & (CACHEALIGN_SIZE - 1))
+
+#ifdef NEEDS_STORAGE_ALIGN
+#define STORAGE_ALIGN_DOWN(x) CACHEALIGN_DOWN(x)
+#define STORAGE_PAD(x) CACHE_PAD(x)
+#define STORAGE_OVERLAP(x) CACHE_OVERLAP(x)
+#endif
#else /* ndef PROC_NEEDS_CACHEALIGN */
@@ -323,9 +333,17 @@ static inline void cpucache_flush(void)
#define CACHEALIGN_DOWN(x) (x)
/* Make no adjustments */
#define CACHEALIGN_BUFFER(start, size)
+#define CACHE_PAD(x) (x)
+#define CACHE_OVERLAP(x) 0
#endif /* PROC_NEEDS_CACHEALIGN */
+#if !defined(PROC_NEEDS_CACHEALIGN) || !defined(NEEDS_STORAGE_ALIGN)
+#define STORAGE_ALIGN_DOWN(x) (x)
+#define STORAGE_PAD(x) (x)
+#define STORAGE_OVERLAP(x) 0
+#endif
+
/* Double-cast to avoid 'dereferencing type-punned pointer will
* break strict aliasing rules' B.S. */
#define PUN_PTR(type, p) ((type)(intptr_t)(p))