From 18c016b4e0262bc2e23a193fc7c8fb92907303b1 Mon Sep 17 00:00:00 2001 From: Marcin Bukat Date: Tue, 8 May 2012 08:53:38 +0200 Subject: Fix test fat failing on 64bit system (second bit of FS#12646) We use unsigned long/long in number of places in fat.c. When this is used to cast 32bit fat field it fails on 64bit systems. This patch introduces explicit types (uint16_t, uint32_t) only in places which influence how fat structures are interpreted. Change-Id: I0be44d0b355f9de20b4deb221698d095f55d4bde Reviewed-on: http://gerrit.rockbox.org/232 Reviewed-by: Frank Gevaerts Reviewed-by: Torne Wuff --- firmware/drivers/fat.c | 62 +++++++++++++++++++++++----------------------- firmware/test/fat/Makefile | 6 ++--- 2 files changed, 34 insertions(+), 34 deletions(-) diff --git a/firmware/drivers/fat.c b/firmware/drivers/fat.c index 51b0cba372..e22f9507b0 100644 --- a/firmware/drivers/fat.c +++ b/firmware/drivers/fat.c @@ -131,9 +131,9 @@ static unsigned char FATLONG_NAME_SIZE[FATLONG_NAME_CHUNKS] = {10, 12, 4}; #define FAT_LONGNAME_PAD_UCS 0xffff struct fsinfo { - unsigned long freecount; /* last known free cluster count */ - unsigned long nextfree; /* first cluster to start looking for free - clusters, or 0xffffffff for no hint */ + uint32_t freecount; /* last known free cluster count */ + uint32_t nextfree; /* first cluster to start looking for free + clusters, or 0xffffffff for no hint */ }; /* fsinfo offsets */ #define FSINFO_FREECOUNT 488 @@ -511,11 +511,11 @@ int fat_mount(IF_MV2(int volume,) IF_MD2(int drive,) long startsector) fat_recalc_free(IF_MV(volume)); } - LDEBUGF("Freecount: %ld\n",fat_bpb->fsinfo.freecount); - LDEBUGF("Nextfree: 0x%lx\n",fat_bpb->fsinfo.nextfree); - LDEBUGF("Cluster count: 0x%lx\n",fat_bpb->dataclusters); + LDEBUGF("Freecount: %ld\n",(unsigned long)fat_bpb->fsinfo.freecount); + LDEBUGF("Nextfree: 0x%lx\n",(unsigned long)fat_bpb->fsinfo.nextfree); + LDEBUGF("Cluster count: 0x%lx\n",(unsigned long)fat_bpb->dataclusters); LDEBUGF("Sectors per cluster: %d\n",fat_bpb->bpb_secperclus); - LDEBUGF("FAT sectors: 0x%lx\n",fat_bpb->fatsize); + LDEBUGF("FAT sectors: 0x%lx\n",(unsigned long)fat_bpb->fatsize); #ifdef HAVE_MULTIVOLUME fat_bpb->mounted = true; @@ -576,7 +576,7 @@ void fat_recalc_free(IF_MV_NONVOID(int volume)) { for (i = 0; ifatsize; i++) { unsigned int j; - unsigned short* fat = cache_fat_sector(IF_MV2(fat_bpb,) i, false); + uint16_t* fat = cache_fat_sector(IF_MV2(fat_bpb,) i, false); for (j = 0; j < CLUSTERS_PER_FAT16_SECTOR; j++) { unsigned int c = i * CLUSTERS_PER_FAT16_SECTOR + j; if ( c > fat_bpb->dataclusters+1 ) /* nr 0 is unused */ @@ -595,7 +595,7 @@ void fat_recalc_free(IF_MV_NONVOID(int volume)) { for (i = 0; ifatsize; i++) { unsigned int j; - unsigned long* fat = cache_fat_sector(IF_MV2(fat_bpb,) i, false); + uint32_t* fat = cache_fat_sector(IF_MV2(fat_bpb,) i, false); for (j = 0; j < CLUSTERS_PER_FAT_SECTOR; j++) { unsigned long c = i * CLUSTERS_PER_FAT_SECTOR + j; if ( c > fat_bpb->dataclusters+1 ) /* nr 0 is unused */ @@ -656,7 +656,7 @@ static int bpb_is_sane(IF_MV_NONVOID(struct bpb* fat_bpb)) fat_bpb->bpb_secperclus) { DEBUGF( "bpb_is_sane() - Error: FSInfo.Freecount > disk size " - "(0x%04lx)\n", fat_bpb->fsinfo.freecount); + "(0x%04lx)\n", (unsigned long)fat_bpb->fsinfo.freecount); return -4; } @@ -785,7 +785,7 @@ static unsigned long find_free_cluster(IF_MV2(struct bpb* fat_bpb,) for (i = 0; ifatsize; i++) { unsigned int j; unsigned int nr = (i + sector) % fat_bpb->fatsize; - unsigned short* fat = cache_fat_sector(IF_MV2(fat_bpb,) nr, false); + uint16_t* fat = cache_fat_sector(IF_MV2(fat_bpb,) nr, false); if ( !fat ) break; for (j = 0; j < CLUSTERS_PER_FAT16_SECTOR; j++) { @@ -813,7 +813,7 @@ static unsigned long find_free_cluster(IF_MV2(struct bpb* fat_bpb,) for (i = 0; ifatsize; i++) { unsigned int j; unsigned long nr = (i + sector) % fat_bpb->fatsize; - unsigned long* fat = cache_fat_sector(IF_MV2(fat_bpb,) nr, false); + uint32_t* fat = cache_fat_sector(IF_MV2(fat_bpb,) nr, false); if ( !fat ) break; for (j = 0; j < CLUSTERS_PER_FAT_SECTOR; j++) { @@ -877,7 +877,7 @@ static int update_fat_entry(IF_MV2(struct bpb* fat_bpb,) unsigned long entry, } LDEBUGF("update_fat_entry: %lu free clusters\n", - fat_bpb->fsinfo.freecount); + (unsigned long)fat_bpb->fsinfo.freecount); sec[offset] = htole16(val); } @@ -886,7 +886,7 @@ static int update_fat_entry(IF_MV2(struct bpb* fat_bpb,) unsigned long entry, { long sector = entry / CLUSTERS_PER_FAT_SECTOR; int offset = entry % CLUSTERS_PER_FAT_SECTOR; - unsigned long* sec; + uint32_t* sec; LDEBUGF("update_fat_entry(%lx,%lx)\n",entry,val); @@ -914,7 +914,7 @@ static int update_fat_entry(IF_MV2(struct bpb* fat_bpb,) unsigned long entry, } LDEBUGF("update_fat_entry: %ld free clusters\n", - fat_bpb->fsinfo.freecount); + (unsigned long)fat_bpb->fsinfo.freecount); /* don't change top 4 bits */ sec[offset] &= htole32(0xf0000000); @@ -950,7 +950,7 @@ static long read_fat_entry(IF_MV2(struct bpb* fat_bpb,) unsigned long entry) { long sector = entry / CLUSTERS_PER_FAT_SECTOR; int offset = entry % CLUSTERS_PER_FAT_SECTOR; - unsigned long* sec; + uint32_t* sec; sec = cache_fat_sector(IF_MV2(fat_bpb,) sector, false); if (!sec) @@ -993,7 +993,7 @@ static int update_fsinfo(IF_MV_NONVOID(struct bpb* fat_bpb)) #ifndef HAVE_MULTIVOLUME struct bpb* fat_bpb = &fat_bpbs[0]; #endif - unsigned long* intptr; + uint32_t* intptr; int rc; #ifdef HAVE_FAT16SUPPORT @@ -1011,10 +1011,10 @@ static int update_fsinfo(IF_MV_NONVOID(struct bpb* fat_bpb)) DEBUGF( "update_fsinfo() - Couldn't read FSInfo (error code %d)", rc); return rc * 10 - 1; } - intptr = (long*)&(fsinfo[FSINFO_FREECOUNT]); + intptr = (uint32_t*)&(fsinfo[FSINFO_FREECOUNT]); *intptr = htole32(fat_bpb->fsinfo.freecount); - intptr = (long*)&(fsinfo[FSINFO_NEXTFREE]); + intptr = (uint32_t*)&(fsinfo[FSINFO_NEXTFREE]); *intptr = htole32(fat_bpb->fsinfo.nextfree); rc = storage_write_sectors(IF_MD2(fat_bpb->drive,) @@ -1625,8 +1625,8 @@ static void randomize_dos_name(unsigned char *name) static int update_short_entry( struct fat_file* file, long size, int attr ) { int sector = file->direntry / DIR_ENTRIES_PER_SECTOR; - unsigned long* sizeptr; - unsigned short* clusptr; + uint32_t* sizeptr; + uint16_t* clusptr; struct fat_file dir; int rc; @@ -1660,28 +1660,28 @@ static int update_short_entry( struct fat_file* file, long size, int attr ) entry[FATDIR_ATTR] = attr & 0xFF; - clusptr = (short*)(entry + FATDIR_FSTCLUSHI); + clusptr = (uint16_t*)(entry + FATDIR_FSTCLUSHI); *clusptr = htole16(file->firstcluster >> 16); - clusptr = (short*)(entry + FATDIR_FSTCLUSLO); + clusptr = (uint16_t*)(entry + FATDIR_FSTCLUSLO); *clusptr = htole16(file->firstcluster & 0xffff); - sizeptr = (long*)(entry + FATDIR_FILESIZE); + sizeptr = (uint32_t*)(entry + FATDIR_FILESIZE); *sizeptr = htole32(size); { #if CONFIG_RTC - unsigned short time = 0; - unsigned short date = 0; + uint16_t time = 0; + uint16_t date = 0; #else /* get old time to increment from */ - unsigned short time = htole16(*(unsigned short*)(entry+FATDIR_WRTTIME)); - unsigned short date = htole16(*(unsigned short*)(entry+FATDIR_WRTDATE)); + uint16_t time = htole16(*(uint16_t*)(entry+FATDIR_WRTTIME)); + uint16_t date = htole16(*(uint16_t*)(entry+FATDIR_WRTDATE)); #endif fat_time(&date, &time, NULL); - *(unsigned short*)(entry + FATDIR_WRTTIME) = htole16(time); - *(unsigned short*)(entry + FATDIR_WRTDATE) = htole16(date); - *(unsigned short*)(entry + FATDIR_LSTACCDATE) = htole16(date); + *(uint16_t*)(entry + FATDIR_WRTTIME) = htole16(time); + *(uint16_t*)(entry + FATDIR_WRTDATE) = htole16(date); + *(uint16_t*)(entry + FATDIR_LSTACCDATE) = htole16(date); } rc = fat_seek( &dir, sector ); diff --git a/firmware/test/fat/Makefile b/firmware/test/fat/Makefile index 3e04724f67..77c299dfca 100644 --- a/firmware/test/fat/Makefile +++ b/firmware/test/fat/Makefile @@ -7,15 +7,15 @@ BUILDDATE=$(shell date -u +'-DYEAR=%Y -DMONTH=%m -DDAY=%d') INCLUDE = -I$(EXPORT) -I$(FIRMWARE)/include -I$(FIRMWARE)/target/hosted -I$(FIRMWARE)/target/hosted/sdl DEFINES = -DTEST_FAT -DDEBUG -DDISK_WRITE -DHAVE_FAT16SUPPORT -D__PCTOOL__ -CFLAGS = -g -m32 -Wall -std=gnu99 -Wno-pointer-sign $(DEFINES) $(BUILDDATE) -I. $(INCLUDE) -I$(FIRMWARE)/libc/include -SIMFLAGS = -g -m32 -Wall -std=gnu99 -Wno-pointer-sign $(DEFINES) -I. $(INCLUDE) +CFLAGS = -g -Wall -std=gnu99 -Wno-pointer-sign $(DEFINES) $(BUILDDATE) -I. $(INCLUDE) -I$(FIRMWARE)/libc/include +SIMFLAGS = -g -Wall -std=gnu99 -Wno-pointer-sign $(DEFINES) -I. $(INCLUDE) TARGET = fat all: $(TARGET) $(TARGET): fat.o ata-sim.o main.o disk.o dir.o file.o ctype.o unicode.o strlcpy.o - gcc -g -m32 -o fat $+ + gcc -g -o fat $+ fat.o: $(DRIVERS)/fat.c $(EXPORT)/fat.h $(EXPORT)/ata.h $(CC) $(CFLAGS) -c $< -o $@ -- cgit v1.2.3