summaryrefslogtreecommitdiffstats
path: root/private/ntos/boot/bootcode/hpfs/i386/superb.inc
blob: e670b800baeff6c25b6dbfb62ba0d3959fab2887 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
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.
;