diff options
Diffstat (limited to 'private/ntos/boot/bootcode/hpfs/i386/superb.inc')
-rw-r--r-- | private/ntos/boot/bootcode/hpfs/i386/superb.inc | 242 |
1 files changed, 242 insertions, 0 deletions
diff --git a/private/ntos/boot/bootcode/hpfs/i386/superb.inc b/private/ntos/boot/bootcode/hpfs/i386/superb.inc new file mode 100644 index 000000000..e670b800b --- /dev/null +++ b/private/ntos/boot/bootcode/hpfs/i386/superb.inc @@ -0,0 +1,242 @@ +;** SUPERB.H - Super Block and Spare Block definitions +; +; FILESYS +; Gregory A. Jones +; Copyright 1988 Microsoft Corporation +; +; Modification history: +; P.A. Williams 06/01/89 Added fields SPB_CPSEC and SPB_CPCNT to +; the spare block. +; P.A. Williams 06/05/89 Changed base and functional version no. to 1. +; + +SEC_SUPERB equ 16 ; superblock is after 8K boot block +SEC_SPAREB equ 17 ; spareblock is after superblock +SEC_BOOT equ 0 ; boot sector + + +;* SUPERB.INC - Super Block Definition +; +; The Superblock is the first block of the file system. +; It starts at sector #4, leaving 2K for boot sectors. +; +; Pointer to the root directory +; Pointer to the bit map +; Clean pointer +; Pointer to the bad list +; + +RSP struc + P dd ? ; main psector pointer + P2 dd ? ; spare pointer +RSP ends + + +SuperB struc + SB_SIG1 dd ? ; signature value 1 + SB_SIG2 dd ? ; signature value 2 + + SB_VER db ? ; version # of filesystem structures + SB_FVER db ? ; functional version number - the smallest/ + ; oldest version of the filesystem that can + ; understand this disk - some version + ; enhancements may define fields which can be + ; ignored by earlier versions + + SB_DUMY dw ? ; free + + SB_ROOT dd ? ; Psector # of root fnode + + SB_SEC dd ? ; # of sectors on volume + SB_BSEC dd ? ; # of bad sectors on volume + + SB_BII db (size RSP) dup (?) ; Bitmap Indirect Block + SB_BBL db (size RSP) dup (?) ; badblock list chain #1 + + SB_CDDAT dd ? ; date of last CHKDSK + SB_DODAT dd ? ; date of last Disk Optimize + + SB_DBSIZE dd ? ; # of sectors in dirblk band + SB_DBLOW dd ? ; first Psector in DIRBLK band + SB_DBHIGH dd ? ; last Psector in DIRBLK band + SB_DBMAP dd ? ; first Psector of DIRBLK band bit map. Starts + ; on a 2K boundary, 2K bytes maximum + + SB_VOLNAME db 32 dup (?) ; Volume name + + SB_SIDSEC dd ? ; sector # of first sector in SIDTAB + ; ID map is 4K - 8 contiguous sectors + + SB_FILL db 512-100 dup (?) ; fill definition out to 512 bytes + ; MUST BE ZERO + +SuperB ends + + + +;* SpareB - Spare Block Definitions +; +; SpareB contains various emergency supplies and fixup information. +; This stuff isn't in the superblock in order for the superblock +; to be read only and decrease the liklihood that a flakey write +; will cause the superblock to become unreadable. +; +; This sector is located directly after the superblock - sector 5. +; +; Note that the number of spare DIRBLKs is a format option, given +; that they all have to fit into the SpareB, giving us a max of +; 101 of them. +; +; Access to the SpareB is complicated by the fact that we can't +; access it via the cache, since the cache may be unavailable. +; If every cache buffer is dirty, we could get a HotFix error when +; writing the first one, which would deadlock us if we needed to +; read this stuff via the cache. Instead, we read it directly into +; a private buffer via RdHF. +; +; This means that the disk layout must be such that each cache cluster +; that contains the SpareB or the hotfix list must not contain any +; other writable sector, to prevent us from having a modified +; direct-written sector overwritten by an earlier unmodified copy +; which was in a cache block. It's ok for the SuperB to be in the +; same cache group as the SpareB since the SuperB is RO to the filesys. +; +; Checksums. Done on both Super Block and the Spare Block. +; Both checksums are stored in the Spare Block. The checksum +; field for the Super Block (SPB_SUPERBSUM) must be set when +; calculating the checksum for the Spare Block. The checksum +; field for the Spare Block (SPB_SPAREBSUM) must be zero when +; calculating the checksum for the Spare Block. +; If both checksum fields are zero, the checksums have not been +; calculated for the volume. +; + +SPAREDB equ 20 ; 20 spare DIRBLKs + +SpareB struc + + SPB_SIG1 dd ? ; signature value 1 + SPB_SIG2 dd ? ; signature value 2 + + SPB_FLAG db ? ; cleanliness flag + SPB_ALIGN db 3 dup (?) ; alignment + + SPB_HFSEC dd ? ; first hotfix list P sector + SPB_HFUSE dd ? ; # of hot fixes in effect + SPB_HFMAX dd ? ; max size of hot fix list + + SPB_SDBCNT dd ? ; # of spare dirblks + SPB_SDBMAX dd ? ; maximum number of spare DB values. + SPB_CPSEC dd ? ; code page sector + SPB_CPCNT dd ? ; number of code pages + SPB_SUPERBSUM dd ? ; Checksum of Super Block + SPB_SPAREBSUM dd ? ; Checksum of Spare Block + SPB_DUMY dd 15 dup (?) ; some extra space for future use + SPB_SPARDB dd 101 dup (?) ; Psector #s of spare dirblks +SpareB ends + + +; Super Block Signature + +SBSIG1 equ 0f995e849h ; two signatures cause we got lotsa +SBSIG2 equ 0FA53E9C5h ; space +SPSIG1 equ 0f9911849h ; two signatures cause we got lotsa +SPSIG2 equ 0FA5229C5h ; space + + + +; Superblock Versions + +SBBASEV equ 2 ; base version +SBBASEFV equ 2 ; base functional version + +; Spare Block Flags +; + +SPF_DIRT equ 0001h ; file system is dirty +SPF_SPARE equ 0002h ; spare DIRBLKs have been used +SPF_HFUSED equ 0004h ; hot fix sectors have been used +SPF_BADSEC equ 0008h ; bad sector, corrupt disk +SPF_BADBM equ 0010h ; bad bitmap block +SPF_VER equ 0080h ; file system was written by a version + ; < SB_VER, so some of the new fields + ; may have not been updated + + +;* Bit maps +; +; PFS keeps track of free space in a series of bit maps. +; Currently, each bit map is 2048 bytes, which covers about +; 8 megabytes of disk space. We could rearrange these to be +; more cylinder sensitive... +; +; The superblock has the address of a section of contiguous sectors +; that contains a double word sector # for each bit map block. This +; will be a maximum of 2048 bytes (4 sectors) +; +; Max # of size RAM (K) size 2nd lvl +; bitmaps (meg) to reside bitmap +; bitmap (bytes) +; +; 1 8.39 2 256 +; 2 16.78 4 512 +; 3 25.17 6 768 +; 4 33.55 8 1024 +; 5 41.94 10 1280 +; 6 50.33 12 1536 +; 7 58.72 14 1792 +; 8 67.11 16 2048 +; 9 75.50 18 2304 +; 10 83.89 20 2560 +; 15 125.83 30 3840 +; 20 167.77 40 5120 +; 30 251.66 60 7680 +; 40 335.54 80 10240 +; 50 419.43 100 12800 +; 100 838.86 200 25600 +; 200 1677.72 400 51200 +; 300 2516.58 600 76800 +; 400 3355.44 800 102400 +; 500 4194.30 1000 128000 +; + + + +;* Hot Fixing +; +; Each file system maintains a structure listing N "hot fix" +; disk clusters of HOTFIXSIZ sectors each, each starting on +; a multiple of HOTFIXSIZ. Whenever the file system discovers +; that it's trying to write to a bad spot on the disk it will +; instead select a free hot fix cluster and write there, instead. +; The substitution will be recorded in the hot fix list, and the +; SBF_SPARE bit will be set. The file system sill describes the +; data as being in the bad old sectors; the disk interface will +; do a mapping between the `believed' location and the true location. +; +; CHKDSK will be run as soon as possible; it will move the +; hot fixed data from the hot fix cluster to somewhere else, +; freeing that hot fix cluster, and adjusting the disk structure +; to point to the new location of the data. As a result, entrys +; on the hot fix list should be transient and few. +; +; The superblock contains the first sector of the hot fix list +; which takes the following format: +; +; long oldsec[SB_HFMAX]; sector # of start of bad clusters +; long newsec[SB_HFMAX]; sector # of start of subst. cluster +; long fnode [SB_HFMAX]; fnode sector of file/directory +; involved with bad cluster. May be +; 0 (don't know) or invalid. The +; repair program must verify that it +; *is* an FNODE and must see if other +; structures might also involve this +; bad cluster. +; +; the SB_HFUSE field describes the number of these records which is +; in use - unused ones should have oldsec[i] = 0. The list will +; be 'dense' - no oldsec[i] will be 0 where i < SB_HFUSE. +; +; The sector(s) which contain the hot fix list must be contiguous +; and may not themselves be defective. +; |