public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
* [U-Boot] [PATCH] fat: fix unaligned errors
@ 2009-01-02  0:54 Mike Frysinger
  2009-01-02  9:32 ` Remy Bohmer
  2009-01-02 22:20 ` Wolfgang Denk
  0 siblings, 2 replies; 9+ messages in thread
From: Mike Frysinger @ 2009-01-02  0:54 UTC (permalink / raw)
  To: u-boot

From: Bryan Wu <bryan.wu@analog.com>

A couple of buffers in the fat code are declared as an array of bytes.  But
it is then cast up to a structure with 16bit and 32bit members.  Since GCC
assumes structure alignment here, we have to force the buffers to be
aligned according to the structure usage.

Signed-off-by: Bryan Wu <bryan.wu@analog.com>
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
---
 fs/fat/fat.c |   19 +++++++++++++++----
 1 files changed, 15 insertions(+), 4 deletions(-)

diff --git a/fs/fat/fat.c b/fs/fat/fat.c
index a9dde7d..06736d9 100644
--- a/fs/fat/fat.c
+++ b/fs/fat/fat.c
@@ -429,12 +429,16 @@ slot2str(dir_slot *slotptr, char *l_name, int *idx)
 
 
 /*
+ * We need align this buffer to 16bit, cause it will be cast up to
+ * a dir_slot structure
+ */
+__u8 get_vfatname_block[MAX_CLUSTSIZE] __attribute__ ((aligned(sizeof(__u16))));
+/*
  * Extract the full long filename starting at 'retdent' (which is really
  * a slot) into 'l_name'. If successful also copy the real directory entry
  * into 'retdent'
  * Return 0 on success, -1 otherwise.
  */
-__u8	 get_vfatname_block[MAX_CLUSTSIZE];
 static int
 get_vfatname(fsdata *mydata, int curclust, __u8 *cluster,
 	     dir_entry *retdent, char *l_name)
@@ -517,10 +521,14 @@ mkcksum(const char *str)
 
 
 /*
+ * We need align this buffer to 32bit, cause it will be cast up to
+ * a dir_entry structure
+ */
+__u8 get_dentfromdir_block[MAX_CLUSTSIZE] __attribute__ ((aligned(sizeof(__u32))));
+/*
  * Get the directory entry associated with 'filename' from the directory
  * starting at 'startsect'
  */
-__u8 get_dentfromdir_block[MAX_CLUSTSIZE];
 static dir_entry *get_dentfromdir (fsdata * mydata, int startsect,
 				   char *filename, dir_entry * retdent,
 				   int dols)
@@ -725,8 +733,11 @@ read_bootsectandvi(boot_sector *bs, volume_info *volinfo, int *fatsize)
 	return -1;
 }
 
-
-__u8 do_fat_read_block[MAX_CLUSTSIZE];  /* Block buffer */
+/*
+ * We need align this buffer to 32bit, cause it will be cast up to
+ * a dir_entry structure
+ */
+__u8 do_fat_read_block[MAX_CLUSTSIZE] __attribute__ ((aligned(sizeof(__u32))));
 long
 do_fat_read (const char *filename, void *buffer, unsigned long maxsize,
 	     int dols)
-- 
1.6.0.6

^ permalink raw reply related	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2009-01-24  1:03 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-01-02  0:54 [U-Boot] [PATCH] fat: fix unaligned errors Mike Frysinger
2009-01-02  9:32 ` Remy Bohmer
2009-01-02 10:16   ` Mike Frysinger
2009-01-02 22:20 ` Wolfgang Denk
2009-01-02 22:42   ` Mike Frysinger
2009-01-02 23:48     ` Wolfgang Denk
2009-01-03  1:47       ` Mike Frysinger
2009-01-03  1:47       ` [U-Boot] [PATCH v2] " Mike Frysinger
2009-01-24  1:03         ` Wolfgang Denk

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox