summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Sevakis <jethead71@rockbox.org>2011-02-09 09:30:09 +0000
committerMichael Sevakis <jethead71@rockbox.org>2011-02-09 09:30:09 +0000
commit0d902c8c54bbc36f24b40c49eb9872aa75b779e4 (patch)
treef5c2ae63204ab4032b6be29dea6d5bfe02809a5d
parent19ea72ff63744c51292cd1d2d1c2792b009892aa (diff)
downloadrockbox-0d902c8c54bbc36f24b40c49eb9872aa75b779e4.tar.gz
rockbox-0d902c8c54bbc36f24b40c49eb9872aa75b779e4.zip
Buffering should align itself and not rely on buffering_reset parameters when storage alignment matters so that wrapped reads maintain alignment.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@29258 a1c6a512-1295-4272-9138-f99709370657
-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 e37b053881..123c7bc85f 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 65db721bb4..78bddae387 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