Trivial FATFS cleanup

Squashed commit of the following:

    fs/fat/fs_fat32util.c:  Most costmetic naming MBR to FBR in numerous locations.  Change some ferr macros to fwarn.  Use FBR macros insteac of MBR macros.

    Add definitions for the FAT boot record (FBR).

    fs/fat:  Clean up some name BS_ and MBR_ refer to the same record and should use the same naming (MBR_).
This commit is contained in:
Gregory Nutt 2018-07-22 08:42:15 -06:00
parent b75103e264
commit d77df925a3
2 changed files with 381 additions and 226 deletions

View File

@ -1,7 +1,8 @@
/****************************************************************************
* fs/fat/fs_fat32.h
*
* Copyright (C) 2007-2009, 2011, 2017 Gregory Nutt. All rights reserved.
* Copyright (C) 2007-2009, 2011, 2017-2018 Gregory Nutt. All rights
* reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
@ -56,86 +57,90 @@
****************************************************************************/
/****************************************************************************
* These offsets describes the master boot record.
* These offsets describes the master boot record (MBR).
*
* The following fields are common to FAT12/16/32 (but all value descriptions
* refer to the interpretation under FAT32).
*
* NOTE: This is an older form of the MBR that you will not often see
* documented. This older form is used with no partition table and includes
* the logical content of the FAT boot record use with partitions.
*/
#define BS_JUMP 0 /* 3@0: Jump instruction to boot code (ignored) */
#define BS_OEMNAME 3 /* 8@3: Usually "MSWIN4.1" */
#define BS_BYTESPERSEC 11 /* 2@11: Bytes per sector: 512, 1024, 2048, 4096 */
#define BS_SECPERCLUS 13 /* 1@13: Sectors per allocation unit: 2**n, n=0..7 */
#define BS_RESVDSECCOUNT 14 /* 2@14: Reserved sector count: Usually 32 */
#define BS_NUMFATS 16 /* 1@16: Number of FAT data structures: always 2 */
#define BS_ROOTENTCNT 17 /* 2@17: FAT12/16: Must be 0 for FAT32 */
#define BS_TOTSEC16 19 /* 2@19: FAT12/16: Must be 0, see BS_TOTSEC32 */
#define BS_MEDIA 21 /* 1@21: Media code: f0, f8, f9-fa, fc-ff */
#define BS_FATSZ16 22 /* 2@22: FAT12/16: Must be 0, see BS_FATSZ32 */
#define BS_SECPERTRK 24 /* 2@24: Sectors per track geometry value */
#define BS_NUMHEADS 26 /* 2@26: Number of heads geometry value */
#define BS_HIDSEC 28 /* 4@28: Count of hidden sectors preceding FAT */
#define BS_TOTSEC32 32 /* 4@32: Total count of sectors on the volume */
#define MBR_JUMP 0 /* 3@0: Jump instruction to boot code (ignored) */
#define MBR_OEMNAME 3 /* 8@3: Usually "MSWIN4.1" */
#define MBR_BYTESPERSEC 11 /* 2@11: Bytes per sector: 512, 1024, 2048, 4096 */
#define MBR_SECPERCLUS 13 /* 1@13: Sectors per allocation unit: 2**n, n=0..7 */
#define MBR_RESVDSECCOUNT 14 /* 2@14: Reserved sector count: Usually 32 */
#define MBR_NUMFATS 16 /* 1@16: Number of FAT data structures: always 2 */
#define MBR_ROOTENTCNT 17 /* 2@17: FAT12/16: Must be 0 for FAT32 */
#define MBR_TOTSEC16 19 /* 2@19: FAT12/16: Must be 0, see MBR_TOTSEC32 */
#define MBR_MEDIA 21 /* 1@21: Media code: f0, f8, f9-fa, fc-ff */
#define MBR_FATSZ16 22 /* 2@22: FAT12/16: Must be 0, see MBR_FATSZ32 */
#define MBR_SECPERTRK 24 /* 2@24: Sectors per track geometry value */
#define MBR_NUMHEADS 26 /* 2@26: Number of heads geometry value */
#define MBR_HIDSEC 28 /* 4@28: Count of hidden sectors preceding FAT */
#define MBR_TOTSEC32 32 /* 4@32: Total count of sectors on the volume */
/* The following fields are only valid for FAT12/16 */
#define BS16_DRVNUM 36 /* 1@36: Drive number for MSDOS bootstrap */
/* 1@37: Reserved (zero) */
#define BS16_BOOTSIG 38 /* 1@38: Extended boot signature: 0x29 if following valid */
#define BS16_VOLID 39 /* 4@39: Volume serial number */
#define BS16_VOLLAB 43 /* 11@43: Volume label */
#define BS16_FILESYSTYPE 54 /* 8@54: "FAT12 ", "FAT16 ", or "FAT " */
#define MBR16_DRVNUM 36 /* 1@36: Drive number for MSDOS bootstrap */
/* 1@37: Reserved (zero) */
#define MBR16_BOOTSIG 38 /* 1@38: Extended boot signature: 0x29 if following valid */
#define MBR16_VOLID 39 /* 4@39: Volume serial number */
#define MBR16_VOLLAB 43 /* 11@43: Volume label */
#define MBR16_FILESYSTYPE 54 /* 8@54: "FAT12 ", "FAT16 ", or "FAT " */
#define BS16_BOOTCODE 62 /* Boot code may be placed in the remainder of the sector */
#define BS16_BOOTCODESIZE 448
#define MBR16_BOOTCODE 62 /* Boot code may be placed in the remainder of the sector */
#define MBR16_BOOTCODESIZE 448
/* The following fields are only valid for FAT32 */
#define BS32_FATSZ32 36 /* 4@36: Count of sectors occupied by one FAT */
#define BS32_EXTFLAGS 40 /* 2@40: 0-3:Active FAT, 7=0 both FATS, 7=1 one FAT */
#define BS32_FSVER 42 /* 2@42: MSB:Major LSB:Minor revision number (0.0) */
#define BS32_ROOTCLUS 44 /* 4@44: Cluster no. of 1st cluster of root dir */
#define BS32_FSINFO 48 /* 2@48: Sector number of fsinfo structure. Usually 1. */
#define BS32_BKBOOTSEC 50 /* 2@50: Sector number of boot record. Usually 6 */
/* 12@52: Reserved (zero) */
#define BS32_DRVNUM 64 /* 1@64: Drive number for MSDOS bootstrap */
/* 1@65: Reserved (zero) */
#define BS32_BOOTSIG 66 /* 1@66: Extended boot signature: 0x29 if following valid */
#define BS32_VOLID 67 /* 4@67: Volume serial number */
#define BS32_VOLLAB 71 /* 11@71: Volume label */
#define BS32_FILESYSTYPE 82 /* 8@82: "FAT12 ", "FAT16 ", or "FAT " */
#define MBR32_FATSZ32 36 /* 4@36: Count of sectors occupied by one FAT */
#define MBR32_EXTFLAGS 40 /* 2@40: 0-3:Active FAT, 7=0 both FATS, 7=1 one FAT */
#define MBR32_FSVER 42 /* 2@42: MSB:Major LSB:Minor revision number (0.0) */
#define MBR32_ROOTCLUS 44 /* 4@44: Cluster no. of 1st cluster of root dir */
#define MBR32_FSINFO 48 /* 2@48: Sector number of fsinfo structure. Usually 1. */
#define MBR32_BKBOOTSEC 50 /* 2@50: Sector number of boot record. Usually 6 */
/* 12@52: Reserved (zero) */
#define MBR32_DRVNUM 64 /* 1@64: Drive number for MSDOS bootstrap */
/* 1@65: Reserved (zero) */
#define MBR32_BOOTSIG 66 /* 1@66: Extended boot signature: 0x29 if following valid */
#define MBR32_VOLID 67 /* 4@67: Volume serial number */
#define MBR32_VOLLAB 71 /* 11@71: Volume label */
#define MBR32_FILESYSTYPE 82 /* 8@82: "FAT12 ", "FAT16 ", or "FAT " */
#define BS32_BOOTCODE 90 /* Boot code may be placed in the remainder of the sector */
#define BS32_BOOTCODESIZE 420
#define MBR32_BOOTCODE 90 /* Boot code may be placed in the remainder of the sector */
#define MBR32_BOOTCODESIZE 420
/* If the sector is not an MBR, then it could have a partition table at
* this offset.
*/
#define MBR_TABLE 446
#define MBR_TABLE 446
/* The magic bytes at the end of the MBR are common to FAT12/16/32 */
#define BS_SIGNATURE 510 /* 2@510: Valid MBRs have 0x55aa here */
#define MBR_SIGNATURE 510 /* 2@510: Valid MBRs have 0x55aa here */
#define BOOT_SIGNATURE16 0xaa55
#define BOOT_SIGNATURE32 0xaa550000
#define BOOT_SIGNATURE16 0xaa55
#define BOOT_SIGNATURE32 0xaa550000
/* The extended boot signature (BS16/32_BOOTSIG) */
#define EXTBOOT_SIGNATURE 0x29
#define EXTBOOT_SIGNATURE 0x29
/****************************************************************************
* These offsets describes the partition table.
* These offsets describes the partition tables in the MBR
*/
/* 446@0: Generally unused and zero; but may
* include IDM Boot Manager menu entry at 8@394 */
#define PART_ENTRY(n) (446+((n) << 4)) /* n = 0,1,2,3 */
#define PART_ENTRY1 446 /* 16@446: Partition table, first entry */
#define PART_ENTRY2 462 /* 16@462: Partition table, second entry */
#define PART_ENTRY3 478 /* 16@478: Partition table, third entry */
#define PART_ENTRY4 494 /* 16@494: Partition table, fourth entry */
#define PART_SIGNATURE 510 /* 2@510: Valid partitions have 0x55aa here */
/* 446@0: Generally unused and zero; but may
* include IDM Boot Manager menu entry at 8@394 */
#define PART_ENTRY(n) (446+((n) << 4)) /* n = 0,1,2,3 */
#define PART_ENTRY1 446 /* 16@446: Partition table, first entry */
#define PART_ENTRY2 462 /* 16@462: Partition table, second entry */
#define PART_ENTRY3 478 /* 16@478: Partition table, third entry */
#define PART_ENTRY4 494 /* 16@494: Partition table, fourth entry */
#define PART_SIGNATURE 510 /* 2@510: Valid partitions have 0x55aa here */
/****************************************************************************
* These offsets describes one partition table entry. NOTE that ent entries
@ -143,26 +148,80 @@
* not properly aligned.
*/
#define PART_BOOTINDICATOR 0 /* 1@0: Boot indicator (0x80: active;0x00:otherwise) */
#define PART_STARTCHS 1 /* 3@1: Starting Cylinder/Head/Sector values */
#define PART_TYPE 4 /* 1@4: Partition type description */
#define PART_ENDCHS 5 /* 3@5: Ending Cylinder/Head/Sector values */
#define PART_STARTSECTOR 8 /* 4@8: Starting sector */
#define PART_SIZE 12 /* 4@12: Partition size (in sectors) */
#define PART_BOOTINDICATOR 0 /* 1@0: Boot indicator (0x80: active;0x00:otherwise) */
#define PART_STARTCHS 1 /* 3@1: Starting Cylinder/Head/Sector values */
#define PART_TYPE 4 /* 1@4: Partition type description */
#define PART_ENDCHS 5 /* 3@5: Ending Cylinder/Head/Sector values */
#define PART_STARTSECTOR 8 /* 4@8: Starting sector */
#define PART_SIZE 12 /* 4@12: Partition size (in sectors) */
/****************************************************************************
* Partition table types.
*/
#define PART_TYPE_NONE 0 /* No partition */
#define PART_TYPE_FAT12 1 /* FAT12 */
#define PART_TYPE_FAT16A 4 /* FAT16 (Partition smaller than 32MB) */
#define PART_TYPE_EXT 5 /* Extended MS-DOS Partition */
#define PART_TYPE_FAT16B 6 /* FAT16 (Partition larger than 32MB) */
#define PART_TYPE_FAT32 11 /* FAT32 (Partition up to 2048Gb) */
#define PART_TYPE_FAT32X 12 /* Same as 11, but uses LBA1 0x13 extensions */
#define PART_TYPE_FAT16X 14 /* Same as 6, but uses LBA1 0x13 extensions */
#define PART_TYPE_EXTX 15 /* Same as 5, but uses LBA1 0x13 extensions */
#define PART_TYPE_NONE 0 /* No partition */
#define PART_TYPE_FAT12 1 /* FAT12 */
#define PART_TYPE_FAT16A 4 /* FAT16 (Partition smaller than 32MB) */
#define PART_TYPE_EXT 5 /* Extended MS-DOS Partition */
#define PART_TYPE_FAT16B 6 /* FAT16 (Partition larger than 32MB) */
#define PART_TYPE_FAT32 11 /* FAT32 (Partition up to 2048Gb) */
#define PART_TYPE_FAT32X 12 /* Same as 11, but uses LBA1 0x13 extensions */
#define PART_TYPE_FAT16X 14 /* Same as 6, but uses LBA1 0x13 extensions */
#define PART_TYPE_EXTX 15 /* Same as 5, but uses LBA1 0x13 extensions */
/****************************************************************************
* Fat Boot Record (FBR).
*
* The FBR is always the very first sector in the partition. Validity check
* is performed by comparing the 16 bit word at offset 1FE to AA55. The
* structure of the FBR is shown below.
*
* NOTE that the fields of the FBR are equivalent to the MBR. This fact is
* explicitly assumed in the function fat_checkbootrecord() which will
* operate on either an MBR or an FBR.
*/
#define FBR_OEMNAME 3 /* 8@3: Usually "MSWIN4.1" */
#define FBR_BYTESPERSEC 11 /* 2@11: Bytes per sector: 512, 1024, 2048, 4096 */
#define FBR_SECPERCLUS 13 /* 1@13: Sectors per allocation unit: 2**n, n=0..7 */
#define FBR_RESVDSECCOUNT 14 /* 2@14: Reserved sector count: Usually 32 */
#define FBR_NUMFATS 16 /* 1@16: Number of FAT data structures: always 2 */
#define FBR_ROOTENTCNT 17 /* 2@17: FAT12/16: Must be 0 for FAT32 */
#define FBR_TOTSEC16 19 /* 2@19: FAT12/16: Must be 0, see FBR_TOTSEC32 */
#define FBR_MEDIA 21 /* 1@21: Media code: f0, f8, f9-fa, fc-ff */
#define FBR_FATSZ16 22 /* 2@22: FAT12/16: Must be 0, see FBR_FATSZ32 */
#define FBR_SECPERTRK 24 /* 2@24: Sectors per track geometry value */
#define FBR_NUMHEADS 26 /* 2@26: Number of heads geometry value */
#define FBR_HIDSEC 28 /* 4@28: Count of hidden sectors preceding FAT */
#define FBR_TOTSEC32 32 /* 4@32: Total count of sectors on the volume */
#define FBR_FATSZ32 36 /* 4@36: Count of sectors occupied by one FAT (FAT32) */
#define FBR_EXTFLAGS 40 /* 2@40: Ext Flags */
#define FBR_FSVER 42 /* 2@42: FS Version */
#define FBR_ROOTCLUS 44 /* 4@44: Cluster no. of 1st cluster of root dir */
#define FBR_FSINFO 48 /* 2@48: FS Info Sector */
#define FBR_BKBOOTSEC 50 /* 2@50: Sector number of boot record. Usually 6 */
/* 52-301 Reserved */
/* The following fields are only valid for FAT12/16 */
#define FBR16_DRVNUM 36 /* 1@36: Drive number for MSDOS bootstrap */
/* 1@37: Reserved (zero) */
#define FBR16_BOOTSIG 38 /* 1@38: Extended boot signature: 0x29 if following valid */
#define FBR16_VOLID 39 /* 4@39: Volume serial number */
#define FBR16_VOLLAB 43 /* 11@43: Volume label */
#define FBR16_FILESYSTYPE 54 /* 8@54: "FAT12 ", "FAT16 ", or "FAT " */
/* The following fields are only valid for FAT32 */
#define FBR32_DRVNUM 64 /* 1@64: Drive number for MSDOS bootstrap */
#define FBR32_BOOTSIG 65 /* 1@65: Extended boot signature: 0x29 if following valid */
#define FBR32_VOLID 66 /* 4@66: Volume serial number */
#define FBR32_VOLLAB 71 /* 11@71: Volume label */
#define FBR32_FILESYSTYPE 82 /* 8@62: "FAT12 ", "FAT16 ", or "FAT " */
/* The magic bytes at the end of the MBR are common to FAT12/16/32 */
#define FBR_SIGNATURE 510 /* 2@510: Valid MBRs have 0x55aa here */
/****************************************************************************
* Each FAT "short" 8.3 file name directory entry is 32-bytes long.
@ -176,37 +235,37 @@
* Sizes and limits
*/
#define DIR_MAXFNAME 11 /* Max short name size is 8+3 = 11 */
#define DIR_MAXFNAME 11 /* Max short name size is 8+3 = 11 */
/* The following define offsets relative to the beginning of a directory
* entry.
*/
#define DIR_NAME 0 /* 11@ 0: NAME: 8 bytes + 3 byte extension */
#define DIR_ATTRIBUTES 11 /* 1@11: File attibutes (see below) */
#define DIR_NTRES 12 /* 1@12: Reserved for use by NT */
#define DIR_CRTTIMETENTH 13 /* 1@13: Tenth sec creation timestamp */
#define DIR_CRTIME 14 /* 2@14: Time file created */
#define DIR_CRDATE 16 /* 2@16: Date file created */
#define DIR_LASTACCDATE 18 /* 2@19: Last access date */
#define DIR_FSTCLUSTHI 20 /* 2@20: MS first cluster number */
#define DIR_WRTTIME 22 /* 2@22: Time of last write */
#define DIR_WRTDATE 24 /* 2@24: Date of last write */
#define DIR_FSTCLUSTLO 26 /* 2@26: LS first cluster number */
#define DIR_FILESIZE 28 /* 4@28: File size in bytes */
#define DIR_SIZE 32 /* The size of one directory entry */
#define DIR_SHIFT 5 /* log2 of DIR_SIZE */
#define DIR_NAME 0 /* 11@ 0: NAME: 8 bytes + 3 byte extension */
#define DIR_ATTRIBUTES 11 /* 1@11: File attibutes (see below) */
#define DIR_NTRES 12 /* 1@12: Reserved for use by NT */
#define DIR_CRTTIMETENTH 13 /* 1@13: Tenth sec creation timestamp */
#define DIR_CRTIME 14 /* 2@14: Time file created */
#define DIR_CRDATE 16 /* 2@16: Date file created */
#define DIR_LASTACCDATE 18 /* 2@19: Last access date */
#define DIR_FSTCLUSTHI 20 /* 2@20: MS first cluster number */
#define DIR_WRTTIME 22 /* 2@22: Time of last write */
#define DIR_WRTDATE 24 /* 2@24: Date of last write */
#define DIR_FSTCLUSTLO 26 /* 2@26: LS first cluster number */
#define DIR_FILESIZE 28 /* 4@28: File size in bytes */
#define DIR_SIZE 32 /* The size of one directory entry */
#define DIR_SHIFT 5 /* log2 of DIR_SIZE */
/* First byte of the directory name has special meanings: */
#define DIR0_EMPTY 0xe5 /* The directory entry is empty */
#define DIR0_ALLEMPTY 0x00 /* This entry and all following are empty */
#define DIR0_E5 0x05 /* The actual value is 0xe5 */
#define DIR0_EMPTY 0xe5 /* The directory entry is empty */
#define DIR0_ALLEMPTY 0x00 /* This entry and all following are empty */
#define DIR0_E5 0x05 /* The actual value is 0xe5 */
/* NTRES flags in the FAT directory */
#define FATNTRES_LCNAME 0x08 /* Lower case in name */
#define FATNTRES_LCEXT 0x10 /* Lower case in extension */
#define FATNTRES_LCNAME 0x08 /* Lower case in name */
#define FATNTRES_LCEXT 0x10 /* Lower case in extension */
/* Directory indexing helper. Each directory entry is 32-bytes in length.
* The number of directory entries in a sector then varies with the size
@ -248,19 +307,19 @@
# error "Illegal value for CONFIG_FAT_MAXFNAME"
# endif
# define LDIR_MAXLFNCHARS 13 /* Max unicode characters in one LFN entry */
# define LDIR_MAXLFNS 20 /* Max number of LFN entries */
# define LDIR_MAXLFNCHARS 13 /* Max unicode characters in one LFN entry */
# define LDIR_MAXLFNS 20 /* Max number of LFN entries */
/* LFN directory entry offsets */
# define LDIR_SEQ 0 /* 1@ 0: Sequence number */
# define LDIR_WCHAR1_5 1 /* 10@ 1: File name characters 1-5 (5 Unicode characters) */
# define LDIR_ATTRIBUTES 11 /* 1@11: File attributes (always 0x0f) */
# define LDIR_NTRES 12 /* 1@12: Reserved for use by NT (always 0x00) */
# define LDIR_CHECKSUM 13 /* 1@13: Checksum of the DOS filename */
# define LDIR_WCHAR6_11 14 /* 12@14: File name characters 6-11 (6 Unicode characters) */
# define LDIR_FSTCLUSTLO 26 /* 2@26: First cluster (always 0x0000) */
# define LDIR_WCHAR12_13 28 /* 4@28: File name characters 12-13 (2 Unicode characters) */
# define LDIR_SEQ 0 /* 1@ 0: Sequence number */
# define LDIR_WCHAR1_5 1 /* 10@ 1: File name characters 1-5 (5 Unicode characters) */
# define LDIR_ATTRIBUTES 11 /* 1@11: File attributes (always 0x0f) */
# define LDIR_NTRES 12 /* 1@12: Reserved for use by NT (always 0x00) */
# define LDIR_CHECKSUM 13 /* 1@13: Checksum of the DOS filename */
# define LDIR_WCHAR6_11 14 /* 12@14: File name characters 6-11 (6 Unicode characters) */
# define LDIR_FSTCLUSTLO 26 /* 2@26: First cluster (always 0x0000) */
# define LDIR_WCHAR12_13 28 /* 4@28: File name characters 12-13 (2 Unicode characters) */
/* LFN sequence number and allocation status */
@ -278,38 +337,38 @@
/****************************************************************************
* File system types */
#define FSTYPE_FAT12 0
#define FSTYPE_FAT16 1
#define FSTYPE_FAT32 2
#define FSTYPE_FAT12 0
#define FSTYPE_FAT16 1
#define FSTYPE_FAT32 2
/* File buffer flags (ff_bflags) */
#define FFBUFF_VALID 1
#define FFBUFF_DIRTY 2
#define FFBUFF_MODIFIED 4
#define FFBUFF_VALID 1
#define FFBUFF_DIRTY 2
#define FFBUFF_MODIFIED 4
/* Mount status flags (ff_bflags) */
#define UMOUNT_FORCED 8
#define UMOUNT_FORCED 8
/****************************************************************************
* These offset describe the FSINFO sector
*/
#define FSI_LEADSIG 0 /* 4@0: 0x41615252 = "RRaA" */
/* 480@4: Reserved (zero) */
#define FSI_STRUCTSIG 484 /* 4@484: 0x61417272 = "rrAa" */
#define FSI_FREECOUNT 488 /* 4@488: Last free cluster count on volume */
#define FSI_NXTFREE 492 /* 4@492: Cluster number of 1st free cluster */
/* 12@496: Reserved (zero) */
#define FSI_TRAILSIG 508 /* 4@508: 0xaa550000 */
#define FSI_LEADSIG 0 /* 4@0: 0x41615252 = "RRaA" */
/* 480@4: Reserved (zero) */
#define FSI_STRUCTSIG 484 /* 4@484: 0x61417272 = "rrAa" */
#define FSI_FREECOUNT 488 /* 4@488: Last free cluster count on volume */
#define FSI_NXTFREE 492 /* 4@492: Cluster number of 1st free cluster */
/* 12@496: Reserved (zero) */
#define FSI_TRAILSIG 508 /* 4@508: 0xaa550000 */
/****************************************************************************
* FAT values
*/
#define FAT_EOF 0x0ffffff8
#define FAT_BAD 0x0ffffff7
#define FAT_EOF 0x0ffffff8
#define FAT_BAD 0x0ffffff7
/****************************************************************************
* Maximum cluster by FAT type. This is the key value used to distinquish
@ -360,13 +419,21 @@
* accessed byte-by-byte for big-endian targets.
*/
#define MBR_GETSECPERCLUS(p) UBYTE_VAL(p,BS_SECPERCLUS)
#define MBR_GETNUMFATS(p) UBYTE_VAL(p,BS_NUMFATS)
#define MBR_GETMEDIA(p) UBYTE_VAL(p,BS_MEDIA)
#define MBR_GETDRVNUM16(p) UBYTE_VAL(p,BS16_DRVNUM)
#define MBR_GETDRVNUM32(p) UBYTE_VAL(p,BS32_DRVNUM)
#define MBR_GETBOOTSIG16(p) UBYTE_VAL(p,BS16_BOOTSIG)
#define MBR_GETBOOTSIG32(p) UBYTE_VAL(p,BS32_BOOTSIG)
#define MBR_GETSECPERCLUS(p) UBYTE_VAL(p,MBR_SECPERCLUS)
#define MBR_GETNUMFATS(p) UBYTE_VAL(p,MBR_NUMFATS)
#define MBR_GETMEDIA(p) UBYTE_VAL(p,MBR_MEDIA)
#define MBR_GETDRVNUM16(p) UBYTE_VAL(p,MBR16_DRVNUM)
#define MBR_GETDRVNUM32(p) UBYTE_VAL(p,MBR32_DRVNUM)
#define MBR_GETBOOTSIG16(p) UBYTE_VAL(p,MBR16_BOOTSIG)
#define MBR_GETBOOTSIG32(p) UBYTE_VAL(p,MBR32_BOOTSIG)
#define FBR_GETSECPERCLUS(p) UBYTE_VAL(p,FBR_SECPERCLUS)
#define FBR_GETNUMFATS(p) UBYTE_VAL(p,FBR_NUMFATS)
#define FBR_GETMEDIA(p) UBYTE_VAL(p,FBR_MEDIA)
#define FBR_GETDRVNUM16(p) UBYTE_VAL(p,FBR16_DRVNUM)
#define FBR_GETDRVNUM32(p) UBYTE_VAL(p,FBR32_DRVNUM)
#define FBR_GETBOOTSIG16(p) UBYTE_VAL(p,FBR16_BOOTSIG)
#define FBR_GETBOOTSIG32(p) UBYTE_VAL(p,FBR32_BOOTSIG)
#define PART_GETTYPE(n,p) UBYTE_VAL(p,PART_ENTRY(n)+PART_TYPE)
#define PART1_GETTYPE(p) UBYTE_VAL(p,PART_ENTRY1+PART_TYPE)
@ -385,13 +452,21 @@
# define LDIR_GETCHECKSUM(p) UBYTE_VAL(p,LDIR_CHECKSUM)
#endif
#define MBR_PUTSECPERCLUS(p,v) UBYTE_PUT(p,BS_SECPERCLUS,v)
#define MBR_PUTNUMFATS(p,v) UBYTE_PUT(p,BS_NUMFATS,v)
#define MBR_PUTMEDIA(p,v) UBYTE_PUT(p,BS_MEDIA,v)
#define MBR_PUTDRVNUM16(p,v) UBYTE_PUT(p,BS16_DRVNUM,v)
#define MBR_PUTDRVNUM32(p,v) UBYTE_PUT(p,BS32_DRVNUM,v)
#define MBR_PUTBOOTSIG16(p,v) UBYTE_PUT(p,BS16_BOOTSIG,v)
#define MBR_PUTBOOTSIG32(p,v) UBYTE_PUT(p,BS32_BOOTSIG,v)
#define MBR_PUTSECPERCLUS(p,v) UBYTE_PUT(p,MBR_SECPERCLUS,v)
#define MBR_PUTNUMFATS(p,v) UBYTE_PUT(p,MBR_NUMFATS,v)
#define MBR_PUTMEDIA(p,v) UBYTE_PUT(p,MBR_MEDIA,v)
#define MBR_PUTDRVNUM16(p,v) UBYTE_PUT(p,MBR16_DRVNUM,v)
#define MBR_PUTDRVNUM32(p,v) UBYTE_PUT(p,MBR32_DRVNUM,v)
#define MBR_PUTBOOTSIG16(p,v) UBYTE_PUT(p,MBR16_BOOTSIG,v)
#define MBR_PUTBOOTSIG32(p,v) UBYTE_PUT(p,MBR32_BOOTSIG,v)
#define FBR_PUTSECPERCLUS(p,v) UBYTE_PUT(p,FBR_SECPERCLUS,v)
#define FBR_PUTNUMFATS(p,v) UBYTE_PUT(p,FBR_NUMFATS,v)
#define FBR_PUTMEDIA(p,v) UBYTE_PUT(p,FBR_MEDIA,v)
#define FBR_PUTDRVNUM16(p,v) UBYTE_PUT(p,FBR16_DRVNUM,v)
#define FBR_PUTDRVNUM32(p,v) UBYTE_PUT(p,FBR32_DRVNUM,v)
#define FBR_PUTBOOTSIG16(p,v) UBYTE_PUT(p,FBR16_BOOTSIG,v)
#define FBR_PUTBOOTSIG32(p,v) UBYTE_PUT(p,FBR32_BOOTSIG,v)
#define PART_PUTTYPE(n,p,v) UBYTE_PUT(p,PART_ENTRY(n)+PART_TYPE,v)
#define PART1_PUTTYPE(p,v) UBYTE_PUT(p,PART_ENTRY1+PART_TYPE,v)
@ -417,11 +492,17 @@
/* Unaligned multi-byte access macros */
#define MBR_GETBYTESPERSEC(p) fat_getuint16(UBYTE_PTR(p,BS_BYTESPERSEC))
#define MBR_GETROOTENTCNT(p) fat_getuint16(UBYTE_PTR(p,BS_ROOTENTCNT))
#define MBR_GETTOTSEC16(p) fat_getuint16(UBYTE_PTR(p,BS_TOTSEC16))
#define MBR_GETVOLID16(p) fat_getuint32(UBYTE_PTR(p,BS16_VOLID))
#define MBR_GETVOLID32(p) fat_getuint32(UBYTE_PTR(p,BS32_VOLID))
#define MBR_GETBYTESPERSEC(p) fat_getuint16(UBYTE_PTR(p,MBR_BYTESPERSEC))
#define MBR_GETROOTENTCNT(p) fat_getuint16(UBYTE_PTR(p,MBR_ROOTENTCNT))
#define MBR_GETTOTSEC16(p) fat_getuint16(UBYTE_PTR(p,MBR_TOTSEC16))
#define MBR_GETVOLID16(p) fat_getuint32(UBYTE_PTR(p,MBR16_VOLID))
#define MBR_GETVOLID32(p) fat_getuint32(UBYTE_PTR(p,MBR32_VOLID))
#define FBR_GETBYTESPERSEC(p) fat_getuint16(UBYTE_PTR(p,FBR_BYTESPERSEC))
#define FBR_GETROOTENTCNT(p) fat_getuint16(UBYTE_PTR(p,FBR_ROOTENTCNT))
#define FBR_GETTOTSEC16(p) fat_getuint16(UBYTE_PTR(p,FBR_TOTSEC16))
#define FBR_GETVOLID16(p) fat_getuint32(UBYTE_PTR(p,FBR16_VOLID))
#define FBR_GETVOLID32(p) fat_getuint32(UBYTE_PTR(p,FBR32_VOLID))
#define PART_GETSTARTSECTOR(n,p) fat_getuint32(UBYTE_PTR(p,PART_ENTRY(n)+PART_STARTSECTOR))
#define PART_GETSIZE(n,p) fat_getuint32(UBYTE_PTR(p,PART_ENTRY(n)+PART_SIZE))
@ -434,11 +515,17 @@
#define PART4_GETSTARTSECTOR(p) fat_getuint32(UBYTE_PTR(p,PART_ENTRY4+PART_STARTSECTOR))
#define PART4_GETSIZE(p) fat_getuint32(UBYTE_PTR(p,PART_ENTRY4+PART_SIZE))
#define MBR_PUTBYTESPERSEC(p,v) fat_putuint16(UBYTE_PTR(p,BS_BYTESPERSEC),v)
#define MBR_PUTROOTENTCNT(p,v) fat_putuint16(UBYTE_PTR(p,BS_ROOTENTCNT),v)
#define MBR_PUTTOTSEC16(p,v) fat_putuint16(UBYTE_PTR(p,BS_TOTSEC16),v)
#define MBR_PUTVOLID16(p,v) fat_putuint32(UBYTE_PTR(p,BS16_VOLID),v)
#define MBR_PUTVOLID32(p,v) fat_putuint32(UBYTE_PTR(p,BS32_VOLID),v)
#define MBR_PUTBYTESPERSEC(p,v) fat_putuint16(UBYTE_PTR(p,MBR_BYTESPERSEC),v)
#define MBR_PUTROOTENTCNT(p,v) fat_putuint16(UBYTE_PTR(p,MBR_ROOTENTCNT),v)
#define MBR_PUTTOTSEC16(p,v) fat_putuint16(UBYTE_PTR(p,MBR_TOTSEC16),v)
#define MBR_PUTVOLID16(p,v) fat_putuint32(UBYTE_PTR(p,MBR16_VOLID),v)
#define MBR_PUTVOLID32(p,v) fat_putuint32(UBYTE_PTR(p,MBR32_VOLID),v)
#define FBR_PUTBYTESPERSEC(p,v) fat_putuint16(UBYTE_PTR(p,FBR_BYTESPERSEC),v)
#define FBR_PUTROOTENTCNT(p,v) fat_putuint16(UBYTE_PTR(p,FBR_ROOTENTCNT),v)
#define FBR_PUTTOTSEC16(p,v) fat_putuint16(UBYTE_PTR(p,FBR_TOTSEC16),v)
#define FBR_PUTVOLID16(p,v) fat_putuint32(UBYTE_PTR(p,FBR16_VOLID),v)
#define FBR_PUTVOLID32(p,v) fat_putuint32(UBYTE_PTR(p,FBR32_VOLID),v)
#define PART_PUTSTARTSECTOR(n,p,v) fat_putuint32(UBYTE_PTR(p,PART_ENTRY(n)+PART_STARTSECTOR),v)
#define PART_PUTSIZE(n,p,v) fat_putuint32(UBYTE_PTR(p,PART_ENTRY(n)+PART_SIZE),v)
@ -468,19 +555,33 @@
* accessed byte-by-byte.
*/
# define MBR_GETRESVDSECCOUNT(p) fat_getuint16(UBYTE_PTR(p,BS_RESVDSECCOUNT))
# define MBR_GETFATSZ16(p) fat_getuint16(UBYTE_PTR(p,BS_FATSZ16))
# define MBR_GETSECPERTRK(p) fat_getuint16(UBYTE_PTR(p,BS_SECPERTRK))
# define MBR_GETNUMHEADS(p) fat_getuint16(UBYTE_PTR(p,BS_NUMHEADS))
# define MBR_GETHIDSEC(p) fat_getuint32(UBYTE_PTR(p,BS_HIDSEC))
# define MBR_GETTOTSEC32(p) fat_getuint32(UBYTE_PTR(p,BS_TOTSEC32))
# define MBR_GETFATSZ32(p) fat_getuint32(UBYTE_PTR(p,BS32_FATSZ32))
# define MBR_GETEXTFLAGS(p) fat_getuint16(UBYTE_PTR(p,BS32_EXTFLAGS))
# define MBR_GETFSVER(p) fat_getuint16(UBYTE_PTR(p,BS32_FSVER))
# define MBR_GETROOTCLUS(p) fat_getuint32(UBYTE_PTR(p,BS32_ROOTCLUS))
# define MBR_GETFSINFO(p) fat_getuint16(UBYTE_PTR(p,BS32_FSINFO))
# define MBR_GETBKBOOTSEC(p) fat_getuint16(UBYTE_PTR(p,BS32_BKBOOTSEC))
# define MBR_GETSIGNATURE(p) fat_getuint16(UBYTE_PTR(p,BS_SIGNATURE))
# define MBR_GETRESVDSECCOUNT(p) fat_getuint16(UBYTE_PTR(p,MBR_RESVDSECCOUNT))
# define MBR_GETFATSZ16(p) fat_getuint16(UBYTE_PTR(p,MBR_FATSZ16))
# define MBR_GETSECPERTRK(p) fat_getuint16(UBYTE_PTR(p,MBR_SECPERTRK))
# define MBR_GETNUMHEADS(p) fat_getuint16(UBYTE_PTR(p,MBR_NUMHEADS))
# define MBR_GETHIDSEC(p) fat_getuint32(UBYTE_PTR(p,MBR_HIDSEC))
# define MBR_GETTOTSEC32(p) fat_getuint32(UBYTE_PTR(p,MBR_TOTSEC32))
# define MBR_GETFATSZ32(p) fat_getuint32(UBYTE_PTR(p,MBR32_FATSZ32))
# define MBR_GETEXTFLAGS(p) fat_getuint16(UBYTE_PTR(p,MBR32_EXTFLAGS))
# define MBR_GETFSVER(p) fat_getuint16(UBYTE_PTR(p,MBR32_FSVER))
# define MBR_GETROOTCLUS(p) fat_getuint32(UBYTE_PTR(p,MBR32_ROOTCLUS))
# define MBR_GETFSINFO(p) fat_getuint16(UBYTE_PTR(p,MBR32_FSINFO))
# define MBR_GETBKBOOTSEC(p) fat_getuint16(UBYTE_PTR(p,MBR32_BKBOOTSEC))
# define MBR_GETSIGNATURE(p) fat_getuint16(UBYTE_PTR(p,MBR_SIGNATURE))
# define FBR_GETRESVDSECCOUNT(p) fat_getuint16(UBYTE_PTR(p,FBR_RESVDSECCOUNT))
# define FBR_GETFATSZ16(p) fat_getuint16(UBYTE_PTR(p,FBR_FATSZ16))
# define FBR_GETSECPERTRK(p) fat_getuint16(UBYTE_PTR(p,FBR_SECPERTRK))
# define FBR_GETNUMHEADS(p) fat_getuint16(UBYTE_PTR(p,FBR_NUMHEADS))
# define FBR_GETHIDSEC(p) fat_getuint32(UBYTE_PTR(p,FBR_HIDSEC))
# define FBR_GETTOTSEC32(p) fat_getuint32(UBYTE_PTR(p,FBR_TOTSEC32))
# define FBR_GETFATSZ32(p) fat_getuint32(UBYTE_PTR(p,FBR_FATSZ32))
# define FBR_GETEXTFLAGS(p) fat_getuint16(UBYTE_PTR(p,FBR_EXTFLAGS))
# define FBR_GETFSVER(p) fat_getuint16(UBYTE_PTR(p,FBR_FSVER))
# define FBR_GETROOTCLUS(p) fat_getuint32(UBYTE_PTR(p,FBR_ROOTCLUS))
# define FBR_GETFSINFO(p) fat_getuint16(UBYTE_PTR(p,FBR_FSINFO))
# define FBR_GETBKBOOTSEC(p) fat_getuint16(UBYTE_PTR(p,FBR_BKBOOTSEC))
# define FBR_GETSIGNATURE(p) fat_getuint16(UBYTE_PTR(p,FBR_SIGNATURE))
# define FSI_GETLEADSIG(p) fat_getuint32(UBYTE_PTR(p,FSI_LEADSIG))
# define FSI_GETSTRUCTSIG(p) fat_getuint32(UBYTE_PTR(p,FSI_STRUCTSIG))
@ -523,19 +624,33 @@
# define FAT_GETFAT16(p,i) fat_getuint16(UBYTE_PTR(p,i))
# define FAT_GETFAT32(p,i) fat_getuint32(UBYTE_PTR(p,i))
# define MBR_PUTRESVDSECCOUNT(p,v) fat_putuint16(UBYTE_PTR(p,BS_RESVDSECCOUNT),v)
# define MBR_PUTFATSZ16(p,v) fat_putuint16(UBYTE_PTR(p,BS_FATSZ16),v)
# define MBR_PUTSECPERTRK(p,v) fat_putuint16(UBYTE_PTR(p,BS_SECPERTRK),v)
# define MBR_PUTNUMHEADS(p,v) fat_putuint16(UBYTE_PTR(p,BS_NUMHEADS),v)
# define MBR_PUTHIDSEC(p,v) fat_putuint32(UBYTE_PTR(p,BS_HIDSEC),v)
# define MBR_PUTTOTSEC32(p,v) fat_putuint32(UBYTE_PTR(p,BS_TOTSEC32),v)
# define MBR_PUTFATSZ32(p,v) fat_putuint32(UBYTE_PTR(p,BS32_FATSZ32),v)
# define MBR_PUTEXTFLAGS(p,v) fat_putuint16(UBYTE_PTR(p,BS32_EXTFLAGS),v)
# define MBR_PUTFSVER(p,v) fat_putuint16(UBYTE_PTR(p,BS32_FSVER),v)
# define MBR_PUTROOTCLUS(p,v) fat_putuint32(UBYTE_PTR(p,BS32_ROOTCLUS),v)
# define MBR_PUTFSINFO(p,v) fat_putuint16(UBYTE_PTR(p,BS32_FSINFO),v)
# define MBR_PUTBKBOOTSEC(p,v) fat_putuint16(UBYTE_PTR(p,BS32_BKBOOTSEC),v)
# define MBR_PUTSIGNATURE(p,v) fat_putuint16(UBYTE_PTR(p,BS_SIGNATURE),v)
# define MBR_PUTRESVDSECCOUNT(p,v) fat_putuint16(UBYTE_PTR(p,MBR_RESVDSECCOUNT),v)
# define MBR_PUTFATSZ16(p,v) fat_putuint16(UBYTE_PTR(p,MBR_FATSZ16),v)
# define MBR_PUTSECPERTRK(p,v) fat_putuint16(UBYTE_PTR(p,MBR_SECPERTRK),v)
# define MBR_PUTNUMHEADS(p,v) fat_putuint16(UBYTE_PTR(p,MBR_NUMHEADS),v)
# define MBR_PUTHIDSEC(p,v) fat_putuint32(UBYTE_PTR(p,MBR_HIDSEC),v)
# define MBR_PUTTOTSEC32(p,v) fat_putuint32(UBYTE_PTR(p,MBR_TOTSEC32),v)
# define MBR_PUTFATSZ32(p,v) fat_putuint32(UBYTE_PTR(p,MBR32_FATSZ32),v)
# define MBR_PUTEXTFLAGS(p,v) fat_putuint16(UBYTE_PTR(p,MBR32_EXTFLAGS),v)
# define MBR_PUTFSVER(p,v) fat_putuint16(UBYTE_PTR(p,MBR32_FSVER),v)
# define MBR_PUTROOTCLUS(p,v) fat_putuint32(UBYTE_PTR(p,MBR32_ROOTCLUS),v)
# define MBR_PUTFSINFO(p,v) fat_putuint16(UBYTE_PTR(p,MBR32_FSINFO),v)
# define MBR_PUTBKBOOTSEC(p,v) fat_putuint16(UBYTE_PTR(p,MBR32_BKBOOTSEC),v)
# define MBR_PUTSIGNATURE(p,v) fat_putuint16(UBYTE_PTR(p,MBR_SIGNATURE),v)
# define FBR_PUTRESVDSECCOUNT(p,v) fat_putuint16(UBYTE_PTR(p,FBR_RESVDSECCOUNT),v)
# define FBR_PUTFATSZ16(p,v) fat_putuint16(UBYTE_PTR(p,FBR_FATSZ16),v)
# define FBR_PUTSECPERTRK(p,v) fat_putuint16(UBYTE_PTR(p,FBR_SECPERTRK),v)
# define FBR_PUTNUMHEADS(p,v) fat_putuint16(UBYTE_PTR(p,FBR_NUMHEADS),v)
# define FBR_PUTHIDSEC(p,v) fat_putuint32(UBYTE_PTR(p,FBR_HIDSEC),v)
# define FBR_PUTTOTSEC32(p,v) fat_putuint32(UBYTE_PTR(p,FBR_TOTSEC32),v)
# define FBR_PUTFATSZ32(p,v) fat_putuint32(UBYTE_PTR(p,FBR_FATSZ32),v)
# define FBR_PUTEXTFLAGS(p,v) fat_putuint16(UBYTE_PTR(p,FBR_EXTFLAGS),v)
# define FBR_PUTFSVER(p,v) fat_putuint16(UBYTE_PTR(p,FBR_FSVER),v)
# define FBR_PUTROOTCLUS(p,v) fat_putuint32(UBYTE_PTR(p,FBR_ROOTCLUS),v)
# define FBR_PUTFSINFO(p,v) fat_putuint16(UBYTE_PTR(p,FBR_FSINFO),v)
# define FBR_PUTBKBOOTSEC(p,v) fat_putuint16(UBYTE_PTR(p,FBR_BKBOOTSEC),v)
# define FBR_PUTSIGNATURE(p,v) fat_putuint16(UBYTE_PTR(p,FBR_SIGNATURE),v)
# define FSI_PUTLEADSIG(p,v) fat_putuint32(UBYTE_PTR(p,FSI_LEADSIG),v)
# define FSI_PUTSTRUCTSIG(p,v) fat_putuint32(UBYTE_PTR(p,FSI_STRUCTSIG),v)
@ -580,22 +695,36 @@
#else
/* But nothing special has to be done for the little endian-case for access
* to aligned mulitbyte values.
* to aligned multibyte values.
*/
# define MBR_GETRESVDSECCOUNT(p) UINT16_VAL(p,BS_RESVDSECCOUNT)
# define MBR_GETFATSZ16(p) UINT16_VAL(p,BS_FATSZ16)
# define MBR_GETSECPERTRK(p) UINT16_VAL(p,BS_SECPERTRK)
# define MBR_GETNUMHEADS(p) UINT16_VAL(p,BS_NUMHEADS)
# define MBR_GETHIDSEC(p) UINT32_VAL(p,BS_HIDSEC)
# define MBR_GETTOTSEC32(p) UINT32_VAL(p,BS_TOTSEC32)
# define MBR_GETFATSZ32(p) UINT32_VAL(p,BS32_FATSZ32)
# define MBR_GETEXTFLAGS(p) UINT16_VAL(p,BS32_EXTFLAGS)
# define MBR_GETFSVER(p) UINT16_VAL(p,BS32_FSVER)
# define MBR_GETROOTCLUS(p) UINT32_VAL(p,BS32_ROOTCLUS)
# define MBR_GETFSINFO(p) UINT16_VAL(p,BS32_FSINFO)
# define MBR_GETBKBOOTSEC(p) UINT16_VAL(p,BS32_BKBOOTSEC)
# define MBR_GETSIGNATURE(p) UINT16_VAL(p,BS_SIGNATURE)
# define MBR_GETRESVDSECCOUNT(p) UINT16_VAL(p,MBR_RESVDSECCOUNT)
# define MBR_GETFATSZ16(p) UINT16_VAL(p,MBR_FATSZ16)
# define MBR_GETSECPERTRK(p) UINT16_VAL(p,MBR_SECPERTRK)
# define MBR_GETNUMHEADS(p) UINT16_VAL(p,MBR_NUMHEADS)
# define MBR_GETHIDSEC(p) UINT32_VAL(p,MBR_HIDSEC)
# define MBR_GETTOTSEC32(p) UINT32_VAL(p,MBR_TOTSEC32)
# define MBR_GETFATSZ32(p) UINT32_VAL(p,MBR32_FATSZ32)
# define MBR_GETEXTFLAGS(p) UINT16_VAL(p,MBR32_EXTFLAGS)
# define MBR_GETFSVER(p) UINT16_VAL(p,MBR32_FSVER)
# define MBR_GETROOTCLUS(p) UINT32_VAL(p,MBR32_ROOTCLUS)
# define MBR_GETFSINFO(p) UINT16_VAL(p,MBR32_FSINFO)
# define MBR_GETBKBOOTSEC(p) UINT16_VAL(p,MBR32_BKBOOTSEC)
# define MBR_GETSIGNATURE(p) UINT16_VAL(p,MBR_SIGNATURE)
# define FBR_GETRESVDSECCOUNT(p) UINT16_VAL(p,FBR_RESVDSECCOUNT)
# define FBR_GETFATSZ16(p) UINT16_VAL(p,FBR_FATSZ16)
# define FBR_GETSECPERTRK(p) UINT16_VAL(p,FBR_SECPERTRK)
# define FBR_GETNUMHEADS(p) UINT16_VAL(p,FBR_NUMHEADS)
# define FBR_GETHIDSEC(p) UINT32_VAL(p,FBR_HIDSEC)
# define FBR_GETTOTSEC32(p) UINT32_VAL(p,FBR_TOTSEC32)
# define FBR_GETFATSZ32(p) UINT32_VAL(p,FBR_FATSZ32)
# define FBR_GETEXTFLAGS(p) UINT16_VAL(p,FBR_EXTFLAGS)
# define FBR_GETFSVER(p) UINT16_VAL(p,FBR_FSVER)
# define FBR_GETROOTCLUS(p) UINT32_VAL(p,FBR_ROOTCLUS)
# define FBR_GETFSINFO(p) UINT16_VAL(p,FBR_FSINFO)
# define FBR_GETBKBOOTSEC(p) UINT16_VAL(p,FBR_BKBOOTSEC)
# define FBR_GETSIGNATURE(p) UINT16_VAL(p,FBR_SIGNATURE)
# define FSI_GETLEADSIG(p) UINT32_VAL(p,FSI_LEADSIG)
# define FSI_GETSTRUCTSIG(p) UINT32_VAL(p,FSI_STRUCTSIG)
@ -637,19 +766,33 @@
# define FAT_GETFAT16(p,i) UINT16_VAL(p,i)
# define FAT_GETFAT32(p,i) UINT32_VAL(p,i)
# define MBR_PUTRESVDSECCOUNT(p,v) UINT16_PUT(p,BS_RESVDSECCOUNT,v)
# define MBR_PUTFATSZ16(p,v) UINT16_PUT(p,BS_FATSZ16,v)
# define MBR_PUTSECPERTRK(p,v) UINT16_PUT(p,BS_SECPERTRK,v)
# define MBR_PUTNUMHEADS(p,v) UINT16_PUT(p,BS_NUMHEADS,v)
# define MBR_PUTHIDSEC(p,v) UINT32_PUT(p,BS_HIDSEC,v)
# define MBR_PUTTOTSEC32(p,v) UINT32_PUT(p,BS_TOTSEC32,v)
# define MBR_PUTFATSZ32(p,v) UINT32_PUT(p,BS32_FATSZ32,v)
# define MBR_PUTEXTFLAGS(p,v) UINT16_PUT(p,BS32_EXTFLAGS,v)
# define MBR_PUTFSVER(p,v) UINT16_PUT(p,BS32_FSVER,v)
# define MBR_PUTROOTCLUS(p,v) UINT32_PUT(p,BS32_ROOTCLUS,v)
# define MBR_PUTFSINFO(p,v) UINT16_PUT(p,BS32_FSINFO,v)
# define MBR_PUTBKBOOTSEC(p,v) UINT16_PUT(p,BS32_BKBOOTSEC,v)
# define MBR_PUTSIGNATURE(p,v) UINT16_PUT(p,BS_SIGNATURE,v)
# define MBR_PUTRESVDSECCOUNT(p,v) UINT16_PUT(p,MBR_RESVDSECCOUNT,v)
# define MBR_PUTFATSZ16(p,v) UINT16_PUT(p,MBR_FATSZ16,v)
# define MBR_PUTSECPERTRK(p,v) UINT16_PUT(p,MBR_SECPERTRK,v)
# define MBR_PUTNUMHEADS(p,v) UINT16_PUT(p,MBR_NUMHEADS,v)
# define MBR_PUTHIDSEC(p,v) UINT32_PUT(p,MBR_HIDSEC,v)
# define MBR_PUTTOTSEC32(p,v) UINT32_PUT(p,MBR_TOTSEC32,v)
# define MBR_PUTFATSZ32(p,v) UINT32_PUT(p,MBR32_FATSZ32,v)
# define MBR_PUTEXTFLAGS(p,v) UINT16_PUT(p,MBR32_EXTFLAGS,v)
# define MBR_PUTFSVER(p,v) UINT16_PUT(p,MBR32_FSVER,v)
# define MBR_PUTROOTCLUS(p,v) UINT32_PUT(p,MBR32_ROOTCLUS,v)
# define MBR_PUTFSINFO(p,v) UINT16_PUT(p,MBR32_FSINFO,v)
# define MBR_PUTBKBOOTSEC(p,v) UINT16_PUT(p,MBR32_BKBOOTSEC,v)
# define MBR_PUTSIGNATURE(p,v) UINT16_PUT(p,MBR_SIGNATURE,v)
# define FBR_PUTRESVDSECCOUNT(p,v) UINT16_PUT(p,FBR_RESVDSECCOUNT,v)
# define FBR_PUTFATSZ16(p,v) UINT16_PUT(p,FBR_FATSZ16,v)
# define FBR_PUTSECPERTRK(p,v) UINT16_PUT(p,FBR_SECPERTRK,v)
# define FBR_PUTNUMHEADS(p,v) UINT16_PUT(p,FBR_NUMHEADS,v)
# define FBR_PUTHIDSEC(p,v) UINT32_PUT(p,FBR_HIDSEC,v)
# define FBR_PUTTOTSEC32(p,v) UINT32_PUT(p,FBR_TOTSEC32,v)
# define FBR_PUTFATSZ32(p,v) UINT32_PUT(p,FBR_FATSZ32,v)
# define FBR_PUTEXTFLAGS(p,v) UINT16_PUT(p,FBR_EXTFLAGS,v)
# define FBR_PUTFSVER(p,v) UINT16_PUT(p,FBR_FSVER,v)
# define FBR_PUTROOTCLUS(p,v) UINT32_PUT(p,FBR_ROOTCLUS,v)
# define FBR_PUTFSINFO(p,v) UINT16_PUT(p,FBR_FSINFO,v)
# define FBR_PUTBKBOOTSEC(p,v) UINT16_PUT(p,FBR_BKBOOTSEC,v)
# define FBR_PUTSIGNATURE(p,v) UINT16_PUT(p,FBR_SIGNATURE,v)
# define FSI_PUTLEADSIG(p,v) UINT32_PUT(p,FSI_LEADSIG,v)
# define FSI_PUTSTRUCTSIG(p,v) UINT32_PUT(p,FSI_STRUCTSIG,v)

View File

@ -101,7 +101,14 @@ static int fat_checkfsinfo(struct fat_mountpt_s *fs)
* Name: fat_checkbootrecord
*
* Description:
* Read a sector and verify that it is a a FAT boot record.
* Verify that that currently buffer sector is a valid FAT boot record.
* This may refer to either the older (pre-partition) MBR sector that lies
* at sector one or to the more common FBR that lies at the beginning of
* the partition.
*
* NOTE: The more common FBR naming is used in the file even when parsing
* an MBR. This is possible because the field offsets and meaning are
* identical.
*
****************************************************************************/
@ -119,11 +126,12 @@ static int fat_checkbootrecord(struct fat_mountpt_s *fs)
* match the reported hardware sector size.
*/
if (MBR_GETSIGNATURE(fs->fs_buffer) != BOOT_SIGNATURE16 ||
MBR_GETBYTESPERSEC(fs->fs_buffer) != fs->fs_hwsectorsize)
if (FBR_GETSIGNATURE(fs->fs_buffer) != BOOT_SIGNATURE16 ||
FBR_GETBYTESPERSEC(fs->fs_buffer) != fs->fs_hwsectorsize)
{
ferr("ERROR: Signature: %04x FS sectorsize: %d HW sectorsize: %d\n",
MBR_GETSIGNATURE(fs->fs_buffer), MBR_GETBYTESPERSEC(fs->fs_buffer),
fwarn("WARNING: Signature: %04x FS sectorsize: %d HW sectorsize: %d\n",
FBR_GETSIGNATURE(fs->fs_buffer),
FBR_GETBYTESPERSEC(fs->fs_buffer),
fs->fs_hwsectorsize);
return -EINVAL;
@ -139,7 +147,7 @@ static int fat_checkbootrecord(struct fat_mountpt_s *fs)
* for FAT32).
*/
fs->fs_rootentcnt = MBR_GETROOTENTCNT(fs->fs_buffer);
fs->fs_rootentcnt = FBR_GETROOTENTCNT(fs->fs_buffer);
if (fs->fs_rootentcnt != 0)
{
notfat32 = true; /* Must be zero for FAT32 */
@ -148,58 +156,58 @@ static int fat_checkbootrecord(struct fat_mountpt_s *fs)
/* Determine the number of sectors in a FAT. */
fs->fs_nfatsects = MBR_GETFATSZ16(fs->fs_buffer); /* Should be zero */
fs->fs_nfatsects = FBR_GETFATSZ16(fs->fs_buffer); /* Should be zero */
if (fs->fs_nfatsects)
{
notfat32 = true; /* Must be zero for FAT32 */
}
else
{
fs->fs_nfatsects = MBR_GETFATSZ32(fs->fs_buffer);
fs->fs_nfatsects = FBR_GETFATSZ32(fs->fs_buffer);
}
if (!fs->fs_nfatsects || fs->fs_nfatsects >= fs->fs_hwnsectors)
{
ferr("ERROR: fs_nfatsects %d fs_hwnsectors: %d\n",
fs->fs_nfatsects, fs->fs_hwnsectors);
fwarn("WARNING: fs_nfatsects %d fs_hwnsectors: %d\n",
fs->fs_nfatsects, fs->fs_hwnsectors);
return -EINVAL;
}
/* Get the total number of sectors on the volume. */
fs->fs_fattotsec = MBR_GETTOTSEC16(fs->fs_buffer); /* Should be zero */
fs->fs_fattotsec = FBR_GETTOTSEC16(fs->fs_buffer); /* Should be zero */
if (fs->fs_fattotsec)
{
notfat32 = true; /* Must be zero for FAT32 */
}
else
{
fs->fs_fattotsec = MBR_GETTOTSEC32(fs->fs_buffer);
fs->fs_fattotsec = FBR_GETTOTSEC32(fs->fs_buffer);
}
if (!fs->fs_fattotsec || fs->fs_fattotsec > fs->fs_hwnsectors)
{
ferr("ERROR: fs_fattotsec %d fs_hwnsectors: %d\n",
fs->fs_fattotsec, fs->fs_hwnsectors);
fwarn("WARNING: fs_fattotsec %d fs_hwnsectors: %d\n",
fs->fs_fattotsec, fs->fs_hwnsectors);
return -EINVAL;
}
/* Get the total number of reserved sectors */
fs->fs_fatresvdseccount = MBR_GETRESVDSECCOUNT(fs->fs_buffer);
fs->fs_fatresvdseccount = FBR_GETRESVDSECCOUNT(fs->fs_buffer);
if (fs->fs_fatresvdseccount > fs->fs_hwnsectors)
{
ferr("ERROR: fs_fatresvdseccount %d fs_hwnsectors: %d\n",
fs->fs_fatresvdseccount, fs->fs_hwnsectors);
fwarn("WARNING: fs_fatresvdseccount %d fs_hwnsectors: %d\n",
fs->fs_fatresvdseccount, fs->fs_hwnsectors);
return -EINVAL;
}
/* Get the number of FATs. This is probably two but could have other values */
fs->fs_fatnumfats = MBR_GETNUMFATS(fs->fs_buffer);
fs->fs_fatnumfats = FBR_GETNUMFATS(fs->fs_buffer);
ntotalfatsects = fs->fs_fatnumfats * fs->fs_nfatsects;
/* Get the total number of data sectors */
@ -207,15 +215,15 @@ static int fat_checkbootrecord(struct fat_mountpt_s *fs)
ndatasectors = fs->fs_fattotsec - fs->fs_fatresvdseccount - ntotalfatsects - rootdirsectors;
if (ndatasectors > fs->fs_hwnsectors)
{
ferr("ERROR: ndatasectors %d fs_hwnsectors: %d\n",
ndatasectors, fs->fs_hwnsectors);
fwarn("WARNING: ndatasectors %d fs_hwnsectors: %d\n",
ndatasectors, fs->fs_hwnsectors);
return -EINVAL;
}
/* Get the sectors per cluster */
fs->fs_fatsecperclus = MBR_GETSECPERCLUS(fs->fs_buffer);
fs->fs_fatsecperclus = FBR_GETSECPERCLUS(fs->fs_buffer);
/* Calculate the number of clusters */
@ -235,13 +243,13 @@ static int fat_checkbootrecord(struct fat_mountpt_s *fs)
}
else if (!notfat32)
{
fs->fs_fsinfo = fs->fs_fatbase + MBR_GETFSINFO(fs->fs_buffer);
fs->fs_fsinfo = fs->fs_fatbase + FBR_GETFSINFO(fs->fs_buffer);
fs->fs_type = FSTYPE_FAT32;
}
else
{
ferr("ERROR: notfat32: %d fs_nclusters: %d\n",
notfat32, fs->fs_nclusters);
fwarn("WARNING: notfat32: %d fs_nclusters: %d\n",
notfat32, fs->fs_nclusters);
return -EINVAL;
}
@ -254,7 +262,7 @@ static int fat_checkbootrecord(struct fat_mountpt_s *fs)
if (fs->fs_type == FSTYPE_FAT32)
{
fs->fs_rootbase = MBR_GETROOTCLUS(fs->fs_buffer);
fs->fs_rootbase = FBR_GETROOTCLUS(fs->fs_buffer);
}
else
{
@ -547,9 +555,9 @@ int fat_mount(struct fat_mountpt_s *fs, bool writeable)
goto errout;
}
/* Search FAT boot record on the drive. First check at sector zero. This
* could be either the boot record or a partition that refers to the boot
* record.
/* Search FAT boot record on the drive. First check the MBR at sector
* zero. This could be either the boot record or a partition that refers
* to the boot record.
*
* First read sector zero. This will be the first access to the drive and a
* likely failure point.
@ -562,13 +570,17 @@ int fat_mount(struct fat_mountpt_s *fs, bool writeable)
goto errout_with_buffer;
}
/* Older style MBR (pre-partition table) includes boot information for the
* partition-less drive. Check for that case first.
*/
ret = fat_checkbootrecord(fs);
if (ret != OK)
{
/* The contents of sector 0 is not a boot record. It could be a DOS
* partition, however. Assume it is a partition and get the offset
* into the partition table. This table is at offset MBR_TABLE and is
* indexed by 16x the partition number.
/* The contents of sector 0 is not a boot record. It could be have
* DOS partitions, however. Get the offset into the partition table.
* This table is at offset MBR_TABLE and is indexed by 16x the
* partition number.
*/
int i;
@ -612,13 +624,13 @@ int fat_mount(struct fat_mountpt_s *fs, bool writeable)
{
/* Break out of the loop if a valid boot record is found */
finfo("MBR found in partition %d\n", i);
finfo("FBR found in partition %d\n", i);
break;
}
/* Re-read sector 0 so that we can check the next partition */
finfo("Partition %d is not an MBR\n", i);
finfo("Partition %d is not an FBR\n", i);
ret = fat_hwread(fs, fs->fs_buffer, 0, 1);
if (ret < 0)
{
@ -629,7 +641,7 @@ int fat_mount(struct fat_mountpt_s *fs, bool writeable)
if (i > 3)
{
ferr("ERROR: No valid MBR\n");
ferr("ERROR: No valid boot record\n");
ret = -EINVAL;
goto errout_with_buffer;
}