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