]> git.proxmox.com Git - mirror_edk2.git/blame - FatPkg/EnhancedFatDxe/FatFileSystem.h
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / FatPkg / EnhancedFatDxe / FatFileSystem.h
CommitLineData
cae7420b
DB
1/** @file\r
2 Definitions for on-disk FAT structures.\r
b9ec9330 3\r
4c5ee6a6 4Copyright (c) 2005 - 2017, Intel Corporation. All rights reserved.<BR>\r
eb6cb4ce 5SPDX-License-Identifier: BSD-2-Clause-Patent\r
b9ec9330
QH
6\r
7\r
cae7420b 8**/\r
b9ec9330
QH
9\r
10#ifndef _FATFILESYSTEM_H_\r
11#define _FATFILESYSTEM_H_\r
12\r
13#pragma pack(1)\r
14//\r
15// FAT info signature\r
16//\r
17#define FAT_INFO_SIGNATURE 0x41615252\r
18#define FAT_INFO_BEGIN_SIGNATURE 0x61417272\r
19#define FAT_INFO_END_SIGNATURE 0xAA550000\r
20//\r
21// FAT entry values\r
22//\r
bcdcc416
MK
23#define FAT_CLUSTER_SPECIAL_EXT (MAX_UINTN & (~0xF))\r
24#define FAT_CLUSTER_SPECIAL ((FAT_CLUSTER_SPECIAL_EXT) | 0x07)\r
25#define FAT_CLUSTER_FREE 0\r
26#define FAT_CLUSTER_RESERVED (FAT_CLUSTER_SPECIAL)\r
27#define FAT_CLUSTER_BAD (FAT_CLUSTER_SPECIAL)\r
28#define FAT_CLUSTER_LAST (-1)\r
29#define FAT_END_OF_FAT_CHAIN(Cluster) ((Cluster) > (FAT_CLUSTER_SPECIAL))\r
30#define FAT_MIN_CLUSTER 2\r
31#define FAT_MAX_FAT12_CLUSTER 0xFF5\r
32#define FAT_MAX_FAT16_CLUSTER 0xFFF5\r
33#define FAT_CLUSTER_SPECIAL_FAT12 0xFF7\r
34#define FAT_CLUSTER_SPECIAL_FAT16 0xFFF7\r
35#define FAT_CLUSTER_SPECIAL_FAT32 0x0FFFFFF7\r
36#define FAT_CLUSTER_MASK_FAT12 0xFFF\r
37#define FAT_CLUSTER_UNMASK_FAT12 0xF000\r
38#define FAT_CLUSTER_MASK_FAT32 0x0FFFFFFF\r
39#define FAT_CLUSTER_UNMASK_FAT32 0xF0000000\r
40#define FAT_POS_FAT12(a) ((a) * 3 / 2)\r
41#define FAT_POS_FAT16(a) ((a) * 2)\r
42#define FAT_POS_FAT32(a) ((a) * 4)\r
43#define FAT_ODD_CLUSTER_FAT12(a) (((a) & 1) != 0)\r
b9ec9330
QH
44\r
45//\r
46// FAT attribute define\r
47//\r
bcdcc416
MK
48#define FAT_ATTRIBUTE_READ_ONLY 0x01\r
49#define FAT_ATTRIBUTE_HIDDEN 0x02\r
50#define FAT_ATTRIBUTE_SYSTEM 0x04\r
51#define FAT_ATTRIBUTE_VOLUME_ID 0x08\r
52#define FAT_ATTRIBUTE_DIRECTORY 0x10\r
53#define FAT_ATTRIBUTE_ARCHIVE 0x20\r
54#define FAT_ATTRIBUTE_DEVICE 0x40\r
55#define FAT_ATTRIBUTE_LFN 0x0F\r
b9ec9330
QH
56//\r
57// Some Long File Name definitions\r
58//\r
bcdcc416
MK
59#define FAT_LFN_LAST 0x40 // Ordinal field\r
60#define MAX_LFN_ENTRIES 20\r
61#define LFN_CHAR1_LEN 5\r
62#define LFN_CHAR2_LEN 6\r
63#define LFN_CHAR3_LEN 2\r
64#define LFN_CHAR_TOTAL (LFN_CHAR1_LEN + LFN_CHAR2_LEN + LFN_CHAR3_LEN)\r
65#define LFN_ENTRY_NUMBER(a) (((a) + LFN_CHAR_TOTAL - 1) / LFN_CHAR_TOTAL)\r
b9ec9330
QH
66//\r
67// Some 8.3 File Name definitions\r
68//\r
bcdcc416
MK
69#define FAT_MAIN_NAME_LEN 8\r
70#define FAT_EXTEND_NAME_LEN 3\r
71#define FAT_NAME_LEN (FAT_MAIN_NAME_LEN + FAT_EXTEND_NAME_LEN)\r
b9ec9330
QH
72//\r
73// Some directory entry information\r
74//\r
bcdcc416
MK
75#define FAT_ENTRY_INFO_OFFSET 13\r
76#define DELETE_ENTRY_MARK 0xE5\r
77#define EMPTY_ENTRY_MARK 0x00\r
b9ec9330
QH
78\r
79//\r
80// Volume dirty Mask\r
81//\r
bcdcc416
MK
82#define FAT16_DIRTY_MASK 0x7fff\r
83#define FAT32_DIRTY_MASK 0xf7ffffff\r
b9ec9330
QH
84//\r
85// internal flag\r
86//\r
bcdcc416
MK
87#define FAT_CASE_MIXED 0x01\r
88#define FAT_CASE_NAME_LOWER 0x08\r
89#define FAT_CASE_EXT_LOWER 0x10\r
b9ec9330
QH
90\r
91typedef struct {\r
bcdcc416
MK
92 UINT8 Ia32Jump[3];\r
93 CHAR8 OemId[8];\r
94 UINT16 SectorSize;\r
95 UINT8 SectorsPerCluster;\r
96 UINT16 ReservedSectors;\r
97 UINT8 NumFats;\r
98 UINT16 RootEntries; // < FAT32, root dir is fixed size\r
99 UINT16 Sectors;\r
100 UINT8 Media;\r
101 UINT16 SectorsPerFat; // < FAT32\r
102 UINT16 SectorsPerTrack; // (ignored)\r
103 UINT16 Heads; // (ignored)\r
104 UINT32 HiddenSectors; // (ignored)\r
105 UINT32 LargeSectors; // Used if Sectors==0\r
b9ec9330
QH
106} FAT_BOOT_SECTOR_BASIC;\r
107\r
108typedef struct {\r
bcdcc416
MK
109 UINT8 PhysicalDriveNumber; // (ignored)\r
110 UINT8 CurrentHead; // holds boot_sector_dirty bit\r
111 UINT8 Signature; // (ignored)\r
112 CHAR8 Id[4];\r
113 CHAR8 FatLabel[11];\r
114 CHAR8 SystemId[8];\r
b9ec9330
QH
115} FAT_BOOT_SECTOR_EXT;\r
116\r
117typedef struct {\r
bcdcc416
MK
118 UINT32 LargeSectorsPerFat; // FAT32\r
119 UINT16 ExtendedFlags; // FAT32 (ignored)\r
120 UINT16 FsVersion; // FAT32 (ignored)\r
121 UINT32 RootDirFirstCluster; // FAT32\r
122 UINT16 FsInfoSector; // FAT32\r
123 UINT16 BackupBootSector; // FAT32\r
124 UINT8 Reserved[12]; // FAT32 (ignored)\r
125 UINT8 PhysicalDriveNumber; // (ignored)\r
126 UINT8 CurrentHead; // holds boot_sector_dirty bit\r
127 UINT8 Signature; // (ignored)\r
128 CHAR8 Id[4];\r
129 CHAR8 FatLabel[11];\r
130 CHAR8 SystemId[8];\r
b9ec9330
QH
131} FAT32_BOOT_SECTOR_EXT;\r
132\r
6b7e4498 133typedef union {\r
bcdcc416
MK
134 FAT_BOOT_SECTOR_EXT FatBse;\r
135 FAT32_BOOT_SECTOR_EXT Fat32Bse;\r
136} FAT_BSE;\r
6b7e4498
DB
137\r
138typedef struct {\r
bcdcc416
MK
139 FAT_BOOT_SECTOR_BASIC FatBsb;\r
140 FAT_BSE FatBse;\r
b9ec9330
QH
141} FAT_BOOT_SECTOR;\r
142\r
143//\r
144// FAT Info Structure\r
145//\r
146typedef struct {\r
bcdcc416
MK
147 UINT32 ClusterCount;\r
148 UINT32 NextCluster;\r
b9ec9330
QH
149} FAT_FREE_INFO;\r
150\r
151typedef struct {\r
bcdcc416
MK
152 UINT32 Signature;\r
153 UINT8 ExtraBootCode[480];\r
154 UINT32 InfoBeginSignature;\r
155 FAT_FREE_INFO FreeInfo;\r
156 UINT8 Reserved[12];\r
157 UINT32 InfoEndSignature;\r
b9ec9330
QH
158} FAT_INFO_SECTOR;\r
159\r
160//\r
161// Directory Entry\r
162//\r
163#define FAT_MAX_YEAR_FROM_1980 0x7f\r
164typedef struct {\r
bcdcc416
MK
165 UINT16 Day : 5;\r
166 UINT16 Month : 4;\r
167 UINT16 Year : 7; // From 1980\r
b9ec9330
QH
168} FAT_DATE;\r
169\r
170typedef struct {\r
bcdcc416
MK
171 UINT16 DoubleSecond : 5;\r
172 UINT16 Minute : 6;\r
173 UINT16 Hour : 5;\r
b9ec9330
QH
174} FAT_TIME;\r
175\r
176typedef struct {\r
bcdcc416
MK
177 FAT_TIME Time;\r
178 FAT_DATE Date;\r
b9ec9330
QH
179} FAT_DATE_TIME;\r
180\r
181typedef struct {\r
bcdcc416
MK
182 CHAR8 FileName[11]; // 8.3 filename\r
183 UINT8 Attributes;\r
184 UINT8 CaseFlag;\r
185 UINT8 CreateMillisecond; // (creation milliseconds - ignored)\r
186 FAT_DATE_TIME FileCreateTime;\r
187 FAT_DATE FileLastAccess;\r
188 UINT16 FileClusterHigh; // >= FAT32\r
189 FAT_DATE_TIME FileModificationTime;\r
190 UINT16 FileCluster;\r
191 UINT32 FileSize;\r
b9ec9330
QH
192} FAT_DIRECTORY_ENTRY;\r
193\r
194typedef struct {\r
bcdcc416
MK
195 UINT8 Ordinal;\r
196 CHAR8 Name1[10]; // (Really 5 chars, but not WCHAR aligned)\r
197 UINT8 Attributes;\r
198 UINT8 Type;\r
199 UINT8 Checksum;\r
200 CHAR16 Name2[6];\r
201 UINT16 MustBeZero;\r
202 CHAR16 Name3[2];\r
b9ec9330
QH
203} FAT_DIRECTORY_LFN;\r
204\r
205#pragma pack()\r
206\r
207#endif\r