xref: /openbsd/usr.sbin/makefs/ffs/ffs_tables.c (revision 4874b543)
1*4874b543Sderaadt /*	$OpenBSD: ffs_tables.c,v 1.3 2021/10/06 00:40:41 deraadt Exp $	*/
26c4d9c1cSnatano /*	$NetBSD: ffs_tables.c,v 1.2 1994/06/29 06:46:35 cgd Exp $	*/
3f54008ebSnatano 
4f54008ebSnatano /*
5f54008ebSnatano  * Copyright (c) 1982, 1986, 1993
6f54008ebSnatano  *	The Regents of the University of California.  All rights reserved.
7f54008ebSnatano  *
8f54008ebSnatano  * Redistribution and use in source and binary forms, with or without
9f54008ebSnatano  * modification, are permitted provided that the following conditions
10f54008ebSnatano  * are met:
11f54008ebSnatano  * 1. Redistributions of source code must retain the above copyright
12f54008ebSnatano  *    notice, this list of conditions and the following disclaimer.
13f54008ebSnatano  * 2. Redistributions in binary form must reproduce the above copyright
14f54008ebSnatano  *    notice, this list of conditions and the following disclaimer in the
15f54008ebSnatano  *    documentation and/or other materials provided with the distribution.
16f54008ebSnatano  * 3. Neither the name of the University nor the names of its contributors
17f54008ebSnatano  *    may be used to endorse or promote products derived from this software
18f54008ebSnatano  *    without specific prior written permission.
19f54008ebSnatano  *
20f54008ebSnatano  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21f54008ebSnatano  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22f54008ebSnatano  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23f54008ebSnatano  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24f54008ebSnatano  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25f54008ebSnatano  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26f54008ebSnatano  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27f54008ebSnatano  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28f54008ebSnatano  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29f54008ebSnatano  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30f54008ebSnatano  * SUCH DAMAGE.
31f54008ebSnatano  *
32f54008ebSnatano  *	@(#)ffs_tables.c	8.1 (Berkeley) 6/11/93
33f54008ebSnatano  */
34f54008ebSnatano 
35*4874b543Sderaadt #include <sys/types.h>
366c4d9c1cSnatano #include <ufs/ffs/fs.h>
37f54008ebSnatano 
38*4874b543Sderaadt #include <stdlib.h>
39*4874b543Sderaadt 
40f54008ebSnatano /*
41f54008ebSnatano  * Bit patterns for identifying fragments in the block map
42f54008ebSnatano  * used as ((map & around) == inside)
43f54008ebSnatano  */
44f54008ebSnatano const int around[9] = {
45f54008ebSnatano 	0x3, 0x7, 0xf, 0x1f, 0x3f, 0x7f, 0xff, 0x1ff, 0x3ff
46f54008ebSnatano };
47f54008ebSnatano const int inside[9] = {
48f54008ebSnatano 	0x0, 0x2, 0x6, 0xe, 0x1e, 0x3e, 0x7e, 0xfe, 0x1fe
49f54008ebSnatano };
50f54008ebSnatano 
51f54008ebSnatano /*
52f54008ebSnatano  * Given a block map bit pattern, the frag tables tell whether a
53f54008ebSnatano  * particular size fragment is available.
54f54008ebSnatano  *
55f54008ebSnatano  * used as:
56f54008ebSnatano  * if ((1 << (size - 1)) & fragtbl[fs->fs_frag][map] {
57f54008ebSnatano  *	at least one fragment of the indicated size is available
58f54008ebSnatano  * }
59f54008ebSnatano  *
60f54008ebSnatano  * These tables are used by the scanc instruction on the VAX to
61f54008ebSnatano  * quickly find an appropriate fragment.
62f54008ebSnatano  */
63f54008ebSnatano const u_char fragtbl124[256] = {
64f54008ebSnatano 	0x00, 0x16, 0x16, 0x2a, 0x16, 0x16, 0x26, 0x4e,
65f54008ebSnatano 	0x16, 0x16, 0x16, 0x3e, 0x2a, 0x3e, 0x4e, 0x8a,
66f54008ebSnatano 	0x16, 0x16, 0x16, 0x3e, 0x16, 0x16, 0x36, 0x5e,
67f54008ebSnatano 	0x16, 0x16, 0x16, 0x3e, 0x3e, 0x3e, 0x5e, 0x9e,
68f54008ebSnatano 	0x16, 0x16, 0x16, 0x3e, 0x16, 0x16, 0x36, 0x5e,
69f54008ebSnatano 	0x16, 0x16, 0x16, 0x3e, 0x3e, 0x3e, 0x5e, 0x9e,
70f54008ebSnatano 	0x2a, 0x3e, 0x3e, 0x2a, 0x3e, 0x3e, 0x2e, 0x6e,
71f54008ebSnatano 	0x3e, 0x3e, 0x3e, 0x3e, 0x2a, 0x3e, 0x6e, 0xaa,
72f54008ebSnatano 	0x16, 0x16, 0x16, 0x3e, 0x16, 0x16, 0x36, 0x5e,
73f54008ebSnatano 	0x16, 0x16, 0x16, 0x3e, 0x3e, 0x3e, 0x5e, 0x9e,
74f54008ebSnatano 	0x16, 0x16, 0x16, 0x3e, 0x16, 0x16, 0x36, 0x5e,
75f54008ebSnatano 	0x16, 0x16, 0x16, 0x3e, 0x3e, 0x3e, 0x5e, 0x9e,
76f54008ebSnatano 	0x26, 0x36, 0x36, 0x2e, 0x36, 0x36, 0x26, 0x6e,
77f54008ebSnatano 	0x36, 0x36, 0x36, 0x3e, 0x2e, 0x3e, 0x6e, 0xae,
78f54008ebSnatano 	0x4e, 0x5e, 0x5e, 0x6e, 0x5e, 0x5e, 0x6e, 0x4e,
79f54008ebSnatano 	0x5e, 0x5e, 0x5e, 0x7e, 0x6e, 0x7e, 0x4e, 0xce,
80f54008ebSnatano 	0x16, 0x16, 0x16, 0x3e, 0x16, 0x16, 0x36, 0x5e,
81f54008ebSnatano 	0x16, 0x16, 0x16, 0x3e, 0x3e, 0x3e, 0x5e, 0x9e,
82f54008ebSnatano 	0x16, 0x16, 0x16, 0x3e, 0x16, 0x16, 0x36, 0x5e,
83f54008ebSnatano 	0x16, 0x16, 0x16, 0x3e, 0x3e, 0x3e, 0x5e, 0x9e,
84f54008ebSnatano 	0x16, 0x16, 0x16, 0x3e, 0x16, 0x16, 0x36, 0x5e,
85f54008ebSnatano 	0x16, 0x16, 0x16, 0x3e, 0x3e, 0x3e, 0x5e, 0x9e,
86f54008ebSnatano 	0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x7e,
87f54008ebSnatano 	0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x7e, 0xbe,
88f54008ebSnatano 	0x2a, 0x3e, 0x3e, 0x2a, 0x3e, 0x3e, 0x2e, 0x6e,
89f54008ebSnatano 	0x3e, 0x3e, 0x3e, 0x3e, 0x2a, 0x3e, 0x6e, 0xaa,
90f54008ebSnatano 	0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x7e,
91f54008ebSnatano 	0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x7e, 0xbe,
92f54008ebSnatano 	0x4e, 0x5e, 0x5e, 0x6e, 0x5e, 0x5e, 0x6e, 0x4e,
93f54008ebSnatano 	0x5e, 0x5e, 0x5e, 0x7e, 0x6e, 0x7e, 0x4e, 0xce,
94f54008ebSnatano 	0x8a, 0x9e, 0x9e, 0xaa, 0x9e, 0x9e, 0xae, 0xce,
95f54008ebSnatano 	0x9e, 0x9e, 0x9e, 0xbe, 0xaa, 0xbe, 0xce, 0x8a,
96f54008ebSnatano };
97f54008ebSnatano 
98f54008ebSnatano const u_char fragtbl8[256] = {
99f54008ebSnatano 	0x00, 0x01, 0x01, 0x02, 0x01, 0x01, 0x02, 0x04,
100f54008ebSnatano 	0x01, 0x01, 0x01, 0x03, 0x02, 0x03, 0x04, 0x08,
101f54008ebSnatano 	0x01, 0x01, 0x01, 0x03, 0x01, 0x01, 0x03, 0x05,
102f54008ebSnatano 	0x02, 0x03, 0x03, 0x02, 0x04, 0x05, 0x08, 0x10,
103f54008ebSnatano 	0x01, 0x01, 0x01, 0x03, 0x01, 0x01, 0x03, 0x05,
104f54008ebSnatano 	0x01, 0x01, 0x01, 0x03, 0x03, 0x03, 0x05, 0x09,
105f54008ebSnatano 	0x02, 0x03, 0x03, 0x02, 0x03, 0x03, 0x02, 0x06,
106f54008ebSnatano 	0x04, 0x05, 0x05, 0x06, 0x08, 0x09, 0x10, 0x20,
107f54008ebSnatano 	0x01, 0x01, 0x01, 0x03, 0x01, 0x01, 0x03, 0x05,
108f54008ebSnatano 	0x01, 0x01, 0x01, 0x03, 0x03, 0x03, 0x05, 0x09,
109f54008ebSnatano 	0x01, 0x01, 0x01, 0x03, 0x01, 0x01, 0x03, 0x05,
110f54008ebSnatano 	0x03, 0x03, 0x03, 0x03, 0x05, 0x05, 0x09, 0x11,
111f54008ebSnatano 	0x02, 0x03, 0x03, 0x02, 0x03, 0x03, 0x02, 0x06,
112f54008ebSnatano 	0x03, 0x03, 0x03, 0x03, 0x02, 0x03, 0x06, 0x0a,
113f54008ebSnatano 	0x04, 0x05, 0x05, 0x06, 0x05, 0x05, 0x06, 0x04,
114f54008ebSnatano 	0x08, 0x09, 0x09, 0x0a, 0x10, 0x11, 0x20, 0x40,
115f54008ebSnatano 	0x01, 0x01, 0x01, 0x03, 0x01, 0x01, 0x03, 0x05,
116f54008ebSnatano 	0x01, 0x01, 0x01, 0x03, 0x03, 0x03, 0x05, 0x09,
117f54008ebSnatano 	0x01, 0x01, 0x01, 0x03, 0x01, 0x01, 0x03, 0x05,
118f54008ebSnatano 	0x03, 0x03, 0x03, 0x03, 0x05, 0x05, 0x09, 0x11,
119f54008ebSnatano 	0x01, 0x01, 0x01, 0x03, 0x01, 0x01, 0x03, 0x05,
120f54008ebSnatano 	0x01, 0x01, 0x01, 0x03, 0x03, 0x03, 0x05, 0x09,
121f54008ebSnatano 	0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x07,
122f54008ebSnatano 	0x05, 0x05, 0x05, 0x07, 0x09, 0x09, 0x11, 0x21,
123f54008ebSnatano 	0x02, 0x03, 0x03, 0x02, 0x03, 0x03, 0x02, 0x06,
124f54008ebSnatano 	0x03, 0x03, 0x03, 0x03, 0x02, 0x03, 0x06, 0x0a,
125f54008ebSnatano 	0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x07,
126f54008ebSnatano 	0x02, 0x03, 0x03, 0x02, 0x06, 0x07, 0x0a, 0x12,
127f54008ebSnatano 	0x04, 0x05, 0x05, 0x06, 0x05, 0x05, 0x06, 0x04,
128f54008ebSnatano 	0x05, 0x05, 0x05, 0x07, 0x06, 0x07, 0x04, 0x0c,
129f54008ebSnatano 	0x08, 0x09, 0x09, 0x0a, 0x09, 0x09, 0x0a, 0x0c,
130f54008ebSnatano 	0x10, 0x11, 0x11, 0x12, 0x20, 0x21, 0x40, 0x80,
131f54008ebSnatano };
132f54008ebSnatano 
133f54008ebSnatano /*
134f54008ebSnatano  * The actual fragtbl array.
135f54008ebSnatano  */
1366c4d9c1cSnatano const u_char *fragtbl[MAXFRAG + 1] = {
1376c4d9c1cSnatano 	NULL, fragtbl124, fragtbl124, NULL, fragtbl124, NULL, NULL, NULL,
1386c4d9c1cSnatano 	fragtbl8,
139f54008ebSnatano };
140