From 53892fe9e3770882fd8f53f1a8a392d875175b4b Mon Sep 17 00:00:00 2001 From: Charles Manning Date: Sun, 30 Mar 2014 10:24:55 +1300 Subject: [PATCH] yaffs: Clean up bitfield types It happens that the C spec says compilers can choose whether to treat int bitfields as signed or unsigned. In some cases, int was being used and signed was expected. The IAR ARM compiler in particular treats int bitfields as unsigned. Clean up these plus a few other bitfield usages to make the size and type explicit. Thanks to ChungKang Hu for identifying this issue. Signed-off-by: Charles Manning --- direct/yaffsfs.c | 8 ++++---- direct/yportenv.h | 1 + yaffs_guts.h | 22 +++++++++++----------- yaffs_packedtags1.h | 14 +++++++------- 4 files changed, 23 insertions(+), 22 deletions(-) diff --git a/direct/yaffsfs.c b/direct/yaffsfs.c index 0b23133..a01155f 100644 --- a/direct/yaffsfs.c +++ b/direct/yaffsfs.c @@ -78,8 +78,8 @@ struct yaffsfs_DirSearchContext { struct yaffs_obj *dirObj; /* ptr to directory being searched */ struct yaffs_obj *nextReturn; /* obj returned by next readddir */ struct list_head others; - int offset:20; - unsigned inUse:1; + s32 offset:20; + u8 inUse:1; }; struct yaffsfs_FileDes { @@ -89,8 +89,8 @@ struct yaffsfs_FileDes { u8 append:1; u8 shareRead:1; u8 shareWrite:1; - int inodeId:12; /* Index to corresponding yaffsfs_Inode */ - int handleCount:10; /* Number of handles for this fd */ + s32 inodeId:12; /* Index to corresponding yaffsfs_Inode */ + s32 handleCount:10; /* Number of handles for this fd */ union { Y_LOFF_T position; /* current position in file */ yaffs_DIR *dir; diff --git a/direct/yportenv.h b/direct/yportenv.h index abc761b..d6e073d 100644 --- a/direct/yportenv.h +++ b/direct/yportenv.h @@ -23,6 +23,7 @@ typedef unsigned char u8; typedef unsigned short u16; typedef unsigned int u32; +typedef signed int s32; #endif diff --git a/yaffs_guts.h b/yaffs_guts.h index 98b607a..77bc7e9 100644 --- a/yaffs_guts.h +++ b/yaffs_guts.h @@ -144,12 +144,12 @@ struct yaffs_cache { */ struct yaffs_tags { - unsigned chunk_id:20; - unsigned serial_number:2; - unsigned n_bytes_lsb:10; - unsigned obj_id:18; - unsigned ecc:12; - unsigned n_bytes_msb:2; + u32 chunk_id:20; + u32 serial_number:2; + u32 n_bytes_lsb:10; + u32 obj_id:18; + u32 ecc:12; + u32 n_bytes_msb:2; }; union yaffs_tags_union { @@ -287,9 +287,9 @@ enum yaffs_block_state { struct yaffs_block_info { - int soft_del_pages:10; /* number of soft deleted pages */ - int pages_in_use:10; /* number of pages in use */ - unsigned block_state:4; /* One of the above block states. */ + s32 soft_del_pages:10; /* number of soft deleted pages */ + s32 pages_in_use:10; /* number of pages in use */ + u32 block_state:4; /* One of the above block states. */ /* NB use unsigned because enum is sometimes * an int */ u32 needs_retiring:1; /* Data has failed on this block, */ @@ -688,8 +688,8 @@ struct yaffs_dev { /* Block Info */ struct yaffs_block_info *block_info; u8 *chunk_bits; /* bitmap of chunks in use */ - unsigned block_info_alt:1; /* allocated using alternative alloc */ - unsigned chunk_bits_alt:1; /* allocated using alternative alloc */ + u8 block_info_alt:1; /* allocated using alternative alloc */ + u8 chunk_bits_alt:1; /* allocated using alternative alloc */ int chunk_bit_stride; /* Number of bytes of chunk_bits per block. * Must be consistent with chunks_per_block. */ diff --git a/yaffs_packedtags1.h b/yaffs_packedtags1.h index b80f0a5..3015d58 100644 --- a/yaffs_packedtags1.h +++ b/yaffs_packedtags1.h @@ -21,13 +21,13 @@ #include "yaffs_guts.h" struct yaffs_packed_tags1 { - unsigned chunk_id:20; - unsigned serial_number:2; - unsigned n_bytes:10; - unsigned obj_id:18; - unsigned ecc:12; - unsigned deleted:1; - unsigned unused_stuff:1; + u32 chunk_id:20; + u32 serial_number:2; + u32 n_bytes:10; + u32 obj_id:18; + u32 ecc:12; + u32 deleted:1; + u32 unused_stuff:1; unsigned should_be_ff; }; -- 2.30.2