NT4/private/ntos/boot/bootcode/hpfs/i386/superb.inc
2020-09-30 17:12:29 +02:00

243 lines
7.8 KiB
PHP

;** 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.
;