Changeset 6be4142 in mainline for uspace/dist/src
- Timestamp:
- 2012-08-12T04:53:47Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 1b6b76d
- Parents:
- 0153c87
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/dist/src/bithenge/fat.bh
r0153c87 r6be4142 27 27 # FAT filesystem script. 28 28 # Largely based on https://en.wikipedia.org/wiki/File_Allocation_Table 29 # Currently only FAT12 and FAT16 are supported. 29 30 30 31 transform u8 = uint8; … … 32 33 transform u32 = uint32le; 33 34 35 transform fat_attributes = struct { 36 .read_only <- bit; 37 .hidden <- bit; 38 .system <- bit; 39 .volume_label <- bit; 40 .subdirectory <- bit; 41 .archive <- bit; 42 .device <- bit; 43 .reserved <- bit; 44 } <- bits_le <- known_length(1); 45 34 46 transform fat_dir_entry(disk) = struct { 35 47 .filename <- known_length(8); 36 48 .extension <- known_length(3); 37 .attrs <- u8;49 .attrs <- fat_attributes; 38 50 .flags <- u8; 39 51 .ctime_fine <- u8; … … 79 91 }; 80 92 81 .num_sectors <- if (.bpb331.ignore) { 82 (.num_sectors_16) 83 } else { 84 (.bpb331.num_sectors_32) 85 }; 86 87 .first_root_sector <- (.num_reserved_sectors + .num_fats * .sectors_per_fat); 88 .first_data_sector <- (.first_root_sector + 89 (.num_root_entries * 32 + .bytes_per_sector - 1) // 90 .bytes_per_sector); 91 .num_clusters <- (2 + (.num_sectors - .first_data_sector) // .sectors_per_cluster); 92 .bits <- if (.num_clusters < 4085) { (12) } 93 else { if (.num_clusters < 65525) { (16) } else { (32) } }; 94 95 .fats <- partial(.num_reserved_sectors * .bytes_per_sector) { 96 repeat(.num_fats) { 97 fat_table(.bits, .num_clusters) <- 98 known_length(.sectors_per_fat * .bytes_per_sector) 99 } 100 } <- (disk); 101 102 .root <- partial(.first_root_sector * .bytes_per_sector) { 103 repeat(.num_root_entries) { fat_dir_entry(disk) } } <- (disk); 93 .drive_number <- u8; 94 .chkdsk_flags <- u8; 95 .extended_boot_signature <- u8; 96 if (.extended_boot_signature == 41) { 97 .volume_id <- u32; 98 .volume_label <- ascii <- known_length(11); 99 .type <- ascii <- known_length(8); 100 } 104 101 105 102 .boot_signature <- (disk[510,2]); # b"\x55\xaa"; TODO: what if .bytes_per_sector < 512? 106 103 }; 107 104 108 transform fat_filesystem = partial { fat_super(in) }; 105 transform fat_filesystem_tree(disk) = struct { 106 .super <- partial{fat_super(disk)} <- (disk); 107 108 .num_sectors <- if (.super.bpb331.ignore) { 109 (.super.num_sectors_16) 110 } else { 111 (.super.bpb331.num_sectors_32) 112 }; 113 114 .first_root_sector <- (.super.num_reserved_sectors + .super.num_fats * .super.sectors_per_fat); 115 .first_data_sector <- (.first_root_sector + 116 (.super.num_root_entries * 32 + .super.bytes_per_sector - 1) // 117 .super.bytes_per_sector); 118 .num_clusters <- (2 + (.num_sectors - .first_data_sector) // .super.sectors_per_cluster); 119 .bits <- if (.num_clusters < 4085) { (12) } 120 else { if (.num_clusters < 65525) { (16) } else { (32) } }; 121 122 .fats <- partial(.super.num_reserved_sectors * .super.bytes_per_sector) { 123 repeat(.super.num_fats) { 124 fat_table(.bits, .num_clusters) <- 125 known_length(.super.sectors_per_fat * .super.bytes_per_sector) 126 } 127 } <- (disk); 128 129 .root <- partial(.first_root_sector * .super.bytes_per_sector) { 130 repeat(.super.num_root_entries) { fat_dir_entry(disk) } } <- (disk); 131 }; 132 133 transform fat_filesystem = partial {fat_filesystem_tree(in)}; 109 134 110 135 transform main = fat_filesystem;
Note:
See TracChangeset
for help on using the changeset viewer.