Browse Source

Kernel: Move FAT structure definitions to Kernel/API

We need to be able to include these definitions from userspace as the
upcoming mkfs.fat utility will depend on these.
implicitfield 1 year ago
parent
commit
8b77737f8e
2 changed files with 77 additions and 63 deletions
  1. 76 0
      Kernel/API/FileSystem/FATStructures.h
  2. 1 63
      Kernel/FileSystem/FATFS/Definitions.h

+ 76 - 0
Kernel/API/FileSystem/FATStructures.h

@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 2022, Undefine <undefine@undefine.pl>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#pragma once
+
+#include <AK/Types.h>
+
+namespace Kernel {
+
+// This structure represents the DOS 3.31 BIOS Partition Block.
+// While DOS 3.31 predates FAT verions 12/16/32 (the versions supported by this driver),
+// the fields in this block are common with the DOS 4 and DOS 7 BIOS Parameter blocks.
+// This structure will be followed by an "Extended BIOS Partition Block" (EBPB).
+//
+// The DOS 4 EBPB is *typically* used by FAT 12/16 file systems, while the DOS 7 EBPB
+// is *typically* used by FAT 32. _However_, any combination is possible, as the FAT
+// version is only determined by the number of clusters.
+//
+// Note that the DOS 4 and DOS 7 EBPB extensions are incompatible with each other
+// (contain fields in different orders and of different lenghts) and do not contain
+// an explicit indication to differentiate them.
+// This driver uses heuristics to identify the EBPB version (based on the signature bytes
+// and sector counts).
+// FIXME: Consider also using the MBR parition type field in the future.
+struct [[gnu::packed]] DOS3BIOSParameterBlock {
+    u8 boot_jump[3];
+    char oem_identifier[8];
+    u16 bytes_per_sector; // Offset 0x0B -- beginning of DOS 3.31 BPB.
+    u8 sectors_per_cluster;
+    u16 reserved_sector_count;
+    u8 fat_count;
+    u16 root_directory_entry_count;
+    u16 sector_count_16bit;
+    u8 media_descriptor_type;
+    u16 sectors_per_fat_16bit;
+    u16 sectors_per_track;
+    u16 head_count;
+    u32 hidden_sector_count;
+    u32 sector_count_32bit; // 0x020 -- end of DOS 3.31 BPB.
+};
+// 11 is the boot jump/OEM identifier prefix prior to the official BPB.
+static_assert(AssertSize<DOS3BIOSParameterBlock, 11 + 25>());
+
+struct [[gnu::packed]] DOS4BIOSParameterBlock {
+    // Begins at sector offset 0x024.
+    u8 drive_number; // 0x024
+    u8 flags;
+    u8 signature;
+    u32 volume_id;
+    char volume_label_string[11];
+    char file_system_type[8];
+};
+static_assert(AssertSize<DOS4BIOSParameterBlock, 26>());
+
+struct [[gnu::packed]] DOS7BIOSParameterBlock {
+    // Begins at sector offset 0x024.
+    u32 sectors_per_fat_32bit; // 0x024
+    u16 flags;
+    u16 fat_version; // Expected value 0x2b2a.
+    u32 root_directory_cluster;
+    u16 fs_info_sector;
+    u16 backup_boot_sector;
+    u8 unused3[12];
+    u8 drive_number;
+    u8 unused4;
+    u8 signature;
+    u32 volume_id;
+    char volume_label_string[11];
+    char file_system_type[8];
+};
+static_assert(AssertSize<DOS7BIOSParameterBlock, 54>());
+
+}

+ 1 - 63
Kernel/FileSystem/FATFS/Definitions.h

@@ -9,73 +9,11 @@
 #include <AK/DOSPackedTime.h>
 #include <AK/EnumBits.h>
 #include <AK/Types.h>
+#include <Kernel/API/FileSystem/FATStructures.h>
 #include <Kernel/Library/KBuffer.h>
 
 namespace Kernel {
 
-// This structure represents the DOS 3.31 BIOS Partition Block.
-// While DOS 3.31 predates FAT verions 12/16/32 (the versions supported by this driver),
-// the fields in this block are common with the DOS 4 and DOS 7 BIOS Parameter blocks.
-// This structure will be followed by an "Extended BIOS Partition Block" (EBPB).
-//
-// The DOS 4 EBPB is *typically* used by FAT 12/16 file systems, while the DOS 7 EBPB
-// is *typically* used by FAT 32. _However_, any combination is possible, as the FAT
-// version is only determined by the number of clusters.
-//
-// Note that the DOS 4 and DOS 7 EBPB extensions are incompatible with each other
-// (contain fields in different orders and of different lenghts) and do not contain
-// an explicit indication to differentiate them.
-// This driver uses heuristics to identify the EBPB version (based on the signature bytes
-// and sector counts).
-// FIXME: Consider also using the MBR parition type field in the future.
-struct [[gnu::packed]] DOS3BIOSParameterBlock {
-    u8 boot_jump[3];
-    char oem_identifier[8];
-    u16 bytes_per_sector; // Offset 0x0B -- beginning of DOS 3.31 BPB.
-    u8 sectors_per_cluster;
-    u16 reserved_sector_count;
-    u8 fat_count;
-    u16 root_directory_entry_count;
-    u16 sector_count_16bit;
-    u8 media_descriptor_type;
-    u16 sectors_per_fat_16bit;
-    u16 sectors_per_track;
-    u16 head_count;
-    u32 hidden_sector_count;
-    u32 sector_count_32bit; // 0x020 -- end of DOS 3.31 BPB.
-};
-// 11 is the boot jump/OEM identifier prefix prior to the official BPB.
-static_assert(AssertSize<DOS3BIOSParameterBlock, 11 + 25>());
-
-struct [[gnu::packed]] DOS4BIOSParameterBlock {
-    // Begins at sector offset 0x024.
-    u8 drive_number; // 0x024
-    u8 flags;
-    u8 signature;
-    u32 volume_id;
-    char volume_label_string[11];
-    char file_system_type[8];
-};
-static_assert(AssertSize<DOS4BIOSParameterBlock, 26>());
-
-struct [[gnu::packed]] DOS7BIOSParameterBlock {
-    // Begins at sector offset 0x024.
-    u32 sectors_per_fat_32bit; // 0x024
-    u16 flags;
-    u16 fat_version; // Expected value 0x2b2a.
-    u32 root_directory_cluster;
-    u16 fs_info_sector;
-    u16 backup_boot_sector;
-    u8 unused3[12];
-    u8 drive_number;
-    u8 unused4;
-    u8 signature;
-    u32 volume_id;
-    char volume_label_string[11];
-    char file_system_type[8];
-};
-static_assert(AssertSize<DOS7BIOSParameterBlock, 54>());
-
 enum DOSBIOSParameterBlockVersion {
     DOS_BPB_UNKNOWN,
     DOS_BPB_3, // Version 3.4.