xref: /illumos-gate/usr/src/grub/grub-0.97/stage2/fat.h (revision 1b8adde7)
1*1b8adde7SWilliam Kucharski /*
2*1b8adde7SWilliam Kucharski  *  GRUB  --  GRand Unified Bootloader
3*1b8adde7SWilliam Kucharski  *  Copyright (C) 2001  Free Software Foundation, Inc.
4*1b8adde7SWilliam Kucharski  *
5*1b8adde7SWilliam Kucharski  *  This program is free software; you can redistribute it and/or modify
6*1b8adde7SWilliam Kucharski  *  it under the terms of the GNU General Public License as published by
7*1b8adde7SWilliam Kucharski  *  the Free Software Foundation; either version 2 of the License, or
8*1b8adde7SWilliam Kucharski  *  (at your option) any later version.
9*1b8adde7SWilliam Kucharski  *
10*1b8adde7SWilliam Kucharski  *  This program is distributed in the hope that it will be useful,
11*1b8adde7SWilliam Kucharski  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12*1b8adde7SWilliam Kucharski  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13*1b8adde7SWilliam Kucharski  *  GNU General Public License for more details.
14*1b8adde7SWilliam Kucharski  *
15*1b8adde7SWilliam Kucharski  *  You should have received a copy of the GNU General Public License
16*1b8adde7SWilliam Kucharski  *  along with this program; if not, write to the Free Software
17*1b8adde7SWilliam Kucharski  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18*1b8adde7SWilliam Kucharski  */
19*1b8adde7SWilliam Kucharski 
20*1b8adde7SWilliam Kucharski 
21*1b8adde7SWilliam Kucharski /*
22*1b8adde7SWilliam Kucharski  *  Defines for the FAT BIOS Parameter Block (embedded in the first block
23*1b8adde7SWilliam Kucharski  *  of the partition.
24*1b8adde7SWilliam Kucharski  */
25*1b8adde7SWilliam Kucharski 
26*1b8adde7SWilliam Kucharski typedef __signed__ char __s8;
27*1b8adde7SWilliam Kucharski typedef unsigned char __u8;
28*1b8adde7SWilliam Kucharski typedef __signed__ short __s16;
29*1b8adde7SWilliam Kucharski typedef unsigned short __u16;
30*1b8adde7SWilliam Kucharski typedef __signed__ int __s32;
31*1b8adde7SWilliam Kucharski typedef unsigned int __u32;
32*1b8adde7SWilliam Kucharski 
33*1b8adde7SWilliam Kucharski /* Note that some shorts are not aligned, and must therefore
34*1b8adde7SWilliam Kucharski  * be declared as array of two bytes.
35*1b8adde7SWilliam Kucharski  */
36*1b8adde7SWilliam Kucharski struct fat_bpb {
37*1b8adde7SWilliam Kucharski 	__s8	ignored[3];	/* Boot strap short or near jump */
38*1b8adde7SWilliam Kucharski 	__s8	system_id[8];	/* Name - can be used to special case
39*1b8adde7SWilliam Kucharski 				   partition manager volumes */
40*1b8adde7SWilliam Kucharski 	__u8	bytes_per_sect[2];	/* bytes per logical sector */
41*1b8adde7SWilliam Kucharski 	__u8	sects_per_clust;/* sectors/cluster */
42*1b8adde7SWilliam Kucharski 	__u8	reserved_sects[2];	/* reserved sectors */
43*1b8adde7SWilliam Kucharski 	__u8	num_fats;	/* number of FATs */
44*1b8adde7SWilliam Kucharski 	__u8	dir_entries[2];	/* root directory entries */
45*1b8adde7SWilliam Kucharski 	__u8	short_sectors[2];	/* number of sectors */
46*1b8adde7SWilliam Kucharski 	__u8	media;		/* media code (unused) */
47*1b8adde7SWilliam Kucharski 	__u16	fat_length;	/* sectors/FAT */
48*1b8adde7SWilliam Kucharski 	__u16	secs_track;	/* sectors per track */
49*1b8adde7SWilliam Kucharski 	__u16	heads;		/* number of heads */
50*1b8adde7SWilliam Kucharski 	__u32	hidden;		/* hidden sectors (unused) */
51*1b8adde7SWilliam Kucharski 	__u32	long_sectors;	/* number of sectors (if short_sectors == 0) */
52*1b8adde7SWilliam Kucharski 
53*1b8adde7SWilliam Kucharski 	/* The following fields are only used by FAT32 */
54*1b8adde7SWilliam Kucharski 	__u32	fat32_length;	/* sectors/FAT */
55*1b8adde7SWilliam Kucharski 	__u16	flags;		/* bit 8: fat mirroring, low 4: active fat */
56*1b8adde7SWilliam Kucharski 	__u8	version[2];	/* major, minor filesystem version */
57*1b8adde7SWilliam Kucharski 	__u32	root_cluster;	/* first cluster in root directory */
58*1b8adde7SWilliam Kucharski 	__u16	info_sector;	/* filesystem info sector */
59*1b8adde7SWilliam Kucharski 	__u16	backup_boot;	/* backup boot sector */
60*1b8adde7SWilliam Kucharski 	__u16	reserved2[6];	/* Unused */
61*1b8adde7SWilliam Kucharski };
62*1b8adde7SWilliam Kucharski 
63*1b8adde7SWilliam Kucharski #define FAT_CVT_U16(bytarr) (* (__u16*)(bytarr))
64*1b8adde7SWilliam Kucharski 
65*1b8adde7SWilliam Kucharski /*
66*1b8adde7SWilliam Kucharski  *  Defines how to differentiate a 12-bit and 16-bit FAT.
67*1b8adde7SWilliam Kucharski  */
68*1b8adde7SWilliam Kucharski 
69*1b8adde7SWilliam Kucharski #define FAT_MAX_12BIT_CLUST       4087	/* 4085 + 2 */
70*1b8adde7SWilliam Kucharski 
71*1b8adde7SWilliam Kucharski /*
72*1b8adde7SWilliam Kucharski  *  Defines for the file "attribute" byte
73*1b8adde7SWilliam Kucharski  */
74*1b8adde7SWilliam Kucharski 
75*1b8adde7SWilliam Kucharski #define FAT_ATTRIB_OK_MASK        0x37
76*1b8adde7SWilliam Kucharski #define FAT_ATTRIB_NOT_OK_MASK    0xC8
77*1b8adde7SWilliam Kucharski #define FAT_ATTRIB_DIR            0x10
78*1b8adde7SWilliam Kucharski #define FAT_ATTRIB_LONGNAME       0x0F
79*1b8adde7SWilliam Kucharski 
80*1b8adde7SWilliam Kucharski /*
81*1b8adde7SWilliam Kucharski  *  Defines for FAT directory entries
82*1b8adde7SWilliam Kucharski  */
83*1b8adde7SWilliam Kucharski 
84*1b8adde7SWilliam Kucharski #define FAT_DIRENTRY_LENGTH       32
85*1b8adde7SWilliam Kucharski 
86*1b8adde7SWilliam Kucharski #define FAT_DIRENTRY_ATTRIB(entry) \
87*1b8adde7SWilliam Kucharski   (*((unsigned char *) (entry+11)))
88*1b8adde7SWilliam Kucharski #define FAT_DIRENTRY_VALID(entry) \
89*1b8adde7SWilliam Kucharski   ( ((*((unsigned char *) entry)) != 0) \
90*1b8adde7SWilliam Kucharski     && ((*((unsigned char *) entry)) != 0xE5) \
91*1b8adde7SWilliam Kucharski     && !(FAT_DIRENTRY_ATTRIB(entry) & FAT_ATTRIB_NOT_OK_MASK) )
92*1b8adde7SWilliam Kucharski #define FAT_DIRENTRY_FIRST_CLUSTER(entry) \
93*1b8adde7SWilliam Kucharski   ((*((unsigned short *) (entry+26)))+(*((unsigned short *) (entry+20)) << 16))
94*1b8adde7SWilliam Kucharski #define FAT_DIRENTRY_FILELENGTH(entry) \
95*1b8adde7SWilliam Kucharski   (*((unsigned long *) (entry+28)))
96*1b8adde7SWilliam Kucharski 
97*1b8adde7SWilliam Kucharski #define FAT_LONGDIR_ID(entry) \
98*1b8adde7SWilliam Kucharski   (*((unsigned char *) (entry)))
99*1b8adde7SWilliam Kucharski #define FAT_LONGDIR_ALIASCHECKSUM(entry) \
100*1b8adde7SWilliam Kucharski   (*((unsigned char *) (entry+13)))
101