diff mbox series

[U-Boot] fs/fat: fix unaligned access regression

Message ID 20171009123950.94375-1-jsg@jsg.id.au
State Deferred
Delegated to: Tom Rini
Headers show
Series [U-Boot] fs/fat: fix unaligned access regression | expand

Commit Message

Jonathan Gray Oct. 9, 2017, 12:39 p.m. UTC
Since
2460098cffacd18729262e3ed36656e6943783ed (fs/fat: Reduce stack usage)
Trying to load a file off a FAT fs on i.MX 6 based CuBox-i4Pro fails:

switch to partitions #0, OK
mmc0 is current device
Scanning mmc 0:1...
CACHE: Misaligned operation at range [8f89da30, 8f89e230]
CACHE: Misaligned operation at range [8f89da30, 8f89e230]
ERROR: v7_outer_cache_inval_range - start address is not aligned - 0x8f89da30
ERROR: v7_outer_cache_inval_range - stop address is not aligned - 0x8f89e230
CACHE: Misaligned operation at range [8f89da30, 8f89e230]
CACHE: Misaligned operation at range [8f89da30, 8f89e230]
ERROR: v7_outer_cache_inval_range - start address is not aligned - 0x8f89da30
ERROR: v7_outer_cache_inval_range - stop address is not aligned - 0x8f89e230
CACHE: Misaligned operation at range [8f89dca0, 8f89e4a0]
CACHE: Misaligned operation at range [8f89dca0, 8f89e4a0]
CACHE: Misaligned operation at range [8f89dca0, 8f89e4a0]
CACHE: Misaligned operation at range [8f89dca0, 8f89e4a0]
CACHE: Misaligned operation at range [8f89dc68, 8f89e468]
CACHE: Misaligned operation at range [8f89dc68, 8f89e468]
ERROR: v7_outer_cache_inval_range - start address is not aligned - 0x8f89dc68
ERROR: v7_outer_cache_inval_range - stop address is not aligned - 0x8f89e468
...

Switching the malloc() calls to malloc_cache_aligned() avoids
the alignment errors and allows booting to continue.

Signed-off-by: Jonathan Gray <jsg@jsg.id.au>
---
 fs/fat/fat.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

Comments

Fabio Estevam Oct. 9, 2017, 9:49 p.m. UTC | #1
On Mon, Oct 9, 2017 at 9:39 AM, Jonathan Gray <jsg@jsg.id.au> wrote:
> Since
> 2460098cffacd18729262e3ed36656e6943783ed (fs/fat: Reduce stack usage)
> Trying to load a file off a FAT fs on i.MX 6 based CuBox-i4Pro fails:
>
> switch to partitions #0, OK
> mmc0 is current device
> Scanning mmc 0:1...
> CACHE: Misaligned operation at range [8f89da30, 8f89e230]
> CACHE: Misaligned operation at range [8f89da30, 8f89e230]
> ERROR: v7_outer_cache_inval_range - start address is not aligned - 0x8f89da30
> ERROR: v7_outer_cache_inval_range - stop address is not aligned - 0x8f89e230
> CACHE: Misaligned operation at range [8f89da30, 8f89e230]
> CACHE: Misaligned operation at range [8f89da30, 8f89e230]
> ERROR: v7_outer_cache_inval_range - start address is not aligned - 0x8f89da30
> ERROR: v7_outer_cache_inval_range - stop address is not aligned - 0x8f89e230
> CACHE: Misaligned operation at range [8f89dca0, 8f89e4a0]
> CACHE: Misaligned operation at range [8f89dca0, 8f89e4a0]
> CACHE: Misaligned operation at range [8f89dca0, 8f89e4a0]
> CACHE: Misaligned operation at range [8f89dca0, 8f89e4a0]
> CACHE: Misaligned operation at range [8f89dc68, 8f89e468]
> CACHE: Misaligned operation at range [8f89dc68, 8f89e468]
> ERROR: v7_outer_cache_inval_range - start address is not aligned - 0x8f89dc68
> ERROR: v7_outer_cache_inval_range - stop address is not aligned - 0x8f89e468
> ...
>
> Switching the malloc() calls to malloc_cache_aligned() avoids
> the alignment errors and allows booting to continue.
>
> Signed-off-by: Jonathan Gray <jsg@jsg.id.au>

Tom has just applied the same fix:
http://git.denx.de/?p=u-boot.git;a=commitdiff;h=09fa964bba80c45432660f0e64362181900a5aef;hp=99e46dfc6a9176f6f0680c9dfdf33c97d56336ce
Tom Rini Oct. 9, 2017, 10:38 p.m. UTC | #2
On Mon, Oct 09, 2017 at 06:49:02PM -0300, Fabio Estevam wrote:
> On Mon, Oct 9, 2017 at 9:39 AM, Jonathan Gray <jsg@jsg.id.au> wrote:
> > Since
> > 2460098cffacd18729262e3ed36656e6943783ed (fs/fat: Reduce stack usage)
> > Trying to load a file off a FAT fs on i.MX 6 based CuBox-i4Pro fails:
> >
> > switch to partitions #0, OK
> > mmc0 is current device
> > Scanning mmc 0:1...
> > CACHE: Misaligned operation at range [8f89da30, 8f89e230]
> > CACHE: Misaligned operation at range [8f89da30, 8f89e230]
> > ERROR: v7_outer_cache_inval_range - start address is not aligned - 0x8f89da30
> > ERROR: v7_outer_cache_inval_range - stop address is not aligned - 0x8f89e230
> > CACHE: Misaligned operation at range [8f89da30, 8f89e230]
> > CACHE: Misaligned operation at range [8f89da30, 8f89e230]
> > ERROR: v7_outer_cache_inval_range - start address is not aligned - 0x8f89da30
> > ERROR: v7_outer_cache_inval_range - stop address is not aligned - 0x8f89e230
> > CACHE: Misaligned operation at range [8f89dca0, 8f89e4a0]
> > CACHE: Misaligned operation at range [8f89dca0, 8f89e4a0]
> > CACHE: Misaligned operation at range [8f89dca0, 8f89e4a0]
> > CACHE: Misaligned operation at range [8f89dca0, 8f89e4a0]
> > CACHE: Misaligned operation at range [8f89dc68, 8f89e468]
> > CACHE: Misaligned operation at range [8f89dc68, 8f89e468]
> > ERROR: v7_outer_cache_inval_range - start address is not aligned - 0x8f89dc68
> > ERROR: v7_outer_cache_inval_range - stop address is not aligned - 0x8f89e468
> > ...
> >
> > Switching the malloc() calls to malloc_cache_aligned() avoids
> > the alignment errors and allows booting to continue.
> >
> > Signed-off-by: Jonathan Gray <jsg@jsg.id.au>
> 
> Tom has just applied the same fix:
> http://git.denx.de/?p=u-boot.git;a=commitdiff;h=09fa964bba80c45432660f0e64362181900a5aef;hp=99e46dfc6a9176f6f0680c9dfdf33c97d56336ce

Oh heck, now I'm embarrassed for not recalling we had the same issue
with a fix in the queue, sorry!
diff mbox series

Patch

diff --git a/fs/fat/fat.c b/fs/fat/fat.c
index 3d3e17e8fa..d299f317a9 100644
--- a/fs/fat/fat.c
+++ b/fs/fat/fat.c
@@ -1038,7 +1038,7 @@  int fat_exists(const char *filename)
 	fat_itr *itr;
 	int ret;
 
-	itr = malloc(sizeof(fat_itr));
+	itr = malloc_cache_aligned(sizeof(fat_itr));
 	ret = fat_itr_root(itr, &fsdata);
 	if (ret)
 		return 0;
@@ -1055,7 +1055,7 @@  int fat_size(const char *filename, loff_t *size)
 	fat_itr *itr;
 	int ret;
 
-	itr = malloc(sizeof(fat_itr));
+	itr = malloc_cache_aligned(sizeof(fat_itr));
 	ret = fat_itr_root(itr, &fsdata);
 	if (ret)
 		return ret;
@@ -1089,7 +1089,7 @@  int file_fat_read_at(const char *filename, loff_t pos, void *buffer,
 	fat_itr *itr;
 	int ret;
 
-	itr = malloc(sizeof(fat_itr));
+	itr = malloc_cache_aligned(sizeof(fat_itr));
 	ret = fat_itr_root(itr, &fsdata);
 	if (ret)
 		return ret;