diff options
author | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 18:20:36 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 18:20:36 -0400 |
commit | 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 (patch) | |
tree | 0bba044c4ce775e45a88a51686b5d9f90697ea9d /lib |
Linux-2.6.12-rc2
Initial git repository build. I'm not bothering with the full history,
even though we have it. We can create a separate "historical" git
archive of that later if we want to, and in the meantime it's about
3.2GB when imported into git - space that would just make the early
git days unnecessarily complicated, when we don't have a lot of good
infrastructure for it.
Let it rip!
Diffstat (limited to 'lib')
60 files changed, 15017 insertions, 0 deletions
diff --git a/lib/Kconfig b/lib/Kconfig new file mode 100644 index 000000000000..eeb45225248f --- /dev/null +++ b/lib/Kconfig | |||
@@ -0,0 +1,61 @@ | |||
1 | # | ||
2 | # Library configuration | ||
3 | # | ||
4 | |||
5 | menu "Library routines" | ||
6 | |||
7 | config CRC_CCITT | ||
8 | tristate "CRC-CCITT functions" | ||
9 | help | ||
10 | This option is provided for the case where no in-kernel-tree | ||
11 | modules require CRC-CCITT functions, but a module built outside | ||
12 | the kernel tree does. Such modules that use library CRC-CCITT | ||
13 | functions require M here. | ||
14 | |||
15 | config CRC32 | ||
16 | tristate "CRC32 functions" | ||
17 | default y | ||
18 | help | ||
19 | This option is provided for the case where no in-kernel-tree | ||
20 | modules require CRC32 functions, but a module built outside the | ||
21 | kernel tree does. Such modules that use library CRC32 functions | ||
22 | require M here. | ||
23 | |||
24 | config LIBCRC32C | ||
25 | tristate "CRC32c (Castagnoli, et al) Cyclic Redundancy-Check" | ||
26 | help | ||
27 | This option is provided for the case where no in-kernel-tree | ||
28 | modules require CRC32c functions, but a module built outside the | ||
29 | kernel tree does. Such modules that use library CRC32c functions | ||
30 | require M here. See Castagnoli93. | ||
31 | Module will be libcrc32c. | ||
32 | |||
33 | # | ||
34 | # compression support is select'ed if needed | ||
35 | # | ||
36 | config ZLIB_INFLATE | ||
37 | tristate | ||
38 | |||
39 | config ZLIB_DEFLATE | ||
40 | tristate | ||
41 | |||
42 | # | ||
43 | # reed solomon support is select'ed if needed | ||
44 | # | ||
45 | config REED_SOLOMON | ||
46 | tristate | ||
47 | |||
48 | config REED_SOLOMON_ENC8 | ||
49 | boolean | ||
50 | |||
51 | config REED_SOLOMON_DEC8 | ||
52 | boolean | ||
53 | |||
54 | config REED_SOLOMON_ENC16 | ||
55 | boolean | ||
56 | |||
57 | config REED_SOLOMON_DEC16 | ||
58 | boolean | ||
59 | |||
60 | endmenu | ||
61 | |||
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug new file mode 100644 index 000000000000..426a0cf7b11c --- /dev/null +++ b/lib/Kconfig.debug | |||
@@ -0,0 +1,159 @@ | |||
1 | |||
2 | config PRINTK_TIME | ||
3 | bool "Show timing information on printks" | ||
4 | help | ||
5 | Selecting this option causes timing information to be | ||
6 | included in printk output. This allows you to measure | ||
7 | the interval between kernel operations, including bootup | ||
8 | operations. This is useful for identifying long delays | ||
9 | in kernel startup. | ||
10 | |||
11 | |||
12 | config DEBUG_KERNEL | ||
13 | bool "Kernel debugging" | ||
14 | help | ||
15 | Say Y here if you are developing drivers or trying to debug and | ||
16 | identify kernel problems. | ||
17 | |||
18 | config MAGIC_SYSRQ | ||
19 | bool "Magic SysRq key" | ||
20 | depends on DEBUG_KERNEL && !UML | ||
21 | help | ||
22 | If you say Y here, you will have some control over the system even | ||
23 | if the system crashes for example during kernel debugging (e.g., you | ||
24 | will be able to flush the buffer cache to disk, reboot the system | ||
25 | immediately or dump some status information). This is accomplished | ||
26 | by pressing various keys while holding SysRq (Alt+PrintScreen). It | ||
27 | also works on a serial console (on PC hardware at least), if you | ||
28 | send a BREAK and then within 5 seconds a command keypress. The | ||
29 | keys are documented in <file:Documentation/sysrq.txt>. Don't say Y | ||
30 | unless you really know what this hack does. | ||
31 | |||
32 | config LOG_BUF_SHIFT | ||
33 | int "Kernel log buffer size (16 => 64KB, 17 => 128KB)" if DEBUG_KERNEL | ||
34 | range 12 21 | ||
35 | default 17 if ARCH_S390 | ||
36 | default 16 if X86_NUMAQ || IA64 | ||
37 | default 15 if SMP | ||
38 | default 14 | ||
39 | help | ||
40 | Select kernel log buffer size as a power of 2. | ||
41 | Defaults and Examples: | ||
42 | 17 => 128 KB for S/390 | ||
43 | 16 => 64 KB for x86 NUMAQ or IA-64 | ||
44 | 15 => 32 KB for SMP | ||
45 | 14 => 16 KB for uniprocessor | ||
46 | 13 => 8 KB | ||
47 | 12 => 4 KB | ||
48 | |||
49 | config SCHEDSTATS | ||
50 | bool "Collect scheduler statistics" | ||
51 | depends on DEBUG_KERNEL && PROC_FS | ||
52 | help | ||
53 | If you say Y here, additional code will be inserted into the | ||
54 | scheduler and related routines to collect statistics about | ||
55 | scheduler behavior and provide them in /proc/schedstat. These | ||
56 | stats may be useful for both tuning and debugging the scheduler | ||
57 | If you aren't debugging the scheduler or trying to tune a specific | ||
58 | application, you can say N to avoid the very slight overhead | ||
59 | this adds. | ||
60 | |||
61 | config DEBUG_SLAB | ||
62 | bool "Debug memory allocations" | ||
63 | depends on DEBUG_KERNEL | ||
64 | help | ||
65 | Say Y here to have the kernel do limited verification on memory | ||
66 | allocation as well as poisoning memory on free to catch use of freed | ||
67 | memory. This can make kmalloc/kfree-intensive workloads much slower. | ||
68 | |||
69 | config DEBUG_PREEMPT | ||
70 | bool "Debug preemptible kernel" | ||
71 | depends on DEBUG_KERNEL && PREEMPT | ||
72 | default y | ||
73 | help | ||
74 | If you say Y here then the kernel will use a debug variant of the | ||
75 | commonly used smp_processor_id() function and will print warnings | ||
76 | if kernel code uses it in a preemption-unsafe way. Also, the kernel | ||
77 | will detect preemption count underflows. | ||
78 | |||
79 | config DEBUG_SPINLOCK | ||
80 | bool "Spinlock debugging" | ||
81 | depends on DEBUG_KERNEL | ||
82 | help | ||
83 | Say Y here and build SMP to catch missing spinlock initialization | ||
84 | and certain other kinds of spinlock errors commonly made. This is | ||
85 | best used in conjunction with the NMI watchdog so that spinlock | ||
86 | deadlocks are also debuggable. | ||
87 | |||
88 | config DEBUG_SPINLOCK_SLEEP | ||
89 | bool "Sleep-inside-spinlock checking" | ||
90 | depends on DEBUG_KERNEL | ||
91 | help | ||
92 | If you say Y here, various routines which may sleep will become very | ||
93 | noisy if they are called with a spinlock held. | ||
94 | |||
95 | config DEBUG_KOBJECT | ||
96 | bool "kobject debugging" | ||
97 | depends on DEBUG_KERNEL | ||
98 | help | ||
99 | If you say Y here, some extra kobject debugging messages will be sent | ||
100 | to the syslog. | ||
101 | |||
102 | config DEBUG_HIGHMEM | ||
103 | bool "Highmem debugging" | ||
104 | depends on DEBUG_KERNEL && HIGHMEM | ||
105 | help | ||
106 | This options enables addition error checking for high memory systems. | ||
107 | Disable for production systems. | ||
108 | |||
109 | config DEBUG_BUGVERBOSE | ||
110 | bool "Verbose BUG() reporting (adds 70K)" if DEBUG_KERNEL && EMBEDDED | ||
111 | depends on ARM || ARM26 || M32R || M68K || SPARC32 || SPARC64 || (X86 && !X86_64) || FRV | ||
112 | default !EMBEDDED | ||
113 | help | ||
114 | Say Y here to make BUG() panics output the file name and line number | ||
115 | of the BUG call as well as the EIP and oops trace. This aids | ||
116 | debugging but costs about 70-100K of memory. | ||
117 | |||
118 | config DEBUG_INFO | ||
119 | bool "Compile the kernel with debug info" | ||
120 | depends on DEBUG_KERNEL | ||
121 | help | ||
122 | If you say Y here the resulting kernel image will include | ||
123 | debugging info resulting in a larger kernel image. | ||
124 | Say Y here only if you plan to debug the kernel. | ||
125 | |||
126 | If unsure, say N. | ||
127 | |||
128 | config DEBUG_IOREMAP | ||
129 | bool "Enable ioremap() debugging" | ||
130 | depends on DEBUG_KERNEL && PARISC | ||
131 | help | ||
132 | Enabling this option will cause the kernel to distinguish between | ||
133 | ioremapped and physical addresses. It will print a backtrace (at | ||
134 | most one every 10 seconds), hopefully allowing you to see which | ||
135 | drivers need work. Fixing all these problems is a prerequisite | ||
136 | for turning on USE_HPPA_IOREMAP. The warnings are harmless; | ||
137 | the kernel has enough information to fix the broken drivers | ||
138 | automatically, but we'd like to make it more efficient by not | ||
139 | having to do that. | ||
140 | |||
141 | config DEBUG_FS | ||
142 | bool "Debug Filesystem" | ||
143 | depends on DEBUG_KERNEL | ||
144 | help | ||
145 | debugfs is a virtual file system that kernel developers use to put | ||
146 | debugging files into. Enable this option to be able to read and | ||
147 | write to these files. | ||
148 | |||
149 | If unsure, say N. | ||
150 | |||
151 | config FRAME_POINTER | ||
152 | bool "Compile the kernel with frame pointers" | ||
153 | depends on DEBUG_KERNEL && ((X86 && !X86_64) || CRIS || M68K || M68KNOMMU || FRV) | ||
154 | help | ||
155 | If you say Y here the resulting kernel image will be slightly larger | ||
156 | and slower, but it will give very useful debugging information. | ||
157 | If you don't debug the kernel, you can say N, but we may not be able | ||
158 | to solve problems without frame pointers. | ||
159 | |||
diff --git a/lib/Makefile b/lib/Makefile new file mode 100644 index 000000000000..7c70db79c0e0 --- /dev/null +++ b/lib/Makefile | |||
@@ -0,0 +1,45 @@ | |||
1 | # | ||
2 | # Makefile for some libs needed in the kernel. | ||
3 | # | ||
4 | |||
5 | lib-y := errno.o ctype.o string.o vsprintf.o cmdline.o \ | ||
6 | bust_spinlocks.o rbtree.o radix-tree.o dump_stack.o \ | ||
7 | kobject.o kref.o idr.o div64.o int_sqrt.o \ | ||
8 | bitmap.o extable.o kobject_uevent.o prio_tree.o sha1.o \ | ||
9 | halfmd4.o | ||
10 | |||
11 | obj-y += sort.o parser.o | ||
12 | |||
13 | ifeq ($(CONFIG_DEBUG_KOBJECT),y) | ||
14 | CFLAGS_kobject.o += -DDEBUG | ||
15 | CFLAGS_kobject_uevent.o += -DDEBUG | ||
16 | endif | ||
17 | |||
18 | lib-$(CONFIG_RWSEM_GENERIC_SPINLOCK) += rwsem-spinlock.o | ||
19 | lib-$(CONFIG_RWSEM_XCHGADD_ALGORITHM) += rwsem.o | ||
20 | lib-$(CONFIG_GENERIC_FIND_NEXT_BIT) += find_next_bit.o | ||
21 | obj-$(CONFIG_LOCK_KERNEL) += kernel_lock.o | ||
22 | |||
23 | ifneq ($(CONFIG_HAVE_DEC_LOCK),y) | ||
24 | lib-y += dec_and_lock.o | ||
25 | endif | ||
26 | |||
27 | obj-$(CONFIG_CRC_CCITT) += crc-ccitt.o | ||
28 | obj-$(CONFIG_CRC32) += crc32.o | ||
29 | obj-$(CONFIG_LIBCRC32C) += libcrc32c.o | ||
30 | obj-$(CONFIG_GENERIC_IOMAP) += iomap.o | ||
31 | |||
32 | obj-$(CONFIG_ZLIB_INFLATE) += zlib_inflate/ | ||
33 | obj-$(CONFIG_ZLIB_DEFLATE) += zlib_deflate/ | ||
34 | obj-$(CONFIG_REED_SOLOMON) += reed_solomon/ | ||
35 | |||
36 | hostprogs-y := gen_crc32table | ||
37 | clean-files := crc32table.h | ||
38 | |||
39 | $(obj)/crc32.o: $(obj)/crc32table.h | ||
40 | |||
41 | quiet_cmd_crc32 = GEN $@ | ||
42 | cmd_crc32 = $< > $@ | ||
43 | |||
44 | $(obj)/crc32table.h: $(obj)/gen_crc32table | ||
45 | $(call cmd,crc32) | ||
diff --git a/lib/bitmap.c b/lib/bitmap.c new file mode 100644 index 000000000000..d1388a5ce89c --- /dev/null +++ b/lib/bitmap.c | |||
@@ -0,0 +1,595 @@ | |||
1 | /* | ||
2 | * lib/bitmap.c | ||
3 | * Helper functions for bitmap.h. | ||
4 | * | ||
5 | * This source code is licensed under the GNU General Public License, | ||
6 | * Version 2. See the file COPYING for more details. | ||
7 | */ | ||
8 | #include <linux/module.h> | ||
9 | #include <linux/ctype.h> | ||
10 | #include <linux/errno.h> | ||
11 | #include <linux/bitmap.h> | ||
12 | #include <linux/bitops.h> | ||
13 | #include <asm/uaccess.h> | ||
14 | |||
15 | /* | ||
16 | * bitmaps provide an array of bits, implemented using an an | ||
17 | * array of unsigned longs. The number of valid bits in a | ||
18 | * given bitmap does _not_ need to be an exact multiple of | ||
19 | * BITS_PER_LONG. | ||
20 | * | ||
21 | * The possible unused bits in the last, partially used word | ||
22 | * of a bitmap are 'don't care'. The implementation makes | ||
23 | * no particular effort to keep them zero. It ensures that | ||
24 | * their value will not affect the results of any operation. | ||
25 | * The bitmap operations that return Boolean (bitmap_empty, | ||
26 | * for example) or scalar (bitmap_weight, for example) results | ||
27 | * carefully filter out these unused bits from impacting their | ||
28 | * results. | ||
29 | * | ||
30 | * These operations actually hold to a slightly stronger rule: | ||
31 | * if you don't input any bitmaps to these ops that have some | ||
32 | * unused bits set, then they won't output any set unused bits | ||
33 | * in output bitmaps. | ||
34 | * | ||
35 | * The byte ordering of bitmaps is more natural on little | ||
36 | * endian architectures. See the big-endian headers | ||
37 | * include/asm-ppc64/bitops.h and include/asm-s390/bitops.h | ||
38 | * for the best explanations of this ordering. | ||
39 | */ | ||
40 | |||
41 | int __bitmap_empty(const unsigned long *bitmap, int bits) | ||
42 | { | ||
43 | int k, lim = bits/BITS_PER_LONG; | ||
44 | for (k = 0; k < lim; ++k) | ||
45 | if (bitmap[k]) | ||
46 | return 0; | ||
47 | |||
48 | if (bits % BITS_PER_LONG) | ||
49 | if (bitmap[k] & BITMAP_LAST_WORD_MASK(bits)) | ||
50 | return 0; | ||
51 | |||
52 | return 1; | ||
53 | } | ||
54 | EXPORT_SYMBOL(__bitmap_empty); | ||
55 | |||
56 | int __bitmap_full(const unsigned long *bitmap, int bits) | ||
57 | { | ||
58 | int k, lim = bits/BITS_PER_LONG; | ||
59 | for (k = 0; k < lim; ++k) | ||
60 | if (~bitmap[k]) | ||
61 | return 0; | ||
62 | |||
63 | if (bits % BITS_PER_LONG) | ||
64 | if (~bitmap[k] & BITMAP_LAST_WORD_MASK(bits)) | ||
65 | return 0; | ||
66 | |||
67 | return 1; | ||
68 | } | ||
69 | EXPORT_SYMBOL(__bitmap_full); | ||
70 | |||
71 | int __bitmap_equal(const unsigned long *bitmap1, | ||
72 | const unsigned long *bitmap2, int bits) | ||
73 | { | ||
74 | int k, lim = bits/BITS_PER_LONG; | ||
75 | for (k = 0; k < lim; ++k) | ||
76 | if (bitmap1[k] != bitmap2[k]) | ||
77 | return 0; | ||
78 | |||
79 | if (bits % BITS_PER_LONG) | ||
80 | if ((bitmap1[k] ^ bitmap2[k]) & BITMAP_LAST_WORD_MASK(bits)) | ||
81 | return 0; | ||
82 | |||
83 | return 1; | ||
84 | } | ||
85 | EXPORT_SYMBOL(__bitmap_equal); | ||
86 | |||
87 | void __bitmap_complement(unsigned long *dst, const unsigned long *src, int bits) | ||
88 | { | ||
89 | int k, lim = bits/BITS_PER_LONG; | ||
90 | for (k = 0; k < lim; ++k) | ||
91 | dst[k] = ~src[k]; | ||
92 | |||
93 | if (bits % BITS_PER_LONG) | ||
94 | dst[k] = ~src[k] & BITMAP_LAST_WORD_MASK(bits); | ||
95 | } | ||
96 | EXPORT_SYMBOL(__bitmap_complement); | ||
97 | |||
98 | /* | ||
99 | * __bitmap_shift_right - logical right shift of the bits in a bitmap | ||
100 | * @dst - destination bitmap | ||
101 | * @src - source bitmap | ||
102 | * @nbits - shift by this many bits | ||
103 | * @bits - bitmap size, in bits | ||
104 | * | ||
105 | * Shifting right (dividing) means moving bits in the MS -> LS bit | ||
106 | * direction. Zeros are fed into the vacated MS positions and the | ||
107 | * LS bits shifted off the bottom are lost. | ||
108 | */ | ||
109 | void __bitmap_shift_right(unsigned long *dst, | ||
110 | const unsigned long *src, int shift, int bits) | ||
111 | { | ||
112 | int k, lim = BITS_TO_LONGS(bits), left = bits % BITS_PER_LONG; | ||
113 | int off = shift/BITS_PER_LONG, rem = shift % BITS_PER_LONG; | ||
114 | unsigned long mask = (1UL << left) - 1; | ||
115 | for (k = 0; off + k < lim; ++k) { | ||
116 | unsigned long upper, lower; | ||
117 | |||
118 | /* | ||
119 | * If shift is not word aligned, take lower rem bits of | ||
120 | * word above and make them the top rem bits of result. | ||
121 | */ | ||
122 | if (!rem || off + k + 1 >= lim) | ||
123 | upper = 0; | ||
124 | else { | ||
125 | upper = src[off + k + 1]; | ||
126 | if (off + k + 1 == lim - 1 && left) | ||
127 | upper &= mask; | ||
128 | } | ||
129 | lower = src[off + k]; | ||
130 | if (left && off + k == lim - 1) | ||
131 | lower &= mask; | ||
132 | dst[k] = upper << (BITS_PER_LONG - rem) | lower >> rem; | ||
133 | if (left && k == lim - 1) | ||
134 | dst[k] &= mask; | ||
135 | } | ||
136 | if (off) | ||
137 | memset(&dst[lim - off], 0, off*sizeof(unsigned long)); | ||
138 | } | ||
139 | EXPORT_SYMBOL(__bitmap_shift_right); | ||
140 | |||
141 | |||
142 | /* | ||
143 | * __bitmap_shift_left - logical left shift of the bits in a bitmap | ||
144 | * @dst - destination bitmap | ||
145 | * @src - source bitmap | ||
146 | * @nbits - shift by this many bits | ||
147 | * @bits - bitmap size, in bits | ||
148 | * | ||
149 | * Shifting left (multiplying) means moving bits in the LS -> MS | ||
150 | * direction. Zeros are fed into the vacated LS bit positions | ||
151 | * and those MS bits shifted off the top are lost. | ||
152 | */ | ||
153 | |||
154 | void __bitmap_shift_left(unsigned long *dst, | ||
155 | const unsigned long *src, int shift, int bits) | ||
156 | { | ||
157 | int k, lim = BITS_TO_LONGS(bits), left = bits % BITS_PER_LONG; | ||
158 | int off = shift/BITS_PER_LONG, rem = shift % BITS_PER_LONG; | ||
159 | for (k = lim - off - 1; k >= 0; --k) { | ||
160 | unsigned long upper, lower; | ||
161 | |||
162 | /* | ||
163 | * If shift is not word aligned, take upper rem bits of | ||
164 | * word below and make them the bottom rem bits of result. | ||
165 | */ | ||
166 | if (rem && k > 0) | ||
167 | lower = src[k - 1]; | ||
168 | else | ||
169 | lower = 0; | ||
170 | upper = src[k]; | ||
171 | if (left && k == lim - 1) | ||
172 | upper &= (1UL << left) - 1; | ||
173 | dst[k + off] = lower >> (BITS_PER_LONG - rem) | upper << rem; | ||
174 | if (left && k + off == lim - 1) | ||
175 | dst[k + off] &= (1UL << left) - 1; | ||
176 | } | ||
177 | if (off) | ||
178 | memset(dst, 0, off*sizeof(unsigned long)); | ||
179 | } | ||
180 | EXPORT_SYMBOL(__bitmap_shift_left); | ||
181 | |||
182 | void __bitmap_and(unsigned long *dst, const unsigned long *bitmap1, | ||
183 | const unsigned long *bitmap2, int bits) | ||
184 | { | ||
185 | int k; | ||
186 | int nr = BITS_TO_LONGS(bits); | ||
187 | |||
188 | for (k = 0; k < nr; k++) | ||
189 | dst[k] = bitmap1[k] & bitmap2[k]; | ||
190 | } | ||
191 | EXPORT_SYMBOL(__bitmap_and); | ||
192 | |||
193 | void __bitmap_or(unsigned long *dst, const unsigned long *bitmap1, | ||
194 | const unsigned long *bitmap2, int bits) | ||
195 | { | ||
196 | int k; | ||
197 | int nr = BITS_TO_LONGS(bits); | ||
198 | |||
199 | for (k = 0; k < nr; k++) | ||
200 | dst[k] = bitmap1[k] | bitmap2[k]; | ||
201 | } | ||
202 | EXPORT_SYMBOL(__bitmap_or); | ||
203 | |||
204 | void __bitmap_xor(unsigned long *dst, const unsigned long *bitmap1, | ||
205 | const unsigned long *bitmap2, int bits) | ||
206 | { | ||
207 | int k; | ||
208 | int nr = BITS_TO_LONGS(bits); | ||
209 | |||
210 | for (k = 0; k < nr; k++) | ||
211 | dst[k] = bitmap1[k] ^ bitmap2[k]; | ||
212 | } | ||
213 | EXPORT_SYMBOL(__bitmap_xor); | ||
214 | |||
215 | void __bitmap_andnot(unsigned long *dst, const unsigned long *bitmap1, | ||
216 | const unsigned long *bitmap2, int bits) | ||
217 | { | ||
218 | int k; | ||
219 | int nr = BITS_TO_LONGS(bits); | ||
220 | |||
221 | for (k = 0; k < nr; k++) | ||
222 | dst[k] = bitmap1[k] & ~bitmap2[k]; | ||
223 | } | ||
224 | EXPORT_SYMBOL(__bitmap_andnot); | ||
225 | |||
226 | int __bitmap_intersects(const unsigned long *bitmap1, | ||
227 | const unsigned long *bitmap2, int bits) | ||
228 | { | ||
229 | int k, lim = bits/BITS_PER_LONG; | ||
230 | for (k = 0; k < lim; ++k) | ||
231 | if (bitmap1[k] & bitmap2[k]) | ||
232 | return 1; | ||
233 | |||
234 | if (bits % BITS_PER_LONG) | ||
235 | if ((bitmap1[k] & bitmap2[k]) & BITMAP_LAST_WORD_MASK(bits)) | ||
236 | return 1; | ||
237 | return 0; | ||
238 | } | ||
239 | EXPORT_SYMBOL(__bitmap_intersects); | ||
240 | |||
241 | int __bitmap_subset(const unsigned long *bitmap1, | ||
242 | const unsigned long *bitmap2, int bits) | ||
243 | { | ||
244 | int k, lim = bits/BITS_PER_LONG; | ||
245 | for (k = 0; k < lim; ++k) | ||
246 | if (bitmap1[k] & ~bitmap2[k]) | ||
247 | return 0; | ||
248 | |||
249 | if (bits % BITS_PER_LONG) | ||
250 | if ((bitmap1[k] & ~bitmap2[k]) & BITMAP_LAST_WORD_MASK(bits)) | ||
251 | return 0; | ||
252 | return 1; | ||
253 | } | ||
254 | EXPORT_SYMBOL(__bitmap_subset); | ||
255 | |||
256 | #if BITS_PER_LONG == 32 | ||
257 | int __bitmap_weight(const unsigned long *bitmap, int bits) | ||
258 | { | ||
259 | int k, w = 0, lim = bits/BITS_PER_LONG; | ||
260 | |||
261 | for (k = 0; k < lim; k++) | ||
262 | w += hweight32(bitmap[k]); | ||
263 | |||
264 | if (bits % BITS_PER_LONG) | ||
265 | w += hweight32(bitmap[k] & BITMAP_LAST_WORD_MASK(bits)); | ||
266 | |||
267 | return w; | ||
268 | } | ||
269 | #else | ||
270 | int __bitmap_weight(const unsigned long *bitmap, int bits) | ||
271 | { | ||
272 | int k, w = 0, lim = bits/BITS_PER_LONG; | ||
273 | |||
274 | for (k = 0; k < lim; k++) | ||
275 | w += hweight64(bitmap[k]); | ||
276 | |||
277 | if (bits % BITS_PER_LONG) | ||
278 | w += hweight64(bitmap[k] & BITMAP_LAST_WORD_MASK(bits)); | ||
279 | |||
280 | return w; | ||
281 | } | ||
282 | #endif | ||
283 | EXPORT_SYMBOL(__bitmap_weight); | ||
284 | |||
285 | /* | ||
286 | * Bitmap printing & parsing functions: first version by Bill Irwin, | ||
287 | * second version by Paul Jackson, third by Joe Korty. | ||
288 | */ | ||
289 | |||
290 | #define CHUNKSZ 32 | ||
291 | #define nbits_to_hold_value(val) fls(val) | ||
292 | #define roundup_power2(val,modulus) (((val) + (modulus) - 1) & ~((modulus) - 1)) | ||
293 | #define unhex(c) (isdigit(c) ? (c - '0') : (toupper(c) - 'A' + 10)) | ||
294 | #define BASEDEC 10 /* fancier cpuset lists input in decimal */ | ||
295 | |||
296 | /** | ||
297 | * bitmap_scnprintf - convert bitmap to an ASCII hex string. | ||
298 | * @buf: byte buffer into which string is placed | ||
299 | * @buflen: reserved size of @buf, in bytes | ||
300 | * @maskp: pointer to bitmap to convert | ||
301 | * @nmaskbits: size of bitmap, in bits | ||
302 | * | ||
303 | * Exactly @nmaskbits bits are displayed. Hex digits are grouped into | ||
304 | * comma-separated sets of eight digits per set. | ||
305 | */ | ||
306 | int bitmap_scnprintf(char *buf, unsigned int buflen, | ||
307 | const unsigned long *maskp, int nmaskbits) | ||
308 | { | ||
309 | int i, word, bit, len = 0; | ||
310 | unsigned long val; | ||
311 | const char *sep = ""; | ||
312 | int chunksz; | ||
313 | u32 chunkmask; | ||
314 | |||
315 | chunksz = nmaskbits & (CHUNKSZ - 1); | ||
316 | if (chunksz == 0) | ||
317 | chunksz = CHUNKSZ; | ||
318 | |||
319 | i = roundup_power2(nmaskbits, CHUNKSZ) - CHUNKSZ; | ||
320 | for (; i >= 0; i -= CHUNKSZ) { | ||
321 | chunkmask = ((1ULL << chunksz) - 1); | ||
322 | word = i / BITS_PER_LONG; | ||
323 | bit = i % BITS_PER_LONG; | ||
324 | val = (maskp[word] >> bit) & chunkmask; | ||
325 | len += scnprintf(buf+len, buflen-len, "%s%0*lx", sep, | ||
326 | (chunksz+3)/4, val); | ||
327 | chunksz = CHUNKSZ; | ||
328 | sep = ","; | ||
329 | } | ||
330 | return len; | ||
331 | } | ||
332 | EXPORT_SYMBOL(bitmap_scnprintf); | ||
333 | |||
334 | /** | ||
335 | * bitmap_parse - convert an ASCII hex string into a bitmap. | ||
336 | * @buf: pointer to buffer in user space containing string. | ||
337 | * @buflen: buffer size in bytes. If string is smaller than this | ||
338 | * then it must be terminated with a \0. | ||
339 | * @maskp: pointer to bitmap array that will contain result. | ||
340 | * @nmaskbits: size of bitmap, in bits. | ||
341 | * | ||
342 | * Commas group hex digits into chunks. Each chunk defines exactly 32 | ||
343 | * bits of the resultant bitmask. No chunk may specify a value larger | ||
344 | * than 32 bits (-EOVERFLOW), and if a chunk specifies a smaller value | ||
345 | * then leading 0-bits are prepended. -EINVAL is returned for illegal | ||
346 | * characters and for grouping errors such as "1,,5", ",44", "," and "". | ||
347 | * Leading and trailing whitespace accepted, but not embedded whitespace. | ||
348 | */ | ||
349 | int bitmap_parse(const char __user *ubuf, unsigned int ubuflen, | ||
350 | unsigned long *maskp, int nmaskbits) | ||
351 | { | ||
352 | int c, old_c, totaldigits, ndigits, nchunks, nbits; | ||
353 | u32 chunk; | ||
354 | |||
355 | bitmap_zero(maskp, nmaskbits); | ||
356 | |||
357 | nchunks = nbits = totaldigits = c = 0; | ||
358 | do { | ||
359 | chunk = ndigits = 0; | ||
360 | |||
361 | /* Get the next chunk of the bitmap */ | ||
362 | while (ubuflen) { | ||
363 | old_c = c; | ||
364 | if (get_user(c, ubuf++)) | ||
365 | return -EFAULT; | ||
366 | ubuflen--; | ||
367 | if (isspace(c)) | ||
368 | continue; | ||
369 | |||
370 | /* | ||
371 | * If the last character was a space and the current | ||
372 | * character isn't '\0', we've got embedded whitespace. | ||
373 | * This is a no-no, so throw an error. | ||
374 | */ | ||
375 | if (totaldigits && c && isspace(old_c)) | ||
376 | return -EINVAL; | ||
377 | |||
378 | /* A '\0' or a ',' signal the end of the chunk */ | ||
379 | if (c == '\0' || c == ',') | ||
380 | break; | ||
381 | |||
382 | if (!isxdigit(c)) | ||
383 | return -EINVAL; | ||
384 | |||
385 | /* | ||
386 | * Make sure there are at least 4 free bits in 'chunk'. | ||
387 | * If not, this hexdigit will overflow 'chunk', so | ||
388 | * throw an error. | ||
389 | */ | ||
390 | if (chunk & ~((1UL << (CHUNKSZ - 4)) - 1)) | ||
391 | return -EOVERFLOW; | ||
392 | |||
393 | chunk = (chunk << 4) | unhex(c); | ||
394 | ndigits++; totaldigits++; | ||
395 | } | ||
396 | if (ndigits == 0) | ||
397 | return -EINVAL; | ||
398 | if (nchunks == 0 && chunk == 0) | ||
399 | continue; | ||
400 | |||
401 | __bitmap_shift_left(maskp, maskp, CHUNKSZ, nmaskbits); | ||
402 | *maskp |= chunk; | ||
403 | nchunks++; | ||
404 | nbits += (nchunks == 1) ? nbits_to_hold_value(chunk) : CHUNKSZ; | ||
405 | if (nbits > nmaskbits) | ||
406 | return -EOVERFLOW; | ||
407 | } while (ubuflen && c == ','); | ||
408 | |||
409 | return 0; | ||
410 | } | ||
411 | EXPORT_SYMBOL(bitmap_parse); | ||
412 | |||
413 | /* | ||
414 | * bscnl_emit(buf, buflen, rbot, rtop, bp) | ||
415 | * | ||
416 | * Helper routine for bitmap_scnlistprintf(). Write decimal number | ||
417 | * or range to buf, suppressing output past buf+buflen, with optional | ||
418 | * comma-prefix. Return len of what would be written to buf, if it | ||
419 | * all fit. | ||
420 | */ | ||
421 | static inline int bscnl_emit(char *buf, int buflen, int rbot, int rtop, int len) | ||
422 | { | ||
423 | if (len > 0) | ||
424 | len += scnprintf(buf + len, buflen - len, ","); | ||
425 | if (rbot == rtop) | ||
426 | len += scnprintf(buf + len, buflen - len, "%d", rbot); | ||
427 | else | ||
428 | len += scnprintf(buf + len, buflen - len, "%d-%d", rbot, rtop); | ||
429 | return len; | ||
430 | } | ||
431 | |||
432 | /** | ||
433 | * bitmap_scnlistprintf - convert bitmap to list format ASCII string | ||
434 | * @buf: byte buffer into which string is placed | ||
435 | * @buflen: reserved size of @buf, in bytes | ||
436 | * @maskp: pointer to bitmap to convert | ||
437 | * @nmaskbits: size of bitmap, in bits | ||
438 | * | ||
439 | * Output format is a comma-separated list of decimal numbers and | ||
440 | * ranges. Consecutively set bits are shown as two hyphen-separated | ||
441 | * decimal numbers, the smallest and largest bit numbers set in | ||
442 | * the range. Output format is compatible with the format | ||
443 | * accepted as input by bitmap_parselist(). | ||
444 | * | ||
445 | * The return value is the number of characters which would be | ||
446 | * generated for the given input, excluding the trailing '\0', as | ||
447 | * per ISO C99. | ||
448 | */ | ||
449 | int bitmap_scnlistprintf(char *buf, unsigned int buflen, | ||
450 | const unsigned long *maskp, int nmaskbits) | ||
451 | { | ||
452 | int len = 0; | ||
453 | /* current bit is 'cur', most recently seen range is [rbot, rtop] */ | ||
454 | int cur, rbot, rtop; | ||
455 | |||
456 | rbot = cur = find_first_bit(maskp, nmaskbits); | ||
457 | while (cur < nmaskbits) { | ||
458 | rtop = cur; | ||
459 | cur = find_next_bit(maskp, nmaskbits, cur+1); | ||
460 | if (cur >= nmaskbits || cur > rtop + 1) { | ||
461 | len = bscnl_emit(buf, buflen, rbot, rtop, len); | ||
462 | rbot = cur; | ||
463 | } | ||
464 | } | ||
465 | return len; | ||
466 | } | ||
467 | EXPORT_SYMBOL(bitmap_scnlistprintf); | ||
468 | |||
469 | /** | ||
470 | * bitmap_parselist - convert list format ASCII string to bitmap | ||
471 | * @buf: read nul-terminated user string from this buffer | ||
472 | * @mask: write resulting mask here | ||
473 | * @nmaskbits: number of bits in mask to be written | ||
474 | * | ||
475 | * Input format is a comma-separated list of decimal numbers and | ||
476 | * ranges. Consecutively set bits are shown as two hyphen-separated | ||
477 | * decimal numbers, the smallest and largest bit numbers set in | ||
478 | * the range. | ||
479 | * | ||
480 | * Returns 0 on success, -errno on invalid input strings: | ||
481 | * -EINVAL: second number in range smaller than first | ||
482 | * -EINVAL: invalid character in string | ||
483 | * -ERANGE: bit number specified too large for mask | ||
484 | */ | ||
485 | int bitmap_parselist(const char *bp, unsigned long *maskp, int nmaskbits) | ||
486 | { | ||
487 | unsigned a, b; | ||
488 | |||
489 | bitmap_zero(maskp, nmaskbits); | ||
490 | do { | ||
491 | if (!isdigit(*bp)) | ||
492 | return -EINVAL; | ||
493 | b = a = simple_strtoul(bp, (char **)&bp, BASEDEC); | ||
494 | if (*bp == '-') { | ||
495 | bp++; | ||
496 | if (!isdigit(*bp)) | ||
497 | return -EINVAL; | ||
498 | b = simple_strtoul(bp, (char **)&bp, BASEDEC); | ||
499 | } | ||
500 | if (!(a <= b)) | ||
501 | return -EINVAL; | ||
502 | if (b >= nmaskbits) | ||
503 | return -ERANGE; | ||
504 | while (a <= b) { | ||
505 | set_bit(a, maskp); | ||
506 | a++; | ||
507 | } | ||
508 | if (*bp == ',') | ||
509 | bp++; | ||
510 | } while (*bp != '\0' && *bp != '\n'); | ||
511 | return 0; | ||
512 | } | ||
513 | EXPORT_SYMBOL(bitmap_parselist); | ||
514 | |||
515 | /** | ||
516 | * bitmap_find_free_region - find a contiguous aligned mem region | ||
517 | * @bitmap: an array of unsigned longs corresponding to the bitmap | ||
518 | * @bits: number of bits in the bitmap | ||
519 | * @order: region size to find (size is actually 1<<order) | ||
520 | * | ||
521 | * This is used to allocate a memory region from a bitmap. The idea is | ||
522 | * that the region has to be 1<<order sized and 1<<order aligned (this | ||
523 | * makes the search algorithm much faster). | ||
524 | * | ||
525 | * The region is marked as set bits in the bitmap if a free one is | ||
526 | * found. | ||
527 | * | ||
528 | * Returns either beginning of region or negative error | ||
529 | */ | ||
530 | int bitmap_find_free_region(unsigned long *bitmap, int bits, int order) | ||
531 | { | ||
532 | unsigned long mask; | ||
533 | int pages = 1 << order; | ||
534 | int i; | ||
535 | |||
536 | if(pages > BITS_PER_LONG) | ||
537 | return -EINVAL; | ||
538 | |||
539 | /* make a mask of the order */ | ||
540 | mask = (1ul << (pages - 1)); | ||
541 | mask += mask - 1; | ||
542 | |||
543 | /* run up the bitmap pages bits at a time */ | ||
544 | for (i = 0; i < bits; i += pages) { | ||
545 | int index = i/BITS_PER_LONG; | ||
546 | int offset = i - (index * BITS_PER_LONG); | ||
547 | if((bitmap[index] & (mask << offset)) == 0) { | ||
548 | /* set region in bimap */ | ||
549 | bitmap[index] |= (mask << offset); | ||
550 | return i; | ||
551 | } | ||
552 | } | ||
553 | return -ENOMEM; | ||
554 | } | ||
555 | EXPORT_SYMBOL(bitmap_find_free_region); | ||
556 | |||
557 | /** | ||
558 | * bitmap_release_region - release allocated bitmap region | ||
559 | * @bitmap: a pointer to the bitmap | ||
560 | * @pos: the beginning of the region | ||
561 | * @order: the order of the bits to release (number is 1<<order) | ||
562 | * | ||
563 | * This is the complement to __bitmap_find_free_region and releases | ||
564 | * the found region (by clearing it in the bitmap). | ||
565 | */ | ||
566 | void bitmap_release_region(unsigned long *bitmap, int pos, int order) | ||
567 | { | ||
568 | int pages = 1 << order; | ||
569 | unsigned long mask = (1ul << (pages - 1)); | ||
570 | int index = pos/BITS_PER_LONG; | ||
571 | int offset = pos - (index * BITS_PER_LONG); | ||
572 | mask += mask - 1; | ||
573 | bitmap[index] &= ~(mask << offset); | ||
574 | } | ||
575 | EXPORT_SYMBOL(bitmap_release_region); | ||
576 | |||
577 | int bitmap_allocate_region(unsigned long *bitmap, int pos, int order) | ||
578 | { | ||
579 | int pages = 1 << order; | ||
580 | unsigned long mask = (1ul << (pages - 1)); | ||
581 | int index = pos/BITS_PER_LONG; | ||
582 | int offset = pos - (index * BITS_PER_LONG); | ||
583 | |||
584 | /* We don't do regions of pages > BITS_PER_LONG. The | ||
585 | * algorithm would be a simple look for multiple zeros in the | ||
586 | * array, but there's no driver today that needs this. If you | ||
587 | * trip this BUG(), you get to code it... */ | ||
588 | BUG_ON(pages > BITS_PER_LONG); | ||
589 | mask += mask - 1; | ||
590 | if (bitmap[index] & (mask << offset)) | ||
591 | return -EBUSY; | ||
592 | bitmap[index] |= (mask << offset); | ||
593 | return 0; | ||
594 | } | ||
595 | EXPORT_SYMBOL(bitmap_allocate_region); | ||
diff --git a/lib/bust_spinlocks.c b/lib/bust_spinlocks.c new file mode 100644 index 000000000000..6bb7319e09a0 --- /dev/null +++ b/lib/bust_spinlocks.c | |||
@@ -0,0 +1,39 @@ | |||
1 | /* | ||
2 | * lib/bust_spinlocks.c | ||
3 | * | ||
4 | * Provides a minimal bust_spinlocks for architectures which don't have one of their own. | ||
5 | * | ||
6 | * bust_spinlocks() clears any spinlocks which would prevent oops, die(), BUG() | ||
7 | * and panic() information from reaching the user. | ||
8 | */ | ||
9 | |||
10 | #include <linux/config.h> | ||
11 | #include <linux/kernel.h> | ||
12 | #include <linux/spinlock.h> | ||
13 | #include <linux/tty.h> | ||
14 | #include <linux/wait.h> | ||
15 | #include <linux/vt_kern.h> | ||
16 | |||
17 | |||
18 | void bust_spinlocks(int yes) | ||
19 | { | ||
20 | if (yes) { | ||
21 | oops_in_progress = 1; | ||
22 | } else { | ||
23 | int loglevel_save = console_loglevel; | ||
24 | #ifdef CONFIG_VT | ||
25 | unblank_screen(); | ||
26 | #endif | ||
27 | oops_in_progress = 0; | ||
28 | /* | ||
29 | * OK, the message is on the console. Now we call printk() | ||
30 | * without oops_in_progress set so that printk() will give klogd | ||
31 | * and the blanked console a poke. Hold onto your hats... | ||
32 | */ | ||
33 | console_loglevel = 15; /* NMI oopser may have shut the console up */ | ||
34 | printk(" "); | ||
35 | console_loglevel = loglevel_save; | ||
36 | } | ||
37 | } | ||
38 | |||
39 | |||
diff --git a/lib/cmdline.c b/lib/cmdline.c new file mode 100644 index 000000000000..0331ed825ea7 --- /dev/null +++ b/lib/cmdline.c | |||
@@ -0,0 +1,120 @@ | |||
1 | /* | ||
2 | * linux/lib/cmdline.c | ||
3 | * Helper functions generally used for parsing kernel command line | ||
4 | * and module options. | ||
5 | * | ||
6 | * Code and copyrights come from init/main.c and arch/i386/kernel/setup.c. | ||
7 | * | ||
8 | * This source code is licensed under the GNU General Public License, | ||
9 | * Version 2. See the file COPYING for more details. | ||
10 | * | ||
11 | * GNU Indent formatting options for this file: -kr -i8 -npsl -pcs | ||
12 | * | ||
13 | */ | ||
14 | |||
15 | #include <linux/module.h> | ||
16 | #include <linux/kernel.h> | ||
17 | #include <linux/string.h> | ||
18 | |||
19 | |||
20 | /** | ||
21 | * get_option - Parse integer from an option string | ||
22 | * @str: option string | ||
23 | * @pint: (output) integer value parsed from @str | ||
24 | * | ||
25 | * Read an int from an option string; if available accept a subsequent | ||
26 | * comma as well. | ||
27 | * | ||
28 | * Return values: | ||
29 | * 0 : no int in string | ||
30 | * 1 : int found, no subsequent comma | ||
31 | * 2 : int found including a subsequent comma | ||
32 | */ | ||
33 | |||
34 | int get_option (char **str, int *pint) | ||
35 | { | ||
36 | char *cur = *str; | ||
37 | |||
38 | if (!cur || !(*cur)) | ||
39 | return 0; | ||
40 | *pint = simple_strtol (cur, str, 0); | ||
41 | if (cur == *str) | ||
42 | return 0; | ||
43 | if (**str == ',') { | ||
44 | (*str)++; | ||
45 | return 2; | ||
46 | } | ||
47 | |||
48 | return 1; | ||
49 | } | ||
50 | |||
51 | /** | ||
52 | * get_options - Parse a string into a list of integers | ||
53 | * @str: String to be parsed | ||
54 | * @nints: size of integer array | ||
55 | * @ints: integer array | ||
56 | * | ||
57 | * This function parses a string containing a comma-separated | ||
58 | * list of integers. The parse halts when the array is | ||
59 | * full, or when no more numbers can be retrieved from the | ||
60 | * string. | ||
61 | * | ||
62 | * Return value is the character in the string which caused | ||
63 | * the parse to end (typically a null terminator, if @str is | ||
64 | * completely parseable). | ||
65 | */ | ||
66 | |||
67 | char *get_options(const char *str, int nints, int *ints) | ||
68 | { | ||
69 | int res, i = 1; | ||
70 | |||
71 | while (i < nints) { | ||
72 | res = get_option ((char **)&str, ints + i); | ||
73 | if (res == 0) | ||
74 | break; | ||
75 | i++; | ||
76 | if (res == 1) | ||
77 | break; | ||
78 | } | ||
79 | ints[0] = i - 1; | ||
80 | return (char *)str; | ||
81 | } | ||
82 | |||
83 | /** | ||
84 | * memparse - parse a string with mem suffixes into a number | ||
85 | * @ptr: Where parse begins | ||
86 | * @retptr: (output) Pointer to next char after parse completes | ||
87 | * | ||
88 | * Parses a string into a number. The number stored at @ptr is | ||
89 | * potentially suffixed with %K (for kilobytes, or 1024 bytes), | ||
90 | * %M (for megabytes, or 1048576 bytes), or %G (for gigabytes, or | ||
91 | * 1073741824). If the number is suffixed with K, M, or G, then | ||
92 | * the return value is the number multiplied by one kilobyte, one | ||
93 | * megabyte, or one gigabyte, respectively. | ||
94 | */ | ||
95 | |||
96 | unsigned long long memparse (char *ptr, char **retptr) | ||
97 | { | ||
98 | unsigned long long ret = simple_strtoull (ptr, retptr, 0); | ||
99 | |||
100 | switch (**retptr) { | ||
101 | case 'G': | ||
102 | case 'g': | ||
103 | ret <<= 10; | ||
104 | case 'M': | ||
105 | case 'm': | ||
106 | ret <<= 10; | ||
107 | case 'K': | ||
108 | case 'k': | ||
109 | ret <<= 10; | ||
110 | (*retptr)++; | ||
111 | default: | ||
112 | break; | ||
113 | } | ||
114 | return ret; | ||
115 | } | ||
116 | |||
117 | |||
118 | EXPORT_SYMBOL(memparse); | ||
119 | EXPORT_SYMBOL(get_option); | ||
120 | EXPORT_SYMBOL(get_options); | ||
diff --git a/lib/crc-ccitt.c b/lib/crc-ccitt.c new file mode 100644 index 000000000000..115d149af407 --- /dev/null +++ b/lib/crc-ccitt.c | |||
@@ -0,0 +1,69 @@ | |||
1 | /* | ||
2 | * linux/lib/crc-ccitt.c | ||
3 | * | ||
4 | * This source code is licensed under the GNU General Public License, | ||
5 | * Version 2. See the file COPYING for more details. | ||
6 | */ | ||
7 | |||
8 | #include <linux/types.h> | ||
9 | #include <linux/module.h> | ||
10 | #include <linux/crc-ccitt.h> | ||
11 | |||
12 | /* | ||
13 | * This mysterious table is just the CRC of each possible byte. It can be | ||
14 | * computed using the standard bit-at-a-time methods. The polynomial can | ||
15 | * be seen in entry 128, 0x8408. This corresponds to x^0 + x^5 + x^12. | ||
16 | * Add the implicit x^16, and you have the standard CRC-CCITT. | ||
17 | */ | ||
18 | u16 const crc_ccitt_table[256] = { | ||
19 | 0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf, | ||
20 | 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7, | ||
21 | 0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e, | ||
22 | 0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876, | ||
23 | 0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd, | ||
24 | 0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5, | ||
25 | 0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c, | ||
26 | 0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974, | ||
27 | 0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb, | ||
28 | 0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3, | ||
29 | 0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a, | ||
30 | 0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72, | ||
31 | 0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9, | ||
32 | 0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1, | ||
33 | 0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738, | ||
34 | 0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70, | ||
35 | 0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7, | ||
36 | 0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff, | ||
37 | 0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036, | ||
38 | 0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e, | ||
39 | 0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5, | ||
40 | 0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd, | ||
41 | 0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134, | ||
42 | 0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c, | ||
43 | 0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3, | ||
44 | 0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb, | ||
45 | 0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232, | ||
46 | 0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a, | ||
47 | 0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1, | ||
48 | 0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9, | ||
49 | 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330, | ||
50 | 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78 | ||
51 | }; | ||
52 | EXPORT_SYMBOL(crc_ccitt_table); | ||
53 | |||
54 | /** | ||
55 | * crc_ccitt - recompute the CRC for the data buffer | ||
56 | * @crc - previous CRC value | ||
57 | * @buffer - data pointer | ||
58 | * @len - number of bytes in the buffer | ||
59 | */ | ||
60 | u16 crc_ccitt(u16 crc, u8 const *buffer, size_t len) | ||
61 | { | ||
62 | while (len--) | ||
63 | crc = crc_ccitt_byte(crc, *buffer++); | ||
64 | return crc; | ||
65 | } | ||
66 | EXPORT_SYMBOL(crc_ccitt); | ||
67 | |||
68 | MODULE_DESCRIPTION("CRC-CCITT calculations"); | ||
69 | MODULE_LICENSE("GPL"); | ||
diff --git a/lib/crc32.c b/lib/crc32.c new file mode 100644 index 000000000000..58b222783f9c --- /dev/null +++ b/lib/crc32.c | |||
@@ -0,0 +1,529 @@ | |||
1 | /* | ||
2 | * Oct 15, 2000 Matt Domsch <Matt_Domsch@dell.com> | ||
3 | * Nicer crc32 functions/docs submitted by linux@horizon.com. Thanks! | ||
4 | * Code was from the public domain, copyright abandoned. Code was | ||
5 | * subsequently included in the kernel, thus was re-licensed under the | ||
6 | * GNU GPL v2. | ||
7 | * | ||
8 | * Oct 12, 2000 Matt Domsch <Matt_Domsch@dell.com> | ||
9 | * Same crc32 function was used in 5 other places in the kernel. | ||
10 | * I made one version, and deleted the others. | ||
11 | * There are various incantations of crc32(). Some use a seed of 0 or ~0. | ||
12 | * Some xor at the end with ~0. The generic crc32() function takes | ||
13 | * seed as an argument, and doesn't xor at the end. Then individual | ||
14 | * users can do whatever they need. | ||
15 | * drivers/net/smc9194.c uses seed ~0, doesn't xor with ~0. | ||
16 | * fs/jffs2 uses seed 0, doesn't xor with ~0. | ||
17 | * fs/partitions/efi.c uses seed ~0, xor's with ~0. | ||
18 | * | ||
19 | * This source code is licensed under the GNU General Public License, | ||
20 | * Version 2. See the file COPYING for more details. | ||
21 | */ | ||
22 | |||
23 | #include <linux/crc32.h> | ||
24 | #include <linux/kernel.h> | ||
25 | #include <linux/module.h> | ||
26 | #include <linux/compiler.h> | ||
27 | #include <linux/types.h> | ||
28 | #include <linux/slab.h> | ||
29 | #include <linux/init.h> | ||
30 | #include <asm/atomic.h> | ||
31 | #include "crc32defs.h" | ||
32 | #if CRC_LE_BITS == 8 | ||
33 | #define tole(x) __constant_cpu_to_le32(x) | ||
34 | #define tobe(x) __constant_cpu_to_be32(x) | ||
35 | #else | ||
36 | #define tole(x) (x) | ||
37 | #define tobe(x) (x) | ||
38 | #endif | ||
39 | #include "crc32table.h" | ||
40 | |||
41 | MODULE_AUTHOR("Matt Domsch <Matt_Domsch@dell.com>"); | ||
42 | MODULE_DESCRIPTION("Ethernet CRC32 calculations"); | ||
43 | MODULE_LICENSE("GPL"); | ||
44 | |||
45 | #if CRC_LE_BITS == 1 | ||
46 | /* | ||
47 | * In fact, the table-based code will work in this case, but it can be | ||
48 | * simplified by inlining the table in ?: form. | ||
49 | */ | ||
50 | |||
51 | /** | ||
52 | * crc32_le() - Calculate bitwise little-endian Ethernet AUTODIN II CRC32 | ||
53 | * @crc - seed value for computation. ~0 for Ethernet, sometimes 0 for | ||
54 | * other uses, or the previous crc32 value if computing incrementally. | ||
55 | * @p - pointer to buffer over which CRC is run | ||
56 | * @len - length of buffer @p | ||
57 | * | ||
58 | */ | ||
59 | u32 __attribute_pure__ crc32_le(u32 crc, unsigned char const *p, size_t len) | ||
60 | { | ||
61 | int i; | ||
62 | while (len--) { | ||
63 | crc ^= *p++; | ||
64 | for (i = 0; i < 8; i++) | ||
65 | crc = (crc >> 1) ^ ((crc & 1) ? CRCPOLY_LE : 0); | ||
66 | } | ||
67 | return crc; | ||
68 | } | ||
69 | #else /* Table-based approach */ | ||
70 | |||
71 | /** | ||
72 | * crc32_le() - Calculate bitwise little-endian Ethernet AUTODIN II CRC32 | ||
73 | * @crc - seed value for computation. ~0 for Ethernet, sometimes 0 for | ||
74 | * other uses, or the previous crc32 value if computing incrementally. | ||
75 | * @p - pointer to buffer over which CRC is run | ||
76 | * @len - length of buffer @p | ||
77 | * | ||
78 | */ | ||
79 | u32 __attribute_pure__ crc32_le(u32 crc, unsigned char const *p, size_t len) | ||
80 | { | ||
81 | # if CRC_LE_BITS == 8 | ||
82 | const u32 *b =(u32 *)p; | ||
83 | const u32 *tab = crc32table_le; | ||
84 | |||
85 | # ifdef __LITTLE_ENDIAN | ||
86 | # define DO_CRC(x) crc = tab[ (crc ^ (x)) & 255 ] ^ (crc>>8) | ||
87 | # else | ||
88 | # define DO_CRC(x) crc = tab[ ((crc >> 24) ^ (x)) & 255] ^ (crc<<8) | ||
89 | # endif | ||
90 | |||
91 | crc = __cpu_to_le32(crc); | ||
92 | /* Align it */ | ||
93 | if(unlikely(((long)b)&3 && len)){ | ||
94 | do { | ||
95 | u8 *p = (u8 *)b; | ||
96 | DO_CRC(*p++); | ||
97 | b = (void *)p; | ||
98 | } while ((--len) && ((long)b)&3 ); | ||
99 | } | ||
100 | if(likely(len >= 4)){ | ||
101 | /* load data 32 bits wide, xor data 32 bits wide. */ | ||
102 | size_t save_len = len & 3; | ||
103 | len = len >> 2; | ||
104 | --b; /* use pre increment below(*++b) for speed */ | ||
105 | do { | ||
106 | crc ^= *++b; | ||
107 | DO_CRC(0); | ||
108 | DO_CRC(0); | ||
109 | DO_CRC(0); | ||
110 | DO_CRC(0); | ||
111 | } while (--len); | ||
112 | b++; /* point to next byte(s) */ | ||
113 | len = save_len; | ||
114 | } | ||
115 | /* And the last few bytes */ | ||
116 | if(len){ | ||
117 | do { | ||
118 | u8 *p = (u8 *)b; | ||
119 | DO_CRC(*p++); | ||
120 | b = (void *)p; | ||
121 | } while (--len); | ||
122 | } | ||
123 | |||
124 | return __le32_to_cpu(crc); | ||
125 | #undef ENDIAN_SHIFT | ||
126 | #undef DO_CRC | ||
127 | |||
128 | # elif CRC_LE_BITS == 4 | ||
129 | while (len--) { | ||
130 | crc ^= *p++; | ||
131 | crc = (crc >> 4) ^ crc32table_le[crc & 15]; | ||
132 | crc = (crc >> 4) ^ crc32table_le[crc & 15]; | ||
133 | } | ||
134 | return crc; | ||
135 | # elif CRC_LE_BITS == 2 | ||
136 | while (len--) { | ||
137 | crc ^= *p++; | ||
138 | crc = (crc >> 2) ^ crc32table_le[crc & 3]; | ||
139 | crc = (crc >> 2) ^ crc32table_le[crc & 3]; | ||
140 | crc = (crc >> 2) ^ crc32table_le[crc & 3]; | ||
141 | crc = (crc >> 2) ^ crc32table_le[crc & 3]; | ||
142 | } | ||
143 | return crc; | ||
144 | # endif | ||
145 | } | ||
146 | #endif | ||
147 | |||
148 | #if CRC_BE_BITS == 1 | ||
149 | /* | ||
150 | * In fact, the table-based code will work in this case, but it can be | ||
151 | * simplified by inlining the table in ?: form. | ||
152 | */ | ||
153 | |||
154 | /** | ||
155 | * crc32_be() - Calculate bitwise big-endian Ethernet AUTODIN II CRC32 | ||
156 | * @crc - seed value for computation. ~0 for Ethernet, sometimes 0 for | ||
157 | * other uses, or the previous crc32 value if computing incrementally. | ||
158 | * @p - pointer to buffer over which CRC is run | ||
159 | * @len - length of buffer @p | ||
160 | * | ||
161 | */ | ||
162 | u32 __attribute_pure__ crc32_be(u32 crc, unsigned char const *p, size_t len) | ||
163 | { | ||
164 | int i; | ||
165 | while (len--) { | ||
166 | crc ^= *p++ << 24; | ||
167 | for (i = 0; i < 8; i++) | ||
168 | crc = | ||
169 | (crc << 1) ^ ((crc & 0x80000000) ? CRCPOLY_BE : | ||
170 | 0); | ||
171 | } | ||
172 | return crc; | ||
173 | } | ||
174 | |||
175 | #else /* Table-based approach */ | ||
176 | /** | ||
177 | * crc32_be() - Calculate bitwise big-endian Ethernet AUTODIN II CRC32 | ||
178 | * @crc - seed value for computation. ~0 for Ethernet, sometimes 0 for | ||
179 | * other uses, or the previous crc32 value if computing incrementally. | ||
180 | * @p - pointer to buffer over which CRC is run | ||
181 | * @len - length of buffer @p | ||
182 | * | ||
183 | */ | ||
184 | u32 __attribute_pure__ crc32_be(u32 crc, unsigned char const *p, size_t len) | ||
185 | { | ||
186 | # if CRC_BE_BITS == 8 | ||
187 | const u32 *b =(u32 *)p; | ||
188 | const u32 *tab = crc32table_be; | ||
189 | |||
190 | # ifdef __LITTLE_ENDIAN | ||
191 | # define DO_CRC(x) crc = tab[ (crc ^ (x)) & 255 ] ^ (crc>>8) | ||
192 | # else | ||
193 | # define DO_CRC(x) crc = tab[ ((crc >> 24) ^ (x)) & 255] ^ (crc<<8) | ||
194 | # endif | ||
195 | |||
196 | crc = __cpu_to_be32(crc); | ||
197 | /* Align it */ | ||
198 | if(unlikely(((long)b)&3 && len)){ | ||
199 | do { | ||
200 | u8 *p = (u8 *)b; | ||
201 | DO_CRC(*p++); | ||
202 | b = (u32 *)p; | ||
203 | } while ((--len) && ((long)b)&3 ); | ||
204 | } | ||
205 | if(likely(len >= 4)){ | ||
206 | /* load data 32 bits wide, xor data 32 bits wide. */ | ||
207 | size_t save_len = len & 3; | ||
208 | len = len >> 2; | ||
209 | --b; /* use pre increment below(*++b) for speed */ | ||
210 | do { | ||
211 | crc ^= *++b; | ||
212 | DO_CRC(0); | ||
213 | DO_CRC(0); | ||
214 | DO_CRC(0); | ||
215 | DO_CRC(0); | ||
216 | } while (--len); | ||
217 | b++; /* point to next byte(s) */ | ||
218 | len = save_len; | ||
219 | } | ||
220 | /* And the last few bytes */ | ||
221 | if(len){ | ||
222 | do { | ||
223 | u8 *p = (u8 *)b; | ||
224 | DO_CRC(*p++); | ||
225 | b = (void *)p; | ||
226 | } while (--len); | ||
227 | } | ||
228 | return __be32_to_cpu(crc); | ||
229 | #undef ENDIAN_SHIFT | ||
230 | #undef DO_CRC | ||
231 | |||
232 | # elif CRC_BE_BITS == 4 | ||
233 | while (len--) { | ||
234 | crc ^= *p++ << 24; | ||
235 | crc = (crc << 4) ^ crc32table_be[crc >> 28]; | ||
236 | crc = (crc << 4) ^ crc32table_be[crc >> 28]; | ||
237 | } | ||
238 | return crc; | ||
239 | # elif CRC_BE_BITS == 2 | ||
240 | while (len--) { | ||
241 | crc ^= *p++ << 24; | ||
242 | crc = (crc << 2) ^ crc32table_be[crc >> 30]; | ||
243 | crc = (crc << 2) ^ crc32table_be[crc >> 30]; | ||
244 | crc = (crc << 2) ^ crc32table_be[crc >> 30]; | ||
245 | crc = (crc << 2) ^ crc32table_be[crc >> 30]; | ||
246 | } | ||
247 | return crc; | ||
248 | # endif | ||
249 | } | ||
250 | #endif | ||
251 | |||
252 | u32 bitreverse(u32 x) | ||
253 | { | ||
254 | x = (x >> 16) | (x << 16); | ||
255 | x = (x >> 8 & 0x00ff00ff) | (x << 8 & 0xff00ff00); | ||
256 | x = (x >> 4 & 0x0f0f0f0f) | (x << 4 & 0xf0f0f0f0); | ||
257 | x = (x >> 2 & 0x33333333) | (x << 2 & 0xcccccccc); | ||
258 | x = (x >> 1 & 0x55555555) | (x << 1 & 0xaaaaaaaa); | ||
259 | return x; | ||
260 | } | ||
261 | |||
262 | EXPORT_SYMBOL(crc32_le); | ||
263 | EXPORT_SYMBOL(crc32_be); | ||
264 | EXPORT_SYMBOL(bitreverse); | ||
265 | |||
266 | /* | ||
267 | * A brief CRC tutorial. | ||
268 | * | ||
269 | * A CRC is a long-division remainder. You add the CRC to the message, | ||
270 | * and the whole thing (message+CRC) is a multiple of the given | ||
271 | * CRC polynomial. To check the CRC, you can either check that the | ||
272 | * CRC matches the recomputed value, *or* you can check that the | ||
273 | * remainder computed on the message+CRC is 0. This latter approach | ||
274 | * is used by a lot of hardware implementations, and is why so many | ||
275 | * protocols put the end-of-frame flag after the CRC. | ||
276 | * | ||
277 | * It's actually the same long division you learned in school, except that | ||
278 | * - We're working in binary, so the digits are only 0 and 1, and | ||
279 | * - When dividing polynomials, there are no carries. Rather than add and | ||
280 | * subtract, we just xor. Thus, we tend to get a bit sloppy about | ||
281 | * the difference between adding and subtracting. | ||
282 | * | ||
283 | * A 32-bit CRC polynomial is actually 33 bits long. But since it's | ||
284 | * 33 bits long, bit 32 is always going to be set, so usually the CRC | ||
285 | * is written in hex with the most significant bit omitted. (If you're | ||
286 | * familiar with the IEEE 754 floating-point format, it's the same idea.) | ||
287 | * | ||
288 | * Note that a CRC is computed over a string of *bits*, so you have | ||
289 | * to decide on the endianness of the bits within each byte. To get | ||
290 | * the best error-detecting properties, this should correspond to the | ||
291 | * order they're actually sent. For example, standard RS-232 serial is | ||
292 | * little-endian; the most significant bit (sometimes used for parity) | ||
293 | * is sent last. And when appending a CRC word to a message, you should | ||
294 | * do it in the right order, matching the endianness. | ||
295 | * | ||
296 | * Just like with ordinary division, the remainder is always smaller than | ||
297 | * the divisor (the CRC polynomial) you're dividing by. Each step of the | ||
298 | * division, you take one more digit (bit) of the dividend and append it | ||
299 | * to the current remainder. Then you figure out the appropriate multiple | ||
300 | * of the divisor to subtract to being the remainder back into range. | ||
301 | * In binary, it's easy - it has to be either 0 or 1, and to make the | ||
302 | * XOR cancel, it's just a copy of bit 32 of the remainder. | ||
303 | * | ||
304 | * When computing a CRC, we don't care about the quotient, so we can | ||
305 | * throw the quotient bit away, but subtract the appropriate multiple of | ||
306 | * the polynomial from the remainder and we're back to where we started, | ||
307 | * ready to process the next bit. | ||
308 | * | ||
309 | * A big-endian CRC written this way would be coded like: | ||
310 | * for (i = 0; i < input_bits; i++) { | ||
311 | * multiple = remainder & 0x80000000 ? CRCPOLY : 0; | ||
312 | * remainder = (remainder << 1 | next_input_bit()) ^ multiple; | ||
313 | * } | ||
314 | * Notice how, to get at bit 32 of the shifted remainder, we look | ||
315 | * at bit 31 of the remainder *before* shifting it. | ||
316 | * | ||
317 | * But also notice how the next_input_bit() bits we're shifting into | ||
318 | * the remainder don't actually affect any decision-making until | ||
319 | * 32 bits later. Thus, the first 32 cycles of this are pretty boring. | ||
320 | * Also, to add the CRC to a message, we need a 32-bit-long hole for it at | ||
321 | * the end, so we have to add 32 extra cycles shifting in zeros at the | ||
322 | * end of every message, | ||
323 | * | ||
324 | * So the standard trick is to rearrage merging in the next_input_bit() | ||
325 | * until the moment it's needed. Then the first 32 cycles can be precomputed, | ||
326 | * and merging in the final 32 zero bits to make room for the CRC can be | ||
327 | * skipped entirely. | ||
328 | * This changes the code to: | ||
329 | * for (i = 0; i < input_bits; i++) { | ||
330 | * remainder ^= next_input_bit() << 31; | ||
331 | * multiple = (remainder & 0x80000000) ? CRCPOLY : 0; | ||
332 | * remainder = (remainder << 1) ^ multiple; | ||
333 | * } | ||
334 | * With this optimization, the little-endian code is simpler: | ||
335 | * for (i = 0; i < input_bits; i++) { | ||
336 | * remainder ^= next_input_bit(); | ||
337 | * multiple = (remainder & 1) ? CRCPOLY : 0; | ||
338 | * remainder = (remainder >> 1) ^ multiple; | ||
339 | * } | ||
340 | * | ||
341 | * Note that the other details of endianness have been hidden in CRCPOLY | ||
342 | * (which must be bit-reversed) and next_input_bit(). | ||
343 | * | ||
344 | * However, as long as next_input_bit is returning the bits in a sensible | ||
345 | * order, we can actually do the merging 8 or more bits at a time rather | ||
346 | * than one bit at a time: | ||
347 | * for (i = 0; i < input_bytes; i++) { | ||
348 | * remainder ^= next_input_byte() << 24; | ||
349 | * for (j = 0; j < 8; j++) { | ||
350 | * multiple = (remainder & 0x80000000) ? CRCPOLY : 0; | ||
351 | * remainder = (remainder << 1) ^ multiple; | ||
352 | * } | ||
353 | * } | ||
354 | * Or in little-endian: | ||
355 | * for (i = 0; i < input_bytes; i++) { | ||
356 | * remainder ^= next_input_byte(); | ||
357 | * for (j = 0; j < 8; j++) { | ||
358 | * multiple = (remainder & 1) ? CRCPOLY : 0; | ||
359 | * remainder = (remainder << 1) ^ multiple; | ||
360 | * } | ||
361 | * } | ||
362 | * If the input is a multiple of 32 bits, you can even XOR in a 32-bit | ||
363 | * word at a time and increase the inner loop count to 32. | ||
364 | * | ||
365 | * You can also mix and match the two loop styles, for example doing the | ||
366 | * bulk of a message byte-at-a-time and adding bit-at-a-time processing | ||
367 | * for any fractional bytes at the end. | ||
368 | * | ||
369 | * The only remaining optimization is to the byte-at-a-time table method. | ||
370 | * Here, rather than just shifting one bit of the remainder to decide | ||
371 | * in the correct multiple to subtract, we can shift a byte at a time. | ||
372 | * This produces a 40-bit (rather than a 33-bit) intermediate remainder, | ||
373 | * but again the multiple of the polynomial to subtract depends only on | ||
374 | * the high bits, the high 8 bits in this case. | ||
375 | * | ||
376 | * The multile we need in that case is the low 32 bits of a 40-bit | ||
377 | * value whose high 8 bits are given, and which is a multiple of the | ||
378 | * generator polynomial. This is simply the CRC-32 of the given | ||
379 | * one-byte message. | ||
380 | * | ||
381 | * Two more details: normally, appending zero bits to a message which | ||
382 | * is already a multiple of a polynomial produces a larger multiple of that | ||
383 | * polynomial. To enable a CRC to detect this condition, it's common to | ||
384 | * invert the CRC before appending it. This makes the remainder of the | ||
385 | * message+crc come out not as zero, but some fixed non-zero value. | ||
386 | * | ||
387 | * The same problem applies to zero bits prepended to the message, and | ||
388 | * a similar solution is used. Instead of starting with a remainder of | ||
389 | * 0, an initial remainder of all ones is used. As long as you start | ||
390 | * the same way on decoding, it doesn't make a difference. | ||
391 | */ | ||
392 | |||
393 | #ifdef UNITTEST | ||
394 | |||
395 | #include <stdlib.h> | ||
396 | #include <stdio.h> | ||
397 | |||
398 | #if 0 /*Not used at present */ | ||
399 | static void | ||
400 | buf_dump(char const *prefix, unsigned char const *buf, size_t len) | ||
401 | { | ||
402 | fputs(prefix, stdout); | ||
403 | while (len--) | ||
404 | printf(" %02x", *buf++); | ||
405 | putchar('\n'); | ||
406 | |||
407 | } | ||
408 | #endif | ||
409 | |||
410 | static void bytereverse(unsigned char *buf, size_t len) | ||
411 | { | ||
412 | while (len--) { | ||
413 | unsigned char x = *buf; | ||
414 | x = (x >> 4) | (x << 4); | ||
415 | x = (x >> 2 & 0x33) | (x << 2 & 0xcc); | ||
416 | x = (x >> 1 & 0x55) | (x << 1 & 0xaa); | ||
417 | *buf++ = x; | ||
418 | } | ||
419 | } | ||
420 | |||
421 | static void random_garbage(unsigned char *buf, size_t len) | ||
422 | { | ||
423 | while (len--) | ||
424 | *buf++ = (unsigned char) random(); | ||
425 | } | ||
426 | |||
427 | #if 0 /* Not used at present */ | ||
428 | static void store_le(u32 x, unsigned char *buf) | ||
429 | { | ||
430 | buf[0] = (unsigned char) x; | ||
431 | buf[1] = (unsigned char) (x >> 8); | ||
432 | buf[2] = (unsigned char) (x >> 16); | ||
433 | buf[3] = (unsigned char) (x >> 24); | ||
434 | } | ||
435 | #endif | ||
436 | |||
437 | static void store_be(u32 x, unsigned char *buf) | ||
438 | { | ||
439 | buf[0] = (unsigned char) (x >> 24); | ||
440 | buf[1] = (unsigned char) (x >> 16); | ||
441 | buf[2] = (unsigned char) (x >> 8); | ||
442 | buf[3] = (unsigned char) x; | ||
443 | } | ||
444 | |||
445 | /* | ||
446 | * This checks that CRC(buf + CRC(buf)) = 0, and that | ||
447 | * CRC commutes with bit-reversal. This has the side effect | ||
448 | * of bytewise bit-reversing the input buffer, and returns | ||
449 | * the CRC of the reversed buffer. | ||
450 | */ | ||
451 | static u32 test_step(u32 init, unsigned char *buf, size_t len) | ||
452 | { | ||
453 | u32 crc1, crc2; | ||
454 | size_t i; | ||
455 | |||
456 | crc1 = crc32_be(init, buf, len); | ||
457 | store_be(crc1, buf + len); | ||
458 | crc2 = crc32_be(init, buf, len + 4); | ||
459 | if (crc2) | ||
460 | printf("\nCRC cancellation fail: 0x%08x should be 0\n", | ||
461 | crc2); | ||
462 | |||
463 | for (i = 0; i <= len + 4; i++) { | ||
464 | crc2 = crc32_be(init, buf, i); | ||
465 | crc2 = crc32_be(crc2, buf + i, len + 4 - i); | ||
466 | if (crc2) | ||
467 | printf("\nCRC split fail: 0x%08x\n", crc2); | ||
468 | } | ||
469 | |||
470 | /* Now swap it around for the other test */ | ||
471 | |||
472 | bytereverse(buf, len + 4); | ||
473 | init = bitreverse(init); | ||
474 | crc2 = bitreverse(crc1); | ||
475 | if (crc1 != bitreverse(crc2)) | ||
476 | printf("\nBit reversal fail: 0x%08x -> %0x08x -> 0x%08x\n", | ||
477 | crc1, crc2, bitreverse(crc2)); | ||
478 | crc1 = crc32_le(init, buf, len); | ||
479 | if (crc1 != crc2) | ||
480 | printf("\nCRC endianness fail: 0x%08x != 0x%08x\n", crc1, | ||
481 | crc2); | ||
482 | crc2 = crc32_le(init, buf, len + 4); | ||
483 | if (crc2) | ||
484 | printf("\nCRC cancellation fail: 0x%08x should be 0\n", | ||
485 | crc2); | ||
486 | |||
487 | for (i = 0; i <= len + 4; i++) { | ||
488 | crc2 = crc32_le(init, buf, i); | ||
489 | crc2 = crc32_le(crc2, buf + i, len + 4 - i); | ||
490 | if (crc2) | ||
491 | printf("\nCRC split fail: 0x%08x\n", crc2); | ||
492 | } | ||
493 | |||
494 | return crc1; | ||
495 | } | ||
496 | |||
497 | #define SIZE 64 | ||
498 | #define INIT1 0 | ||
499 | #define INIT2 0 | ||
500 | |||
501 | int main(void) | ||
502 | { | ||
503 | unsigned char buf1[SIZE + 4]; | ||
504 | unsigned char buf2[SIZE + 4]; | ||
505 | unsigned char buf3[SIZE + 4]; | ||
506 | int i, j; | ||
507 | u32 crc1, crc2, crc3; | ||
508 | |||
509 | for (i = 0; i <= SIZE; i++) { | ||
510 | printf("\rTesting length %d...", i); | ||
511 | fflush(stdout); | ||
512 | random_garbage(buf1, i); | ||
513 | random_garbage(buf2, i); | ||
514 | for (j = 0; j < i; j++) | ||
515 | buf3[j] = buf1[j] ^ buf2[j]; | ||
516 | |||
517 | crc1 = test_step(INIT1, buf1, i); | ||
518 | crc2 = test_step(INIT2, buf2, i); | ||
519 | /* Now check that CRC(buf1 ^ buf2) = CRC(buf1) ^ CRC(buf2) */ | ||
520 | crc3 = test_step(INIT1 ^ INIT2, buf3, i); | ||
521 | if (crc3 != (crc1 ^ crc2)) | ||
522 | printf("CRC XOR fail: 0x%08x != 0x%08x ^ 0x%08x\n", | ||
523 | crc3, crc1, crc2); | ||
524 | } | ||
525 | printf("\nAll test complete. No failures expected.\n"); | ||
526 | return 0; | ||
527 | } | ||
528 | |||
529 | #endif /* UNITTEST */ | ||
diff --git a/lib/crc32defs.h b/lib/crc32defs.h new file mode 100644 index 000000000000..9b6773d73749 --- /dev/null +++ b/lib/crc32defs.h | |||
@@ -0,0 +1,32 @@ | |||
1 | /* | ||
2 | * There are multiple 16-bit CRC polynomials in common use, but this is | ||
3 | * *the* standard CRC-32 polynomial, first popularized by Ethernet. | ||
4 | * x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x^1+x^0 | ||
5 | */ | ||
6 | #define CRCPOLY_LE 0xedb88320 | ||
7 | #define CRCPOLY_BE 0x04c11db7 | ||
8 | |||
9 | /* How many bits at a time to use. Requires a table of 4<<CRC_xx_BITS bytes. */ | ||
10 | /* For less performance-sensitive, use 4 */ | ||
11 | #ifndef CRC_LE_BITS | ||
12 | # define CRC_LE_BITS 8 | ||
13 | #endif | ||
14 | #ifndef CRC_BE_BITS | ||
15 | # define CRC_BE_BITS 8 | ||
16 | #endif | ||
17 | |||
18 | /* | ||
19 | * Little-endian CRC computation. Used with serial bit streams sent | ||
20 | * lsbit-first. Be sure to use cpu_to_le32() to append the computed CRC. | ||
21 | */ | ||
22 | #if CRC_LE_BITS > 8 || CRC_LE_BITS < 1 || CRC_LE_BITS & CRC_LE_BITS-1 | ||
23 | # error CRC_LE_BITS must be a power of 2 between 1 and 8 | ||
24 | #endif | ||
25 | |||
26 | /* | ||
27 | * Big-endian CRC computation. Used with serial bit streams sent | ||
28 | * msbit-first. Be sure to use cpu_to_be32() to append the computed CRC. | ||
29 | */ | ||
30 | #if CRC_BE_BITS > 8 || CRC_BE_BITS < 1 || CRC_BE_BITS & CRC_BE_BITS-1 | ||
31 | # error CRC_BE_BITS must be a power of 2 between 1 and 8 | ||
32 | #endif | ||
diff --git a/lib/ctype.c b/lib/ctype.c new file mode 100644 index 000000000000..d02ace14a322 --- /dev/null +++ b/lib/ctype.c | |||
@@ -0,0 +1,36 @@ | |||
1 | /* | ||
2 | * linux/lib/ctype.c | ||
3 | * | ||
4 | * Copyright (C) 1991, 1992 Linus Torvalds | ||
5 | */ | ||
6 | |||
7 | #include <linux/ctype.h> | ||
8 | #include <linux/module.h> | ||
9 | |||
10 | unsigned char _ctype[] = { | ||
11 | _C,_C,_C,_C,_C,_C,_C,_C, /* 0-7 */ | ||
12 | _C,_C|_S,_C|_S,_C|_S,_C|_S,_C|_S,_C,_C, /* 8-15 */ | ||
13 | _C,_C,_C,_C,_C,_C,_C,_C, /* 16-23 */ | ||
14 | _C,_C,_C,_C,_C,_C,_C,_C, /* 24-31 */ | ||
15 | _S|_SP,_P,_P,_P,_P,_P,_P,_P, /* 32-39 */ | ||
16 | _P,_P,_P,_P,_P,_P,_P,_P, /* 40-47 */ | ||
17 | _D,_D,_D,_D,_D,_D,_D,_D, /* 48-55 */ | ||
18 | _D,_D,_P,_P,_P,_P,_P,_P, /* 56-63 */ | ||
19 | _P,_U|_X,_U|_X,_U|_X,_U|_X,_U|_X,_U|_X,_U, /* 64-71 */ | ||
20 | _U,_U,_U,_U,_U,_U,_U,_U, /* 72-79 */ | ||
21 | _U,_U,_U,_U,_U,_U,_U,_U, /* 80-87 */ | ||
22 | _U,_U,_U,_P,_P,_P,_P,_P, /* 88-95 */ | ||
23 | _P,_L|_X,_L|_X,_L|_X,_L|_X,_L|_X,_L|_X,_L, /* 96-103 */ | ||
24 | _L,_L,_L,_L,_L,_L,_L,_L, /* 104-111 */ | ||
25 | _L,_L,_L,_L,_L,_L,_L,_L, /* 112-119 */ | ||
26 | _L,_L,_L,_P,_P,_P,_P,_C, /* 120-127 */ | ||
27 | 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 128-143 */ | ||
28 | 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 144-159 */ | ||
29 | _S|_SP,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P, /* 160-175 */ | ||
30 | _P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P, /* 176-191 */ | ||
31 | _U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U, /* 192-207 */ | ||
32 | _U,_U,_U,_U,_U,_U,_U,_P,_U,_U,_U,_U,_U,_U,_U,_L, /* 208-223 */ | ||
33 | _L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L, /* 224-239 */ | ||
34 | _L,_L,_L,_L,_L,_L,_L,_P,_L,_L,_L,_L,_L,_L,_L,_L}; /* 240-255 */ | ||
35 | |||
36 | EXPORT_SYMBOL(_ctype); | ||
diff --git a/lib/dec_and_lock.c b/lib/dec_and_lock.c new file mode 100644 index 000000000000..6658d81e1836 --- /dev/null +++ b/lib/dec_and_lock.c | |||
@@ -0,0 +1,40 @@ | |||
1 | #include <linux/module.h> | ||
2 | #include <linux/spinlock.h> | ||
3 | #include <asm/atomic.h> | ||
4 | |||
5 | /* | ||
6 | * This is an architecture-neutral, but slow, | ||
7 | * implementation of the notion of "decrement | ||
8 | * a reference count, and return locked if it | ||
9 | * decremented to zero". | ||
10 | * | ||
11 | * NOTE NOTE NOTE! This is _not_ equivalent to | ||
12 | * | ||
13 | * if (atomic_dec_and_test(&atomic)) { | ||
14 | * spin_lock(&lock); | ||
15 | * return 1; | ||
16 | * } | ||
17 | * return 0; | ||
18 | * | ||
19 | * because the spin-lock and the decrement must be | ||
20 | * "atomic". | ||
21 | * | ||
22 | * This slow version gets the spinlock unconditionally, | ||
23 | * and releases it if it isn't needed. Architectures | ||
24 | * are encouraged to come up with better approaches, | ||
25 | * this is trivially done efficiently using a load-locked | ||
26 | * store-conditional approach, for example. | ||
27 | */ | ||
28 | |||
29 | #ifndef ATOMIC_DEC_AND_LOCK | ||
30 | int _atomic_dec_and_lock(atomic_t *atomic, spinlock_t *lock) | ||
31 | { | ||
32 | spin_lock(lock); | ||
33 | if (atomic_dec_and_test(atomic)) | ||
34 | return 1; | ||
35 | spin_unlock(lock); | ||
36 | return 0; | ||
37 | } | ||
38 | |||
39 | EXPORT_SYMBOL(_atomic_dec_and_lock); | ||
40 | #endif | ||
diff --git a/lib/div64.c b/lib/div64.c new file mode 100644 index 000000000000..365719f84832 --- /dev/null +++ b/lib/div64.c | |||
@@ -0,0 +1,61 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2003 Bernardo Innocenti <bernie@develer.com> | ||
3 | * | ||
4 | * Based on former do_div() implementation from asm-parisc/div64.h: | ||
5 | * Copyright (C) 1999 Hewlett-Packard Co | ||
6 | * Copyright (C) 1999 David Mosberger-Tang <davidm@hpl.hp.com> | ||
7 | * | ||
8 | * | ||
9 | * Generic C version of 64bit/32bit division and modulo, with | ||
10 | * 64bit result and 32bit remainder. | ||
11 | * | ||
12 | * The fast case for (n>>32 == 0) is handled inline by do_div(). | ||
13 | * | ||
14 | * Code generated for this function might be very inefficient | ||
15 | * for some CPUs. __div64_32() can be overridden by linking arch-specific | ||
16 | * assembly versions such as arch/ppc/lib/div64.S and arch/sh/lib/div64.S. | ||
17 | */ | ||
18 | |||
19 | #include <linux/types.h> | ||
20 | #include <linux/module.h> | ||
21 | #include <asm/div64.h> | ||
22 | |||
23 | /* Not needed on 64bit architectures */ | ||
24 | #if BITS_PER_LONG == 32 | ||
25 | |||
26 | uint32_t __div64_32(uint64_t *n, uint32_t base) | ||
27 | { | ||
28 | uint64_t rem = *n; | ||
29 | uint64_t b = base; | ||
30 | uint64_t res, d = 1; | ||
31 | uint32_t high = rem >> 32; | ||
32 | |||
33 | /* Reduce the thing a bit first */ | ||
34 | res = 0; | ||
35 | if (high >= base) { | ||
36 | high /= base; | ||
37 | res = (uint64_t) high << 32; | ||
38 | rem -= (uint64_t) (high*base) << 32; | ||
39 | } | ||
40 | |||
41 | while ((int64_t)b > 0 && b < rem) { | ||
42 | b = b+b; | ||
43 | d = d+d; | ||
44 | } | ||
45 | |||
46 | do { | ||
47 | if (rem >= b) { | ||
48 | rem -= b; | ||
49 | res += d; | ||
50 | } | ||
51 | b >>= 1; | ||
52 | d >>= 1; | ||
53 | } while (d); | ||
54 | |||
55 | *n = res; | ||
56 | return rem; | ||
57 | } | ||
58 | |||
59 | EXPORT_SYMBOL(__div64_32); | ||
60 | |||
61 | #endif /* BITS_PER_LONG == 32 */ | ||
diff --git a/lib/dump_stack.c b/lib/dump_stack.c new file mode 100644 index 000000000000..53bff4c8452b --- /dev/null +++ b/lib/dump_stack.c | |||
@@ -0,0 +1,15 @@ | |||
1 | /* | ||
2 | * Provide a default dump_stack() function for architectures | ||
3 | * which don't implement their own. | ||
4 | */ | ||
5 | |||
6 | #include <linux/kernel.h> | ||
7 | #include <linux/module.h> | ||
8 | |||
9 | void dump_stack(void) | ||
10 | { | ||
11 | printk(KERN_NOTICE | ||
12 | "This architecture does not implement dump_stack()\n"); | ||
13 | } | ||
14 | |||
15 | EXPORT_SYMBOL(dump_stack); | ||
diff --git a/lib/errno.c b/lib/errno.c new file mode 100644 index 000000000000..41cb9d76c052 --- /dev/null +++ b/lib/errno.c | |||
@@ -0,0 +1,7 @@ | |||
1 | /* | ||
2 | * linux/lib/errno.c | ||
3 | * | ||
4 | * Copyright (C) 1991, 1992 Linus Torvalds | ||
5 | */ | ||
6 | |||
7 | int errno; | ||
diff --git a/lib/extable.c b/lib/extable.c new file mode 100644 index 000000000000..3f677a8f0c3c --- /dev/null +++ b/lib/extable.c | |||
@@ -0,0 +1,79 @@ | |||
1 | /* | ||
2 | * lib/extable.c | ||
3 | * Derived from arch/ppc/mm/extable.c and arch/i386/mm/extable.c. | ||
4 | * | ||
5 | * Copyright (C) 2004 Paul Mackerras, IBM Corp. | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or | ||
8 | * modify it under the terms of the GNU General Public License | ||
9 | * as published by the Free Software Foundation; either version | ||
10 | * 2 of the License, or (at your option) any later version. | ||
11 | */ | ||
12 | |||
13 | #include <linux/config.h> | ||
14 | #include <linux/module.h> | ||
15 | #include <linux/init.h> | ||
16 | #include <linux/sort.h> | ||
17 | #include <asm/uaccess.h> | ||
18 | |||
19 | extern struct exception_table_entry __start___ex_table[]; | ||
20 | extern struct exception_table_entry __stop___ex_table[]; | ||
21 | |||
22 | #ifndef ARCH_HAS_SORT_EXTABLE | ||
23 | /* | ||
24 | * The exception table needs to be sorted so that the binary | ||
25 | * search that we use to find entries in it works properly. | ||
26 | * This is used both for the kernel exception table and for | ||
27 | * the exception tables of modules that get loaded. | ||
28 | */ | ||
29 | static int cmp_ex(const void *a, const void *b) | ||
30 | { | ||
31 | const struct exception_table_entry *x = a, *y = b; | ||
32 | |||
33 | /* avoid overflow */ | ||
34 | if (x->insn > y->insn) | ||
35 | return 1; | ||
36 | if (x->insn < y->insn) | ||
37 | return -1; | ||
38 | return 0; | ||
39 | } | ||
40 | |||
41 | void sort_extable(struct exception_table_entry *start, | ||
42 | struct exception_table_entry *finish) | ||
43 | { | ||
44 | sort(start, finish - start, sizeof(struct exception_table_entry), | ||
45 | cmp_ex, NULL); | ||
46 | } | ||
47 | #endif | ||
48 | |||
49 | #ifndef ARCH_HAS_SEARCH_EXTABLE | ||
50 | /* | ||
51 | * Search one exception table for an entry corresponding to the | ||
52 | * given instruction address, and return the address of the entry, | ||
53 | * or NULL if none is found. | ||
54 | * We use a binary search, and thus we assume that the table is | ||
55 | * already sorted. | ||
56 | */ | ||
57 | const struct exception_table_entry * | ||
58 | search_extable(const struct exception_table_entry *first, | ||
59 | const struct exception_table_entry *last, | ||
60 | unsigned long value) | ||
61 | { | ||
62 | while (first <= last) { | ||
63 | const struct exception_table_entry *mid; | ||
64 | |||
65 | mid = (last - first) / 2 + first; | ||
66 | /* | ||
67 | * careful, the distance between entries can be | ||
68 | * larger than 2GB: | ||
69 | */ | ||
70 | if (mid->insn < value) | ||
71 | first = mid + 1; | ||
72 | else if (mid->insn > value) | ||
73 | last = mid - 1; | ||
74 | else | ||
75 | return mid; | ||
76 | } | ||
77 | return NULL; | ||
78 | } | ||
79 | #endif | ||
diff --git a/lib/find_next_bit.c b/lib/find_next_bit.c new file mode 100644 index 000000000000..d08302d2a42c --- /dev/null +++ b/lib/find_next_bit.c | |||
@@ -0,0 +1,55 @@ | |||
1 | /* find_next_bit.c: fallback find next bit implementation | ||
2 | * | ||
3 | * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | */ | ||
11 | |||
12 | #include <linux/bitops.h> | ||
13 | |||
14 | int find_next_bit(const unsigned long *addr, int size, int offset) | ||
15 | { | ||
16 | const unsigned long *base; | ||
17 | const int NBITS = sizeof(*addr) * 8; | ||
18 | unsigned long tmp; | ||
19 | |||
20 | base = addr; | ||
21 | if (offset) { | ||
22 | int suboffset; | ||
23 | |||
24 | addr += offset / NBITS; | ||
25 | |||
26 | suboffset = offset % NBITS; | ||
27 | if (suboffset) { | ||
28 | tmp = *addr; | ||
29 | tmp >>= suboffset; | ||
30 | if (tmp) | ||
31 | goto finish; | ||
32 | } | ||
33 | |||
34 | addr++; | ||
35 | } | ||
36 | |||
37 | while ((tmp = *addr) == 0) | ||
38 | addr++; | ||
39 | |||
40 | offset = (addr - base) * NBITS; | ||
41 | |||
42 | finish: | ||
43 | /* count the remaining bits without using __ffs() since that takes a 32-bit arg */ | ||
44 | while (!(tmp & 0xff)) { | ||
45 | offset += 8; | ||
46 | tmp >>= 8; | ||
47 | } | ||
48 | |||
49 | while (!(tmp & 1)) { | ||
50 | offset++; | ||
51 | tmp >>= 1; | ||
52 | } | ||
53 | |||
54 | return offset; | ||
55 | } | ||
diff --git a/lib/gen_crc32table.c b/lib/gen_crc32table.c new file mode 100644 index 000000000000..bea5d97df991 --- /dev/null +++ b/lib/gen_crc32table.c | |||
@@ -0,0 +1,82 @@ | |||
1 | #include <stdio.h> | ||
2 | #include "crc32defs.h" | ||
3 | #include <inttypes.h> | ||
4 | |||
5 | #define ENTRIES_PER_LINE 4 | ||
6 | |||
7 | #define LE_TABLE_SIZE (1 << CRC_LE_BITS) | ||
8 | #define BE_TABLE_SIZE (1 << CRC_BE_BITS) | ||
9 | |||
10 | static uint32_t crc32table_le[LE_TABLE_SIZE]; | ||
11 | static uint32_t crc32table_be[BE_TABLE_SIZE]; | ||
12 | |||
13 | /** | ||
14 | * crc32init_le() - allocate and initialize LE table data | ||
15 | * | ||
16 | * crc is the crc of the byte i; other entries are filled in based on the | ||
17 | * fact that crctable[i^j] = crctable[i] ^ crctable[j]. | ||
18 | * | ||
19 | */ | ||
20 | static void crc32init_le(void) | ||
21 | { | ||
22 | unsigned i, j; | ||
23 | uint32_t crc = 1; | ||
24 | |||
25 | crc32table_le[0] = 0; | ||
26 | |||
27 | for (i = 1 << (CRC_LE_BITS - 1); i; i >>= 1) { | ||
28 | crc = (crc >> 1) ^ ((crc & 1) ? CRCPOLY_LE : 0); | ||
29 | for (j = 0; j < LE_TABLE_SIZE; j += 2 * i) | ||
30 | crc32table_le[i + j] = crc ^ crc32table_le[j]; | ||
31 | } | ||
32 | } | ||
33 | |||
34 | /** | ||
35 | * crc32init_be() - allocate and initialize BE table data | ||
36 | */ | ||
37 | static void crc32init_be(void) | ||
38 | { | ||
39 | unsigned i, j; | ||
40 | uint32_t crc = 0x80000000; | ||
41 | |||
42 | crc32table_be[0] = 0; | ||
43 | |||
44 | for (i = 1; i < BE_TABLE_SIZE; i <<= 1) { | ||
45 | crc = (crc << 1) ^ ((crc & 0x80000000) ? CRCPOLY_BE : 0); | ||
46 | for (j = 0; j < i; j++) | ||
47 | crc32table_be[i + j] = crc ^ crc32table_be[j]; | ||
48 | } | ||
49 | } | ||
50 | |||
51 | static void output_table(uint32_t table[], int len, char *trans) | ||
52 | { | ||
53 | int i; | ||
54 | |||
55 | for (i = 0; i < len - 1; i++) { | ||
56 | if (i % ENTRIES_PER_LINE == 0) | ||
57 | printf("\n"); | ||
58 | printf("%s(0x%8.8xL), ", trans, table[i]); | ||
59 | } | ||
60 | printf("%s(0x%8.8xL)\n", trans, table[len - 1]); | ||
61 | } | ||
62 | |||
63 | int main(int argc, char** argv) | ||
64 | { | ||
65 | printf("/* this file is generated - do not edit */\n\n"); | ||
66 | |||
67 | if (CRC_LE_BITS > 1) { | ||
68 | crc32init_le(); | ||
69 | printf("static const u32 crc32table_le[] = {"); | ||
70 | output_table(crc32table_le, LE_TABLE_SIZE, "tole"); | ||
71 | printf("};\n"); | ||
72 | } | ||
73 | |||
74 | if (CRC_BE_BITS > 1) { | ||
75 | crc32init_be(); | ||
76 | printf("static const u32 crc32table_be[] = {"); | ||
77 | output_table(crc32table_be, BE_TABLE_SIZE, "tobe"); | ||
78 | printf("};\n"); | ||
79 | } | ||
80 | |||
81 | return 0; | ||
82 | } | ||
diff --git a/lib/halfmd4.c b/lib/halfmd4.c new file mode 100644 index 000000000000..e11db26f8ae5 --- /dev/null +++ b/lib/halfmd4.c | |||
@@ -0,0 +1,66 @@ | |||
1 | #include <linux/kernel.h> | ||
2 | #include <linux/module.h> | ||
3 | #include <linux/cryptohash.h> | ||
4 | |||
5 | /* F, G and H are basic MD4 functions: selection, majority, parity */ | ||
6 | #define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z)))) | ||
7 | #define G(x, y, z) (((x) & (y)) + (((x) ^ (y)) & (z))) | ||
8 | #define H(x, y, z) ((x) ^ (y) ^ (z)) | ||
9 | |||
10 | /* | ||
11 | * The generic round function. The application is so specific that | ||
12 | * we don't bother protecting all the arguments with parens, as is generally | ||
13 | * good macro practice, in favor of extra legibility. | ||
14 | * Rotation is separate from addition to prevent recomputation | ||
15 | */ | ||
16 | #define ROUND(f, a, b, c, d, x, s) \ | ||
17 | (a += f(b, c, d) + x, a = (a << s) | (a >> (32 - s))) | ||
18 | #define K1 0 | ||
19 | #define K2 013240474631UL | ||
20 | #define K3 015666365641UL | ||
21 | |||
22 | /* | ||
23 | * Basic cut-down MD4 transform. Returns only 32 bits of result. | ||
24 | */ | ||
25 | __u32 half_md4_transform(__u32 buf[4], __u32 const in[8]) | ||
26 | { | ||
27 | __u32 a = buf[0], b = buf[1], c = buf[2], d = buf[3]; | ||
28 | |||
29 | /* Round 1 */ | ||
30 | ROUND(F, a, b, c, d, in[0] + K1, 3); | ||
31 | ROUND(F, d, a, b, c, in[1] + K1, 7); | ||
32 | ROUND(F, c, d, a, b, in[2] + K1, 11); | ||
33 | ROUND(F, b, c, d, a, in[3] + K1, 19); | ||
34 | ROUND(F, a, b, c, d, in[4] + K1, 3); | ||
35 | ROUND(F, d, a, b, c, in[5] + K1, 7); | ||
36 | ROUND(F, c, d, a, b, in[6] + K1, 11); | ||
37 | ROUND(F, b, c, d, a, in[7] + K1, 19); | ||
38 | |||
39 | /* Round 2 */ | ||
40 | ROUND(G, a, b, c, d, in[1] + K2, 3); | ||
41 | ROUND(G, d, a, b, c, in[3] + K2, 5); | ||
42 | ROUND(G, c, d, a, b, in[5] + K2, 9); | ||
43 | ROUND(G, b, c, d, a, in[7] + K2, 13); | ||
44 | ROUND(G, a, b, c, d, in[0] + K2, 3); | ||
45 | ROUND(G, d, a, b, c, in[2] + K2, 5); | ||
46 | ROUND(G, c, d, a, b, in[4] + K2, 9); | ||
47 | ROUND(G, b, c, d, a, in[6] + K2, 13); | ||
48 | |||
49 | /* Round 3 */ | ||
50 | ROUND(H, a, b, c, d, in[3] + K3, 3); | ||
51 | ROUND(H, d, a, b, c, in[7] + K3, 9); | ||
52 | ROUND(H, c, d, a, b, in[2] + K3, 11); | ||
53 | ROUND(H, b, c, d, a, in[6] + K3, 15); | ||
54 | ROUND(H, a, b, c, d, in[1] + K3, 3); | ||
55 | ROUND(H, d, a, b, c, in[5] + K3, 9); | ||
56 | ROUND(H, c, d, a, b, in[0] + K3, 11); | ||
57 | ROUND(H, b, c, d, a, in[4] + K3, 15); | ||
58 | |||
59 | buf[0] += a; | ||
60 | buf[1] += b; | ||
61 | buf[2] += c; | ||
62 | buf[3] += d; | ||
63 | |||
64 | return buf[1]; /* "most hashed" word */ | ||
65 | } | ||
66 | EXPORT_SYMBOL(half_md4_transform); | ||
diff --git a/lib/idr.c b/lib/idr.c new file mode 100644 index 000000000000..81fc430602ee --- /dev/null +++ b/lib/idr.c | |||
@@ -0,0 +1,408 @@ | |||
1 | /* | ||
2 | * 2002-10-18 written by Jim Houston jim.houston@ccur.com | ||
3 | * Copyright (C) 2002 by Concurrent Computer Corporation | ||
4 | * Distributed under the GNU GPL license version 2. | ||
5 | * | ||
6 | * Modified by George Anzinger to reuse immediately and to use | ||
7 | * find bit instructions. Also removed _irq on spinlocks. | ||
8 | * | ||
9 | * Small id to pointer translation service. | ||
10 | * | ||
11 | * It uses a radix tree like structure as a sparse array indexed | ||
12 | * by the id to obtain the pointer. The bitmap makes allocating | ||
13 | * a new id quick. | ||
14 | * | ||
15 | * You call it to allocate an id (an int) an associate with that id a | ||
16 | * pointer or what ever, we treat it as a (void *). You can pass this | ||
17 | * id to a user for him to pass back at a later time. You then pass | ||
18 | * that id to this code and it returns your pointer. | ||
19 | |||
20 | * You can release ids at any time. When all ids are released, most of | ||
21 | * the memory is returned (we keep IDR_FREE_MAX) in a local pool so we | ||
22 | * don't need to go to the memory "store" during an id allocate, just | ||
23 | * so you don't need to be too concerned about locking and conflicts | ||
24 | * with the slab allocator. | ||
25 | */ | ||
26 | |||
27 | #ifndef TEST // to test in user space... | ||
28 | #include <linux/slab.h> | ||
29 | #include <linux/init.h> | ||
30 | #include <linux/module.h> | ||
31 | #endif | ||
32 | #include <linux/string.h> | ||
33 | #include <linux/idr.h> | ||
34 | |||
35 | static kmem_cache_t *idr_layer_cache; | ||
36 | |||
37 | static struct idr_layer *alloc_layer(struct idr *idp) | ||
38 | { | ||
39 | struct idr_layer *p; | ||
40 | |||
41 | spin_lock(&idp->lock); | ||
42 | if ((p = idp->id_free)) { | ||
43 | idp->id_free = p->ary[0]; | ||
44 | idp->id_free_cnt--; | ||
45 | p->ary[0] = NULL; | ||
46 | } | ||
47 | spin_unlock(&idp->lock); | ||
48 | return(p); | ||
49 | } | ||
50 | |||
51 | static void free_layer(struct idr *idp, struct idr_layer *p) | ||
52 | { | ||
53 | /* | ||
54 | * Depends on the return element being zeroed. | ||
55 | */ | ||
56 | spin_lock(&idp->lock); | ||
57 | p->ary[0] = idp->id_free; | ||
58 | idp->id_free = p; | ||
59 | idp->id_free_cnt++; | ||
60 | spin_unlock(&idp->lock); | ||
61 | } | ||
62 | |||
63 | /** | ||
64 | * idr_pre_get - reserver resources for idr allocation | ||
65 | * @idp: idr handle | ||
66 | * @gfp_mask: memory allocation flags | ||
67 | * | ||
68 | * This function should be called prior to locking and calling the | ||
69 | * following function. It preallocates enough memory to satisfy | ||
70 | * the worst possible allocation. | ||
71 | * | ||
72 | * If the system is REALLY out of memory this function returns 0, | ||
73 | * otherwise 1. | ||
74 | */ | ||
75 | int idr_pre_get(struct idr *idp, unsigned gfp_mask) | ||
76 | { | ||
77 | while (idp->id_free_cnt < IDR_FREE_MAX) { | ||
78 | struct idr_layer *new; | ||
79 | new = kmem_cache_alloc(idr_layer_cache, gfp_mask); | ||
80 | if(new == NULL) | ||
81 | return (0); | ||
82 | free_layer(idp, new); | ||
83 | } | ||
84 | return 1; | ||
85 | } | ||
86 | EXPORT_SYMBOL(idr_pre_get); | ||
87 | |||
88 | static int sub_alloc(struct idr *idp, void *ptr, int *starting_id) | ||
89 | { | ||
90 | int n, m, sh; | ||
91 | struct idr_layer *p, *new; | ||
92 | struct idr_layer *pa[MAX_LEVEL]; | ||
93 | int l, id; | ||
94 | long bm; | ||
95 | |||
96 | id = *starting_id; | ||
97 | p = idp->top; | ||
98 | l = idp->layers; | ||
99 | pa[l--] = NULL; | ||
100 | while (1) { | ||
101 | /* | ||
102 | * We run around this while until we reach the leaf node... | ||
103 | */ | ||
104 | n = (id >> (IDR_BITS*l)) & IDR_MASK; | ||
105 | bm = ~p->bitmap; | ||
106 | m = find_next_bit(&bm, IDR_SIZE, n); | ||
107 | if (m == IDR_SIZE) { | ||
108 | /* no space available go back to previous layer. */ | ||
109 | l++; | ||
110 | id = (id | ((1 << (IDR_BITS*l))-1)) + 1; | ||
111 | if (!(p = pa[l])) { | ||
112 | *starting_id = id; | ||
113 | return -2; | ||
114 | } | ||
115 | continue; | ||
116 | } | ||
117 | if (m != n) { | ||
118 | sh = IDR_BITS*l; | ||
119 | id = ((id >> sh) ^ n ^ m) << sh; | ||
120 | } | ||
121 | if ((id >= MAX_ID_BIT) || (id < 0)) | ||
122 | return -3; | ||
123 | if (l == 0) | ||
124 | break; | ||
125 | /* | ||
126 | * Create the layer below if it is missing. | ||
127 | */ | ||
128 | if (!p->ary[m]) { | ||
129 | if (!(new = alloc_layer(idp))) | ||
130 | return -1; | ||
131 | p->ary[m] = new; | ||
132 | p->count++; | ||
133 | } | ||
134 | pa[l--] = p; | ||
135 | p = p->ary[m]; | ||
136 | } | ||
137 | /* | ||
138 | * We have reached the leaf node, plant the | ||
139 | * users pointer and return the raw id. | ||
140 | */ | ||
141 | p->ary[m] = (struct idr_layer *)ptr; | ||
142 | __set_bit(m, &p->bitmap); | ||
143 | p->count++; | ||
144 | /* | ||
145 | * If this layer is full mark the bit in the layer above | ||
146 | * to show that this part of the radix tree is full. | ||
147 | * This may complete the layer above and require walking | ||
148 | * up the radix tree. | ||
149 | */ | ||
150 | n = id; | ||
151 | while (p->bitmap == IDR_FULL) { | ||
152 | if (!(p = pa[++l])) | ||
153 | break; | ||
154 | n = n >> IDR_BITS; | ||
155 | __set_bit((n & IDR_MASK), &p->bitmap); | ||
156 | } | ||
157 | return(id); | ||
158 | } | ||
159 | |||
160 | static int idr_get_new_above_int(struct idr *idp, void *ptr, int starting_id) | ||
161 | { | ||
162 | struct idr_layer *p, *new; | ||
163 | int layers, v, id; | ||
164 | |||
165 | id = starting_id; | ||
166 | build_up: | ||
167 | p = idp->top; | ||
168 | layers = idp->layers; | ||
169 | if (unlikely(!p)) { | ||
170 | if (!(p = alloc_layer(idp))) | ||
171 | return -1; | ||
172 | layers = 1; | ||
173 | } | ||
174 | /* | ||
175 | * Add a new layer to the top of the tree if the requested | ||
176 | * id is larger than the currently allocated space. | ||
177 | */ | ||
178 | while ((layers < MAX_LEVEL) && (id >= (1 << (layers*IDR_BITS)))) { | ||
179 | layers++; | ||
180 | if (!p->count) | ||
181 | continue; | ||
182 | if (!(new = alloc_layer(idp))) { | ||
183 | /* | ||
184 | * The allocation failed. If we built part of | ||
185 | * the structure tear it down. | ||
186 | */ | ||
187 | for (new = p; p && p != idp->top; new = p) { | ||
188 | p = p->ary[0]; | ||
189 | new->ary[0] = NULL; | ||
190 | new->bitmap = new->count = 0; | ||
191 | free_layer(idp, new); | ||
192 | } | ||
193 | return -1; | ||
194 | } | ||
195 | new->ary[0] = p; | ||
196 | new->count = 1; | ||
197 | if (p->bitmap == IDR_FULL) | ||
198 | __set_bit(0, &new->bitmap); | ||
199 | p = new; | ||
200 | } | ||
201 | idp->top = p; | ||
202 | idp->layers = layers; | ||
203 | v = sub_alloc(idp, ptr, &id); | ||
204 | if (v == -2) | ||
205 | goto build_up; | ||
206 | return(v); | ||
207 | } | ||
208 | |||
209 | /** | ||
210 | * idr_get_new_above - allocate new idr entry above a start id | ||
211 | * @idp: idr handle | ||
212 | * @ptr: pointer you want associated with the ide | ||
213 | * @start_id: id to start search at | ||
214 | * @id: pointer to the allocated handle | ||
215 | * | ||
216 | * This is the allocate id function. It should be called with any | ||
217 | * required locks. | ||
218 | * | ||
219 | * If memory is required, it will return -EAGAIN, you should unlock | ||
220 | * and go back to the idr_pre_get() call. If the idr is full, it will | ||
221 | * return -ENOSPC. | ||
222 | * | ||
223 | * @id returns a value in the range 0 ... 0x7fffffff | ||
224 | */ | ||
225 | int idr_get_new_above(struct idr *idp, void *ptr, int starting_id, int *id) | ||
226 | { | ||
227 | int rv; | ||
228 | rv = idr_get_new_above_int(idp, ptr, starting_id); | ||
229 | /* | ||
230 | * This is a cheap hack until the IDR code can be fixed to | ||
231 | * return proper error values. | ||
232 | */ | ||
233 | if (rv < 0) { | ||
234 | if (rv == -1) | ||
235 | return -EAGAIN; | ||
236 | else /* Will be -3 */ | ||
237 | return -ENOSPC; | ||
238 | } | ||
239 | *id = rv; | ||
240 | return 0; | ||
241 | } | ||
242 | EXPORT_SYMBOL(idr_get_new_above); | ||
243 | |||
244 | /** | ||
245 | * idr_get_new - allocate new idr entry | ||
246 | * @idp: idr handle | ||
247 | * @ptr: pointer you want associated with the ide | ||
248 | * @id: pointer to the allocated handle | ||
249 | * | ||
250 | * This is the allocate id function. It should be called with any | ||
251 | * required locks. | ||
252 | * | ||
253 | * If memory is required, it will return -EAGAIN, you should unlock | ||
254 | * and go back to the idr_pre_get() call. If the idr is full, it will | ||
255 | * return -ENOSPC. | ||
256 | * | ||
257 | * @id returns a value in the range 0 ... 0x7fffffff | ||
258 | */ | ||
259 | int idr_get_new(struct idr *idp, void *ptr, int *id) | ||
260 | { | ||
261 | int rv; | ||
262 | rv = idr_get_new_above_int(idp, ptr, 0); | ||
263 | /* | ||
264 | * This is a cheap hack until the IDR code can be fixed to | ||
265 | * return proper error values. | ||
266 | */ | ||
267 | if (rv < 0) { | ||
268 | if (rv == -1) | ||
269 | return -EAGAIN; | ||
270 | else /* Will be -3 */ | ||
271 | return -ENOSPC; | ||
272 | } | ||
273 | *id = rv; | ||
274 | return 0; | ||
275 | } | ||
276 | EXPORT_SYMBOL(idr_get_new); | ||
277 | |||
278 | static void idr_remove_warning(int id) | ||
279 | { | ||
280 | printk("idr_remove called for id=%d which is not allocated.\n", id); | ||
281 | dump_stack(); | ||
282 | } | ||
283 | |||
284 | static void sub_remove(struct idr *idp, int shift, int id) | ||
285 | { | ||
286 | struct idr_layer *p = idp->top; | ||
287 | struct idr_layer **pa[MAX_LEVEL]; | ||
288 | struct idr_layer ***paa = &pa[0]; | ||
289 | int n; | ||
290 | |||
291 | *paa = NULL; | ||
292 | *++paa = &idp->top; | ||
293 | |||
294 | while ((shift > 0) && p) { | ||
295 | n = (id >> shift) & IDR_MASK; | ||
296 | __clear_bit(n, &p->bitmap); | ||
297 | *++paa = &p->ary[n]; | ||
298 | p = p->ary[n]; | ||
299 | shift -= IDR_BITS; | ||
300 | } | ||
301 | n = id & IDR_MASK; | ||
302 | if (likely(p != NULL && test_bit(n, &p->bitmap))){ | ||
303 | __clear_bit(n, &p->bitmap); | ||
304 | p->ary[n] = NULL; | ||
305 | while(*paa && ! --((**paa)->count)){ | ||
306 | free_layer(idp, **paa); | ||
307 | **paa-- = NULL; | ||
308 | } | ||
309 | if ( ! *paa ) | ||
310 | idp->layers = 0; | ||
311 | } else { | ||
312 | idr_remove_warning(id); | ||
313 | } | ||
314 | } | ||
315 | |||
316 | /** | ||
317 | * idr_remove - remove the given id and free it's slot | ||
318 | * idp: idr handle | ||
319 | * id: uniqueue key | ||
320 | */ | ||
321 | void idr_remove(struct idr *idp, int id) | ||
322 | { | ||
323 | struct idr_layer *p; | ||
324 | |||
325 | /* Mask off upper bits we don't use for the search. */ | ||
326 | id &= MAX_ID_MASK; | ||
327 | |||
328 | sub_remove(idp, (idp->layers - 1) * IDR_BITS, id); | ||
329 | if ( idp->top && idp->top->count == 1 && | ||
330 | (idp->layers > 1) && | ||
331 | idp->top->ary[0]){ // We can drop a layer | ||
332 | |||
333 | p = idp->top->ary[0]; | ||
334 | idp->top->bitmap = idp->top->count = 0; | ||
335 | free_layer(idp, idp->top); | ||
336 | idp->top = p; | ||
337 | --idp->layers; | ||
338 | } | ||
339 | while (idp->id_free_cnt >= IDR_FREE_MAX) { | ||
340 | |||
341 | p = alloc_layer(idp); | ||
342 | kmem_cache_free(idr_layer_cache, p); | ||
343 | return; | ||
344 | } | ||
345 | } | ||
346 | EXPORT_SYMBOL(idr_remove); | ||
347 | |||
348 | /** | ||
349 | * idr_find - return pointer for given id | ||
350 | * @idp: idr handle | ||
351 | * @id: lookup key | ||
352 | * | ||
353 | * Return the pointer given the id it has been registered with. A %NULL | ||
354 | * return indicates that @id is not valid or you passed %NULL in | ||
355 | * idr_get_new(). | ||
356 | * | ||
357 | * The caller must serialize idr_find() vs idr_get_new() and idr_remove(). | ||
358 | */ | ||
359 | void *idr_find(struct idr *idp, int id) | ||
360 | { | ||
361 | int n; | ||
362 | struct idr_layer *p; | ||
363 | |||
364 | n = idp->layers * IDR_BITS; | ||
365 | p = idp->top; | ||
366 | |||
367 | /* Mask off upper bits we don't use for the search. */ | ||
368 | id &= MAX_ID_MASK; | ||
369 | |||
370 | if (id >= (1 << n)) | ||
371 | return NULL; | ||
372 | |||
373 | while (n > 0 && p) { | ||
374 | n -= IDR_BITS; | ||
375 | p = p->ary[(id >> n) & IDR_MASK]; | ||
376 | } | ||
377 | return((void *)p); | ||
378 | } | ||
379 | EXPORT_SYMBOL(idr_find); | ||
380 | |||
381 | static void idr_cache_ctor(void * idr_layer, | ||
382 | kmem_cache_t *idr_layer_cache, unsigned long flags) | ||
383 | { | ||
384 | memset(idr_layer, 0, sizeof(struct idr_layer)); | ||
385 | } | ||
386 | |||
387 | static int init_id_cache(void) | ||
388 | { | ||
389 | if (!idr_layer_cache) | ||
390 | idr_layer_cache = kmem_cache_create("idr_layer_cache", | ||
391 | sizeof(struct idr_layer), 0, 0, idr_cache_ctor, NULL); | ||
392 | return 0; | ||
393 | } | ||
394 | |||
395 | /** | ||
396 | * idr_init - initialize idr handle | ||
397 | * @idp: idr handle | ||
398 | * | ||
399 | * This function is use to set up the handle (@idp) that you will pass | ||
400 | * to the rest of the functions. | ||
401 | */ | ||
402 | void idr_init(struct idr *idp) | ||
403 | { | ||
404 | init_id_cache(); | ||
405 | memset(idp, 0, sizeof(struct idr)); | ||
406 | spin_lock_init(&idp->lock); | ||
407 | } | ||
408 | EXPORT_SYMBOL(idr_init); | ||
diff --git a/lib/inflate.c b/lib/inflate.c new file mode 100644 index 000000000000..75e7d303c72e --- /dev/null +++ b/lib/inflate.c | |||
@@ -0,0 +1,1210 @@ | |||
1 | #define DEBG(x) | ||
2 | #define DEBG1(x) | ||
3 | /* inflate.c -- Not copyrighted 1992 by Mark Adler | ||
4 | version c10p1, 10 January 1993 */ | ||
5 | |||
6 | /* | ||
7 | * Adapted for booting Linux by Hannu Savolainen 1993 | ||
8 | * based on gzip-1.0.3 | ||
9 | * | ||
10 | * Nicolas Pitre <nico@cam.org>, 1999/04/14 : | ||
11 | * Little mods for all variable to reside either into rodata or bss segments | ||
12 | * by marking constant variables with 'const' and initializing all the others | ||
13 | * at run-time only. This allows for the kernel uncompressor to run | ||
14 | * directly from Flash or ROM memory on embedded systems. | ||
15 | */ | ||
16 | |||
17 | /* | ||
18 | Inflate deflated (PKZIP's method 8 compressed) data. The compression | ||
19 | method searches for as much of the current string of bytes (up to a | ||
20 | length of 258) in the previous 32 K bytes. If it doesn't find any | ||
21 | matches (of at least length 3), it codes the next byte. Otherwise, it | ||
22 | codes the length of the matched string and its distance backwards from | ||
23 | the current position. There is a single Huffman code that codes both | ||
24 | single bytes (called "literals") and match lengths. A second Huffman | ||
25 | code codes the distance information, which follows a length code. Each | ||
26 | length or distance code actually represents a base value and a number | ||
27 | of "extra" (sometimes zero) bits to get to add to the base value. At | ||
28 | the end of each deflated block is a special end-of-block (EOB) literal/ | ||
29 | length code. The decoding process is basically: get a literal/length | ||
30 | code; if EOB then done; if a literal, emit the decoded byte; if a | ||
31 | length then get the distance and emit the referred-to bytes from the | ||
32 | sliding window of previously emitted data. | ||
33 | |||
34 | There are (currently) three kinds of inflate blocks: stored, fixed, and | ||
35 | dynamic. The compressor deals with some chunk of data at a time, and | ||
36 | decides which method to use on a chunk-by-chunk basis. A chunk might | ||
37 | typically be 32 K or 64 K. If the chunk is incompressible, then the | ||
38 | "stored" method is used. In this case, the bytes are simply stored as | ||
39 | is, eight bits per byte, with none of the above coding. The bytes are | ||
40 | preceded by a count, since there is no longer an EOB code. | ||
41 | |||
42 | If the data is compressible, then either the fixed or dynamic methods | ||
43 | are used. In the dynamic method, the compressed data is preceded by | ||
44 | an encoding of the literal/length and distance Huffman codes that are | ||
45 | to be used to decode this block. The representation is itself Huffman | ||
46 | coded, and so is preceded by a description of that code. These code | ||
47 | descriptions take up a little space, and so for small blocks, there is | ||
48 | a predefined set of codes, called the fixed codes. The fixed method is | ||
49 | used if the block codes up smaller that way (usually for quite small | ||
50 | chunks), otherwise the dynamic method is used. In the latter case, the | ||
51 | codes are customized to the probabilities in the current block, and so | ||
52 | can code it much better than the pre-determined fixed codes. | ||
53 | |||
54 | The Huffman codes themselves are decoded using a multi-level table | ||
55 | lookup, in order to maximize the speed of decoding plus the speed of | ||
56 | building the decoding tables. See the comments below that precede the | ||
57 | lbits and dbits tuning parameters. | ||
58 | */ | ||
59 | |||
60 | |||
61 | /* | ||
62 | Notes beyond the 1.93a appnote.txt: | ||
63 | |||
64 | 1. Distance pointers never point before the beginning of the output | ||
65 | stream. | ||
66 | 2. Distance pointers can point back across blocks, up to 32k away. | ||
67 | 3. There is an implied maximum of 7 bits for the bit length table and | ||
68 | 15 bits for the actual data. | ||
69 | 4. If only one code exists, then it is encoded using one bit. (Zero | ||
70 | would be more efficient, but perhaps a little confusing.) If two | ||
71 | codes exist, they are coded using one bit each (0 and 1). | ||
72 | 5. There is no way of sending zero distance codes--a dummy must be | ||
73 | sent if there are none. (History: a pre 2.0 version of PKZIP would | ||
74 | store blocks with no distance codes, but this was discovered to be | ||
75 | too harsh a criterion.) Valid only for 1.93a. 2.04c does allow | ||
76 | zero distance codes, which is sent as one code of zero bits in | ||
77 | length. | ||
78 | 6. There are up to 286 literal/length codes. Code 256 represents the | ||
79 | end-of-block. Note however that the static length tree defines | ||
80 | 288 codes just to fill out the Huffman codes. Codes 286 and 287 | ||
81 | cannot be used though, since there is no length base or extra bits | ||
82 | defined for them. Similarly, there are up to 30 distance codes. | ||
83 | However, static trees define 32 codes (all 5 bits) to fill out the | ||
84 | Huffman codes, but the last two had better not show up in the data. | ||
85 | 7. Unzip can check dynamic Huffman blocks for complete code sets. | ||
86 | The exception is that a single code would not be complete (see #4). | ||
87 | 8. The five bits following the block type is really the number of | ||
88 | literal codes sent minus 257. | ||
89 | 9. Length codes 8,16,16 are interpreted as 13 length codes of 8 bits | ||
90 | (1+6+6). Therefore, to output three times the length, you output | ||
91 | three codes (1+1+1), whereas to output four times the same length, | ||
92 | you only need two codes (1+3). Hmm. | ||
93 | 10. In the tree reconstruction algorithm, Code = Code + Increment | ||
94 | only if BitLength(i) is not zero. (Pretty obvious.) | ||
95 | 11. Correction: 4 Bits: # of Bit Length codes - 4 (4 - 19) | ||
96 | 12. Note: length code 284 can represent 227-258, but length code 285 | ||
97 | really is 258. The last length deserves its own, short code | ||
98 | since it gets used a lot in very redundant files. The length | ||
99 | 258 is special since 258 - 3 (the min match length) is 255. | ||
100 | 13. The literal/length and distance code bit lengths are read as a | ||
101 | single stream of lengths. It is possible (and advantageous) for | ||
102 | a repeat code (16, 17, or 18) to go across the boundary between | ||
103 | the two sets of lengths. | ||
104 | */ | ||
105 | #include <linux/compiler.h> | ||
106 | |||
107 | #ifdef RCSID | ||
108 | static char rcsid[] = "#Id: inflate.c,v 0.14 1993/06/10 13:27:04 jloup Exp #"; | ||
109 | #endif | ||
110 | |||
111 | #ifndef STATIC | ||
112 | |||
113 | #if defined(STDC_HEADERS) || defined(HAVE_STDLIB_H) | ||
114 | # include <sys/types.h> | ||
115 | # include <stdlib.h> | ||
116 | #endif | ||
117 | |||
118 | #include "gzip.h" | ||
119 | #define STATIC | ||
120 | #endif /* !STATIC */ | ||
121 | |||
122 | #ifndef INIT | ||
123 | #define INIT | ||
124 | #endif | ||
125 | |||
126 | #define slide window | ||
127 | |||
128 | /* Huffman code lookup table entry--this entry is four bytes for machines | ||
129 | that have 16-bit pointers (e.g. PC's in the small or medium model). | ||
130 | Valid extra bits are 0..13. e == 15 is EOB (end of block), e == 16 | ||
131 | means that v is a literal, 16 < e < 32 means that v is a pointer to | ||
132 | the next table, which codes e - 16 bits, and lastly e == 99 indicates | ||
133 | an unused code. If a code with e == 99 is looked up, this implies an | ||
134 | error in the data. */ | ||
135 | struct huft { | ||
136 | uch e; /* number of extra bits or operation */ | ||
137 | uch b; /* number of bits in this code or subcode */ | ||
138 | union { | ||
139 | ush n; /* literal, length base, or distance base */ | ||
140 | struct huft *t; /* pointer to next level of table */ | ||
141 | } v; | ||
142 | }; | ||
143 | |||
144 | |||
145 | /* Function prototypes */ | ||
146 | STATIC int INIT huft_build OF((unsigned *, unsigned, unsigned, | ||
147 | const ush *, const ush *, struct huft **, int *)); | ||
148 | STATIC int INIT huft_free OF((struct huft *)); | ||
149 | STATIC int INIT inflate_codes OF((struct huft *, struct huft *, int, int)); | ||
150 | STATIC int INIT inflate_stored OF((void)); | ||
151 | STATIC int INIT inflate_fixed OF((void)); | ||
152 | STATIC int INIT inflate_dynamic OF((void)); | ||
153 | STATIC int INIT inflate_block OF((int *)); | ||
154 | STATIC int INIT inflate OF((void)); | ||
155 | |||
156 | |||
157 | /* The inflate algorithm uses a sliding 32 K byte window on the uncompressed | ||
158 | stream to find repeated byte strings. This is implemented here as a | ||
159 | circular buffer. The index is updated simply by incrementing and then | ||
160 | ANDing with 0x7fff (32K-1). */ | ||
161 | /* It is left to other modules to supply the 32 K area. It is assumed | ||
162 | to be usable as if it were declared "uch slide[32768];" or as just | ||
163 | "uch *slide;" and then malloc'ed in the latter case. The definition | ||
164 | must be in unzip.h, included above. */ | ||
165 | /* unsigned wp; current position in slide */ | ||
166 | #define wp outcnt | ||
167 | #define flush_output(w) (wp=(w),flush_window()) | ||
168 | |||
169 | /* Tables for deflate from PKZIP's appnote.txt. */ | ||
170 | static const unsigned border[] = { /* Order of the bit length code lengths */ | ||
171 | 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; | ||
172 | static const ush cplens[] = { /* Copy lengths for literal codes 257..285 */ | ||
173 | 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, | ||
174 | 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; | ||
175 | /* note: see note #13 above about the 258 in this list. */ | ||
176 | static const ush cplext[] = { /* Extra bits for literal codes 257..285 */ | ||
177 | 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, | ||
178 | 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 99, 99}; /* 99==invalid */ | ||
179 | static const ush cpdist[] = { /* Copy offsets for distance codes 0..29 */ | ||
180 | 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, | ||
181 | 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, | ||
182 | 8193, 12289, 16385, 24577}; | ||
183 | static const ush cpdext[] = { /* Extra bits for distance codes */ | ||
184 | 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, | ||
185 | 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, | ||
186 | 12, 12, 13, 13}; | ||
187 | |||
188 | |||
189 | |||
190 | /* Macros for inflate() bit peeking and grabbing. | ||
191 | The usage is: | ||
192 | |||
193 | NEEDBITS(j) | ||
194 | x = b & mask_bits[j]; | ||
195 | DUMPBITS(j) | ||
196 | |||
197 | where NEEDBITS makes sure that b has at least j bits in it, and | ||
198 | DUMPBITS removes the bits from b. The macros use the variable k | ||
199 | for the number of bits in b. Normally, b and k are register | ||
200 | variables for speed, and are initialized at the beginning of a | ||
201 | routine that uses these macros from a global bit buffer and count. | ||
202 | |||
203 | If we assume that EOB will be the longest code, then we will never | ||
204 | ask for bits with NEEDBITS that are beyond the end of the stream. | ||
205 | So, NEEDBITS should not read any more bytes than are needed to | ||
206 | meet the request. Then no bytes need to be "returned" to the buffer | ||
207 | at the end of the last block. | ||
208 | |||
209 | However, this assumption is not true for fixed blocks--the EOB code | ||
210 | is 7 bits, but the other literal/length codes can be 8 or 9 bits. | ||
211 | (The EOB code is shorter than other codes because fixed blocks are | ||
212 | generally short. So, while a block always has an EOB, many other | ||
213 | literal/length codes have a significantly lower probability of | ||
214 | showing up at all.) However, by making the first table have a | ||
215 | lookup of seven bits, the EOB code will be found in that first | ||
216 | lookup, and so will not require that too many bits be pulled from | ||
217 | the stream. | ||
218 | */ | ||
219 | |||
220 | STATIC ulg bb; /* bit buffer */ | ||
221 | STATIC unsigned bk; /* bits in bit buffer */ | ||
222 | |||
223 | STATIC const ush mask_bits[] = { | ||
224 | 0x0000, | ||
225 | 0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff, | ||
226 | 0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff | ||
227 | }; | ||
228 | |||
229 | #define NEXTBYTE() ({ int v = get_byte(); if (v < 0) goto underrun; (uch)v; }) | ||
230 | #define NEEDBITS(n) {while(k<(n)){b|=((ulg)NEXTBYTE())<<k;k+=8;}} | ||
231 | #define DUMPBITS(n) {b>>=(n);k-=(n);} | ||
232 | |||
233 | |||
234 | /* | ||
235 | Huffman code decoding is performed using a multi-level table lookup. | ||
236 | The fastest way to decode is to simply build a lookup table whose | ||
237 | size is determined by the longest code. However, the time it takes | ||
238 | to build this table can also be a factor if the data being decoded | ||
239 | is not very long. The most common codes are necessarily the | ||
240 | shortest codes, so those codes dominate the decoding time, and hence | ||
241 | the speed. The idea is you can have a shorter table that decodes the | ||
242 | shorter, more probable codes, and then point to subsidiary tables for | ||
243 | the longer codes. The time it costs to decode the longer codes is | ||
244 | then traded against the time it takes to make longer tables. | ||
245 | |||
246 | This results of this trade are in the variables lbits and dbits | ||
247 | below. lbits is the number of bits the first level table for literal/ | ||
248 | length codes can decode in one step, and dbits is the same thing for | ||
249 | the distance codes. Subsequent tables are also less than or equal to | ||
250 | those sizes. These values may be adjusted either when all of the | ||
251 | codes are shorter than that, in which case the longest code length in | ||
252 | bits is used, or when the shortest code is *longer* than the requested | ||
253 | table size, in which case the length of the shortest code in bits is | ||
254 | used. | ||
255 | |||
256 | There are two different values for the two tables, since they code a | ||
257 | different number of possibilities each. The literal/length table | ||
258 | codes 286 possible values, or in a flat code, a little over eight | ||
259 | bits. The distance table codes 30 possible values, or a little less | ||
260 | than five bits, flat. The optimum values for speed end up being | ||
261 | about one bit more than those, so lbits is 8+1 and dbits is 5+1. | ||
262 | The optimum values may differ though from machine to machine, and | ||
263 | possibly even between compilers. Your mileage may vary. | ||
264 | */ | ||
265 | |||
266 | |||
267 | STATIC const int lbits = 9; /* bits in base literal/length lookup table */ | ||
268 | STATIC const int dbits = 6; /* bits in base distance lookup table */ | ||
269 | |||
270 | |||
271 | /* If BMAX needs to be larger than 16, then h and x[] should be ulg. */ | ||
272 | #define BMAX 16 /* maximum bit length of any code (16 for explode) */ | ||
273 | #define N_MAX 288 /* maximum number of codes in any set */ | ||
274 | |||
275 | |||
276 | STATIC unsigned hufts; /* track memory usage */ | ||
277 | |||
278 | |||
279 | STATIC int INIT huft_build( | ||
280 | unsigned *b, /* code lengths in bits (all assumed <= BMAX) */ | ||
281 | unsigned n, /* number of codes (assumed <= N_MAX) */ | ||
282 | unsigned s, /* number of simple-valued codes (0..s-1) */ | ||
283 | const ush *d, /* list of base values for non-simple codes */ | ||
284 | const ush *e, /* list of extra bits for non-simple codes */ | ||
285 | struct huft **t, /* result: starting table */ | ||
286 | int *m /* maximum lookup bits, returns actual */ | ||
287 | ) | ||
288 | /* Given a list of code lengths and a maximum table size, make a set of | ||
289 | tables to decode that set of codes. Return zero on success, one if | ||
290 | the given code set is incomplete (the tables are still built in this | ||
291 | case), two if the input is invalid (all zero length codes or an | ||
292 | oversubscribed set of lengths), and three if not enough memory. */ | ||
293 | { | ||
294 | unsigned a; /* counter for codes of length k */ | ||
295 | unsigned c[BMAX+1]; /* bit length count table */ | ||
296 | unsigned f; /* i repeats in table every f entries */ | ||
297 | int g; /* maximum code length */ | ||
298 | int h; /* table level */ | ||
299 | register unsigned i; /* counter, current code */ | ||
300 | register unsigned j; /* counter */ | ||
301 | register int k; /* number of bits in current code */ | ||
302 | int l; /* bits per table (returned in m) */ | ||
303 | register unsigned *p; /* pointer into c[], b[], or v[] */ | ||
304 | register struct huft *q; /* points to current table */ | ||
305 | struct huft r; /* table entry for structure assignment */ | ||
306 | struct huft *u[BMAX]; /* table stack */ | ||
307 | unsigned v[N_MAX]; /* values in order of bit length */ | ||
308 | register int w; /* bits before this table == (l * h) */ | ||
309 | unsigned x[BMAX+1]; /* bit offsets, then code stack */ | ||
310 | unsigned *xp; /* pointer into x */ | ||
311 | int y; /* number of dummy codes added */ | ||
312 | unsigned z; /* number of entries in current table */ | ||
313 | |||
314 | DEBG("huft1 "); | ||
315 | |||
316 | /* Generate counts for each bit length */ | ||
317 | memzero(c, sizeof(c)); | ||
318 | p = b; i = n; | ||
319 | do { | ||
320 | Tracecv(*p, (stderr, (n-i >= ' ' && n-i <= '~' ? "%c %d\n" : "0x%x %d\n"), | ||
321 | n-i, *p)); | ||
322 | c[*p]++; /* assume all entries <= BMAX */ | ||
323 | p++; /* Can't combine with above line (Solaris bug) */ | ||
324 | } while (--i); | ||
325 | if (c[0] == n) /* null input--all zero length codes */ | ||
326 | { | ||
327 | *t = (struct huft *)NULL; | ||
328 | *m = 0; | ||
329 | return 0; | ||
330 | } | ||
331 | |||
332 | DEBG("huft2 "); | ||
333 | |||
334 | /* Find minimum and maximum length, bound *m by those */ | ||
335 | l = *m; | ||
336 | for (j = 1; j <= BMAX; j++) | ||
337 | if (c[j]) | ||
338 | break; | ||
339 | k = j; /* minimum code length */ | ||
340 | if ((unsigned)l < j) | ||
341 | l = j; | ||
342 | for (i = BMAX; i; i--) | ||
343 | if (c[i]) | ||
344 | break; | ||
345 | g = i; /* maximum code length */ | ||
346 | if ((unsigned)l > i) | ||
347 | l = i; | ||
348 | *m = l; | ||
349 | |||
350 | DEBG("huft3 "); | ||
351 | |||
352 | /* Adjust last length count to fill out codes, if needed */ | ||
353 | for (y = 1 << j; j < i; j++, y <<= 1) | ||
354 | if ((y -= c[j]) < 0) | ||
355 | return 2; /* bad input: more codes than bits */ | ||
356 | if ((y -= c[i]) < 0) | ||
357 | return 2; | ||
358 | c[i] += y; | ||
359 | |||
360 | DEBG("huft4 "); | ||
361 | |||
362 | /* Generate starting offsets into the value table for each length */ | ||
363 | x[1] = j = 0; | ||
364 | p = c + 1; xp = x + 2; | ||
365 | while (--i) { /* note that i == g from above */ | ||
366 | *xp++ = (j += *p++); | ||
367 | } | ||
368 | |||
369 | DEBG("huft5 "); | ||
370 | |||
371 | /* Make a table of values in order of bit lengths */ | ||
372 | p = b; i = 0; | ||
373 | do { | ||
374 | if ((j = *p++) != 0) | ||
375 | v[x[j]++] = i; | ||
376 | } while (++i < n); | ||
377 | |||
378 | DEBG("h6 "); | ||
379 | |||
380 | /* Generate the Huffman codes and for each, make the table entries */ | ||
381 | x[0] = i = 0; /* first Huffman code is zero */ | ||
382 | p = v; /* grab values in bit order */ | ||
383 | h = -1; /* no tables yet--level -1 */ | ||
384 | w = -l; /* bits decoded == (l * h) */ | ||
385 | u[0] = (struct huft *)NULL; /* just to keep compilers happy */ | ||
386 | q = (struct huft *)NULL; /* ditto */ | ||
387 | z = 0; /* ditto */ | ||
388 | DEBG("h6a "); | ||
389 | |||
390 | /* go through the bit lengths (k already is bits in shortest code) */ | ||
391 | for (; k <= g; k++) | ||
392 | { | ||
393 | DEBG("h6b "); | ||
394 | a = c[k]; | ||
395 | while (a--) | ||
396 | { | ||
397 | DEBG("h6b1 "); | ||
398 | /* here i is the Huffman code of length k bits for value *p */ | ||
399 | /* make tables up to required level */ | ||
400 | while (k > w + l) | ||
401 | { | ||
402 | DEBG1("1 "); | ||
403 | h++; | ||
404 | w += l; /* previous table always l bits */ | ||
405 | |||
406 | /* compute minimum size table less than or equal to l bits */ | ||
407 | z = (z = g - w) > (unsigned)l ? l : z; /* upper limit on table size */ | ||
408 | if ((f = 1 << (j = k - w)) > a + 1) /* try a k-w bit table */ | ||
409 | { /* too few codes for k-w bit table */ | ||
410 | DEBG1("2 "); | ||
411 | f -= a + 1; /* deduct codes from patterns left */ | ||
412 | xp = c + k; | ||
413 | while (++j < z) /* try smaller tables up to z bits */ | ||
414 | { | ||
415 | if ((f <<= 1) <= *++xp) | ||
416 | break; /* enough codes to use up j bits */ | ||
417 | f -= *xp; /* else deduct codes from patterns */ | ||
418 | } | ||
419 | } | ||
420 | DEBG1("3 "); | ||
421 | z = 1 << j; /* table entries for j-bit table */ | ||
422 | |||
423 | /* allocate and link in new table */ | ||
424 | if ((q = (struct huft *)malloc((z + 1)*sizeof(struct huft))) == | ||
425 | (struct huft *)NULL) | ||
426 | { | ||
427 | if (h) | ||
428 | huft_free(u[0]); | ||
429 | return 3; /* not enough memory */ | ||
430 | } | ||
431 | DEBG1("4 "); | ||
432 | hufts += z + 1; /* track memory usage */ | ||
433 | *t = q + 1; /* link to list for huft_free() */ | ||
434 | *(t = &(q->v.t)) = (struct huft *)NULL; | ||
435 | u[h] = ++q; /* table starts after link */ | ||
436 | |||
437 | DEBG1("5 "); | ||
438 | /* connect to last table, if there is one */ | ||
439 | if (h) | ||
440 | { | ||
441 | x[h] = i; /* save pattern for backing up */ | ||
442 | r.b = (uch)l; /* bits to dump before this table */ | ||
443 | r.e = (uch)(16 + j); /* bits in this table */ | ||
444 | r.v.t = q; /* pointer to this table */ | ||
445 | j = i >> (w - l); /* (get around Turbo C bug) */ | ||
446 | u[h-1][j] = r; /* connect to last table */ | ||
447 | } | ||
448 | DEBG1("6 "); | ||
449 | } | ||
450 | DEBG("h6c "); | ||
451 | |||
452 | /* set up table entry in r */ | ||
453 | r.b = (uch)(k - w); | ||
454 | if (p >= v + n) | ||
455 | r.e = 99; /* out of values--invalid code */ | ||
456 | else if (*p < s) | ||
457 | { | ||
458 | r.e = (uch)(*p < 256 ? 16 : 15); /* 256 is end-of-block code */ | ||
459 | r.v.n = (ush)(*p); /* simple code is just the value */ | ||
460 | p++; /* one compiler does not like *p++ */ | ||
461 | } | ||
462 | else | ||
463 | { | ||
464 | r.e = (uch)e[*p - s]; /* non-simple--look up in lists */ | ||
465 | r.v.n = d[*p++ - s]; | ||
466 | } | ||
467 | DEBG("h6d "); | ||
468 | |||
469 | /* fill code-like entries with r */ | ||
470 | f = 1 << (k - w); | ||
471 | for (j = i >> w; j < z; j += f) | ||
472 | q[j] = r; | ||
473 | |||
474 | /* backwards increment the k-bit code i */ | ||
475 | for (j = 1 << (k - 1); i & j; j >>= 1) | ||
476 | i ^= j; | ||
477 | i ^= j; | ||
478 | |||
479 | /* backup over finished tables */ | ||
480 | while ((i & ((1 << w) - 1)) != x[h]) | ||
481 | { | ||
482 | h--; /* don't need to update q */ | ||
483 | w -= l; | ||
484 | } | ||
485 | DEBG("h6e "); | ||
486 | } | ||
487 | DEBG("h6f "); | ||
488 | } | ||
489 | |||
490 | DEBG("huft7 "); | ||
491 | |||
492 | /* Return true (1) if we were given an incomplete table */ | ||
493 | return y != 0 && g != 1; | ||
494 | } | ||
495 | |||
496 | |||
497 | |||
498 | STATIC int INIT huft_free( | ||
499 | struct huft *t /* table to free */ | ||
500 | ) | ||
501 | /* Free the malloc'ed tables built by huft_build(), which makes a linked | ||
502 | list of the tables it made, with the links in a dummy first entry of | ||
503 | each table. */ | ||
504 | { | ||
505 | register struct huft *p, *q; | ||
506 | |||
507 | |||
508 | /* Go through linked list, freeing from the malloced (t[-1]) address. */ | ||
509 | p = t; | ||
510 | while (p != (struct huft *)NULL) | ||
511 | { | ||
512 | q = (--p)->v.t; | ||
513 | free((char*)p); | ||
514 | p = q; | ||
515 | } | ||
516 | return 0; | ||
517 | } | ||
518 | |||
519 | |||
520 | STATIC int INIT inflate_codes( | ||
521 | struct huft *tl, /* literal/length decoder tables */ | ||
522 | struct huft *td, /* distance decoder tables */ | ||
523 | int bl, /* number of bits decoded by tl[] */ | ||
524 | int bd /* number of bits decoded by td[] */ | ||
525 | ) | ||
526 | /* inflate (decompress) the codes in a deflated (compressed) block. | ||
527 | Return an error code or zero if it all goes ok. */ | ||
528 | { | ||
529 | register unsigned e; /* table entry flag/number of extra bits */ | ||
530 | unsigned n, d; /* length and index for copy */ | ||
531 | unsigned w; /* current window position */ | ||
532 | struct huft *t; /* pointer to table entry */ | ||
533 | unsigned ml, md; /* masks for bl and bd bits */ | ||
534 | register ulg b; /* bit buffer */ | ||
535 | register unsigned k; /* number of bits in bit buffer */ | ||
536 | |||
537 | |||
538 | /* make local copies of globals */ | ||
539 | b = bb; /* initialize bit buffer */ | ||
540 | k = bk; | ||
541 | w = wp; /* initialize window position */ | ||
542 | |||
543 | /* inflate the coded data */ | ||
544 | ml = mask_bits[bl]; /* precompute masks for speed */ | ||
545 | md = mask_bits[bd]; | ||
546 | for (;;) /* do until end of block */ | ||
547 | { | ||
548 | NEEDBITS((unsigned)bl) | ||
549 | if ((e = (t = tl + ((unsigned)b & ml))->e) > 16) | ||
550 | do { | ||
551 | if (e == 99) | ||
552 | return 1; | ||
553 | DUMPBITS(t->b) | ||
554 | e -= 16; | ||
555 | NEEDBITS(e) | ||
556 | } while ((e = (t = t->v.t + ((unsigned)b & mask_bits[e]))->e) > 16); | ||
557 | DUMPBITS(t->b) | ||
558 | if (e == 16) /* then it's a literal */ | ||
559 | { | ||
560 | slide[w++] = (uch)t->v.n; | ||
561 | Tracevv((stderr, "%c", slide[w-1])); | ||
562 | if (w == WSIZE) | ||
563 | { | ||
564 | flush_output(w); | ||
565 | w = 0; | ||
566 | } | ||
567 | } | ||
568 | else /* it's an EOB or a length */ | ||
569 | { | ||
570 | /* exit if end of block */ | ||
571 | if (e == 15) | ||
572 | break; | ||
573 | |||
574 | /* get length of block to copy */ | ||
575 | NEEDBITS(e) | ||
576 | n = t->v.n + ((unsigned)b & mask_bits[e]); | ||
577 | DUMPBITS(e); | ||
578 | |||
579 | /* decode distance of block to copy */ | ||
580 | NEEDBITS((unsigned)bd) | ||
581 | if ((e = (t = td + ((unsigned)b & md))->e) > 16) | ||
582 | do { | ||
583 | if (e == 99) | ||
584 | return 1; | ||
585 | DUMPBITS(t->b) | ||
586 | e -= 16; | ||
587 | NEEDBITS(e) | ||
588 | } while ((e = (t = t->v.t + ((unsigned)b & mask_bits[e]))->e) > 16); | ||
589 | DUMPBITS(t->b) | ||
590 | NEEDBITS(e) | ||
591 | d = w - t->v.n - ((unsigned)b & mask_bits[e]); | ||
592 | DUMPBITS(e) | ||
593 | Tracevv((stderr,"\\[%d,%d]", w-d, n)); | ||
594 | |||
595 | /* do the copy */ | ||
596 | do { | ||
597 | n -= (e = (e = WSIZE - ((d &= WSIZE-1) > w ? d : w)) > n ? n : e); | ||
598 | #if !defined(NOMEMCPY) && !defined(DEBUG) | ||
599 | if (w - d >= e) /* (this test assumes unsigned comparison) */ | ||
600 | { | ||
601 | memcpy(slide + w, slide + d, e); | ||
602 | w += e; | ||
603 | d += e; | ||
604 | } | ||
605 | else /* do it slow to avoid memcpy() overlap */ | ||
606 | #endif /* !NOMEMCPY */ | ||
607 | do { | ||
608 | slide[w++] = slide[d++]; | ||
609 | Tracevv((stderr, "%c", slide[w-1])); | ||
610 | } while (--e); | ||
611 | if (w == WSIZE) | ||
612 | { | ||
613 | flush_output(w); | ||
614 | w = 0; | ||
615 | } | ||
616 | } while (n); | ||
617 | } | ||
618 | } | ||
619 | |||
620 | |||
621 | /* restore the globals from the locals */ | ||
622 | wp = w; /* restore global window pointer */ | ||
623 | bb = b; /* restore global bit buffer */ | ||
624 | bk = k; | ||
625 | |||
626 | /* done */ | ||
627 | return 0; | ||
628 | |||
629 | underrun: | ||
630 | return 4; /* Input underrun */ | ||
631 | } | ||
632 | |||
633 | |||
634 | |||
635 | STATIC int INIT inflate_stored(void) | ||
636 | /* "decompress" an inflated type 0 (stored) block. */ | ||
637 | { | ||
638 | unsigned n; /* number of bytes in block */ | ||
639 | unsigned w; /* current window position */ | ||
640 | register ulg b; /* bit buffer */ | ||
641 | register unsigned k; /* number of bits in bit buffer */ | ||
642 | |||
643 | DEBG("<stor"); | ||
644 | |||
645 | /* make local copies of globals */ | ||
646 | b = bb; /* initialize bit buffer */ | ||
647 | k = bk; | ||
648 | w = wp; /* initialize window position */ | ||
649 | |||
650 | |||
651 | /* go to byte boundary */ | ||
652 | n = k & 7; | ||
653 | DUMPBITS(n); | ||
654 | |||
655 | |||
656 | /* get the length and its complement */ | ||
657 | NEEDBITS(16) | ||
658 | n = ((unsigned)b & 0xffff); | ||
659 | DUMPBITS(16) | ||
660 | NEEDBITS(16) | ||
661 | if (n != (unsigned)((~b) & 0xffff)) | ||
662 | return 1; /* error in compressed data */ | ||
663 | DUMPBITS(16) | ||
664 | |||
665 | |||
666 | /* read and output the compressed data */ | ||
667 | while (n--) | ||
668 | { | ||
669 | NEEDBITS(8) | ||
670 | slide[w++] = (uch)b; | ||
671 | if (w == WSIZE) | ||
672 | { | ||
673 | flush_output(w); | ||
674 | w = 0; | ||
675 | } | ||
676 | DUMPBITS(8) | ||
677 | } | ||
678 | |||
679 | |||
680 | /* restore the globals from the locals */ | ||
681 | wp = w; /* restore global window pointer */ | ||
682 | bb = b; /* restore global bit buffer */ | ||
683 | bk = k; | ||
684 | |||
685 | DEBG(">"); | ||
686 | return 0; | ||
687 | |||
688 | underrun: | ||
689 | return 4; /* Input underrun */ | ||
690 | } | ||
691 | |||
692 | |||
693 | /* | ||
694 | * We use `noinline' here to prevent gcc-3.5 from using too much stack space | ||
695 | */ | ||
696 | STATIC int noinline INIT inflate_fixed(void) | ||
697 | /* decompress an inflated type 1 (fixed Huffman codes) block. We should | ||
698 | either replace this with a custom decoder, or at least precompute the | ||
699 | Huffman tables. */ | ||
700 | { | ||
701 | int i; /* temporary variable */ | ||
702 | struct huft *tl; /* literal/length code table */ | ||
703 | struct huft *td; /* distance code table */ | ||
704 | int bl; /* lookup bits for tl */ | ||
705 | int bd; /* lookup bits for td */ | ||
706 | unsigned l[288]; /* length list for huft_build */ | ||
707 | |||
708 | DEBG("<fix"); | ||
709 | |||
710 | /* set up literal table */ | ||
711 | for (i = 0; i < 144; i++) | ||
712 | l[i] = 8; | ||
713 | for (; i < 256; i++) | ||
714 | l[i] = 9; | ||
715 | for (; i < 280; i++) | ||
716 | l[i] = 7; | ||
717 | for (; i < 288; i++) /* make a complete, but wrong code set */ | ||
718 | l[i] = 8; | ||
719 | bl = 7; | ||
720 | if ((i = huft_build(l, 288, 257, cplens, cplext, &tl, &bl)) != 0) | ||
721 | return i; | ||
722 | |||
723 | |||
724 | /* set up distance table */ | ||
725 | for (i = 0; i < 30; i++) /* make an incomplete code set */ | ||
726 | l[i] = 5; | ||
727 | bd = 5; | ||
728 | if ((i = huft_build(l, 30, 0, cpdist, cpdext, &td, &bd)) > 1) | ||
729 | { | ||
730 | huft_free(tl); | ||
731 | |||
732 | DEBG(">"); | ||
733 | return i; | ||
734 | } | ||
735 | |||
736 | |||
737 | /* decompress until an end-of-block code */ | ||
738 | if (inflate_codes(tl, td, bl, bd)) | ||
739 | return 1; | ||
740 | |||
741 | |||
742 | /* free the decoding tables, return */ | ||
743 | huft_free(tl); | ||
744 | huft_free(td); | ||
745 | return 0; | ||
746 | } | ||
747 | |||
748 | |||
749 | /* | ||
750 | * We use `noinline' here to prevent gcc-3.5 from using too much stack space | ||
751 | */ | ||
752 | STATIC int noinline INIT inflate_dynamic(void) | ||
753 | /* decompress an inflated type 2 (dynamic Huffman codes) block. */ | ||
754 | { | ||
755 | int i; /* temporary variables */ | ||
756 | unsigned j; | ||
757 | unsigned l; /* last length */ | ||
758 | unsigned m; /* mask for bit lengths table */ | ||
759 | unsigned n; /* number of lengths to get */ | ||
760 | struct huft *tl; /* literal/length code table */ | ||
761 | struct huft *td; /* distance code table */ | ||
762 | int bl; /* lookup bits for tl */ | ||
763 | int bd; /* lookup bits for td */ | ||
764 | unsigned nb; /* number of bit length codes */ | ||
765 | unsigned nl; /* number of literal/length codes */ | ||
766 | unsigned nd; /* number of distance codes */ | ||
767 | #ifdef PKZIP_BUG_WORKAROUND | ||
768 | unsigned ll[288+32]; /* literal/length and distance code lengths */ | ||
769 | #else | ||
770 | unsigned ll[286+30]; /* literal/length and distance code lengths */ | ||
771 | #endif | ||
772 | register ulg b; /* bit buffer */ | ||
773 | register unsigned k; /* number of bits in bit buffer */ | ||
774 | |||
775 | DEBG("<dyn"); | ||
776 | |||
777 | /* make local bit buffer */ | ||
778 | b = bb; | ||
779 | k = bk; | ||
780 | |||
781 | |||
782 | /* read in table lengths */ | ||
783 | NEEDBITS(5) | ||
784 | nl = 257 + ((unsigned)b & 0x1f); /* number of literal/length codes */ | ||
785 | DUMPBITS(5) | ||
786 | NEEDBITS(5) | ||
787 | nd = 1 + ((unsigned)b & 0x1f); /* number of distance codes */ | ||
788 | DUMPBITS(5) | ||
789 | NEEDBITS(4) | ||
790 | nb = 4 + ((unsigned)b & 0xf); /* number of bit length codes */ | ||
791 | DUMPBITS(4) | ||
792 | #ifdef PKZIP_BUG_WORKAROUND | ||
793 | if (nl > 288 || nd > 32) | ||
794 | #else | ||
795 | if (nl > 286 || nd > 30) | ||
796 | #endif | ||
797 | return 1; /* bad lengths */ | ||
798 | |||
799 | DEBG("dyn1 "); | ||
800 | |||
801 | /* read in bit-length-code lengths */ | ||
802 | for (j = 0; j < nb; j++) | ||
803 | { | ||
804 | NEEDBITS(3) | ||
805 | ll[border[j]] = (unsigned)b & 7; | ||
806 | DUMPBITS(3) | ||
807 | } | ||
808 | for (; j < 19; j++) | ||
809 | ll[border[j]] = 0; | ||
810 | |||
811 | DEBG("dyn2 "); | ||
812 | |||
813 | /* build decoding table for trees--single level, 7 bit lookup */ | ||
814 | bl = 7; | ||
815 | if ((i = huft_build(ll, 19, 19, NULL, NULL, &tl, &bl)) != 0) | ||
816 | { | ||
817 | if (i == 1) | ||
818 | huft_free(tl); | ||
819 | return i; /* incomplete code set */ | ||
820 | } | ||
821 | |||
822 | DEBG("dyn3 "); | ||
823 | |||
824 | /* read in literal and distance code lengths */ | ||
825 | n = nl + nd; | ||
826 | m = mask_bits[bl]; | ||
827 | i = l = 0; | ||
828 | while ((unsigned)i < n) | ||
829 | { | ||
830 | NEEDBITS((unsigned)bl) | ||
831 | j = (td = tl + ((unsigned)b & m))->b; | ||
832 | DUMPBITS(j) | ||
833 | j = td->v.n; | ||
834 | if (j < 16) /* length of code in bits (0..15) */ | ||
835 | ll[i++] = l = j; /* save last length in l */ | ||
836 | else if (j == 16) /* repeat last length 3 to 6 times */ | ||
837 | { | ||
838 | NEEDBITS(2) | ||
839 | j = 3 + ((unsigned)b & 3); | ||
840 | DUMPBITS(2) | ||
841 | if ((unsigned)i + j > n) | ||
842 | return 1; | ||
843 | while (j--) | ||
844 | ll[i++] = l; | ||
845 | } | ||
846 | else if (j == 17) /* 3 to 10 zero length codes */ | ||
847 | { | ||
848 | NEEDBITS(3) | ||
849 | j = 3 + ((unsigned)b & 7); | ||
850 | DUMPBITS(3) | ||
851 | if ((unsigned)i + j > n) | ||
852 | return 1; | ||
853 | while (j--) | ||
854 | ll[i++] = 0; | ||
855 | l = 0; | ||
856 | } | ||
857 | else /* j == 18: 11 to 138 zero length codes */ | ||
858 | { | ||
859 | NEEDBITS(7) | ||
860 | j = 11 + ((unsigned)b & 0x7f); | ||
861 | DUMPBITS(7) | ||
862 | if ((unsigned)i + j > n) | ||
863 | return 1; | ||
864 | while (j--) | ||
865 | ll[i++] = 0; | ||
866 | l = 0; | ||
867 | } | ||
868 | } | ||
869 | |||
870 | DEBG("dyn4 "); | ||
871 | |||
872 | /* free decoding table for trees */ | ||
873 | huft_free(tl); | ||
874 | |||
875 | DEBG("dyn5 "); | ||
876 | |||
877 | /* restore the global bit buffer */ | ||
878 | bb = b; | ||
879 | bk = k; | ||
880 | |||
881 | DEBG("dyn5a "); | ||
882 | |||
883 | /* build the decoding tables for literal/length and distance codes */ | ||
884 | bl = lbits; | ||
885 | if ((i = huft_build(ll, nl, 257, cplens, cplext, &tl, &bl)) != 0) | ||
886 | { | ||
887 | DEBG("dyn5b "); | ||
888 | if (i == 1) { | ||
889 | error("incomplete literal tree"); | ||
890 | huft_free(tl); | ||
891 | } | ||
892 | return i; /* incomplete code set */ | ||
893 | } | ||
894 | DEBG("dyn5c "); | ||
895 | bd = dbits; | ||
896 | if ((i = huft_build(ll + nl, nd, 0, cpdist, cpdext, &td, &bd)) != 0) | ||
897 | { | ||
898 | DEBG("dyn5d "); | ||
899 | if (i == 1) { | ||
900 | error("incomplete distance tree"); | ||
901 | #ifdef PKZIP_BUG_WORKAROUND | ||
902 | i = 0; | ||
903 | } | ||
904 | #else | ||
905 | huft_free(td); | ||
906 | } | ||
907 | huft_free(tl); | ||
908 | return i; /* incomplete code set */ | ||
909 | #endif | ||
910 | } | ||
911 | |||
912 | DEBG("dyn6 "); | ||
913 | |||
914 | /* decompress until an end-of-block code */ | ||
915 | if (inflate_codes(tl, td, bl, bd)) | ||
916 | return 1; | ||
917 | |||
918 | DEBG("dyn7 "); | ||
919 | |||
920 | /* free the decoding tables, return */ | ||
921 | huft_free(tl); | ||
922 | huft_free(td); | ||
923 | |||
924 | DEBG(">"); | ||
925 | return 0; | ||
926 | |||
927 | underrun: | ||
928 | return 4; /* Input underrun */ | ||
929 | } | ||
930 | |||
931 | |||
932 | |||
933 | STATIC int INIT inflate_block( | ||
934 | int *e /* last block flag */ | ||
935 | ) | ||
936 | /* decompress an inflated block */ | ||
937 | { | ||
938 | unsigned t; /* block type */ | ||
939 | register ulg b; /* bit buffer */ | ||
940 | register unsigned k; /* number of bits in bit buffer */ | ||
941 | |||
942 | DEBG("<blk"); | ||
943 | |||
944 | /* make local bit buffer */ | ||
945 | b = bb; | ||
946 | k = bk; | ||
947 | |||
948 | |||
949 | /* read in last block bit */ | ||
950 | NEEDBITS(1) | ||
951 | *e = (int)b & 1; | ||
952 | DUMPBITS(1) | ||
953 | |||
954 | |||
955 | /* read in block type */ | ||
956 | NEEDBITS(2) | ||
957 | t = (unsigned)b & 3; | ||
958 | DUMPBITS(2) | ||
959 | |||
960 | |||
961 | /* restore the global bit buffer */ | ||
962 | bb = b; | ||
963 | bk = k; | ||
964 | |||
965 | /* inflate that block type */ | ||
966 | if (t == 2) | ||
967 | return inflate_dynamic(); | ||
968 | if (t == 0) | ||
969 | return inflate_stored(); | ||
970 | if (t == 1) | ||
971 | return inflate_fixed(); | ||
972 | |||
973 | DEBG(">"); | ||
974 | |||
975 | /* bad block type */ | ||
976 | return 2; | ||
977 | |||
978 | underrun: | ||
979 | return 4; /* Input underrun */ | ||
980 | } | ||
981 | |||
982 | |||
983 | |||
984 | STATIC int INIT inflate(void) | ||
985 | /* decompress an inflated entry */ | ||
986 | { | ||
987 | int e; /* last block flag */ | ||
988 | int r; /* result code */ | ||
989 | unsigned h; /* maximum struct huft's malloc'ed */ | ||
990 | void *ptr; | ||
991 | |||
992 | /* initialize window, bit buffer */ | ||
993 | wp = 0; | ||
994 | bk = 0; | ||
995 | bb = 0; | ||
996 | |||
997 | |||
998 | /* decompress until the last block */ | ||
999 | h = 0; | ||
1000 | do { | ||
1001 | hufts = 0; | ||
1002 | gzip_mark(&ptr); | ||
1003 | if ((r = inflate_block(&e)) != 0) { | ||
1004 | gzip_release(&ptr); | ||
1005 | return r; | ||
1006 | } | ||
1007 | gzip_release(&ptr); | ||
1008 | if (hufts > h) | ||
1009 | h = hufts; | ||
1010 | } while (!e); | ||
1011 | |||
1012 | /* Undo too much lookahead. The next read will be byte aligned so we | ||
1013 | * can discard unused bits in the last meaningful byte. | ||
1014 | */ | ||
1015 | while (bk >= 8) { | ||
1016 | bk -= 8; | ||
1017 | inptr--; | ||
1018 | } | ||
1019 | |||
1020 | /* flush out slide */ | ||
1021 | flush_output(wp); | ||
1022 | |||
1023 | |||
1024 | /* return success */ | ||
1025 | #ifdef DEBUG | ||
1026 | fprintf(stderr, "<%u> ", h); | ||
1027 | #endif /* DEBUG */ | ||
1028 | return 0; | ||
1029 | } | ||
1030 | |||
1031 | /********************************************************************** | ||
1032 | * | ||
1033 | * The following are support routines for inflate.c | ||
1034 | * | ||
1035 | **********************************************************************/ | ||
1036 | |||
1037 | static ulg crc_32_tab[256]; | ||
1038 | static ulg crc; /* initialized in makecrc() so it'll reside in bss */ | ||
1039 | #define CRC_VALUE (crc ^ 0xffffffffUL) | ||
1040 | |||
1041 | /* | ||
1042 | * Code to compute the CRC-32 table. Borrowed from | ||
1043 | * gzip-1.0.3/makecrc.c. | ||
1044 | */ | ||
1045 | |||
1046 | static void INIT | ||
1047 | makecrc(void) | ||
1048 | { | ||
1049 | /* Not copyrighted 1990 Mark Adler */ | ||
1050 | |||
1051 | unsigned long c; /* crc shift register */ | ||
1052 | unsigned long e; /* polynomial exclusive-or pattern */ | ||
1053 | int i; /* counter for all possible eight bit values */ | ||
1054 | int k; /* byte being shifted into crc apparatus */ | ||
1055 | |||
1056 | /* terms of polynomial defining this crc (except x^32): */ | ||
1057 | static const int p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26}; | ||
1058 | |||
1059 | /* Make exclusive-or pattern from polynomial */ | ||
1060 | e = 0; | ||
1061 | for (i = 0; i < sizeof(p)/sizeof(int); i++) | ||
1062 | e |= 1L << (31 - p[i]); | ||
1063 | |||
1064 | crc_32_tab[0] = 0; | ||
1065 | |||
1066 | for (i = 1; i < 256; i++) | ||
1067 | { | ||
1068 | c = 0; | ||
1069 | for (k = i | 256; k != 1; k >>= 1) | ||
1070 | { | ||
1071 | c = c & 1 ? (c >> 1) ^ e : c >> 1; | ||
1072 | if (k & 1) | ||
1073 | c ^= e; | ||
1074 | } | ||
1075 | crc_32_tab[i] = c; | ||
1076 | } | ||
1077 | |||
1078 | /* this is initialized here so this code could reside in ROM */ | ||
1079 | crc = (ulg)0xffffffffUL; /* shift register contents */ | ||
1080 | } | ||
1081 | |||
1082 | /* gzip flag byte */ | ||
1083 | #define ASCII_FLAG 0x01 /* bit 0 set: file probably ASCII text */ | ||
1084 | #define CONTINUATION 0x02 /* bit 1 set: continuation of multi-part gzip file */ | ||
1085 | #define EXTRA_FIELD 0x04 /* bit 2 set: extra field present */ | ||
1086 | #define ORIG_NAME 0x08 /* bit 3 set: original file name present */ | ||
1087 | #define COMMENT 0x10 /* bit 4 set: file comment present */ | ||
1088 | #define ENCRYPTED 0x20 /* bit 5 set: file is encrypted */ | ||
1089 | #define RESERVED 0xC0 /* bit 6,7: reserved */ | ||
1090 | |||
1091 | /* | ||
1092 | * Do the uncompression! | ||
1093 | */ | ||
1094 | static int INIT gunzip(void) | ||
1095 | { | ||
1096 | uch flags; | ||
1097 | unsigned char magic[2]; /* magic header */ | ||
1098 | char method; | ||
1099 | ulg orig_crc = 0; /* original crc */ | ||
1100 | ulg orig_len = 0; /* original uncompressed length */ | ||
1101 | int res; | ||
1102 | |||
1103 | magic[0] = NEXTBYTE(); | ||
1104 | magic[1] = NEXTBYTE(); | ||
1105 | method = NEXTBYTE(); | ||
1106 | |||
1107 | if (magic[0] != 037 || | ||
1108 | ((magic[1] != 0213) && (magic[1] != 0236))) { | ||
1109 | error("bad gzip magic numbers"); | ||
1110 | return -1; | ||
1111 | } | ||
1112 | |||
1113 | /* We only support method #8, DEFLATED */ | ||
1114 | if (method != 8) { | ||
1115 | error("internal error, invalid method"); | ||
1116 | return -1; | ||
1117 | } | ||
1118 | |||
1119 | flags = (uch)get_byte(); | ||
1120 | if ((flags & ENCRYPTED) != 0) { | ||
1121 | error("Input is encrypted"); | ||
1122 | return -1; | ||
1123 | } | ||
1124 | if ((flags & CONTINUATION) != 0) { | ||
1125 | error("Multi part input"); | ||
1126 | return -1; | ||
1127 | } | ||
1128 | if ((flags & RESERVED) != 0) { | ||
1129 | error("Input has invalid flags"); | ||
1130 | return -1; | ||
1131 | } | ||
1132 | NEXTBYTE(); /* Get timestamp */ | ||
1133 | NEXTBYTE(); | ||
1134 | NEXTBYTE(); | ||
1135 | NEXTBYTE(); | ||
1136 | |||
1137 | (void)NEXTBYTE(); /* Ignore extra flags for the moment */ | ||
1138 | (void)NEXTBYTE(); /* Ignore OS type for the moment */ | ||
1139 | |||
1140 | if ((flags & EXTRA_FIELD) != 0) { | ||
1141 | unsigned len = (unsigned)NEXTBYTE(); | ||
1142 | len |= ((unsigned)NEXTBYTE())<<8; | ||
1143 | while (len--) (void)NEXTBYTE(); | ||
1144 | } | ||
1145 | |||
1146 | /* Get original file name if it was truncated */ | ||
1147 | if ((flags & ORIG_NAME) != 0) { | ||
1148 | /* Discard the old name */ | ||
1149 | while (NEXTBYTE() != 0) /* null */ ; | ||
1150 | } | ||
1151 | |||
1152 | /* Discard file comment if any */ | ||
1153 | if ((flags & COMMENT) != 0) { | ||
1154 | while (NEXTBYTE() != 0) /* null */ ; | ||
1155 | } | ||
1156 | |||
1157 | /* Decompress */ | ||
1158 | if ((res = inflate())) { | ||
1159 | switch (res) { | ||
1160 | case 0: | ||
1161 | break; | ||
1162 | case 1: | ||
1163 | error("invalid compressed format (err=1)"); | ||
1164 | break; | ||
1165 | case 2: | ||
1166 | error("invalid compressed format (err=2)"); | ||
1167 | break; | ||
1168 | case 3: | ||
1169 | error("out of memory"); | ||
1170 | break; | ||
1171 | case 4: | ||
1172 | error("out of input data"); | ||
1173 | break; | ||
1174 | default: | ||
1175 | error("invalid compressed format (other)"); | ||
1176 | } | ||
1177 | return -1; | ||
1178 | } | ||
1179 | |||
1180 | /* Get the crc and original length */ | ||
1181 | /* crc32 (see algorithm.doc) | ||
1182 | * uncompressed input size modulo 2^32 | ||
1183 | */ | ||
1184 | orig_crc = (ulg) NEXTBYTE(); | ||
1185 | orig_crc |= (ulg) NEXTBYTE() << 8; | ||
1186 | orig_crc |= (ulg) NEXTBYTE() << 16; | ||
1187 | orig_crc |= (ulg) NEXTBYTE() << 24; | ||
1188 | |||
1189 | orig_len = (ulg) NEXTBYTE(); | ||
1190 | orig_len |= (ulg) NEXTBYTE() << 8; | ||
1191 | orig_len |= (ulg) NEXTBYTE() << 16; | ||
1192 | orig_len |= (ulg) NEXTBYTE() << 24; | ||
1193 | |||
1194 | /* Validate decompression */ | ||
1195 | if (orig_crc != CRC_VALUE) { | ||
1196 | error("crc error"); | ||
1197 | return -1; | ||
1198 | } | ||
1199 | if (orig_len != bytes_out) { | ||
1200 | error("length error"); | ||
1201 | return -1; | ||
1202 | } | ||
1203 | return 0; | ||
1204 | |||
1205 | underrun: /* NEXTBYTE() goto's here if needed */ | ||
1206 | error("out of input data"); | ||
1207 | return -1; | ||
1208 | } | ||
1209 | |||
1210 | |||
diff --git a/lib/int_sqrt.c b/lib/int_sqrt.c new file mode 100644 index 000000000000..a5d2cdc5684c --- /dev/null +++ b/lib/int_sqrt.c | |||
@@ -0,0 +1,32 @@ | |||
1 | |||
2 | #include <linux/kernel.h> | ||
3 | #include <linux/module.h> | ||
4 | |||
5 | /** | ||
6 | * int_sqrt - rough approximation to sqrt | ||
7 | * @x: integer of which to calculate the sqrt | ||
8 | * | ||
9 | * A very rough approximation to the sqrt() function. | ||
10 | */ | ||
11 | unsigned long int_sqrt(unsigned long x) | ||
12 | { | ||
13 | unsigned long op, res, one; | ||
14 | |||
15 | op = x; | ||
16 | res = 0; | ||
17 | |||
18 | one = 1 << 30; | ||
19 | while (one > op) | ||
20 | one >>= 2; | ||
21 | |||
22 | while (one != 0) { | ||
23 | if (op >= res + one) { | ||
24 | op = op - (res + one); | ||
25 | res = res + 2 * one; | ||
26 | } | ||
27 | res /= 2; | ||
28 | one /= 4; | ||
29 | } | ||
30 | return res; | ||
31 | } | ||
32 | EXPORT_SYMBOL(int_sqrt); | ||
diff --git a/lib/iomap.c b/lib/iomap.c new file mode 100644 index 000000000000..5e74390852b0 --- /dev/null +++ b/lib/iomap.c | |||
@@ -0,0 +1,212 @@ | |||
1 | /* | ||
2 | * Implement the default iomap interfaces | ||
3 | * | ||
4 | * (C) Copyright 2004 Linus Torvalds | ||
5 | */ | ||
6 | #include <linux/pci.h> | ||
7 | #include <linux/module.h> | ||
8 | #include <asm/io.h> | ||
9 | |||
10 | /* | ||
11 | * Read/write from/to an (offsettable) iomem cookie. It might be a PIO | ||
12 | * access or a MMIO access, these functions don't care. The info is | ||
13 | * encoded in the hardware mapping set up by the mapping functions | ||
14 | * (or the cookie itself, depending on implementation and hw). | ||
15 | * | ||
16 | * The generic routines don't assume any hardware mappings, and just | ||
17 | * encode the PIO/MMIO as part of the cookie. They coldly assume that | ||
18 | * the MMIO IO mappings are not in the low address range. | ||
19 | * | ||
20 | * Architectures for which this is not true can't use this generic | ||
21 | * implementation and should do their own copy. | ||
22 | */ | ||
23 | |||
24 | #ifndef HAVE_ARCH_PIO_SIZE | ||
25 | /* | ||
26 | * We encode the physical PIO addresses (0-0xffff) into the | ||
27 | * pointer by offsetting them with a constant (0x10000) and | ||
28 | * assuming that all the low addresses are always PIO. That means | ||
29 | * we can do some sanity checks on the low bits, and don't | ||
30 | * need to just take things for granted. | ||
31 | */ | ||
32 | #define PIO_OFFSET 0x10000UL | ||
33 | #define PIO_MASK 0x0ffffUL | ||
34 | #define PIO_RESERVED 0x40000UL | ||
35 | #endif | ||
36 | |||
37 | /* | ||
38 | * Ugly macros are a way of life. | ||
39 | */ | ||
40 | #define VERIFY_PIO(port) BUG_ON((port & ~PIO_MASK) != PIO_OFFSET) | ||
41 | |||
42 | #define IO_COND(addr, is_pio, is_mmio) do { \ | ||
43 | unsigned long port = (unsigned long __force)addr; \ | ||
44 | if (port < PIO_RESERVED) { \ | ||
45 | VERIFY_PIO(port); \ | ||
46 | port &= PIO_MASK; \ | ||
47 | is_pio; \ | ||
48 | } else { \ | ||
49 | is_mmio; \ | ||
50 | } \ | ||
51 | } while (0) | ||
52 | |||
53 | unsigned int fastcall ioread8(void __iomem *addr) | ||
54 | { | ||
55 | IO_COND(addr, return inb(port), return readb(addr)); | ||
56 | } | ||
57 | unsigned int fastcall ioread16(void __iomem *addr) | ||
58 | { | ||
59 | IO_COND(addr, return inw(port), return readw(addr)); | ||
60 | } | ||
61 | unsigned int fastcall ioread32(void __iomem *addr) | ||
62 | { | ||
63 | IO_COND(addr, return inl(port), return readl(addr)); | ||
64 | } | ||
65 | EXPORT_SYMBOL(ioread8); | ||
66 | EXPORT_SYMBOL(ioread16); | ||
67 | EXPORT_SYMBOL(ioread32); | ||
68 | |||
69 | void fastcall iowrite8(u8 val, void __iomem *addr) | ||
70 | { | ||
71 | IO_COND(addr, outb(val,port), writeb(val, addr)); | ||
72 | } | ||
73 | void fastcall iowrite16(u16 val, void __iomem *addr) | ||
74 | { | ||
75 | IO_COND(addr, outw(val,port), writew(val, addr)); | ||
76 | } | ||
77 | void fastcall iowrite32(u32 val, void __iomem *addr) | ||
78 | { | ||
79 | IO_COND(addr, outl(val,port), writel(val, addr)); | ||
80 | } | ||
81 | EXPORT_SYMBOL(iowrite8); | ||
82 | EXPORT_SYMBOL(iowrite16); | ||
83 | EXPORT_SYMBOL(iowrite32); | ||
84 | |||
85 | /* | ||
86 | * These are the "repeat MMIO read/write" functions. | ||
87 | * Note the "__raw" accesses, since we don't want to | ||
88 | * convert to CPU byte order. We write in "IO byte | ||
89 | * order" (we also don't have IO barriers). | ||
90 | */ | ||
91 | static inline void mmio_insb(void __iomem *addr, u8 *dst, int count) | ||
92 | { | ||
93 | while (--count >= 0) { | ||
94 | u8 data = __raw_readb(addr); | ||
95 | *dst = data; | ||
96 | dst++; | ||
97 | } | ||
98 | } | ||
99 | static inline void mmio_insw(void __iomem *addr, u16 *dst, int count) | ||
100 | { | ||
101 | while (--count >= 0) { | ||
102 | u16 data = __raw_readw(addr); | ||
103 | *dst = data; | ||
104 | dst++; | ||
105 | } | ||
106 | } | ||
107 | static inline void mmio_insl(void __iomem *addr, u32 *dst, int count) | ||
108 | { | ||
109 | while (--count >= 0) { | ||
110 | u32 data = __raw_readl(addr); | ||
111 | *dst = data; | ||
112 | dst++; | ||
113 | } | ||
114 | } | ||
115 | |||
116 | static inline void mmio_outsb(void __iomem *addr, const u8 *src, int count) | ||
117 | { | ||
118 | while (--count >= 0) { | ||
119 | __raw_writeb(*src, addr); | ||
120 | src++; | ||
121 | } | ||
122 | } | ||
123 | static inline void mmio_outsw(void __iomem *addr, const u16 *src, int count) | ||
124 | { | ||
125 | while (--count >= 0) { | ||
126 | __raw_writew(*src, addr); | ||
127 | src++; | ||
128 | } | ||
129 | } | ||
130 | static inline void mmio_outsl(void __iomem *addr, const u32 *src, int count) | ||
131 | { | ||
132 | while (--count >= 0) { | ||
133 | __raw_writel(*src, addr); | ||
134 | src++; | ||
135 | } | ||
136 | } | ||
137 | |||
138 | void fastcall ioread8_rep(void __iomem *addr, void *dst, unsigned long count) | ||
139 | { | ||
140 | IO_COND(addr, insb(port,dst,count), mmio_insb(addr, dst, count)); | ||
141 | } | ||
142 | void fastcall ioread16_rep(void __iomem *addr, void *dst, unsigned long count) | ||
143 | { | ||
144 | IO_COND(addr, insw(port,dst,count), mmio_insw(addr, dst, count)); | ||
145 | } | ||
146 | void fastcall ioread32_rep(void __iomem *addr, void *dst, unsigned long count) | ||
147 | { | ||
148 | IO_COND(addr, insl(port,dst,count), mmio_insl(addr, dst, count)); | ||
149 | } | ||
150 | EXPORT_SYMBOL(ioread8_rep); | ||
151 | EXPORT_SYMBOL(ioread16_rep); | ||
152 | EXPORT_SYMBOL(ioread32_rep); | ||
153 | |||
154 | void fastcall iowrite8_rep(void __iomem *addr, const void *src, unsigned long count) | ||
155 | { | ||
156 | IO_COND(addr, outsb(port, src, count), mmio_outsb(addr, src, count)); | ||
157 | } | ||
158 | void fastcall iowrite16_rep(void __iomem *addr, const void *src, unsigned long count) | ||
159 | { | ||
160 | IO_COND(addr, outsw(port, src, count), mmio_outsw(addr, src, count)); | ||
161 | } | ||
162 | void fastcall iowrite32_rep(void __iomem *addr, const void *src, unsigned long count) | ||
163 | { | ||
164 | IO_COND(addr, outsl(port, src,count), mmio_outsl(addr, src, count)); | ||
165 | } | ||
166 | EXPORT_SYMBOL(iowrite8_rep); | ||
167 | EXPORT_SYMBOL(iowrite16_rep); | ||
168 | EXPORT_SYMBOL(iowrite32_rep); | ||
169 | |||
170 | /* Create a virtual mapping cookie for an IO port range */ | ||
171 | void __iomem *ioport_map(unsigned long port, unsigned int nr) | ||
172 | { | ||
173 | if (port > PIO_MASK) | ||
174 | return NULL; | ||
175 | return (void __iomem *) (unsigned long) (port + PIO_OFFSET); | ||
176 | } | ||
177 | |||
178 | void ioport_unmap(void __iomem *addr) | ||
179 | { | ||
180 | /* Nothing to do */ | ||
181 | } | ||
182 | EXPORT_SYMBOL(ioport_map); | ||
183 | EXPORT_SYMBOL(ioport_unmap); | ||
184 | |||
185 | /* Create a virtual mapping cookie for a PCI BAR (memory or IO) */ | ||
186 | void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long maxlen) | ||
187 | { | ||
188 | unsigned long start = pci_resource_start(dev, bar); | ||
189 | unsigned long len = pci_resource_len(dev, bar); | ||
190 | unsigned long flags = pci_resource_flags(dev, bar); | ||
191 | |||
192 | if (!len || !start) | ||
193 | return NULL; | ||
194 | if (maxlen && len > maxlen) | ||
195 | len = maxlen; | ||
196 | if (flags & IORESOURCE_IO) | ||
197 | return ioport_map(start, len); | ||
198 | if (flags & IORESOURCE_MEM) { | ||
199 | if (flags & IORESOURCE_CACHEABLE) | ||
200 | return ioremap(start, len); | ||
201 | return ioremap_nocache(start, len); | ||
202 | } | ||
203 | /* What? */ | ||
204 | return NULL; | ||
205 | } | ||
206 | |||
207 | void pci_iounmap(struct pci_dev *dev, void __iomem * addr) | ||
208 | { | ||
209 | IO_COND(addr, /* nothing */, iounmap(addr)); | ||
210 | } | ||
211 | EXPORT_SYMBOL(pci_iomap); | ||
212 | EXPORT_SYMBOL(pci_iounmap); | ||
diff --git a/lib/kernel_lock.c b/lib/kernel_lock.c new file mode 100644 index 000000000000..99b0ae3d51dd --- /dev/null +++ b/lib/kernel_lock.c | |||
@@ -0,0 +1,264 @@ | |||
1 | /* | ||
2 | * lib/kernel_lock.c | ||
3 | * | ||
4 | * This is the traditional BKL - big kernel lock. Largely | ||
5 | * relegated to obsolescense, but used by various less | ||
6 | * important (or lazy) subsystems. | ||
7 | */ | ||
8 | #include <linux/smp_lock.h> | ||
9 | #include <linux/module.h> | ||
10 | #include <linux/kallsyms.h> | ||
11 | |||
12 | #if defined(CONFIG_PREEMPT) && defined(__smp_processor_id) && \ | ||
13 | defined(CONFIG_DEBUG_PREEMPT) | ||
14 | |||
15 | /* | ||
16 | * Debugging check. | ||
17 | */ | ||
18 | unsigned int smp_processor_id(void) | ||
19 | { | ||
20 | unsigned long preempt_count = preempt_count(); | ||
21 | int this_cpu = __smp_processor_id(); | ||
22 | cpumask_t this_mask; | ||
23 | |||
24 | if (likely(preempt_count)) | ||
25 | goto out; | ||
26 | |||
27 | if (irqs_disabled()) | ||
28 | goto out; | ||
29 | |||
30 | /* | ||
31 | * Kernel threads bound to a single CPU can safely use | ||
32 | * smp_processor_id(): | ||
33 | */ | ||
34 | this_mask = cpumask_of_cpu(this_cpu); | ||
35 | |||
36 | if (cpus_equal(current->cpus_allowed, this_mask)) | ||
37 | goto out; | ||
38 | |||
39 | /* | ||
40 | * It is valid to assume CPU-locality during early bootup: | ||
41 | */ | ||
42 | if (system_state != SYSTEM_RUNNING) | ||
43 | goto out; | ||
44 | |||
45 | /* | ||
46 | * Avoid recursion: | ||
47 | */ | ||
48 | preempt_disable(); | ||
49 | |||
50 | if (!printk_ratelimit()) | ||
51 | goto out_enable; | ||
52 | |||
53 | printk(KERN_ERR "BUG: using smp_processor_id() in preemptible [%08x] code: %s/%d\n", preempt_count(), current->comm, current->pid); | ||
54 | print_symbol("caller is %s\n", (long)__builtin_return_address(0)); | ||
55 | dump_stack(); | ||
56 | |||
57 | out_enable: | ||
58 | preempt_enable_no_resched(); | ||
59 | out: | ||
60 | return this_cpu; | ||
61 | } | ||
62 | |||
63 | EXPORT_SYMBOL(smp_processor_id); | ||
64 | |||
65 | #endif /* PREEMPT && __smp_processor_id && DEBUG_PREEMPT */ | ||
66 | |||
67 | #ifdef CONFIG_PREEMPT_BKL | ||
68 | /* | ||
69 | * The 'big kernel semaphore' | ||
70 | * | ||
71 | * This mutex is taken and released recursively by lock_kernel() | ||
72 | * and unlock_kernel(). It is transparently dropped and reaquired | ||
73 | * over schedule(). It is used to protect legacy code that hasn't | ||
74 | * been migrated to a proper locking design yet. | ||
75 | * | ||
76 | * Note: code locked by this semaphore will only be serialized against | ||
77 | * other code using the same locking facility. The code guarantees that | ||
78 | * the task remains on the same CPU. | ||
79 | * | ||
80 | * Don't use in new code. | ||
81 | */ | ||
82 | static DECLARE_MUTEX(kernel_sem); | ||
83 | |||
84 | /* | ||
85 | * Re-acquire the kernel semaphore. | ||
86 | * | ||
87 | * This function is called with preemption off. | ||
88 | * | ||
89 | * We are executing in schedule() so the code must be extremely careful | ||
90 | * about recursion, both due to the down() and due to the enabling of | ||
91 | * preemption. schedule() will re-check the preemption flag after | ||
92 | * reacquiring the semaphore. | ||
93 | */ | ||
94 | int __lockfunc __reacquire_kernel_lock(void) | ||
95 | { | ||
96 | struct task_struct *task = current; | ||
97 | int saved_lock_depth = task->lock_depth; | ||
98 | |||
99 | BUG_ON(saved_lock_depth < 0); | ||
100 | |||
101 | task->lock_depth = -1; | ||
102 | preempt_enable_no_resched(); | ||
103 | |||
104 | down(&kernel_sem); | ||
105 | |||
106 | preempt_disable(); | ||
107 | task->lock_depth = saved_lock_depth; | ||
108 | |||
109 | return 0; | ||
110 | } | ||
111 | |||
112 | void __lockfunc __release_kernel_lock(void) | ||
113 | { | ||
114 | up(&kernel_sem); | ||
115 | } | ||
116 | |||
117 | /* | ||
118 | * Getting the big kernel semaphore. | ||
119 | */ | ||
120 | void __lockfunc lock_kernel(void) | ||
121 | { | ||
122 | struct task_struct *task = current; | ||
123 | int depth = task->lock_depth + 1; | ||
124 | |||
125 | if (likely(!depth)) | ||
126 | /* | ||
127 | * No recursion worries - we set up lock_depth _after_ | ||
128 | */ | ||
129 | down(&kernel_sem); | ||
130 | |||
131 | task->lock_depth = depth; | ||
132 | } | ||
133 | |||
134 | void __lockfunc unlock_kernel(void) | ||
135 | { | ||
136 | struct task_struct *task = current; | ||
137 | |||
138 | BUG_ON(task->lock_depth < 0); | ||
139 | |||
140 | if (likely(--task->lock_depth < 0)) | ||
141 | up(&kernel_sem); | ||
142 | } | ||
143 | |||
144 | #else | ||
145 | |||
146 | /* | ||
147 | * The 'big kernel lock' | ||
148 | * | ||
149 | * This spinlock is taken and released recursively by lock_kernel() | ||
150 | * and unlock_kernel(). It is transparently dropped and reaquired | ||
151 | * over schedule(). It is used to protect legacy code that hasn't | ||
152 | * been migrated to a proper locking design yet. | ||
153 | * | ||
154 | * Don't use in new code. | ||
155 | */ | ||
156 | static __cacheline_aligned_in_smp DEFINE_SPINLOCK(kernel_flag); | ||
157 | |||
158 | |||
159 | /* | ||
160 | * Acquire/release the underlying lock from the scheduler. | ||
161 | * | ||
162 | * This is called with preemption disabled, and should | ||
163 | * return an error value if it cannot get the lock and | ||
164 | * TIF_NEED_RESCHED gets set. | ||
165 | * | ||
166 | * If it successfully gets the lock, it should increment | ||
167 | * the preemption count like any spinlock does. | ||
168 | * | ||
169 | * (This works on UP too - _raw_spin_trylock will never | ||
170 | * return false in that case) | ||
171 | */ | ||
172 | int __lockfunc __reacquire_kernel_lock(void) | ||
173 | { | ||
174 | while (!_raw_spin_trylock(&kernel_flag)) { | ||
175 | if (test_thread_flag(TIF_NEED_RESCHED)) | ||
176 | return -EAGAIN; | ||
177 | cpu_relax(); | ||
178 | } | ||
179 | preempt_disable(); | ||
180 | return 0; | ||
181 | } | ||
182 | |||
183 | void __lockfunc __release_kernel_lock(void) | ||
184 | { | ||
185 | _raw_spin_unlock(&kernel_flag); | ||
186 | preempt_enable_no_resched(); | ||
187 | } | ||
188 | |||
189 | /* | ||
190 | * These are the BKL spinlocks - we try to be polite about preemption. | ||
191 | * If SMP is not on (ie UP preemption), this all goes away because the | ||
192 | * _raw_spin_trylock() will always succeed. | ||
193 | */ | ||
194 | #ifdef CONFIG_PREEMPT | ||
195 | static inline void __lock_kernel(void) | ||
196 | { | ||
197 | preempt_disable(); | ||
198 | if (unlikely(!_raw_spin_trylock(&kernel_flag))) { | ||
199 | /* | ||
200 | * If preemption was disabled even before this | ||
201 | * was called, there's nothing we can be polite | ||
202 | * about - just spin. | ||
203 | */ | ||
204 | if (preempt_count() > 1) { | ||
205 | _raw_spin_lock(&kernel_flag); | ||
206 | return; | ||
207 | } | ||
208 | |||
209 | /* | ||
210 | * Otherwise, let's wait for the kernel lock | ||
211 | * with preemption enabled.. | ||
212 | */ | ||
213 | do { | ||
214 | preempt_enable(); | ||
215 | while (spin_is_locked(&kernel_flag)) | ||
216 | cpu_relax(); | ||
217 | preempt_disable(); | ||
218 | } while (!_raw_spin_trylock(&kernel_flag)); | ||
219 | } | ||
220 | } | ||
221 | |||
222 | #else | ||
223 | |||
224 | /* | ||
225 | * Non-preemption case - just get the spinlock | ||
226 | */ | ||
227 | static inline void __lock_kernel(void) | ||
228 | { | ||
229 | _raw_spin_lock(&kernel_flag); | ||
230 | } | ||
231 | #endif | ||
232 | |||
233 | static inline void __unlock_kernel(void) | ||
234 | { | ||
235 | _raw_spin_unlock(&kernel_flag); | ||
236 | preempt_enable(); | ||
237 | } | ||
238 | |||
239 | /* | ||
240 | * Getting the big kernel lock. | ||
241 | * | ||
242 | * This cannot happen asynchronously, so we only need to | ||
243 | * worry about other CPU's. | ||
244 | */ | ||
245 | void __lockfunc lock_kernel(void) | ||
246 | { | ||
247 | int depth = current->lock_depth+1; | ||
248 | if (likely(!depth)) | ||
249 | __lock_kernel(); | ||
250 | current->lock_depth = depth; | ||
251 | } | ||
252 | |||
253 | void __lockfunc unlock_kernel(void) | ||
254 | { | ||
255 | BUG_ON(current->lock_depth < 0); | ||
256 | if (likely(--current->lock_depth < 0)) | ||
257 | __unlock_kernel(); | ||
258 | } | ||
259 | |||
260 | #endif | ||
261 | |||
262 | EXPORT_SYMBOL(lock_kernel); | ||
263 | EXPORT_SYMBOL(unlock_kernel); | ||
264 | |||
diff --git a/lib/kobject.c b/lib/kobject.c new file mode 100644 index 000000000000..ff9491986b38 --- /dev/null +++ b/lib/kobject.c | |||
@@ -0,0 +1,544 @@ | |||
1 | /* | ||
2 | * kobject.c - library routines for handling generic kernel objects | ||
3 | * | ||
4 | * Copyright (c) 2002-2003 Patrick Mochel <mochel@osdl.org> | ||
5 | * | ||
6 | * This file is released under the GPLv2. | ||
7 | * | ||
8 | * | ||
9 | * Please see the file Documentation/kobject.txt for critical information | ||
10 | * about using the kobject interface. | ||
11 | */ | ||
12 | |||
13 | #include <linux/kobject.h> | ||
14 | #include <linux/string.h> | ||
15 | #include <linux/module.h> | ||
16 | #include <linux/stat.h> | ||
17 | |||
18 | /** | ||
19 | * populate_dir - populate directory with attributes. | ||
20 | * @kobj: object we're working on. | ||
21 | * | ||
22 | * Most subsystems have a set of default attributes that | ||
23 | * are associated with an object that registers with them. | ||
24 | * This is a helper called during object registration that | ||
25 | * loops through the default attributes of the subsystem | ||
26 | * and creates attributes files for them in sysfs. | ||
27 | * | ||
28 | */ | ||
29 | |||
30 | static int populate_dir(struct kobject * kobj) | ||
31 | { | ||
32 | struct kobj_type * t = get_ktype(kobj); | ||
33 | struct attribute * attr; | ||
34 | int error = 0; | ||
35 | int i; | ||
36 | |||
37 | if (t && t->default_attrs) { | ||
38 | for (i = 0; (attr = t->default_attrs[i]) != NULL; i++) { | ||
39 | if ((error = sysfs_create_file(kobj,attr))) | ||
40 | break; | ||
41 | } | ||
42 | } | ||
43 | return error; | ||
44 | } | ||
45 | |||
46 | static int create_dir(struct kobject * kobj) | ||
47 | { | ||
48 | int error = 0; | ||
49 | if (kobject_name(kobj)) { | ||
50 | error = sysfs_create_dir(kobj); | ||
51 | if (!error) { | ||
52 | if ((error = populate_dir(kobj))) | ||
53 | sysfs_remove_dir(kobj); | ||
54 | } | ||
55 | } | ||
56 | return error; | ||
57 | } | ||
58 | |||
59 | static inline struct kobject * to_kobj(struct list_head * entry) | ||
60 | { | ||
61 | return container_of(entry,struct kobject,entry); | ||
62 | } | ||
63 | |||
64 | static int get_kobj_path_length(struct kobject *kobj) | ||
65 | { | ||
66 | int length = 1; | ||
67 | struct kobject * parent = kobj; | ||
68 | |||
69 | /* walk up the ancestors until we hit the one pointing to the | ||
70 | * root. | ||
71 | * Add 1 to strlen for leading '/' of each level. | ||
72 | */ | ||
73 | do { | ||
74 | length += strlen(kobject_name(parent)) + 1; | ||
75 | parent = parent->parent; | ||
76 | } while (parent); | ||
77 | return length; | ||
78 | } | ||
79 | |||
80 | static void fill_kobj_path(struct kobject *kobj, char *path, int length) | ||
81 | { | ||
82 | struct kobject * parent; | ||
83 | |||
84 | --length; | ||
85 | for (parent = kobj; parent; parent = parent->parent) { | ||
86 | int cur = strlen(kobject_name(parent)); | ||
87 | /* back up enough to print this name with '/' */ | ||
88 | length -= cur; | ||
89 | strncpy (path + length, kobject_name(parent), cur); | ||
90 | *(path + --length) = '/'; | ||
91 | } | ||
92 | |||
93 | pr_debug("%s: path = '%s'\n",__FUNCTION__,path); | ||
94 | } | ||
95 | |||
96 | /** | ||
97 | * kobject_get_path - generate and return the path associated with a given kobj | ||
98 | * and kset pair. The result must be freed by the caller with kfree(). | ||
99 | * | ||
100 | * @kobj: kobject in question, with which to build the path | ||
101 | * @gfp_mask: the allocation type used to allocate the path | ||
102 | */ | ||
103 | char *kobject_get_path(struct kobject *kobj, int gfp_mask) | ||
104 | { | ||
105 | char *path; | ||
106 | int len; | ||
107 | |||
108 | len = get_kobj_path_length(kobj); | ||
109 | path = kmalloc(len, gfp_mask); | ||
110 | if (!path) | ||
111 | return NULL; | ||
112 | memset(path, 0x00, len); | ||
113 | fill_kobj_path(kobj, path, len); | ||
114 | |||
115 | return path; | ||
116 | } | ||
117 | |||
118 | /** | ||
119 | * kobject_init - initialize object. | ||
120 | * @kobj: object in question. | ||
121 | */ | ||
122 | void kobject_init(struct kobject * kobj) | ||
123 | { | ||
124 | kref_init(&kobj->kref); | ||
125 | INIT_LIST_HEAD(&kobj->entry); | ||
126 | kobj->kset = kset_get(kobj->kset); | ||
127 | } | ||
128 | |||
129 | |||
130 | /** | ||
131 | * unlink - remove kobject from kset list. | ||
132 | * @kobj: kobject. | ||
133 | * | ||
134 | * Remove the kobject from the kset list and decrement | ||
135 | * its parent's refcount. | ||
136 | * This is separated out, so we can use it in both | ||
137 | * kobject_del() and kobject_add() on error. | ||
138 | */ | ||
139 | |||
140 | static void unlink(struct kobject * kobj) | ||
141 | { | ||
142 | if (kobj->kset) { | ||
143 | spin_lock(&kobj->kset->list_lock); | ||
144 | list_del_init(&kobj->entry); | ||
145 | spin_unlock(&kobj->kset->list_lock); | ||
146 | } | ||
147 | kobject_put(kobj); | ||
148 | } | ||
149 | |||
150 | /** | ||
151 | * kobject_add - add an object to the hierarchy. | ||
152 | * @kobj: object. | ||
153 | */ | ||
154 | |||
155 | int kobject_add(struct kobject * kobj) | ||
156 | { | ||
157 | int error = 0; | ||
158 | struct kobject * parent; | ||
159 | |||
160 | if (!(kobj = kobject_get(kobj))) | ||
161 | return -ENOENT; | ||
162 | if (!kobj->k_name) | ||
163 | kobj->k_name = kobj->name; | ||
164 | parent = kobject_get(kobj->parent); | ||
165 | |||
166 | pr_debug("kobject %s: registering. parent: %s, set: %s\n", | ||
167 | kobject_name(kobj), parent ? kobject_name(parent) : "<NULL>", | ||
168 | kobj->kset ? kobj->kset->kobj.name : "<NULL>" ); | ||
169 | |||
170 | if (kobj->kset) { | ||
171 | spin_lock(&kobj->kset->list_lock); | ||
172 | |||
173 | if (!parent) | ||
174 | parent = kobject_get(&kobj->kset->kobj); | ||
175 | |||
176 | list_add_tail(&kobj->entry,&kobj->kset->list); | ||
177 | spin_unlock(&kobj->kset->list_lock); | ||
178 | } | ||
179 | kobj->parent = parent; | ||
180 | |||
181 | error = create_dir(kobj); | ||
182 | if (error) { | ||
183 | /* unlink does the kobject_put() for us */ | ||
184 | unlink(kobj); | ||
185 | if (parent) | ||
186 | kobject_put(parent); | ||
187 | } else { | ||
188 | kobject_hotplug(kobj, KOBJ_ADD); | ||
189 | } | ||
190 | |||
191 | return error; | ||
192 | } | ||
193 | |||
194 | |||
195 | /** | ||
196 | * kobject_register - initialize and add an object. | ||
197 | * @kobj: object in question. | ||
198 | */ | ||
199 | |||
200 | int kobject_register(struct kobject * kobj) | ||
201 | { | ||
202 | int error = 0; | ||
203 | if (kobj) { | ||
204 | kobject_init(kobj); | ||
205 | error = kobject_add(kobj); | ||
206 | if (error) { | ||
207 | printk("kobject_register failed for %s (%d)\n", | ||
208 | kobject_name(kobj),error); | ||
209 | dump_stack(); | ||
210 | } | ||
211 | } else | ||
212 | error = -EINVAL; | ||
213 | return error; | ||
214 | } | ||
215 | |||
216 | |||
217 | /** | ||
218 | * kobject_set_name - Set the name of an object | ||
219 | * @kobj: object. | ||
220 | * @name: name. | ||
221 | * | ||
222 | * If strlen(name) >= KOBJ_NAME_LEN, then use a dynamically allocated | ||
223 | * string that @kobj->k_name points to. Otherwise, use the static | ||
224 | * @kobj->name array. | ||
225 | */ | ||
226 | |||
227 | int kobject_set_name(struct kobject * kobj, const char * fmt, ...) | ||
228 | { | ||
229 | int error = 0; | ||
230 | int limit = KOBJ_NAME_LEN; | ||
231 | int need; | ||
232 | va_list args; | ||
233 | char * name; | ||
234 | |||
235 | /* | ||
236 | * First, try the static array | ||
237 | */ | ||
238 | va_start(args,fmt); | ||
239 | need = vsnprintf(kobj->name,limit,fmt,args); | ||
240 | va_end(args); | ||
241 | if (need < limit) | ||
242 | name = kobj->name; | ||
243 | else { | ||
244 | /* | ||
245 | * Need more space? Allocate it and try again | ||
246 | */ | ||
247 | limit = need + 1; | ||
248 | name = kmalloc(limit,GFP_KERNEL); | ||
249 | if (!name) { | ||
250 | error = -ENOMEM; | ||
251 | goto Done; | ||
252 | } | ||
253 | va_start(args,fmt); | ||
254 | need = vsnprintf(name,limit,fmt,args); | ||
255 | va_end(args); | ||
256 | |||
257 | /* Still? Give up. */ | ||
258 | if (need >= limit) { | ||
259 | kfree(name); | ||
260 | error = -EFAULT; | ||
261 | goto Done; | ||
262 | } | ||
263 | } | ||
264 | |||
265 | /* Free the old name, if necessary. */ | ||
266 | if (kobj->k_name && kobj->k_name != kobj->name) | ||
267 | kfree(kobj->k_name); | ||
268 | |||
269 | /* Now, set the new name */ | ||
270 | kobj->k_name = name; | ||
271 | Done: | ||
272 | return error; | ||
273 | } | ||
274 | |||
275 | EXPORT_SYMBOL(kobject_set_name); | ||
276 | |||
277 | |||
278 | /** | ||
279 | * kobject_rename - change the name of an object | ||
280 | * @kobj: object in question. | ||
281 | * @new_name: object's new name | ||
282 | */ | ||
283 | |||
284 | int kobject_rename(struct kobject * kobj, char *new_name) | ||
285 | { | ||
286 | int error = 0; | ||
287 | |||
288 | kobj = kobject_get(kobj); | ||
289 | if (!kobj) | ||
290 | return -EINVAL; | ||
291 | error = sysfs_rename_dir(kobj, new_name); | ||
292 | kobject_put(kobj); | ||
293 | |||
294 | return error; | ||
295 | } | ||
296 | |||
297 | /** | ||
298 | * kobject_del - unlink kobject from hierarchy. | ||
299 | * @kobj: object. | ||
300 | */ | ||
301 | |||
302 | void kobject_del(struct kobject * kobj) | ||
303 | { | ||
304 | kobject_hotplug(kobj, KOBJ_REMOVE); | ||
305 | sysfs_remove_dir(kobj); | ||
306 | unlink(kobj); | ||
307 | } | ||
308 | |||
309 | /** | ||
310 | * kobject_unregister - remove object from hierarchy and decrement refcount. | ||
311 | * @kobj: object going away. | ||
312 | */ | ||
313 | |||
314 | void kobject_unregister(struct kobject * kobj) | ||
315 | { | ||
316 | pr_debug("kobject %s: unregistering\n",kobject_name(kobj)); | ||
317 | kobject_del(kobj); | ||
318 | kobject_put(kobj); | ||
319 | } | ||
320 | |||
321 | /** | ||
322 | * kobject_get - increment refcount for object. | ||
323 | * @kobj: object. | ||
324 | */ | ||
325 | |||
326 | struct kobject * kobject_get(struct kobject * kobj) | ||
327 | { | ||
328 | if (kobj) | ||
329 | kref_get(&kobj->kref); | ||
330 | return kobj; | ||
331 | } | ||
332 | |||
333 | /** | ||
334 | * kobject_cleanup - free kobject resources. | ||
335 | * @kobj: object. | ||
336 | */ | ||
337 | |||
338 | void kobject_cleanup(struct kobject * kobj) | ||
339 | { | ||
340 | struct kobj_type * t = get_ktype(kobj); | ||
341 | struct kset * s = kobj->kset; | ||
342 | struct kobject * parent = kobj->parent; | ||
343 | |||
344 | pr_debug("kobject %s: cleaning up\n",kobject_name(kobj)); | ||
345 | if (kobj->k_name != kobj->name) | ||
346 | kfree(kobj->k_name); | ||
347 | kobj->k_name = NULL; | ||
348 | if (t && t->release) | ||
349 | t->release(kobj); | ||
350 | if (s) | ||
351 | kset_put(s); | ||
352 | if (parent) | ||
353 | kobject_put(parent); | ||
354 | } | ||
355 | |||
356 | static void kobject_release(struct kref *kref) | ||
357 | { | ||
358 | kobject_cleanup(container_of(kref, struct kobject, kref)); | ||
359 | } | ||
360 | |||
361 | /** | ||
362 | * kobject_put - decrement refcount for object. | ||
363 | * @kobj: object. | ||
364 | * | ||
365 | * Decrement the refcount, and if 0, call kobject_cleanup(). | ||
366 | */ | ||
367 | void kobject_put(struct kobject * kobj) | ||
368 | { | ||
369 | if (kobj) | ||
370 | kref_put(&kobj->kref, kobject_release); | ||
371 | } | ||
372 | |||
373 | |||
374 | /** | ||
375 | * kset_init - initialize a kset for use | ||
376 | * @k: kset | ||
377 | */ | ||
378 | |||
379 | void kset_init(struct kset * k) | ||
380 | { | ||
381 | kobject_init(&k->kobj); | ||
382 | INIT_LIST_HEAD(&k->list); | ||
383 | spin_lock_init(&k->list_lock); | ||
384 | } | ||
385 | |||
386 | |||
387 | /** | ||
388 | * kset_add - add a kset object to the hierarchy. | ||
389 | * @k: kset. | ||
390 | * | ||
391 | * Simply, this adds the kset's embedded kobject to the | ||
392 | * hierarchy. | ||
393 | * We also try to make sure that the kset's embedded kobject | ||
394 | * has a parent before it is added. We only care if the embedded | ||
395 | * kobject is not part of a kset itself, since kobject_add() | ||
396 | * assigns a parent in that case. | ||
397 | * If that is the case, and the kset has a controlling subsystem, | ||
398 | * then we set the kset's parent to be said subsystem. | ||
399 | */ | ||
400 | |||
401 | int kset_add(struct kset * k) | ||
402 | { | ||
403 | if (!k->kobj.parent && !k->kobj.kset && k->subsys) | ||
404 | k->kobj.parent = &k->subsys->kset.kobj; | ||
405 | |||
406 | return kobject_add(&k->kobj); | ||
407 | } | ||
408 | |||
409 | |||
410 | /** | ||
411 | * kset_register - initialize and add a kset. | ||
412 | * @k: kset. | ||
413 | */ | ||
414 | |||
415 | int kset_register(struct kset * k) | ||
416 | { | ||
417 | kset_init(k); | ||
418 | return kset_add(k); | ||
419 | } | ||
420 | |||
421 | |||
422 | /** | ||
423 | * kset_unregister - remove a kset. | ||
424 | * @k: kset. | ||
425 | */ | ||
426 | |||
427 | void kset_unregister(struct kset * k) | ||
428 | { | ||
429 | kobject_unregister(&k->kobj); | ||
430 | } | ||
431 | |||
432 | |||
433 | /** | ||
434 | * kset_find_obj - search for object in kset. | ||
435 | * @kset: kset we're looking in. | ||
436 | * @name: object's name. | ||
437 | * | ||
438 | * Lock kset via @kset->subsys, and iterate over @kset->list, | ||
439 | * looking for a matching kobject. If matching object is found | ||
440 | * take a reference and return the object. | ||
441 | */ | ||
442 | |||
443 | struct kobject * kset_find_obj(struct kset * kset, const char * name) | ||
444 | { | ||
445 | struct list_head * entry; | ||
446 | struct kobject * ret = NULL; | ||
447 | |||
448 | spin_lock(&kset->list_lock); | ||
449 | list_for_each(entry,&kset->list) { | ||
450 | struct kobject * k = to_kobj(entry); | ||
451 | if (kobject_name(k) && !strcmp(kobject_name(k),name)) { | ||
452 | ret = kobject_get(k); | ||
453 | break; | ||
454 | } | ||
455 | } | ||
456 | spin_unlock(&kset->list_lock); | ||
457 | return ret; | ||
458 | } | ||
459 | |||
460 | |||
461 | void subsystem_init(struct subsystem * s) | ||
462 | { | ||
463 | init_rwsem(&s->rwsem); | ||
464 | kset_init(&s->kset); | ||
465 | } | ||
466 | |||
467 | /** | ||
468 | * subsystem_register - register a subsystem. | ||
469 | * @s: the subsystem we're registering. | ||
470 | * | ||
471 | * Once we register the subsystem, we want to make sure that | ||
472 | * the kset points back to this subsystem for correct usage of | ||
473 | * the rwsem. | ||
474 | */ | ||
475 | |||
476 | int subsystem_register(struct subsystem * s) | ||
477 | { | ||
478 | int error; | ||
479 | |||
480 | subsystem_init(s); | ||
481 | pr_debug("subsystem %s: registering\n",s->kset.kobj.name); | ||
482 | |||
483 | if (!(error = kset_add(&s->kset))) { | ||
484 | if (!s->kset.subsys) | ||
485 | s->kset.subsys = s; | ||
486 | } | ||
487 | return error; | ||
488 | } | ||
489 | |||
490 | void subsystem_unregister(struct subsystem * s) | ||
491 | { | ||
492 | pr_debug("subsystem %s: unregistering\n",s->kset.kobj.name); | ||
493 | kset_unregister(&s->kset); | ||
494 | } | ||
495 | |||
496 | |||
497 | /** | ||
498 | * subsystem_create_file - export sysfs attribute file. | ||
499 | * @s: subsystem. | ||
500 | * @a: subsystem attribute descriptor. | ||
501 | */ | ||
502 | |||
503 | int subsys_create_file(struct subsystem * s, struct subsys_attribute * a) | ||
504 | { | ||
505 | int error = 0; | ||
506 | if (subsys_get(s)) { | ||
507 | error = sysfs_create_file(&s->kset.kobj,&a->attr); | ||
508 | subsys_put(s); | ||
509 | } | ||
510 | return error; | ||
511 | } | ||
512 | |||
513 | |||
514 | /** | ||
515 | * subsystem_remove_file - remove sysfs attribute file. | ||
516 | * @s: subsystem. | ||
517 | * @a: attribute desciptor. | ||
518 | */ | ||
519 | |||
520 | void subsys_remove_file(struct subsystem * s, struct subsys_attribute * a) | ||
521 | { | ||
522 | if (subsys_get(s)) { | ||
523 | sysfs_remove_file(&s->kset.kobj,&a->attr); | ||
524 | subsys_put(s); | ||
525 | } | ||
526 | } | ||
527 | |||
528 | EXPORT_SYMBOL(kobject_init); | ||
529 | EXPORT_SYMBOL(kobject_register); | ||
530 | EXPORT_SYMBOL(kobject_unregister); | ||
531 | EXPORT_SYMBOL(kobject_get); | ||
532 | EXPORT_SYMBOL(kobject_put); | ||
533 | EXPORT_SYMBOL(kobject_add); | ||
534 | EXPORT_SYMBOL(kobject_del); | ||
535 | |||
536 | EXPORT_SYMBOL(kset_register); | ||
537 | EXPORT_SYMBOL(kset_unregister); | ||
538 | EXPORT_SYMBOL(kset_find_obj); | ||
539 | |||
540 | EXPORT_SYMBOL(subsystem_init); | ||
541 | EXPORT_SYMBOL(subsystem_register); | ||
542 | EXPORT_SYMBOL(subsystem_unregister); | ||
543 | EXPORT_SYMBOL(subsys_create_file); | ||
544 | EXPORT_SYMBOL(subsys_remove_file); | ||
diff --git a/lib/kobject_uevent.c b/lib/kobject_uevent.c new file mode 100644 index 000000000000..2a4e7671eaf4 --- /dev/null +++ b/lib/kobject_uevent.c | |||
@@ -0,0 +1,369 @@ | |||
1 | /* | ||
2 | * kernel userspace event delivery | ||
3 | * | ||
4 | * Copyright (C) 2004 Red Hat, Inc. All rights reserved. | ||
5 | * Copyright (C) 2004 Novell, Inc. All rights reserved. | ||
6 | * Copyright (C) 2004 IBM, Inc. All rights reserved. | ||
7 | * | ||
8 | * Licensed under the GNU GPL v2. | ||
9 | * | ||
10 | * Authors: | ||
11 | * Robert Love <rml@novell.com> | ||
12 | * Kay Sievers <kay.sievers@vrfy.org> | ||
13 | * Arjan van de Ven <arjanv@redhat.com> | ||
14 | * Greg Kroah-Hartman <greg@kroah.com> | ||
15 | */ | ||
16 | |||
17 | #include <linux/spinlock.h> | ||
18 | #include <linux/socket.h> | ||
19 | #include <linux/skbuff.h> | ||
20 | #include <linux/netlink.h> | ||
21 | #include <linux/string.h> | ||
22 | #include <linux/kobject_uevent.h> | ||
23 | #include <linux/kobject.h> | ||
24 | #include <net/sock.h> | ||
25 | |||
26 | #define BUFFER_SIZE 1024 /* buffer for the hotplug env */ | ||
27 | #define NUM_ENVP 32 /* number of env pointers */ | ||
28 | |||
29 | #if defined(CONFIG_KOBJECT_UEVENT) || defined(CONFIG_HOTPLUG) | ||
30 | static char *action_to_string(enum kobject_action action) | ||
31 | { | ||
32 | switch (action) { | ||
33 | case KOBJ_ADD: | ||
34 | return "add"; | ||
35 | case KOBJ_REMOVE: | ||
36 | return "remove"; | ||
37 | case KOBJ_CHANGE: | ||
38 | return "change"; | ||
39 | case KOBJ_MOUNT: | ||
40 | return "mount"; | ||
41 | case KOBJ_UMOUNT: | ||
42 | return "umount"; | ||
43 | case KOBJ_OFFLINE: | ||
44 | return "offline"; | ||
45 | case KOBJ_ONLINE: | ||
46 | return "online"; | ||
47 | default: | ||
48 | return NULL; | ||
49 | } | ||
50 | } | ||
51 | #endif | ||
52 | |||
53 | #ifdef CONFIG_KOBJECT_UEVENT | ||
54 | static struct sock *uevent_sock; | ||
55 | |||
56 | /** | ||
57 | * send_uevent - notify userspace by sending event trough netlink socket | ||
58 | * | ||
59 | * @signal: signal name | ||
60 | * @obj: object path (kobject) | ||
61 | * @envp: possible hotplug environment to pass with the message | ||
62 | * @gfp_mask: | ||
63 | */ | ||
64 | static int send_uevent(const char *signal, const char *obj, | ||
65 | char **envp, int gfp_mask) | ||
66 | { | ||
67 | struct sk_buff *skb; | ||
68 | char *pos; | ||
69 | int len; | ||
70 | |||
71 | if (!uevent_sock) | ||
72 | return -EIO; | ||
73 | |||
74 | len = strlen(signal) + 1; | ||
75 | len += strlen(obj) + 1; | ||
76 | |||
77 | /* allocate buffer with the maximum possible message size */ | ||
78 | skb = alloc_skb(len + BUFFER_SIZE, gfp_mask); | ||
79 | if (!skb) | ||
80 | return -ENOMEM; | ||
81 | |||
82 | pos = skb_put(skb, len); | ||
83 | sprintf(pos, "%s@%s", signal, obj); | ||
84 | |||
85 | /* copy the environment key by key to our continuous buffer */ | ||
86 | if (envp) { | ||
87 | int i; | ||
88 | |||
89 | for (i = 2; envp[i]; i++) { | ||
90 | len = strlen(envp[i]) + 1; | ||
91 | pos = skb_put(skb, len); | ||
92 | strcpy(pos, envp[i]); | ||
93 | } | ||
94 | } | ||
95 | |||
96 | return netlink_broadcast(uevent_sock, skb, 0, 1, gfp_mask); | ||
97 | } | ||
98 | |||
99 | static int do_kobject_uevent(struct kobject *kobj, enum kobject_action action, | ||
100 | struct attribute *attr, int gfp_mask) | ||
101 | { | ||
102 | char *path; | ||
103 | char *attrpath; | ||
104 | char *signal; | ||
105 | int len; | ||
106 | int rc = -ENOMEM; | ||
107 | |||
108 | path = kobject_get_path(kobj, gfp_mask); | ||
109 | if (!path) | ||
110 | return -ENOMEM; | ||
111 | |||
112 | signal = action_to_string(action); | ||
113 | if (!signal) | ||
114 | return -EINVAL; | ||
115 | |||
116 | if (attr) { | ||
117 | len = strlen(path); | ||
118 | len += strlen(attr->name) + 2; | ||
119 | attrpath = kmalloc(len, gfp_mask); | ||
120 | if (!attrpath) | ||
121 | goto exit; | ||
122 | sprintf(attrpath, "%s/%s", path, attr->name); | ||
123 | rc = send_uevent(signal, attrpath, NULL, gfp_mask); | ||
124 | kfree(attrpath); | ||
125 | } else | ||
126 | rc = send_uevent(signal, path, NULL, gfp_mask); | ||
127 | |||
128 | exit: | ||
129 | kfree(path); | ||
130 | return rc; | ||
131 | } | ||
132 | |||
133 | /** | ||
134 | * kobject_uevent - notify userspace by sending event through netlink socket | ||
135 | * | ||
136 | * @signal: signal name | ||
137 | * @kobj: struct kobject that the event is happening to | ||
138 | * @attr: optional struct attribute the event belongs to | ||
139 | */ | ||
140 | int kobject_uevent(struct kobject *kobj, enum kobject_action action, | ||
141 | struct attribute *attr) | ||
142 | { | ||
143 | return do_kobject_uevent(kobj, action, attr, GFP_KERNEL); | ||
144 | } | ||
145 | EXPORT_SYMBOL_GPL(kobject_uevent); | ||
146 | |||
147 | int kobject_uevent_atomic(struct kobject *kobj, enum kobject_action action, | ||
148 | struct attribute *attr) | ||
149 | { | ||
150 | return do_kobject_uevent(kobj, action, attr, GFP_ATOMIC); | ||
151 | } | ||
152 | EXPORT_SYMBOL_GPL(kobject_uevent_atomic); | ||
153 | |||
154 | static int __init kobject_uevent_init(void) | ||
155 | { | ||
156 | uevent_sock = netlink_kernel_create(NETLINK_KOBJECT_UEVENT, NULL); | ||
157 | |||
158 | if (!uevent_sock) { | ||
159 | printk(KERN_ERR | ||
160 | "kobject_uevent: unable to create netlink socket!\n"); | ||
161 | return -ENODEV; | ||
162 | } | ||
163 | |||
164 | return 0; | ||
165 | } | ||
166 | |||
167 | postcore_initcall(kobject_uevent_init); | ||
168 | |||
169 | #else | ||
170 | static inline int send_uevent(const char *signal, const char *obj, | ||
171 | char **envp, int gfp_mask) | ||
172 | { | ||
173 | return 0; | ||
174 | } | ||
175 | |||
176 | #endif /* CONFIG_KOBJECT_UEVENT */ | ||
177 | |||
178 | |||
179 | #ifdef CONFIG_HOTPLUG | ||
180 | char hotplug_path[HOTPLUG_PATH_LEN] = "/sbin/hotplug"; | ||
181 | u64 hotplug_seqnum; | ||
182 | static DEFINE_SPINLOCK(sequence_lock); | ||
183 | |||
184 | /** | ||
185 | * kobject_hotplug - notify userspace by executing /sbin/hotplug | ||
186 | * | ||
187 | * @action: action that is happening (usually "ADD" or "REMOVE") | ||
188 | * @kobj: struct kobject that the action is happening to | ||
189 | */ | ||
190 | void kobject_hotplug(struct kobject *kobj, enum kobject_action action) | ||
191 | { | ||
192 | char *argv [3]; | ||
193 | char **envp = NULL; | ||
194 | char *buffer = NULL; | ||
195 | char *seq_buff; | ||
196 | char *scratch; | ||
197 | int i = 0; | ||
198 | int retval; | ||
199 | char *kobj_path = NULL; | ||
200 | char *name = NULL; | ||
201 | char *action_string; | ||
202 | u64 seq; | ||
203 | struct kobject *top_kobj = kobj; | ||
204 | struct kset *kset; | ||
205 | static struct kset_hotplug_ops null_hotplug_ops; | ||
206 | struct kset_hotplug_ops *hotplug_ops = &null_hotplug_ops; | ||
207 | |||
208 | /* If this kobj does not belong to a kset, | ||
209 | try to find a parent that does. */ | ||
210 | if (!top_kobj->kset && top_kobj->parent) { | ||
211 | do { | ||
212 | top_kobj = top_kobj->parent; | ||
213 | } while (!top_kobj->kset && top_kobj->parent); | ||
214 | } | ||
215 | |||
216 | if (top_kobj->kset) | ||
217 | kset = top_kobj->kset; | ||
218 | else | ||
219 | return; | ||
220 | |||
221 | if (kset->hotplug_ops) | ||
222 | hotplug_ops = kset->hotplug_ops; | ||
223 | |||
224 | /* If the kset has a filter operation, call it. | ||
225 | Skip the event, if the filter returns zero. */ | ||
226 | if (hotplug_ops->filter) { | ||
227 | if (!hotplug_ops->filter(kset, kobj)) | ||
228 | return; | ||
229 | } | ||
230 | |||
231 | pr_debug ("%s\n", __FUNCTION__); | ||
232 | |||
233 | action_string = action_to_string(action); | ||
234 | if (!action_string) | ||
235 | return; | ||
236 | |||
237 | envp = kmalloc(NUM_ENVP * sizeof (char *), GFP_KERNEL); | ||
238 | if (!envp) | ||
239 | return; | ||
240 | memset (envp, 0x00, NUM_ENVP * sizeof (char *)); | ||
241 | |||
242 | buffer = kmalloc(BUFFER_SIZE, GFP_KERNEL); | ||
243 | if (!buffer) | ||
244 | goto exit; | ||
245 | |||
246 | if (hotplug_ops->name) | ||
247 | name = hotplug_ops->name(kset, kobj); | ||
248 | if (name == NULL) | ||
249 | name = kset->kobj.name; | ||
250 | |||
251 | argv [0] = hotplug_path; | ||
252 | argv [1] = name; | ||
253 | argv [2] = NULL; | ||
254 | |||
255 | /* minimal command environment */ | ||
256 | envp [i++] = "HOME=/"; | ||
257 | envp [i++] = "PATH=/sbin:/bin:/usr/sbin:/usr/bin"; | ||
258 | |||
259 | scratch = buffer; | ||
260 | |||
261 | envp [i++] = scratch; | ||
262 | scratch += sprintf(scratch, "ACTION=%s", action_string) + 1; | ||
263 | |||
264 | kobj_path = kobject_get_path(kobj, GFP_KERNEL); | ||
265 | if (!kobj_path) | ||
266 | goto exit; | ||
267 | |||
268 | envp [i++] = scratch; | ||
269 | scratch += sprintf (scratch, "DEVPATH=%s", kobj_path) + 1; | ||
270 | |||
271 | envp [i++] = scratch; | ||
272 | scratch += sprintf(scratch, "SUBSYSTEM=%s", name) + 1; | ||
273 | |||
274 | /* reserve space for the sequence, | ||
275 | * put the real one in after the hotplug call */ | ||
276 | envp[i++] = seq_buff = scratch; | ||
277 | scratch += strlen("SEQNUM=18446744073709551616") + 1; | ||
278 | |||
279 | if (hotplug_ops->hotplug) { | ||
280 | /* have the kset specific function add its stuff */ | ||
281 | retval = hotplug_ops->hotplug (kset, kobj, | ||
282 | &envp[i], NUM_ENVP - i, scratch, | ||
283 | BUFFER_SIZE - (scratch - buffer)); | ||
284 | if (retval) { | ||
285 | pr_debug ("%s - hotplug() returned %d\n", | ||
286 | __FUNCTION__, retval); | ||
287 | goto exit; | ||
288 | } | ||
289 | } | ||
290 | |||
291 | spin_lock(&sequence_lock); | ||
292 | seq = ++hotplug_seqnum; | ||
293 | spin_unlock(&sequence_lock); | ||
294 | sprintf(seq_buff, "SEQNUM=%llu", (unsigned long long)seq); | ||
295 | |||
296 | pr_debug ("%s: %s %s seq=%llu %s %s %s %s %s\n", | ||
297 | __FUNCTION__, argv[0], argv[1], (unsigned long long)seq, | ||
298 | envp[0], envp[1], envp[2], envp[3], envp[4]); | ||
299 | |||
300 | send_uevent(action_string, kobj_path, envp, GFP_KERNEL); | ||
301 | |||
302 | if (!hotplug_path[0]) | ||
303 | goto exit; | ||
304 | |||
305 | retval = call_usermodehelper (argv[0], argv, envp, 0); | ||
306 | if (retval) | ||
307 | pr_debug ("%s - call_usermodehelper returned %d\n", | ||
308 | __FUNCTION__, retval); | ||
309 | |||
310 | exit: | ||
311 | kfree(kobj_path); | ||
312 | kfree(buffer); | ||
313 | kfree(envp); | ||
314 | return; | ||
315 | } | ||
316 | EXPORT_SYMBOL(kobject_hotplug); | ||
317 | |||
318 | /** | ||
319 | * add_hotplug_env_var - helper for creating hotplug environment variables | ||
320 | * @envp: Pointer to table of environment variables, as passed into | ||
321 | * hotplug() method. | ||
322 | * @num_envp: Number of environment variable slots available, as | ||
323 | * passed into hotplug() method. | ||
324 | * @cur_index: Pointer to current index into @envp. It should be | ||
325 | * initialized to 0 before the first call to add_hotplug_env_var(), | ||
326 | * and will be incremented on success. | ||
327 | * @buffer: Pointer to buffer for environment variables, as passed | ||
328 | * into hotplug() method. | ||
329 | * @buffer_size: Length of @buffer, as passed into hotplug() method. | ||
330 | * @cur_len: Pointer to current length of space used in @buffer. | ||
331 | * Should be initialized to 0 before the first call to | ||
332 | * add_hotplug_env_var(), and will be incremented on success. | ||
333 | * @format: Format for creating environment variable (of the form | ||
334 | * "XXX=%x") for snprintf(). | ||
335 | * | ||
336 | * Returns 0 if environment variable was added successfully or -ENOMEM | ||
337 | * if no space was available. | ||
338 | */ | ||
339 | int add_hotplug_env_var(char **envp, int num_envp, int *cur_index, | ||
340 | char *buffer, int buffer_size, int *cur_len, | ||
341 | const char *format, ...) | ||
342 | { | ||
343 | va_list args; | ||
344 | |||
345 | /* | ||
346 | * We check against num_envp - 1 to make sure there is at | ||
347 | * least one slot left after we return, since the hotplug | ||
348 | * method needs to set the last slot to NULL. | ||
349 | */ | ||
350 | if (*cur_index >= num_envp - 1) | ||
351 | return -ENOMEM; | ||
352 | |||
353 | envp[*cur_index] = buffer + *cur_len; | ||
354 | |||
355 | va_start(args, format); | ||
356 | *cur_len += vsnprintf(envp[*cur_index], | ||
357 | max(buffer_size - *cur_len, 0), | ||
358 | format, args) + 1; | ||
359 | va_end(args); | ||
360 | |||
361 | if (*cur_len > buffer_size) | ||
362 | return -ENOMEM; | ||
363 | |||
364 | (*cur_index)++; | ||
365 | return 0; | ||
366 | } | ||
367 | EXPORT_SYMBOL(add_hotplug_env_var); | ||
368 | |||
369 | #endif /* CONFIG_HOTPLUG */ | ||
diff --git a/lib/kref.c b/lib/kref.c new file mode 100644 index 000000000000..0d07cc31c818 --- /dev/null +++ b/lib/kref.c | |||
@@ -0,0 +1,64 @@ | |||
1 | /* | ||
2 | * kref.c - library routines for handling generic reference counted objects | ||
3 | * | ||
4 | * Copyright (C) 2004 Greg Kroah-Hartman <greg@kroah.com> | ||
5 | * Copyright (C) 2004 IBM Corp. | ||
6 | * | ||
7 | * based on lib/kobject.c which was: | ||
8 | * Copyright (C) 2002-2003 Patrick Mochel <mochel@osdl.org> | ||
9 | * | ||
10 | * This file is released under the GPLv2. | ||
11 | * | ||
12 | */ | ||
13 | |||
14 | #include <linux/kref.h> | ||
15 | #include <linux/module.h> | ||
16 | |||
17 | /** | ||
18 | * kref_init - initialize object. | ||
19 | * @kref: object in question. | ||
20 | */ | ||
21 | void kref_init(struct kref *kref) | ||
22 | { | ||
23 | atomic_set(&kref->refcount,1); | ||
24 | } | ||
25 | |||
26 | /** | ||
27 | * kref_get - increment refcount for object. | ||
28 | * @kref: object. | ||
29 | */ | ||
30 | void kref_get(struct kref *kref) | ||
31 | { | ||
32 | WARN_ON(!atomic_read(&kref->refcount)); | ||
33 | atomic_inc(&kref->refcount); | ||
34 | } | ||
35 | |||
36 | /** | ||
37 | * kref_put - decrement refcount for object. | ||
38 | * @kref: object. | ||
39 | * @release: pointer to the function that will clean up the object when the | ||
40 | * last reference to the object is released. | ||
41 | * This pointer is required, and it is not acceptable to pass kfree | ||
42 | * in as this function. | ||
43 | * | ||
44 | * Decrement the refcount, and if 0, call release(). | ||
45 | * Return 1 if the object was removed, otherwise return 0. Beware, if this | ||
46 | * function returns 0, you still can not count on the kref from remaining in | ||
47 | * memory. Only use the return value if you want to see if the kref is now | ||
48 | * gone, not present. | ||
49 | */ | ||
50 | int kref_put(struct kref *kref, void (*release)(struct kref *kref)) | ||
51 | { | ||
52 | WARN_ON(release == NULL); | ||
53 | WARN_ON(release == (void (*)(struct kref *))kfree); | ||
54 | |||
55 | if (atomic_dec_and_test(&kref->refcount)) { | ||
56 | release(kref); | ||
57 | return 1; | ||
58 | } | ||
59 | return 0; | ||
60 | } | ||
61 | |||
62 | EXPORT_SYMBOL(kref_init); | ||
63 | EXPORT_SYMBOL(kref_get); | ||
64 | EXPORT_SYMBOL(kref_put); | ||
diff --git a/lib/libcrc32c.c b/lib/libcrc32c.c new file mode 100644 index 000000000000..52b6dc144ce3 --- /dev/null +++ b/lib/libcrc32c.c | |||
@@ -0,0 +1,200 @@ | |||
1 | /* | ||
2 | * CRC32C | ||
3 | *@Article{castagnoli-crc, | ||
4 | * author = { Guy Castagnoli and Stefan Braeuer and Martin Herrman}, | ||
5 | * title = {{Optimization of Cyclic Redundancy-Check Codes with 24 | ||
6 | * and 32 Parity Bits}}, | ||
7 | * journal = IEEE Transactions on Communication, | ||
8 | * year = {1993}, | ||
9 | * volume = {41}, | ||
10 | * number = {6}, | ||
11 | * pages = {}, | ||
12 | * month = {June}, | ||
13 | *} | ||
14 | * Used by the iSCSI driver, possibly others, and derived from the | ||
15 | * the iscsi-crc.c module of the linux-iscsi driver at | ||
16 | * http://linux-iscsi.sourceforge.net. | ||
17 | * | ||
18 | * Following the example of lib/crc32, this function is intended to be | ||
19 | * flexible and useful for all users. Modules that currently have their | ||
20 | * own crc32c, but hopefully may be able to use this one are: | ||
21 | * net/sctp (please add all your doco to here if you change to | ||
22 | * use this one!) | ||
23 | * <endoflist> | ||
24 | * | ||
25 | * Copyright (c) 2004 Cisco Systems, Inc. | ||
26 | * | ||
27 | * This program is free software; you can redistribute it and/or modify it | ||
28 | * under the terms of the GNU General Public License as published by the Free | ||
29 | * Software Foundation; either version 2 of the License, or (at your option) | ||
30 | * any later version. | ||
31 | * | ||
32 | */ | ||
33 | #include <linux/crc32c.h> | ||
34 | #include <linux/compiler.h> | ||
35 | #include <linux/module.h> | ||
36 | #include <asm/byteorder.h> | ||
37 | |||
38 | MODULE_AUTHOR("Clay Haapala <chaapala@cisco.com>"); | ||
39 | MODULE_DESCRIPTION("CRC32c (Castagnoli) calculations"); | ||
40 | MODULE_LICENSE("GPL"); | ||
41 | |||
42 | #define CRC32C_POLY_BE 0x1EDC6F41 | ||
43 | #define CRC32C_POLY_LE 0x82F63B78 | ||
44 | |||
45 | #ifndef CRC_LE_BITS | ||
46 | # define CRC_LE_BITS 8 | ||
47 | #endif | ||
48 | |||
49 | |||
50 | /* | ||
51 | * Haven't generated a big-endian table yet, but the bit-wise version | ||
52 | * should at least work. | ||
53 | */ | ||
54 | #if defined CRC_BE_BITS && CRC_BE_BITS != 1 | ||
55 | #undef CRC_BE_BITS | ||
56 | #endif | ||
57 | #ifndef CRC_BE_BITS | ||
58 | # define CRC_BE_BITS 1 | ||
59 | #endif | ||
60 | |||
61 | EXPORT_SYMBOL(crc32c_le); | ||
62 | |||
63 | #if CRC_LE_BITS == 1 | ||
64 | /* | ||
65 | * Compute things bit-wise, as done in crc32.c. We could share the tight | ||
66 | * loop below with crc32 and vary the POLY if we don't find value in terms | ||
67 | * of space and maintainability in keeping the two modules separate. | ||
68 | */ | ||
69 | u32 __attribute_pure__ | ||
70 | crc32c_le(u32 crc, unsigned char const *p, size_t len) | ||
71 | { | ||
72 | int i; | ||
73 | while (len--) { | ||
74 | crc ^= *p++; | ||
75 | for (i = 0; i < 8; i++) | ||
76 | crc = (crc >> 1) ^ ((crc & 1) ? CRC32C_POLY_LE : 0); | ||
77 | } | ||
78 | return crc; | ||
79 | } | ||
80 | #else | ||
81 | |||
82 | /* | ||
83 | * This is the CRC-32C table | ||
84 | * Generated with: | ||
85 | * width = 32 bits | ||
86 | * poly = 0x1EDC6F41 | ||
87 | * reflect input bytes = true | ||
88 | * reflect output bytes = true | ||
89 | */ | ||
90 | |||
91 | static u32 crc32c_table[256] = { | ||
92 | 0x00000000L, 0xF26B8303L, 0xE13B70F7L, 0x1350F3F4L, | ||
93 | 0xC79A971FL, 0x35F1141CL, 0x26A1E7E8L, 0xD4CA64EBL, | ||
94 | 0x8AD958CFL, 0x78B2DBCCL, 0x6BE22838L, 0x9989AB3BL, | ||
95 | 0x4D43CFD0L, 0xBF284CD3L, 0xAC78BF27L, 0x5E133C24L, | ||
96 | 0x105EC76FL, 0xE235446CL, 0xF165B798L, 0x030E349BL, | ||
97 | 0xD7C45070L, 0x25AFD373L, 0x36FF2087L, 0xC494A384L, | ||
98 | 0x9A879FA0L, 0x68EC1CA3L, 0x7BBCEF57L, 0x89D76C54L, | ||
99 | 0x5D1D08BFL, 0xAF768BBCL, 0xBC267848L, 0x4E4DFB4BL, | ||
100 | 0x20BD8EDEL, 0xD2D60DDDL, 0xC186FE29L, 0x33ED7D2AL, | ||
101 | 0xE72719C1L, 0x154C9AC2L, 0x061C6936L, 0xF477EA35L, | ||
102 | 0xAA64D611L, 0x580F5512L, 0x4B5FA6E6L, 0xB93425E5L, | ||
103 | 0x6DFE410EL, 0x9F95C20DL, 0x8CC531F9L, 0x7EAEB2FAL, | ||
104 | 0x30E349B1L, 0xC288CAB2L, 0xD1D83946L, 0x23B3BA45L, | ||
105 | 0xF779DEAEL, 0x05125DADL, 0x1642AE59L, 0xE4292D5AL, | ||
106 | 0xBA3A117EL, 0x4851927DL, 0x5B016189L, 0xA96AE28AL, | ||
107 | 0x7DA08661L, 0x8FCB0562L, 0x9C9BF696L, 0x6EF07595L, | ||
108 | 0x417B1DBCL, 0xB3109EBFL, 0xA0406D4BL, 0x522BEE48L, | ||
109 | 0x86E18AA3L, 0x748A09A0L, 0x67DAFA54L, 0x95B17957L, | ||
110 | 0xCBA24573L, 0x39C9C670L, 0x2A993584L, 0xD8F2B687L, | ||
111 | 0x0C38D26CL, 0xFE53516FL, 0xED03A29BL, 0x1F682198L, | ||
112 | 0x5125DAD3L, 0xA34E59D0L, 0xB01EAA24L, 0x42752927L, | ||
113 | 0x96BF4DCCL, 0x64D4CECFL, 0x77843D3BL, 0x85EFBE38L, | ||
114 | 0xDBFC821CL, 0x2997011FL, 0x3AC7F2EBL, 0xC8AC71E8L, | ||
115 | 0x1C661503L, 0xEE0D9600L, 0xFD5D65F4L, 0x0F36E6F7L, | ||
116 | 0x61C69362L, 0x93AD1061L, 0x80FDE395L, 0x72966096L, | ||
117 | 0xA65C047DL, 0x5437877EL, 0x4767748AL, 0xB50CF789L, | ||
118 | 0xEB1FCBADL, 0x197448AEL, 0x0A24BB5AL, 0xF84F3859L, | ||
119 | 0x2C855CB2L, 0xDEEEDFB1L, 0xCDBE2C45L, 0x3FD5AF46L, | ||
120 | 0x7198540DL, 0x83F3D70EL, 0x90A324FAL, 0x62C8A7F9L, | ||
121 | 0xB602C312L, 0x44694011L, 0x5739B3E5L, 0xA55230E6L, | ||
122 | 0xFB410CC2L, 0x092A8FC1L, 0x1A7A7C35L, 0xE811FF36L, | ||
123 | 0x3CDB9BDDL, 0xCEB018DEL, 0xDDE0EB2AL, 0x2F8B6829L, | ||
124 | 0x82F63B78L, 0x709DB87BL, 0x63CD4B8FL, 0x91A6C88CL, | ||
125 | 0x456CAC67L, 0xB7072F64L, 0xA457DC90L, 0x563C5F93L, | ||
126 | 0x082F63B7L, 0xFA44E0B4L, 0xE9141340L, 0x1B7F9043L, | ||
127 | 0xCFB5F4A8L, 0x3DDE77ABL, 0x2E8E845FL, 0xDCE5075CL, | ||
128 | 0x92A8FC17L, 0x60C37F14L, 0x73938CE0L, 0x81F80FE3L, | ||
129 | 0x55326B08L, 0xA759E80BL, 0xB4091BFFL, 0x466298FCL, | ||
130 | 0x1871A4D8L, 0xEA1A27DBL, 0xF94AD42FL, 0x0B21572CL, | ||
131 | 0xDFEB33C7L, 0x2D80B0C4L, 0x3ED04330L, 0xCCBBC033L, | ||
132 | 0xA24BB5A6L, 0x502036A5L, 0x4370C551L, 0xB11B4652L, | ||
133 | 0x65D122B9L, 0x97BAA1BAL, 0x84EA524EL, 0x7681D14DL, | ||
134 | 0x2892ED69L, 0xDAF96E6AL, 0xC9A99D9EL, 0x3BC21E9DL, | ||
135 | 0xEF087A76L, 0x1D63F975L, 0x0E330A81L, 0xFC588982L, | ||
136 | 0xB21572C9L, 0x407EF1CAL, 0x532E023EL, 0xA145813DL, | ||
137 | 0x758FE5D6L, 0x87E466D5L, 0x94B49521L, 0x66DF1622L, | ||
138 | 0x38CC2A06L, 0xCAA7A905L, 0xD9F75AF1L, 0x2B9CD9F2L, | ||
139 | 0xFF56BD19L, 0x0D3D3E1AL, 0x1E6DCDEEL, 0xEC064EEDL, | ||
140 | 0xC38D26C4L, 0x31E6A5C7L, 0x22B65633L, 0xD0DDD530L, | ||
141 | 0x0417B1DBL, 0xF67C32D8L, 0xE52CC12CL, 0x1747422FL, | ||
142 | 0x49547E0BL, 0xBB3FFD08L, 0xA86F0EFCL, 0x5A048DFFL, | ||
143 | 0x8ECEE914L, 0x7CA56A17L, 0x6FF599E3L, 0x9D9E1AE0L, | ||
144 | 0xD3D3E1ABL, 0x21B862A8L, 0x32E8915CL, 0xC083125FL, | ||
145 | 0x144976B4L, 0xE622F5B7L, 0xF5720643L, 0x07198540L, | ||
146 | 0x590AB964L, 0xAB613A67L, 0xB831C993L, 0x4A5A4A90L, | ||
147 | 0x9E902E7BL, 0x6CFBAD78L, 0x7FAB5E8CL, 0x8DC0DD8FL, | ||
148 | 0xE330A81AL, 0x115B2B19L, 0x020BD8EDL, 0xF0605BEEL, | ||
149 | 0x24AA3F05L, 0xD6C1BC06L, 0xC5914FF2L, 0x37FACCF1L, | ||
150 | 0x69E9F0D5L, 0x9B8273D6L, 0x88D28022L, 0x7AB90321L, | ||
151 | 0xAE7367CAL, 0x5C18E4C9L, 0x4F48173DL, 0xBD23943EL, | ||
152 | 0xF36E6F75L, 0x0105EC76L, 0x12551F82L, 0xE03E9C81L, | ||
153 | 0x34F4F86AL, 0xC69F7B69L, 0xD5CF889DL, 0x27A40B9EL, | ||
154 | 0x79B737BAL, 0x8BDCB4B9L, 0x988C474DL, 0x6AE7C44EL, | ||
155 | 0xBE2DA0A5L, 0x4C4623A6L, 0x5F16D052L, 0xAD7D5351L | ||
156 | }; | ||
157 | |||
158 | /* | ||
159 | * Steps through buffer one byte at at time, calculates reflected | ||
160 | * crc using table. | ||
161 | */ | ||
162 | |||
163 | u32 __attribute_pure__ | ||
164 | crc32c_le(u32 seed, unsigned char const *data, size_t length) | ||
165 | { | ||
166 | u32 crc = __cpu_to_le32(seed); | ||
167 | |||
168 | while (length--) | ||
169 | crc = | ||
170 | crc32c_table[(crc ^ *data++) & 0xFFL] ^ (crc >> 8); | ||
171 | |||
172 | return __le32_to_cpu(crc); | ||
173 | } | ||
174 | |||
175 | #endif /* CRC_LE_BITS == 8 */ | ||
176 | |||
177 | EXPORT_SYMBOL(crc32c_be); | ||
178 | |||
179 | #if CRC_BE_BITS == 1 | ||
180 | u32 __attribute_pure__ | ||
181 | crc32c_be(u32 crc, unsigned char const *p, size_t len) | ||
182 | { | ||
183 | int i; | ||
184 | while (len--) { | ||
185 | crc ^= *p++ << 24; | ||
186 | for (i = 0; i < 8; i++) | ||
187 | crc = | ||
188 | (crc << 1) ^ ((crc & 0x80000000) ? CRC32C_POLY_BE : | ||
189 | 0); | ||
190 | } | ||
191 | return crc; | ||
192 | } | ||
193 | #endif | ||
194 | |||
195 | /* | ||
196 | * Unit test | ||
197 | * | ||
198 | * A small unit test suite is implemented as part of the crypto suite. | ||
199 | * Select CRYPTO_CRC32C and use the tcrypt module to run the tests. | ||
200 | */ | ||
diff --git a/lib/parser.c b/lib/parser.c new file mode 100644 index 000000000000..7ad2a48abc5e --- /dev/null +++ b/lib/parser.c | |||
@@ -0,0 +1,220 @@ | |||
1 | /* | ||
2 | * lib/parser.c - simple parser for mount, etc. options. | ||
3 | * | ||
4 | * This source code is licensed under the GNU General Public License, | ||
5 | * Version 2. See the file COPYING for more details. | ||
6 | */ | ||
7 | |||
8 | #include <linux/ctype.h> | ||
9 | #include <linux/module.h> | ||
10 | #include <linux/parser.h> | ||
11 | #include <linux/slab.h> | ||
12 | #include <linux/string.h> | ||
13 | |||
14 | /** | ||
15 | * match_one: - Determines if a string matches a simple pattern | ||
16 | * @s: the string to examine for presense of the pattern | ||
17 | * @p: the string containing the pattern | ||
18 | * @args: array of %MAX_OPT_ARGS &substring_t elements. Used to return match | ||
19 | * locations. | ||
20 | * | ||
21 | * Description: Determines if the pattern @p is present in string @s. Can only | ||
22 | * match extremely simple token=arg style patterns. If the pattern is found, | ||
23 | * the location(s) of the arguments will be returned in the @args array. | ||
24 | */ | ||
25 | static int match_one(char *s, char *p, substring_t args[]) | ||
26 | { | ||
27 | char *meta; | ||
28 | int argc = 0; | ||
29 | |||
30 | if (!p) | ||
31 | return 1; | ||
32 | |||
33 | while(1) { | ||
34 | int len = -1; | ||
35 | meta = strchr(p, '%'); | ||
36 | if (!meta) | ||
37 | return strcmp(p, s) == 0; | ||
38 | |||
39 | if (strncmp(p, s, meta-p)) | ||
40 | return 0; | ||
41 | |||
42 | s += meta - p; | ||
43 | p = meta + 1; | ||
44 | |||
45 | if (isdigit(*p)) | ||
46 | len = simple_strtoul(p, &p, 10); | ||
47 | else if (*p == '%') { | ||
48 | if (*s++ != '%') | ||
49 | return 0; | ||
50 | p++; | ||
51 | continue; | ||
52 | } | ||
53 | |||
54 | if (argc >= MAX_OPT_ARGS) | ||
55 | return 0; | ||
56 | |||
57 | args[argc].from = s; | ||
58 | switch (*p++) { | ||
59 | case 's': | ||
60 | if (strlen(s) == 0) | ||
61 | return 0; | ||
62 | else if (len == -1 || len > strlen(s)) | ||
63 | len = strlen(s); | ||
64 | args[argc].to = s + len; | ||
65 | break; | ||
66 | case 'd': | ||
67 | simple_strtol(s, &args[argc].to, 0); | ||
68 | goto num; | ||
69 | case 'u': | ||
70 | simple_strtoul(s, &args[argc].to, 0); | ||
71 | goto num; | ||
72 | case 'o': | ||
73 | simple_strtoul(s, &args[argc].to, 8); | ||
74 | goto num; | ||
75 | case 'x': | ||
76 | simple_strtoul(s, &args[argc].to, 16); | ||
77 | num: | ||
78 | if (args[argc].to == args[argc].from) | ||
79 | return 0; | ||
80 | break; | ||
81 | default: | ||
82 | return 0; | ||
83 | } | ||
84 | s = args[argc].to; | ||
85 | argc++; | ||
86 | } | ||
87 | } | ||
88 | |||
89 | /** | ||
90 | * match_token: - Find a token (and optional args) in a string | ||
91 | * @s: the string to examine for token/argument pairs | ||
92 | * @table: match_table_t describing the set of allowed option tokens and the | ||
93 | * arguments that may be associated with them. Must be terminated with a | ||
94 | * &struct match_token whose pattern is set to the NULL pointer. | ||
95 | * @args: array of %MAX_OPT_ARGS &substring_t elements. Used to return match | ||
96 | * locations. | ||
97 | * | ||
98 | * Description: Detects which if any of a set of token strings has been passed | ||
99 | * to it. Tokens can include up to MAX_OPT_ARGS instances of basic c-style | ||
100 | * format identifiers which will be taken into account when matching the | ||
101 | * tokens, and whose locations will be returned in the @args array. | ||
102 | */ | ||
103 | int match_token(char *s, match_table_t table, substring_t args[]) | ||
104 | { | ||
105 | struct match_token *p; | ||
106 | |||
107 | for (p = table; !match_one(s, p->pattern, args) ; p++) | ||
108 | ; | ||
109 | |||
110 | return p->token; | ||
111 | } | ||
112 | |||
113 | /** | ||
114 | * match_number: scan a number in the given base from a substring_t | ||
115 | * @s: substring to be scanned | ||
116 | * @result: resulting integer on success | ||
117 | * @base: base to use when converting string | ||
118 | * | ||
119 | * Description: Given a &substring_t and a base, attempts to parse the substring | ||
120 | * as a number in that base. On success, sets @result to the integer represented | ||
121 | * by the string and returns 0. Returns either -ENOMEM or -EINVAL on failure. | ||
122 | */ | ||
123 | static int match_number(substring_t *s, int *result, int base) | ||
124 | { | ||
125 | char *endp; | ||
126 | char *buf; | ||
127 | int ret; | ||
128 | |||
129 | buf = kmalloc(s->to - s->from + 1, GFP_KERNEL); | ||
130 | if (!buf) | ||
131 | return -ENOMEM; | ||
132 | memcpy(buf, s->from, s->to - s->from); | ||
133 | buf[s->to - s->from] = '\0'; | ||
134 | *result = simple_strtol(buf, &endp, base); | ||
135 | ret = 0; | ||
136 | if (endp == buf) | ||
137 | ret = -EINVAL; | ||
138 | kfree(buf); | ||
139 | return ret; | ||
140 | } | ||
141 | |||
142 | /** | ||
143 | * match_int: - scan a decimal representation of an integer from a substring_t | ||
144 | * @s: substring_t to be scanned | ||
145 | * @result: resulting integer on success | ||
146 | * | ||
147 | * Description: Attempts to parse the &substring_t @s as a decimal integer. On | ||
148 | * success, sets @result to the integer represented by the string and returns 0. | ||
149 | * Returns either -ENOMEM or -EINVAL on failure. | ||
150 | */ | ||
151 | int match_int(substring_t *s, int *result) | ||
152 | { | ||
153 | return match_number(s, result, 0); | ||
154 | } | ||
155 | |||
156 | /** | ||
157 | * match_octal: - scan an octal representation of an integer from a substring_t | ||
158 | * @s: substring_t to be scanned | ||
159 | * @result: resulting integer on success | ||
160 | * | ||
161 | * Description: Attempts to parse the &substring_t @s as an octal integer. On | ||
162 | * success, sets @result to the integer represented by the string and returns | ||
163 | * 0. Returns either -ENOMEM or -EINVAL on failure. | ||
164 | */ | ||
165 | int match_octal(substring_t *s, int *result) | ||
166 | { | ||
167 | return match_number(s, result, 8); | ||
168 | } | ||
169 | |||
170 | /** | ||
171 | * match_hex: - scan a hex representation of an integer from a substring_t | ||
172 | * @s: substring_t to be scanned | ||
173 | * @result: resulting integer on success | ||
174 | * | ||
175 | * Description: Attempts to parse the &substring_t @s as a hexadecimal integer. | ||
176 | * On success, sets @result to the integer represented by the string and | ||
177 | * returns 0. Returns either -ENOMEM or -EINVAL on failure. | ||
178 | */ | ||
179 | int match_hex(substring_t *s, int *result) | ||
180 | { | ||
181 | return match_number(s, result, 16); | ||
182 | } | ||
183 | |||
184 | /** | ||
185 | * match_strcpy: - copies the characters from a substring_t to a string | ||
186 | * @to: string to copy characters to. | ||
187 | * @s: &substring_t to copy | ||
188 | * | ||
189 | * Description: Copies the set of characters represented by the given | ||
190 | * &substring_t @s to the c-style string @to. Caller guarantees that @to is | ||
191 | * large enough to hold the characters of @s. | ||
192 | */ | ||
193 | void match_strcpy(char *to, substring_t *s) | ||
194 | { | ||
195 | memcpy(to, s->from, s->to - s->from); | ||
196 | to[s->to - s->from] = '\0'; | ||
197 | } | ||
198 | |||
199 | /** | ||
200 | * match_strdup: - allocate a new string with the contents of a substring_t | ||
201 | * @s: &substring_t to copy | ||
202 | * | ||
203 | * Description: Allocates and returns a string filled with the contents of | ||
204 | * the &substring_t @s. The caller is responsible for freeing the returned | ||
205 | * string with kfree(). | ||
206 | */ | ||
207 | char *match_strdup(substring_t *s) | ||
208 | { | ||
209 | char *p = kmalloc(s->to - s->from + 1, GFP_KERNEL); | ||
210 | if (p) | ||
211 | match_strcpy(p, s); | ||
212 | return p; | ||
213 | } | ||
214 | |||
215 | EXPORT_SYMBOL(match_token); | ||
216 | EXPORT_SYMBOL(match_int); | ||
217 | EXPORT_SYMBOL(match_octal); | ||
218 | EXPORT_SYMBOL(match_hex); | ||
219 | EXPORT_SYMBOL(match_strcpy); | ||
220 | EXPORT_SYMBOL(match_strdup); | ||
diff --git a/lib/prio_tree.c b/lib/prio_tree.c new file mode 100644 index 000000000000..ccfd850b0dec --- /dev/null +++ b/lib/prio_tree.c | |||
@@ -0,0 +1,484 @@ | |||
1 | /* | ||
2 | * lib/prio_tree.c - priority search tree | ||
3 | * | ||
4 | * Copyright (C) 2004, Rajesh Venkatasubramanian <vrajesh@umich.edu> | ||
5 | * | ||
6 | * This file is released under the GPL v2. | ||
7 | * | ||
8 | * Based on the radix priority search tree proposed by Edward M. McCreight | ||
9 | * SIAM Journal of Computing, vol. 14, no.2, pages 257-276, May 1985 | ||
10 | * | ||
11 | * 02Feb2004 Initial version | ||
12 | */ | ||
13 | |||
14 | #include <linux/init.h> | ||
15 | #include <linux/mm.h> | ||
16 | #include <linux/prio_tree.h> | ||
17 | |||
18 | /* | ||
19 | * A clever mix of heap and radix trees forms a radix priority search tree (PST) | ||
20 | * which is useful for storing intervals, e.g, we can consider a vma as a closed | ||
21 | * interval of file pages [offset_begin, offset_end], and store all vmas that | ||
22 | * map a file in a PST. Then, using the PST, we can answer a stabbing query, | ||
23 | * i.e., selecting a set of stored intervals (vmas) that overlap with (map) a | ||
24 | * given input interval X (a set of consecutive file pages), in "O(log n + m)" | ||
25 | * time where 'log n' is the height of the PST, and 'm' is the number of stored | ||
26 | * intervals (vmas) that overlap (map) with the input interval X (the set of | ||
27 | * consecutive file pages). | ||
28 | * | ||
29 | * In our implementation, we store closed intervals of the form [radix_index, | ||
30 | * heap_index]. We assume that always radix_index <= heap_index. McCreight's PST | ||
31 | * is designed for storing intervals with unique radix indices, i.e., each | ||
32 | * interval have different radix_index. However, this limitation can be easily | ||
33 | * overcome by using the size, i.e., heap_index - radix_index, as part of the | ||
34 | * index, so we index the tree using [(radix_index,size), heap_index]. | ||
35 | * | ||
36 | * When the above-mentioned indexing scheme is used, theoretically, in a 32 bit | ||
37 | * machine, the maximum height of a PST can be 64. We can use a balanced version | ||
38 | * of the priority search tree to optimize the tree height, but the balanced | ||
39 | * tree proposed by McCreight is too complex and memory-hungry for our purpose. | ||
40 | */ | ||
41 | |||
42 | /* | ||
43 | * The following macros are used for implementing prio_tree for i_mmap | ||
44 | */ | ||
45 | |||
46 | #define RADIX_INDEX(vma) ((vma)->vm_pgoff) | ||
47 | #define VMA_SIZE(vma) (((vma)->vm_end - (vma)->vm_start) >> PAGE_SHIFT) | ||
48 | /* avoid overflow */ | ||
49 | #define HEAP_INDEX(vma) ((vma)->vm_pgoff + (VMA_SIZE(vma) - 1)) | ||
50 | |||
51 | |||
52 | static void get_index(const struct prio_tree_root *root, | ||
53 | const struct prio_tree_node *node, | ||
54 | unsigned long *radix, unsigned long *heap) | ||
55 | { | ||
56 | if (root->raw) { | ||
57 | struct vm_area_struct *vma = prio_tree_entry( | ||
58 | node, struct vm_area_struct, shared.prio_tree_node); | ||
59 | |||
60 | *radix = RADIX_INDEX(vma); | ||
61 | *heap = HEAP_INDEX(vma); | ||
62 | } | ||
63 | else { | ||
64 | *radix = node->start; | ||
65 | *heap = node->last; | ||
66 | } | ||
67 | } | ||
68 | |||
69 | static unsigned long index_bits_to_maxindex[BITS_PER_LONG]; | ||
70 | |||
71 | void __init prio_tree_init(void) | ||
72 | { | ||
73 | unsigned int i; | ||
74 | |||
75 | for (i = 0; i < ARRAY_SIZE(index_bits_to_maxindex) - 1; i++) | ||
76 | index_bits_to_maxindex[i] = (1UL << (i + 1)) - 1; | ||
77 | index_bits_to_maxindex[ARRAY_SIZE(index_bits_to_maxindex) - 1] = ~0UL; | ||
78 | } | ||
79 | |||
80 | /* | ||
81 | * Maximum heap_index that can be stored in a PST with index_bits bits | ||
82 | */ | ||
83 | static inline unsigned long prio_tree_maxindex(unsigned int bits) | ||
84 | { | ||
85 | return index_bits_to_maxindex[bits - 1]; | ||
86 | } | ||
87 | |||
88 | /* | ||
89 | * Extend a priority search tree so that it can store a node with heap_index | ||
90 | * max_heap_index. In the worst case, this algorithm takes O((log n)^2). | ||
91 | * However, this function is used rarely and the common case performance is | ||
92 | * not bad. | ||
93 | */ | ||
94 | static struct prio_tree_node *prio_tree_expand(struct prio_tree_root *root, | ||
95 | struct prio_tree_node *node, unsigned long max_heap_index) | ||
96 | { | ||
97 | struct prio_tree_node *first = NULL, *prev, *last = NULL; | ||
98 | |||
99 | if (max_heap_index > prio_tree_maxindex(root->index_bits)) | ||
100 | root->index_bits++; | ||
101 | |||
102 | while (max_heap_index > prio_tree_maxindex(root->index_bits)) { | ||
103 | root->index_bits++; | ||
104 | |||
105 | if (prio_tree_empty(root)) | ||
106 | continue; | ||
107 | |||
108 | if (first == NULL) { | ||
109 | first = root->prio_tree_node; | ||
110 | prio_tree_remove(root, root->prio_tree_node); | ||
111 | INIT_PRIO_TREE_NODE(first); | ||
112 | last = first; | ||
113 | } else { | ||
114 | prev = last; | ||
115 | last = root->prio_tree_node; | ||
116 | prio_tree_remove(root, root->prio_tree_node); | ||
117 | INIT_PRIO_TREE_NODE(last); | ||
118 | prev->left = last; | ||
119 | last->parent = prev; | ||
120 | } | ||
121 | } | ||
122 | |||
123 | INIT_PRIO_TREE_NODE(node); | ||
124 | |||
125 | if (first) { | ||
126 | node->left = first; | ||
127 | first->parent = node; | ||
128 | } else | ||
129 | last = node; | ||
130 | |||
131 | if (!prio_tree_empty(root)) { | ||
132 | last->left = root->prio_tree_node; | ||
133 | last->left->parent = last; | ||
134 | } | ||
135 | |||
136 | root->prio_tree_node = node; | ||
137 | return node; | ||
138 | } | ||
139 | |||
140 | /* | ||
141 | * Replace a prio_tree_node with a new node and return the old node | ||
142 | */ | ||
143 | struct prio_tree_node *prio_tree_replace(struct prio_tree_root *root, | ||
144 | struct prio_tree_node *old, struct prio_tree_node *node) | ||
145 | { | ||
146 | INIT_PRIO_TREE_NODE(node); | ||
147 | |||
148 | if (prio_tree_root(old)) { | ||
149 | BUG_ON(root->prio_tree_node != old); | ||
150 | /* | ||
151 | * We can reduce root->index_bits here. However, it is complex | ||
152 | * and does not help much to improve performance (IMO). | ||
153 | */ | ||
154 | node->parent = node; | ||
155 | root->prio_tree_node = node; | ||
156 | } else { | ||
157 | node->parent = old->parent; | ||
158 | if (old->parent->left == old) | ||
159 | old->parent->left = node; | ||
160 | else | ||
161 | old->parent->right = node; | ||
162 | } | ||
163 | |||
164 | if (!prio_tree_left_empty(old)) { | ||
165 | node->left = old->left; | ||
166 | old->left->parent = node; | ||
167 | } | ||
168 | |||
169 | if (!prio_tree_right_empty(old)) { | ||
170 | node->right = old->right; | ||
171 | old->right->parent = node; | ||
172 | } | ||
173 | |||
174 | return old; | ||
175 | } | ||
176 | |||
177 | /* | ||
178 | * Insert a prio_tree_node @node into a radix priority search tree @root. The | ||
179 | * algorithm typically takes O(log n) time where 'log n' is the number of bits | ||
180 | * required to represent the maximum heap_index. In the worst case, the algo | ||
181 | * can take O((log n)^2) - check prio_tree_expand. | ||
182 | * | ||
183 | * If a prior node with same radix_index and heap_index is already found in | ||
184 | * the tree, then returns the address of the prior node. Otherwise, inserts | ||
185 | * @node into the tree and returns @node. | ||
186 | */ | ||
187 | struct prio_tree_node *prio_tree_insert(struct prio_tree_root *root, | ||
188 | struct prio_tree_node *node) | ||
189 | { | ||
190 | struct prio_tree_node *cur, *res = node; | ||
191 | unsigned long radix_index, heap_index; | ||
192 | unsigned long r_index, h_index, index, mask; | ||
193 | int size_flag = 0; | ||
194 | |||
195 | get_index(root, node, &radix_index, &heap_index); | ||
196 | |||
197 | if (prio_tree_empty(root) || | ||
198 | heap_index > prio_tree_maxindex(root->index_bits)) | ||
199 | return prio_tree_expand(root, node, heap_index); | ||
200 | |||
201 | cur = root->prio_tree_node; | ||
202 | mask = 1UL << (root->index_bits - 1); | ||
203 | |||
204 | while (mask) { | ||
205 | get_index(root, cur, &r_index, &h_index); | ||
206 | |||
207 | if (r_index == radix_index && h_index == heap_index) | ||
208 | return cur; | ||
209 | |||
210 | if (h_index < heap_index || | ||
211 | (h_index == heap_index && r_index > radix_index)) { | ||
212 | struct prio_tree_node *tmp = node; | ||
213 | node = prio_tree_replace(root, cur, node); | ||
214 | cur = tmp; | ||
215 | /* swap indices */ | ||
216 | index = r_index; | ||
217 | r_index = radix_index; | ||
218 | radix_index = index; | ||
219 | index = h_index; | ||
220 | h_index = heap_index; | ||
221 | heap_index = index; | ||
222 | } | ||
223 | |||
224 | if (size_flag) | ||
225 | index = heap_index - radix_index; | ||
226 | else | ||
227 | index = radix_index; | ||
228 | |||
229 | if (index & mask) { | ||
230 | if (prio_tree_right_empty(cur)) { | ||
231 | INIT_PRIO_TREE_NODE(node); | ||
232 | cur->right = node; | ||
233 | node->parent = cur; | ||
234 | return res; | ||
235 | } else | ||
236 | cur = cur->right; | ||
237 | } else { | ||
238 | if (prio_tree_left_empty(cur)) { | ||
239 | INIT_PRIO_TREE_NODE(node); | ||
240 | cur->left = node; | ||
241 | node->parent = cur; | ||
242 | return res; | ||
243 | } else | ||
244 | cur = cur->left; | ||
245 | } | ||
246 | |||
247 | mask >>= 1; | ||
248 | |||
249 | if (!mask) { | ||
250 | mask = 1UL << (BITS_PER_LONG - 1); | ||
251 | size_flag = 1; | ||
252 | } | ||
253 | } | ||
254 | /* Should not reach here */ | ||
255 | BUG(); | ||
256 | return NULL; | ||
257 | } | ||
258 | |||
259 | /* | ||
260 | * Remove a prio_tree_node @node from a radix priority search tree @root. The | ||
261 | * algorithm takes O(log n) time where 'log n' is the number of bits required | ||
262 | * to represent the maximum heap_index. | ||
263 | */ | ||
264 | void prio_tree_remove(struct prio_tree_root *root, struct prio_tree_node *node) | ||
265 | { | ||
266 | struct prio_tree_node *cur; | ||
267 | unsigned long r_index, h_index_right, h_index_left; | ||
268 | |||
269 | cur = node; | ||
270 | |||
271 | while (!prio_tree_left_empty(cur) || !prio_tree_right_empty(cur)) { | ||
272 | if (!prio_tree_left_empty(cur)) | ||
273 | get_index(root, cur->left, &r_index, &h_index_left); | ||
274 | else { | ||
275 | cur = cur->right; | ||
276 | continue; | ||
277 | } | ||
278 | |||
279 | if (!prio_tree_right_empty(cur)) | ||
280 | get_index(root, cur->right, &r_index, &h_index_right); | ||
281 | else { | ||
282 | cur = cur->left; | ||
283 | continue; | ||
284 | } | ||
285 | |||
286 | /* both h_index_left and h_index_right cannot be 0 */ | ||
287 | if (h_index_left >= h_index_right) | ||
288 | cur = cur->left; | ||
289 | else | ||
290 | cur = cur->right; | ||
291 | } | ||
292 | |||
293 | if (prio_tree_root(cur)) { | ||
294 | BUG_ON(root->prio_tree_node != cur); | ||
295 | __INIT_PRIO_TREE_ROOT(root, root->raw); | ||
296 | return; | ||
297 | } | ||
298 | |||
299 | if (cur->parent->right == cur) | ||
300 | cur->parent->right = cur->parent; | ||
301 | else | ||
302 | cur->parent->left = cur->parent; | ||
303 | |||
304 | while (cur != node) | ||
305 | cur = prio_tree_replace(root, cur->parent, cur); | ||
306 | } | ||
307 | |||
308 | /* | ||
309 | * Following functions help to enumerate all prio_tree_nodes in the tree that | ||
310 | * overlap with the input interval X [radix_index, heap_index]. The enumeration | ||
311 | * takes O(log n + m) time where 'log n' is the height of the tree (which is | ||
312 | * proportional to # of bits required to represent the maximum heap_index) and | ||
313 | * 'm' is the number of prio_tree_nodes that overlap the interval X. | ||
314 | */ | ||
315 | |||
316 | static struct prio_tree_node *prio_tree_left(struct prio_tree_iter *iter, | ||
317 | unsigned long *r_index, unsigned long *h_index) | ||
318 | { | ||
319 | if (prio_tree_left_empty(iter->cur)) | ||
320 | return NULL; | ||
321 | |||
322 | get_index(iter->root, iter->cur->left, r_index, h_index); | ||
323 | |||
324 | if (iter->r_index <= *h_index) { | ||
325 | iter->cur = iter->cur->left; | ||
326 | iter->mask >>= 1; | ||
327 | if (iter->mask) { | ||
328 | if (iter->size_level) | ||
329 | iter->size_level++; | ||
330 | } else { | ||
331 | if (iter->size_level) { | ||
332 | BUG_ON(!prio_tree_left_empty(iter->cur)); | ||
333 | BUG_ON(!prio_tree_right_empty(iter->cur)); | ||
334 | iter->size_level++; | ||
335 | iter->mask = ULONG_MAX; | ||
336 | } else { | ||
337 | iter->size_level = 1; | ||
338 | iter->mask = 1UL << (BITS_PER_LONG - 1); | ||
339 | } | ||
340 | } | ||
341 | return iter->cur; | ||
342 | } | ||
343 | |||
344 | return NULL; | ||
345 | } | ||
346 | |||
347 | static struct prio_tree_node *prio_tree_right(struct prio_tree_iter *iter, | ||
348 | unsigned long *r_index, unsigned long *h_index) | ||
349 | { | ||
350 | unsigned long value; | ||
351 | |||
352 | if (prio_tree_right_empty(iter->cur)) | ||
353 | return NULL; | ||
354 | |||
355 | if (iter->size_level) | ||
356 | value = iter->value; | ||
357 | else | ||
358 | value = iter->value | iter->mask; | ||
359 | |||
360 | if (iter->h_index < value) | ||
361 | return NULL; | ||
362 | |||
363 | get_index(iter->root, iter->cur->right, r_index, h_index); | ||
364 | |||
365 | if (iter->r_index <= *h_index) { | ||
366 | iter->cur = iter->cur->right; | ||
367 | iter->mask >>= 1; | ||
368 | iter->value = value; | ||
369 | if (iter->mask) { | ||
370 | if (iter->size_level) | ||
371 | iter->size_level++; | ||
372 | } else { | ||
373 | if (iter->size_level) { | ||
374 | BUG_ON(!prio_tree_left_empty(iter->cur)); | ||
375 | BUG_ON(!prio_tree_right_empty(iter->cur)); | ||
376 | iter->size_level++; | ||
377 | iter->mask = ULONG_MAX; | ||
378 | } else { | ||
379 | iter->size_level = 1; | ||
380 | iter->mask = 1UL << (BITS_PER_LONG - 1); | ||
381 | } | ||
382 | } | ||
383 | return iter->cur; | ||
384 | } | ||
385 | |||
386 | return NULL; | ||
387 | } | ||
388 | |||
389 | static struct prio_tree_node *prio_tree_parent(struct prio_tree_iter *iter) | ||
390 | { | ||
391 | iter->cur = iter->cur->parent; | ||
392 | if (iter->mask == ULONG_MAX) | ||
393 | iter->mask = 1UL; | ||
394 | else if (iter->size_level == 1) | ||
395 | iter->mask = 1UL; | ||
396 | else | ||
397 | iter->mask <<= 1; | ||
398 | if (iter->size_level) | ||
399 | iter->size_level--; | ||
400 | if (!iter->size_level && (iter->value & iter->mask)) | ||
401 | iter->value ^= iter->mask; | ||
402 | return iter->cur; | ||
403 | } | ||
404 | |||
405 | static inline int overlap(struct prio_tree_iter *iter, | ||
406 | unsigned long r_index, unsigned long h_index) | ||
407 | { | ||
408 | return iter->h_index >= r_index && iter->r_index <= h_index; | ||
409 | } | ||
410 | |||
411 | /* | ||
412 | * prio_tree_first: | ||
413 | * | ||
414 | * Get the first prio_tree_node that overlaps with the interval [radix_index, | ||
415 | * heap_index]. Note that always radix_index <= heap_index. We do a pre-order | ||
416 | * traversal of the tree. | ||
417 | */ | ||
418 | static struct prio_tree_node *prio_tree_first(struct prio_tree_iter *iter) | ||
419 | { | ||
420 | struct prio_tree_root *root; | ||
421 | unsigned long r_index, h_index; | ||
422 | |||
423 | INIT_PRIO_TREE_ITER(iter); | ||
424 | |||
425 | root = iter->root; | ||
426 | if (prio_tree_empty(root)) | ||
427 | return NULL; | ||
428 | |||
429 | get_index(root, root->prio_tree_node, &r_index, &h_index); | ||
430 | |||
431 | if (iter->r_index > h_index) | ||
432 | return NULL; | ||
433 | |||
434 | iter->mask = 1UL << (root->index_bits - 1); | ||
435 | iter->cur = root->prio_tree_node; | ||
436 | |||
437 | while (1) { | ||
438 | if (overlap(iter, r_index, h_index)) | ||
439 | return iter->cur; | ||
440 | |||
441 | if (prio_tree_left(iter, &r_index, &h_index)) | ||
442 | continue; | ||
443 | |||
444 | if (prio_tree_right(iter, &r_index, &h_index)) | ||
445 | continue; | ||
446 | |||
447 | break; | ||
448 | } | ||
449 | return NULL; | ||
450 | } | ||
451 | |||
452 | /* | ||
453 | * prio_tree_next: | ||
454 | * | ||
455 | * Get the next prio_tree_node that overlaps with the input interval in iter | ||
456 | */ | ||
457 | struct prio_tree_node *prio_tree_next(struct prio_tree_iter *iter) | ||
458 | { | ||
459 | unsigned long r_index, h_index; | ||
460 | |||
461 | if (iter->cur == NULL) | ||
462 | return prio_tree_first(iter); | ||
463 | |||
464 | repeat: | ||
465 | while (prio_tree_left(iter, &r_index, &h_index)) | ||
466 | if (overlap(iter, r_index, h_index)) | ||
467 | return iter->cur; | ||
468 | |||
469 | while (!prio_tree_right(iter, &r_index, &h_index)) { | ||
470 | while (!prio_tree_root(iter->cur) && | ||
471 | iter->cur->parent->right == iter->cur) | ||
472 | prio_tree_parent(iter); | ||
473 | |||
474 | if (prio_tree_root(iter->cur)) | ||
475 | return NULL; | ||
476 | |||
477 | prio_tree_parent(iter); | ||
478 | } | ||
479 | |||
480 | if (overlap(iter, r_index, h_index)) | ||
481 | return iter->cur; | ||
482 | |||
483 | goto repeat; | ||
484 | } | ||
diff --git a/lib/radix-tree.c b/lib/radix-tree.c new file mode 100644 index 000000000000..04d664377f2c --- /dev/null +++ b/lib/radix-tree.c | |||
@@ -0,0 +1,807 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2001 Momchil Velikov | ||
3 | * Portions Copyright (C) 2001 Christoph Hellwig | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or | ||
6 | * modify it under the terms of the GNU General Public License as | ||
7 | * published by the Free Software Foundation; either version 2, or (at | ||
8 | * your option) any later version. | ||
9 | * | ||
10 | * This program is distributed in the hope that it will be useful, but | ||
11 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
13 | * General Public License for more details. | ||
14 | * | ||
15 | * You should have received a copy of the GNU General Public License | ||
16 | * along with this program; if not, write to the Free Software | ||
17 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
18 | */ | ||
19 | |||
20 | #include <linux/errno.h> | ||
21 | #include <linux/init.h> | ||
22 | #include <linux/kernel.h> | ||
23 | #include <linux/module.h> | ||
24 | #include <linux/radix-tree.h> | ||
25 | #include <linux/percpu.h> | ||
26 | #include <linux/slab.h> | ||
27 | #include <linux/notifier.h> | ||
28 | #include <linux/cpu.h> | ||
29 | #include <linux/gfp.h> | ||
30 | #include <linux/string.h> | ||
31 | #include <linux/bitops.h> | ||
32 | |||
33 | |||
34 | #ifdef __KERNEL__ | ||
35 | #define RADIX_TREE_MAP_SHIFT 6 | ||
36 | #else | ||
37 | #define RADIX_TREE_MAP_SHIFT 3 /* For more stressful testing */ | ||
38 | #endif | ||
39 | #define RADIX_TREE_TAGS 2 | ||
40 | |||
41 | #define RADIX_TREE_MAP_SIZE (1UL << RADIX_TREE_MAP_SHIFT) | ||
42 | #define RADIX_TREE_MAP_MASK (RADIX_TREE_MAP_SIZE-1) | ||
43 | |||
44 | #define RADIX_TREE_TAG_LONGS \ | ||
45 | ((RADIX_TREE_MAP_SIZE + BITS_PER_LONG - 1) / BITS_PER_LONG) | ||
46 | |||
47 | struct radix_tree_node { | ||
48 | unsigned int count; | ||
49 | void *slots[RADIX_TREE_MAP_SIZE]; | ||
50 | unsigned long tags[RADIX_TREE_TAGS][RADIX_TREE_TAG_LONGS]; | ||
51 | }; | ||
52 | |||
53 | struct radix_tree_path { | ||
54 | struct radix_tree_node *node, **slot; | ||
55 | int offset; | ||
56 | }; | ||
57 | |||
58 | #define RADIX_TREE_INDEX_BITS (8 /* CHAR_BIT */ * sizeof(unsigned long)) | ||
59 | #define RADIX_TREE_MAX_PATH (RADIX_TREE_INDEX_BITS/RADIX_TREE_MAP_SHIFT + 2) | ||
60 | |||
61 | static unsigned long height_to_maxindex[RADIX_TREE_MAX_PATH]; | ||
62 | |||
63 | /* | ||
64 | * Radix tree node cache. | ||
65 | */ | ||
66 | static kmem_cache_t *radix_tree_node_cachep; | ||
67 | |||
68 | /* | ||
69 | * Per-cpu pool of preloaded nodes | ||
70 | */ | ||
71 | struct radix_tree_preload { | ||
72 | int nr; | ||
73 | struct radix_tree_node *nodes[RADIX_TREE_MAX_PATH]; | ||
74 | }; | ||
75 | DEFINE_PER_CPU(struct radix_tree_preload, radix_tree_preloads) = { 0, }; | ||
76 | |||
77 | /* | ||
78 | * This assumes that the caller has performed appropriate preallocation, and | ||
79 | * that the caller has pinned this thread of control to the current CPU. | ||
80 | */ | ||
81 | static struct radix_tree_node * | ||
82 | radix_tree_node_alloc(struct radix_tree_root *root) | ||
83 | { | ||
84 | struct radix_tree_node *ret; | ||
85 | |||
86 | ret = kmem_cache_alloc(radix_tree_node_cachep, root->gfp_mask); | ||
87 | if (ret == NULL && !(root->gfp_mask & __GFP_WAIT)) { | ||
88 | struct radix_tree_preload *rtp; | ||
89 | |||
90 | rtp = &__get_cpu_var(radix_tree_preloads); | ||
91 | if (rtp->nr) { | ||
92 | ret = rtp->nodes[rtp->nr - 1]; | ||
93 | rtp->nodes[rtp->nr - 1] = NULL; | ||
94 | rtp->nr--; | ||
95 | } | ||
96 | } | ||
97 | return ret; | ||
98 | } | ||
99 | |||
100 | static inline void | ||
101 | radix_tree_node_free(struct radix_tree_node *node) | ||
102 | { | ||
103 | kmem_cache_free(radix_tree_node_cachep, node); | ||
104 | } | ||
105 | |||
106 | /* | ||
107 | * Load up this CPU's radix_tree_node buffer with sufficient objects to | ||
108 | * ensure that the addition of a single element in the tree cannot fail. On | ||
109 | * success, return zero, with preemption disabled. On error, return -ENOMEM | ||
110 | * with preemption not disabled. | ||
111 | */ | ||
112 | int radix_tree_preload(int gfp_mask) | ||
113 | { | ||
114 | struct radix_tree_preload *rtp; | ||
115 | struct radix_tree_node *node; | ||
116 | int ret = -ENOMEM; | ||
117 | |||
118 | preempt_disable(); | ||
119 | rtp = &__get_cpu_var(radix_tree_preloads); | ||
120 | while (rtp->nr < ARRAY_SIZE(rtp->nodes)) { | ||
121 | preempt_enable(); | ||
122 | node = kmem_cache_alloc(radix_tree_node_cachep, gfp_mask); | ||
123 | if (node == NULL) | ||
124 | goto out; | ||
125 | preempt_disable(); | ||
126 | rtp = &__get_cpu_var(radix_tree_preloads); | ||
127 | if (rtp->nr < ARRAY_SIZE(rtp->nodes)) | ||
128 | rtp->nodes[rtp->nr++] = node; | ||
129 | else | ||
130 | kmem_cache_free(radix_tree_node_cachep, node); | ||
131 | } | ||
132 | ret = 0; | ||
133 | out: | ||
134 | return ret; | ||
135 | } | ||
136 | |||
137 | static inline void tag_set(struct radix_tree_node *node, int tag, int offset) | ||
138 | { | ||
139 | if (!test_bit(offset, &node->tags[tag][0])) | ||
140 | __set_bit(offset, &node->tags[tag][0]); | ||
141 | } | ||
142 | |||
143 | static inline void tag_clear(struct radix_tree_node *node, int tag, int offset) | ||
144 | { | ||
145 | __clear_bit(offset, &node->tags[tag][0]); | ||
146 | } | ||
147 | |||
148 | static inline int tag_get(struct radix_tree_node *node, int tag, int offset) | ||
149 | { | ||
150 | return test_bit(offset, &node->tags[tag][0]); | ||
151 | } | ||
152 | |||
153 | /* | ||
154 | * Return the maximum key which can be store into a | ||
155 | * radix tree with height HEIGHT. | ||
156 | */ | ||
157 | static inline unsigned long radix_tree_maxindex(unsigned int height) | ||
158 | { | ||
159 | return height_to_maxindex[height]; | ||
160 | } | ||
161 | |||
162 | /* | ||
163 | * Extend a radix tree so it can store key @index. | ||
164 | */ | ||
165 | static int radix_tree_extend(struct radix_tree_root *root, unsigned long index) | ||
166 | { | ||
167 | struct radix_tree_node *node; | ||
168 | unsigned int height; | ||
169 | char tags[RADIX_TREE_TAGS]; | ||
170 | int tag; | ||
171 | |||
172 | /* Figure out what the height should be. */ | ||
173 | height = root->height + 1; | ||
174 | while (index > radix_tree_maxindex(height)) | ||
175 | height++; | ||
176 | |||
177 | if (root->rnode == NULL) { | ||
178 | root->height = height; | ||
179 | goto out; | ||
180 | } | ||
181 | |||
182 | /* | ||
183 | * Prepare the tag status of the top-level node for propagation | ||
184 | * into the newly-pushed top-level node(s) | ||
185 | */ | ||
186 | for (tag = 0; tag < RADIX_TREE_TAGS; tag++) { | ||
187 | int idx; | ||
188 | |||
189 | tags[tag] = 0; | ||
190 | for (idx = 0; idx < RADIX_TREE_TAG_LONGS; idx++) { | ||
191 | if (root->rnode->tags[tag][idx]) { | ||
192 | tags[tag] = 1; | ||
193 | break; | ||
194 | } | ||
195 | } | ||
196 | } | ||
197 | |||
198 | do { | ||
199 | if (!(node = radix_tree_node_alloc(root))) | ||
200 | return -ENOMEM; | ||
201 | |||
202 | /* Increase the height. */ | ||
203 | node->slots[0] = root->rnode; | ||
204 | |||
205 | /* Propagate the aggregated tag info into the new root */ | ||
206 | for (tag = 0; tag < RADIX_TREE_TAGS; tag++) { | ||
207 | if (tags[tag]) | ||
208 | tag_set(node, tag, 0); | ||
209 | } | ||
210 | |||
211 | node->count = 1; | ||
212 | root->rnode = node; | ||
213 | root->height++; | ||
214 | } while (height > root->height); | ||
215 | out: | ||
216 | return 0; | ||
217 | } | ||
218 | |||
219 | /** | ||
220 | * radix_tree_insert - insert into a radix tree | ||
221 | * @root: radix tree root | ||
222 | * @index: index key | ||
223 | * @item: item to insert | ||
224 | * | ||
225 | * Insert an item into the radix tree at position @index. | ||
226 | */ | ||
227 | int radix_tree_insert(struct radix_tree_root *root, | ||
228 | unsigned long index, void *item) | ||
229 | { | ||
230 | struct radix_tree_node *node = NULL, *tmp, **slot; | ||
231 | unsigned int height, shift; | ||
232 | int offset; | ||
233 | int error; | ||
234 | |||
235 | /* Make sure the tree is high enough. */ | ||
236 | if ((!index && !root->rnode) || | ||
237 | index > radix_tree_maxindex(root->height)) { | ||
238 | error = radix_tree_extend(root, index); | ||
239 | if (error) | ||
240 | return error; | ||
241 | } | ||
242 | |||
243 | slot = &root->rnode; | ||
244 | height = root->height; | ||
245 | shift = (height-1) * RADIX_TREE_MAP_SHIFT; | ||
246 | |||
247 | offset = 0; /* uninitialised var warning */ | ||
248 | while (height > 0) { | ||
249 | if (*slot == NULL) { | ||
250 | /* Have to add a child node. */ | ||
251 | if (!(tmp = radix_tree_node_alloc(root))) | ||
252 | return -ENOMEM; | ||
253 | *slot = tmp; | ||
254 | if (node) | ||
255 | node->count++; | ||
256 | } | ||
257 | |||
258 | /* Go a level down */ | ||
259 | offset = (index >> shift) & RADIX_TREE_MAP_MASK; | ||
260 | node = *slot; | ||
261 | slot = (struct radix_tree_node **)(node->slots + offset); | ||
262 | shift -= RADIX_TREE_MAP_SHIFT; | ||
263 | height--; | ||
264 | } | ||
265 | |||
266 | if (*slot != NULL) | ||
267 | return -EEXIST; | ||
268 | if (node) { | ||
269 | node->count++; | ||
270 | BUG_ON(tag_get(node, 0, offset)); | ||
271 | BUG_ON(tag_get(node, 1, offset)); | ||
272 | } | ||
273 | |||
274 | *slot = item; | ||
275 | return 0; | ||
276 | } | ||
277 | EXPORT_SYMBOL(radix_tree_insert); | ||
278 | |||
279 | /** | ||
280 | * radix_tree_lookup - perform lookup operation on a radix tree | ||
281 | * @root: radix tree root | ||
282 | * @index: index key | ||
283 | * | ||
284 | * Lookup the item at the position @index in the radix tree @root. | ||
285 | */ | ||
286 | void *radix_tree_lookup(struct radix_tree_root *root, unsigned long index) | ||
287 | { | ||
288 | unsigned int height, shift; | ||
289 | struct radix_tree_node **slot; | ||
290 | |||
291 | height = root->height; | ||
292 | if (index > radix_tree_maxindex(height)) | ||
293 | return NULL; | ||
294 | |||
295 | shift = (height-1) * RADIX_TREE_MAP_SHIFT; | ||
296 | slot = &root->rnode; | ||
297 | |||
298 | while (height > 0) { | ||
299 | if (*slot == NULL) | ||
300 | return NULL; | ||
301 | |||
302 | slot = (struct radix_tree_node **) | ||
303 | ((*slot)->slots + | ||
304 | ((index >> shift) & RADIX_TREE_MAP_MASK)); | ||
305 | shift -= RADIX_TREE_MAP_SHIFT; | ||
306 | height--; | ||
307 | } | ||
308 | |||
309 | return *slot; | ||
310 | } | ||
311 | EXPORT_SYMBOL(radix_tree_lookup); | ||
312 | |||
313 | /** | ||
314 | * radix_tree_tag_set - set a tag on a radix tree node | ||
315 | * @root: radix tree root | ||
316 | * @index: index key | ||
317 | * @tag: tag index | ||
318 | * | ||
319 | * Set the search tag corresponging to @index in the radix tree. From | ||
320 | * the root all the way down to the leaf node. | ||
321 | * | ||
322 | * Returns the address of the tagged item. Setting a tag on a not-present | ||
323 | * item is a bug. | ||
324 | */ | ||
325 | void *radix_tree_tag_set(struct radix_tree_root *root, | ||
326 | unsigned long index, int tag) | ||
327 | { | ||
328 | unsigned int height, shift; | ||
329 | struct radix_tree_node **slot; | ||
330 | |||
331 | height = root->height; | ||
332 | if (index > radix_tree_maxindex(height)) | ||
333 | return NULL; | ||
334 | |||
335 | shift = (height - 1) * RADIX_TREE_MAP_SHIFT; | ||
336 | slot = &root->rnode; | ||
337 | |||
338 | while (height > 0) { | ||
339 | int offset; | ||
340 | |||
341 | offset = (index >> shift) & RADIX_TREE_MAP_MASK; | ||
342 | tag_set(*slot, tag, offset); | ||
343 | slot = (struct radix_tree_node **)((*slot)->slots + offset); | ||
344 | BUG_ON(*slot == NULL); | ||
345 | shift -= RADIX_TREE_MAP_SHIFT; | ||
346 | height--; | ||
347 | } | ||
348 | |||
349 | return *slot; | ||
350 | } | ||
351 | EXPORT_SYMBOL(radix_tree_tag_set); | ||
352 | |||
353 | /** | ||
354 | * radix_tree_tag_clear - clear a tag on a radix tree node | ||
355 | * @root: radix tree root | ||
356 | * @index: index key | ||
357 | * @tag: tag index | ||
358 | * | ||
359 | * Clear the search tag corresponging to @index in the radix tree. If | ||
360 | * this causes the leaf node to have no tags set then clear the tag in the | ||
361 | * next-to-leaf node, etc. | ||
362 | * | ||
363 | * Returns the address of the tagged item on success, else NULL. ie: | ||
364 | * has the same return value and semantics as radix_tree_lookup(). | ||
365 | */ | ||
366 | void *radix_tree_tag_clear(struct radix_tree_root *root, | ||
367 | unsigned long index, int tag) | ||
368 | { | ||
369 | struct radix_tree_path path[RADIX_TREE_MAX_PATH], *pathp = path; | ||
370 | unsigned int height, shift; | ||
371 | void *ret = NULL; | ||
372 | |||
373 | height = root->height; | ||
374 | if (index > radix_tree_maxindex(height)) | ||
375 | goto out; | ||
376 | |||
377 | shift = (height - 1) * RADIX_TREE_MAP_SHIFT; | ||
378 | pathp->node = NULL; | ||
379 | pathp->slot = &root->rnode; | ||
380 | |||
381 | while (height > 0) { | ||
382 | int offset; | ||
383 | |||
384 | if (*pathp->slot == NULL) | ||
385 | goto out; | ||
386 | |||
387 | offset = (index >> shift) & RADIX_TREE_MAP_MASK; | ||
388 | pathp[1].offset = offset; | ||
389 | pathp[1].node = *pathp[0].slot; | ||
390 | pathp[1].slot = (struct radix_tree_node **) | ||
391 | (pathp[1].node->slots + offset); | ||
392 | pathp++; | ||
393 | shift -= RADIX_TREE_MAP_SHIFT; | ||
394 | height--; | ||
395 | } | ||
396 | |||
397 | ret = *pathp[0].slot; | ||
398 | if (ret == NULL) | ||
399 | goto out; | ||
400 | |||
401 | do { | ||
402 | int idx; | ||
403 | |||
404 | tag_clear(pathp[0].node, tag, pathp[0].offset); | ||
405 | for (idx = 0; idx < RADIX_TREE_TAG_LONGS; idx++) { | ||
406 | if (pathp[0].node->tags[tag][idx]) | ||
407 | goto out; | ||
408 | } | ||
409 | pathp--; | ||
410 | } while (pathp[0].node); | ||
411 | out: | ||
412 | return ret; | ||
413 | } | ||
414 | EXPORT_SYMBOL(radix_tree_tag_clear); | ||
415 | |||
416 | #ifndef __KERNEL__ /* Only the test harness uses this at present */ | ||
417 | /** | ||
418 | * radix_tree_tag_get - get a tag on a radix tree node | ||
419 | * @root: radix tree root | ||
420 | * @index: index key | ||
421 | * @tag: tag index | ||
422 | * | ||
423 | * Return the search tag corresponging to @index in the radix tree. | ||
424 | * | ||
425 | * Returns zero if the tag is unset, or if there is no corresponding item | ||
426 | * in the tree. | ||
427 | */ | ||
428 | int radix_tree_tag_get(struct radix_tree_root *root, | ||
429 | unsigned long index, int tag) | ||
430 | { | ||
431 | unsigned int height, shift; | ||
432 | struct radix_tree_node **slot; | ||
433 | int saw_unset_tag = 0; | ||
434 | |||
435 | height = root->height; | ||
436 | if (index > radix_tree_maxindex(height)) | ||
437 | return 0; | ||
438 | |||
439 | shift = (height - 1) * RADIX_TREE_MAP_SHIFT; | ||
440 | slot = &root->rnode; | ||
441 | |||
442 | for ( ; ; ) { | ||
443 | int offset; | ||
444 | |||
445 | if (*slot == NULL) | ||
446 | return 0; | ||
447 | |||
448 | offset = (index >> shift) & RADIX_TREE_MAP_MASK; | ||
449 | |||
450 | /* | ||
451 | * This is just a debug check. Later, we can bale as soon as | ||
452 | * we see an unset tag. | ||
453 | */ | ||
454 | if (!tag_get(*slot, tag, offset)) | ||
455 | saw_unset_tag = 1; | ||
456 | if (height == 1) { | ||
457 | int ret = tag_get(*slot, tag, offset); | ||
458 | |||
459 | BUG_ON(ret && saw_unset_tag); | ||
460 | return ret; | ||
461 | } | ||
462 | slot = (struct radix_tree_node **)((*slot)->slots + offset); | ||
463 | shift -= RADIX_TREE_MAP_SHIFT; | ||
464 | height--; | ||
465 | } | ||
466 | } | ||
467 | EXPORT_SYMBOL(radix_tree_tag_get); | ||
468 | #endif | ||
469 | |||
470 | static unsigned int | ||
471 | __lookup(struct radix_tree_root *root, void **results, unsigned long index, | ||
472 | unsigned int max_items, unsigned long *next_index) | ||
473 | { | ||
474 | unsigned int nr_found = 0; | ||
475 | unsigned int shift; | ||
476 | unsigned int height = root->height; | ||
477 | struct radix_tree_node *slot; | ||
478 | |||
479 | shift = (height-1) * RADIX_TREE_MAP_SHIFT; | ||
480 | slot = root->rnode; | ||
481 | |||
482 | while (height > 0) { | ||
483 | unsigned long i = (index >> shift) & RADIX_TREE_MAP_MASK; | ||
484 | |||
485 | for ( ; i < RADIX_TREE_MAP_SIZE; i++) { | ||
486 | if (slot->slots[i] != NULL) | ||
487 | break; | ||
488 | index &= ~((1UL << shift) - 1); | ||
489 | index += 1UL << shift; | ||
490 | if (index == 0) | ||
491 | goto out; /* 32-bit wraparound */ | ||
492 | } | ||
493 | if (i == RADIX_TREE_MAP_SIZE) | ||
494 | goto out; | ||
495 | height--; | ||
496 | if (height == 0) { /* Bottom level: grab some items */ | ||
497 | unsigned long j = index & RADIX_TREE_MAP_MASK; | ||
498 | |||
499 | for ( ; j < RADIX_TREE_MAP_SIZE; j++) { | ||
500 | index++; | ||
501 | if (slot->slots[j]) { | ||
502 | results[nr_found++] = slot->slots[j]; | ||
503 | if (nr_found == max_items) | ||
504 | goto out; | ||
505 | } | ||
506 | } | ||
507 | } | ||
508 | shift -= RADIX_TREE_MAP_SHIFT; | ||
509 | slot = slot->slots[i]; | ||
510 | } | ||
511 | out: | ||
512 | *next_index = index; | ||
513 | return nr_found; | ||
514 | } | ||
515 | |||
516 | /** | ||
517 | * radix_tree_gang_lookup - perform multiple lookup on a radix tree | ||
518 | * @root: radix tree root | ||
519 | * @results: where the results of the lookup are placed | ||
520 | * @first_index: start the lookup from this key | ||
521 | * @max_items: place up to this many items at *results | ||
522 | * | ||
523 | * Performs an index-ascending scan of the tree for present items. Places | ||
524 | * them at *@results and returns the number of items which were placed at | ||
525 | * *@results. | ||
526 | * | ||
527 | * The implementation is naive. | ||
528 | */ | ||
529 | unsigned int | ||
530 | radix_tree_gang_lookup(struct radix_tree_root *root, void **results, | ||
531 | unsigned long first_index, unsigned int max_items) | ||
532 | { | ||
533 | const unsigned long max_index = radix_tree_maxindex(root->height); | ||
534 | unsigned long cur_index = first_index; | ||
535 | unsigned int ret = 0; | ||
536 | |||
537 | while (ret < max_items) { | ||
538 | unsigned int nr_found; | ||
539 | unsigned long next_index; /* Index of next search */ | ||
540 | |||
541 | if (cur_index > max_index) | ||
542 | break; | ||
543 | nr_found = __lookup(root, results + ret, cur_index, | ||
544 | max_items - ret, &next_index); | ||
545 | ret += nr_found; | ||
546 | if (next_index == 0) | ||
547 | break; | ||
548 | cur_index = next_index; | ||
549 | } | ||
550 | return ret; | ||
551 | } | ||
552 | EXPORT_SYMBOL(radix_tree_gang_lookup); | ||
553 | |||
554 | /* | ||
555 | * FIXME: the two tag_get()s here should use find_next_bit() instead of | ||
556 | * open-coding the search. | ||
557 | */ | ||
558 | static unsigned int | ||
559 | __lookup_tag(struct radix_tree_root *root, void **results, unsigned long index, | ||
560 | unsigned int max_items, unsigned long *next_index, int tag) | ||
561 | { | ||
562 | unsigned int nr_found = 0; | ||
563 | unsigned int shift; | ||
564 | unsigned int height = root->height; | ||
565 | struct radix_tree_node *slot; | ||
566 | |||
567 | shift = (height - 1) * RADIX_TREE_MAP_SHIFT; | ||
568 | slot = root->rnode; | ||
569 | |||
570 | while (height > 0) { | ||
571 | unsigned long i = (index >> shift) & RADIX_TREE_MAP_MASK; | ||
572 | |||
573 | for ( ; i < RADIX_TREE_MAP_SIZE; i++) { | ||
574 | if (tag_get(slot, tag, i)) { | ||
575 | BUG_ON(slot->slots[i] == NULL); | ||
576 | break; | ||
577 | } | ||
578 | index &= ~((1UL << shift) - 1); | ||
579 | index += 1UL << shift; | ||
580 | if (index == 0) | ||
581 | goto out; /* 32-bit wraparound */ | ||
582 | } | ||
583 | if (i == RADIX_TREE_MAP_SIZE) | ||
584 | goto out; | ||
585 | height--; | ||
586 | if (height == 0) { /* Bottom level: grab some items */ | ||
587 | unsigned long j = index & RADIX_TREE_MAP_MASK; | ||
588 | |||
589 | for ( ; j < RADIX_TREE_MAP_SIZE; j++) { | ||
590 | index++; | ||
591 | if (tag_get(slot, tag, j)) { | ||
592 | BUG_ON(slot->slots[j] == NULL); | ||
593 | results[nr_found++] = slot->slots[j]; | ||
594 | if (nr_found == max_items) | ||
595 | goto out; | ||
596 | } | ||
597 | } | ||
598 | } | ||
599 | shift -= RADIX_TREE_MAP_SHIFT; | ||
600 | slot = slot->slots[i]; | ||
601 | } | ||
602 | out: | ||
603 | *next_index = index; | ||
604 | return nr_found; | ||
605 | } | ||
606 | |||
607 | /** | ||
608 | * radix_tree_gang_lookup_tag - perform multiple lookup on a radix tree | ||
609 | * based on a tag | ||
610 | * @root: radix tree root | ||
611 | * @results: where the results of the lookup are placed | ||
612 | * @first_index: start the lookup from this key | ||
613 | * @max_items: place up to this many items at *results | ||
614 | * @tag: the tag index | ||
615 | * | ||
616 | * Performs an index-ascending scan of the tree for present items which | ||
617 | * have the tag indexed by @tag set. Places the items at *@results and | ||
618 | * returns the number of items which were placed at *@results. | ||
619 | */ | ||
620 | unsigned int | ||
621 | radix_tree_gang_lookup_tag(struct radix_tree_root *root, void **results, | ||
622 | unsigned long first_index, unsigned int max_items, int tag) | ||
623 | { | ||
624 | const unsigned long max_index = radix_tree_maxindex(root->height); | ||
625 | unsigned long cur_index = first_index; | ||
626 | unsigned int ret = 0; | ||
627 | |||
628 | while (ret < max_items) { | ||
629 | unsigned int nr_found; | ||
630 | unsigned long next_index; /* Index of next search */ | ||
631 | |||
632 | if (cur_index > max_index) | ||
633 | break; | ||
634 | nr_found = __lookup_tag(root, results + ret, cur_index, | ||
635 | max_items - ret, &next_index, tag); | ||
636 | ret += nr_found; | ||
637 | if (next_index == 0) | ||
638 | break; | ||
639 | cur_index = next_index; | ||
640 | } | ||
641 | return ret; | ||
642 | } | ||
643 | EXPORT_SYMBOL(radix_tree_gang_lookup_tag); | ||
644 | |||
645 | /** | ||
646 | * radix_tree_delete - delete an item from a radix tree | ||
647 | * @root: radix tree root | ||
648 | * @index: index key | ||
649 | * | ||
650 | * Remove the item at @index from the radix tree rooted at @root. | ||
651 | * | ||
652 | * Returns the address of the deleted item, or NULL if it was not present. | ||
653 | */ | ||
654 | void *radix_tree_delete(struct radix_tree_root *root, unsigned long index) | ||
655 | { | ||
656 | struct radix_tree_path path[RADIX_TREE_MAX_PATH], *pathp = path; | ||
657 | struct radix_tree_path *orig_pathp; | ||
658 | unsigned int height, shift; | ||
659 | void *ret = NULL; | ||
660 | char tags[RADIX_TREE_TAGS]; | ||
661 | int nr_cleared_tags; | ||
662 | |||
663 | height = root->height; | ||
664 | if (index > radix_tree_maxindex(height)) | ||
665 | goto out; | ||
666 | |||
667 | shift = (height - 1) * RADIX_TREE_MAP_SHIFT; | ||
668 | pathp->node = NULL; | ||
669 | pathp->slot = &root->rnode; | ||
670 | |||
671 | while (height > 0) { | ||
672 | int offset; | ||
673 | |||
674 | if (*pathp->slot == NULL) | ||
675 | goto out; | ||
676 | |||
677 | offset = (index >> shift) & RADIX_TREE_MAP_MASK; | ||
678 | pathp[1].offset = offset; | ||
679 | pathp[1].node = *pathp[0].slot; | ||
680 | pathp[1].slot = (struct radix_tree_node **) | ||
681 | (pathp[1].node->slots + offset); | ||
682 | pathp++; | ||
683 | shift -= RADIX_TREE_MAP_SHIFT; | ||
684 | height--; | ||
685 | } | ||
686 | |||
687 | ret = *pathp[0].slot; | ||
688 | if (ret == NULL) | ||
689 | goto out; | ||
690 | |||
691 | orig_pathp = pathp; | ||
692 | |||
693 | /* | ||
694 | * Clear all tags associated with the just-deleted item | ||
695 | */ | ||
696 | memset(tags, 0, sizeof(tags)); | ||
697 | do { | ||
698 | int tag; | ||
699 | |||
700 | nr_cleared_tags = RADIX_TREE_TAGS; | ||
701 | for (tag = 0; tag < RADIX_TREE_TAGS; tag++) { | ||
702 | int idx; | ||
703 | |||
704 | if (tags[tag]) | ||
705 | continue; | ||
706 | |||
707 | tag_clear(pathp[0].node, tag, pathp[0].offset); | ||
708 | |||
709 | for (idx = 0; idx < RADIX_TREE_TAG_LONGS; idx++) { | ||
710 | if (pathp[0].node->tags[tag][idx]) { | ||
711 | tags[tag] = 1; | ||
712 | nr_cleared_tags--; | ||
713 | break; | ||
714 | } | ||
715 | } | ||
716 | } | ||
717 | pathp--; | ||
718 | } while (pathp[0].node && nr_cleared_tags); | ||
719 | |||
720 | pathp = orig_pathp; | ||
721 | *pathp[0].slot = NULL; | ||
722 | while (pathp[0].node && --pathp[0].node->count == 0) { | ||
723 | pathp--; | ||
724 | BUG_ON(*pathp[0].slot == NULL); | ||
725 | *pathp[0].slot = NULL; | ||
726 | radix_tree_node_free(pathp[1].node); | ||
727 | } | ||
728 | if (root->rnode == NULL) | ||
729 | root->height = 0; | ||
730 | out: | ||
731 | return ret; | ||
732 | } | ||
733 | EXPORT_SYMBOL(radix_tree_delete); | ||
734 | |||
735 | /** | ||
736 | * radix_tree_tagged - test whether any items in the tree are tagged | ||
737 | * @root: radix tree root | ||
738 | * @tag: tag to test | ||
739 | */ | ||
740 | int radix_tree_tagged(struct radix_tree_root *root, int tag) | ||
741 | { | ||
742 | int idx; | ||
743 | |||
744 | if (!root->rnode) | ||
745 | return 0; | ||
746 | for (idx = 0; idx < RADIX_TREE_TAG_LONGS; idx++) { | ||
747 | if (root->rnode->tags[tag][idx]) | ||
748 | return 1; | ||
749 | } | ||
750 | return 0; | ||
751 | } | ||
752 | EXPORT_SYMBOL(radix_tree_tagged); | ||
753 | |||
754 | static void | ||
755 | radix_tree_node_ctor(void *node, kmem_cache_t *cachep, unsigned long flags) | ||
756 | { | ||
757 | memset(node, 0, sizeof(struct radix_tree_node)); | ||
758 | } | ||
759 | |||
760 | static __init unsigned long __maxindex(unsigned int height) | ||
761 | { | ||
762 | unsigned int tmp = height * RADIX_TREE_MAP_SHIFT; | ||
763 | unsigned long index = (~0UL >> (RADIX_TREE_INDEX_BITS - tmp - 1)) >> 1; | ||
764 | |||
765 | if (tmp >= RADIX_TREE_INDEX_BITS) | ||
766 | index = ~0UL; | ||
767 | return index; | ||
768 | } | ||
769 | |||
770 | static __init void radix_tree_init_maxindex(void) | ||
771 | { | ||
772 | unsigned int i; | ||
773 | |||
774 | for (i = 0; i < ARRAY_SIZE(height_to_maxindex); i++) | ||
775 | height_to_maxindex[i] = __maxindex(i); | ||
776 | } | ||
777 | |||
778 | #ifdef CONFIG_HOTPLUG_CPU | ||
779 | static int radix_tree_callback(struct notifier_block *nfb, | ||
780 | unsigned long action, | ||
781 | void *hcpu) | ||
782 | { | ||
783 | int cpu = (long)hcpu; | ||
784 | struct radix_tree_preload *rtp; | ||
785 | |||
786 | /* Free per-cpu pool of perloaded nodes */ | ||
787 | if (action == CPU_DEAD) { | ||
788 | rtp = &per_cpu(radix_tree_preloads, cpu); | ||
789 | while (rtp->nr) { | ||
790 | kmem_cache_free(radix_tree_node_cachep, | ||
791 | rtp->nodes[rtp->nr-1]); | ||
792 | rtp->nodes[rtp->nr-1] = NULL; | ||
793 | rtp->nr--; | ||
794 | } | ||
795 | } | ||
796 | return NOTIFY_OK; | ||
797 | } | ||
798 | #endif /* CONFIG_HOTPLUG_CPU */ | ||
799 | |||
800 | void __init radix_tree_init(void) | ||
801 | { | ||
802 | radix_tree_node_cachep = kmem_cache_create("radix_tree_node", | ||
803 | sizeof(struct radix_tree_node), 0, | ||
804 | SLAB_PANIC, radix_tree_node_ctor, NULL); | ||
805 | radix_tree_init_maxindex(); | ||
806 | hotcpu_notifier(radix_tree_callback, 0); | ||
807 | } | ||
diff --git a/lib/rbtree.c b/lib/rbtree.c new file mode 100644 index 000000000000..14b791ac5089 --- /dev/null +++ b/lib/rbtree.c | |||
@@ -0,0 +1,394 @@ | |||
1 | /* | ||
2 | Red Black Trees | ||
3 | (C) 1999 Andrea Arcangeli <andrea@suse.de> | ||
4 | (C) 2002 David Woodhouse <dwmw2@infradead.org> | ||
5 | |||
6 | This program is free software; you can redistribute it and/or modify | ||
7 | it under the terms of the GNU General Public License as published by | ||
8 | the Free Software Foundation; either version 2 of the License, or | ||
9 | (at your option) any later version. | ||
10 | |||
11 | This program is distributed in the hope that it will be useful, | ||
12 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | GNU General Public License for more details. | ||
15 | |||
16 | You should have received a copy of the GNU General Public License | ||
17 | along with this program; if not, write to the Free Software | ||
18 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
19 | |||
20 | linux/lib/rbtree.c | ||
21 | */ | ||
22 | |||
23 | #include <linux/rbtree.h> | ||
24 | #include <linux/module.h> | ||
25 | |||
26 | static void __rb_rotate_left(struct rb_node *node, struct rb_root *root) | ||
27 | { | ||
28 | struct rb_node *right = node->rb_right; | ||
29 | |||
30 | if ((node->rb_right = right->rb_left)) | ||
31 | right->rb_left->rb_parent = node; | ||
32 | right->rb_left = node; | ||
33 | |||
34 | if ((right->rb_parent = node->rb_parent)) | ||
35 | { | ||
36 | if (node == node->rb_parent->rb_left) | ||
37 | node->rb_parent->rb_left = right; | ||
38 | else | ||
39 | node->rb_parent->rb_right = right; | ||
40 | } | ||
41 | else | ||
42 | root->rb_node = right; | ||
43 | node->rb_parent = right; | ||
44 | } | ||
45 | |||
46 | static void __rb_rotate_right(struct rb_node *node, struct rb_root *root) | ||
47 | { | ||
48 | struct rb_node *left = node->rb_left; | ||
49 | |||
50 | if ((node->rb_left = left->rb_right)) | ||
51 | left->rb_right->rb_parent = node; | ||
52 | left->rb_right = node; | ||
53 | |||
54 | if ((left->rb_parent = node->rb_parent)) | ||
55 | { | ||
56 | if (node == node->rb_parent->rb_right) | ||
57 | node->rb_parent->rb_right = left; | ||
58 | else | ||
59 | node->rb_parent->rb_left = left; | ||
60 | } | ||
61 | else | ||
62 | root->rb_node = left; | ||
63 | node->rb_parent = left; | ||
64 | } | ||
65 | |||
66 | void rb_insert_color(struct rb_node *node, struct rb_root *root) | ||
67 | { | ||
68 | struct rb_node *parent, *gparent; | ||
69 | |||
70 | while ((parent = node->rb_parent) && parent->rb_color == RB_RED) | ||
71 | { | ||
72 | gparent = parent->rb_parent; | ||
73 | |||
74 | if (parent == gparent->rb_left) | ||
75 | { | ||
76 | { | ||
77 | register struct rb_node *uncle = gparent->rb_right; | ||
78 | if (uncle && uncle->rb_color == RB_RED) | ||
79 | { | ||
80 | uncle->rb_color = RB_BLACK; | ||
81 | parent->rb_color = RB_BLACK; | ||
82 | gparent->rb_color = RB_RED; | ||
83 | node = gparent; | ||
84 | continue; | ||
85 | } | ||
86 | } | ||
87 | |||
88 | if (parent->rb_right == node) | ||
89 | { | ||
90 | register struct rb_node *tmp; | ||
91 | __rb_rotate_left(parent, root); | ||
92 | tmp = parent; | ||
93 | parent = node; | ||
94 | node = tmp; | ||
95 | } | ||
96 | |||
97 | parent->rb_color = RB_BLACK; | ||
98 | gparent->rb_color = RB_RED; | ||
99 | __rb_rotate_right(gparent, root); | ||
100 | } else { | ||
101 | { | ||
102 | register struct rb_node *uncle = gparent->rb_left; | ||
103 | if (uncle && uncle->rb_color == RB_RED) | ||
104 | { | ||
105 | uncle->rb_color = RB_BLACK; | ||
106 | parent->rb_color = RB_BLACK; | ||
107 | gparent->rb_color = RB_RED; | ||
108 | node = gparent; | ||
109 | continue; | ||
110 | } | ||
111 | } | ||
112 | |||
113 | if (parent->rb_left == node) | ||
114 | { | ||
115 | register struct rb_node *tmp; | ||
116 | __rb_rotate_right(parent, root); | ||
117 | tmp = parent; | ||
118 | parent = node; | ||
119 | node = tmp; | ||
120 | } | ||
121 | |||
122 | parent->rb_color = RB_BLACK; | ||
123 | gparent->rb_color = RB_RED; | ||
124 | __rb_rotate_left(gparent, root); | ||
125 | } | ||
126 | } | ||
127 | |||
128 | root->rb_node->rb_color = RB_BLACK; | ||
129 | } | ||
130 | EXPORT_SYMBOL(rb_insert_color); | ||
131 | |||
132 | static void __rb_erase_color(struct rb_node *node, struct rb_node *parent, | ||
133 | struct rb_root *root) | ||
134 | { | ||
135 | struct rb_node *other; | ||
136 | |||
137 | while ((!node || node->rb_color == RB_BLACK) && node != root->rb_node) | ||
138 | { | ||
139 | if (parent->rb_left == node) | ||
140 | { | ||
141 | other = parent->rb_right; | ||
142 | if (other->rb_color == RB_RED) | ||
143 | { | ||
144 | other->rb_color = RB_BLACK; | ||
145 | parent->rb_color = RB_RED; | ||
146 | __rb_rotate_left(parent, root); | ||
147 | other = parent->rb_right; | ||
148 | } | ||
149 | if ((!other->rb_left || | ||
150 | other->rb_left->rb_color == RB_BLACK) | ||
151 | && (!other->rb_right || | ||
152 | other->rb_right->rb_color == RB_BLACK)) | ||
153 | { | ||
154 | other->rb_color = RB_RED; | ||
155 | node = parent; | ||
156 | parent = node->rb_parent; | ||
157 | } | ||
158 | else | ||
159 | { | ||
160 | if (!other->rb_right || | ||
161 | other->rb_right->rb_color == RB_BLACK) | ||
162 | { | ||
163 | register struct rb_node *o_left; | ||
164 | if ((o_left = other->rb_left)) | ||
165 | o_left->rb_color = RB_BLACK; | ||
166 | other->rb_color = RB_RED; | ||
167 | __rb_rotate_right(other, root); | ||
168 | other = parent->rb_right; | ||
169 | } | ||
170 | other->rb_color = parent->rb_color; | ||
171 | parent->rb_color = RB_BLACK; | ||
172 | if (other->rb_right) | ||
173 | other->rb_right->rb_color = RB_BLACK; | ||
174 | __rb_rotate_left(parent, root); | ||
175 | node = root->rb_node; | ||
176 | break; | ||
177 | } | ||
178 | } | ||
179 | else | ||
180 | { | ||
181 | other = parent->rb_left; | ||
182 | if (other->rb_color == RB_RED) | ||
183 | { | ||
184 | other->rb_color = RB_BLACK; | ||
185 | parent->rb_color = RB_RED; | ||
186 | __rb_rotate_right(parent, root); | ||
187 | other = parent->rb_left; | ||
188 | } | ||
189 | if ((!other->rb_left || | ||
190 | other->rb_left->rb_color == RB_BLACK) | ||
191 | && (!other->rb_right || | ||
192 | other->rb_right->rb_color == RB_BLACK)) | ||
193 | { | ||
194 | other->rb_color = RB_RED; | ||
195 | node = parent; | ||
196 | parent = node->rb_parent; | ||
197 | } | ||
198 | else | ||
199 | { | ||
200 | if (!other->rb_left || | ||
201 | other->rb_left->rb_color == RB_BLACK) | ||
202 | { | ||
203 | register struct rb_node *o_right; | ||
204 | if ((o_right = other->rb_right)) | ||
205 | o_right->rb_color = RB_BLACK; | ||
206 | other->rb_color = RB_RED; | ||
207 | __rb_rotate_left(other, root); | ||
208 | other = parent->rb_left; | ||
209 | } | ||
210 | other->rb_color = parent->rb_color; | ||
211 | parent->rb_color = RB_BLACK; | ||
212 | if (other->rb_left) | ||
213 | other->rb_left->rb_color = RB_BLACK; | ||
214 | __rb_rotate_right(parent, root); | ||
215 | node = root->rb_node; | ||
216 | break; | ||
217 | } | ||
218 | } | ||
219 | } | ||
220 | if (node) | ||
221 | node->rb_color = RB_BLACK; | ||
222 | } | ||
223 | |||
224 | void rb_erase(struct rb_node *node, struct rb_root *root) | ||
225 | { | ||
226 | struct rb_node *child, *parent; | ||
227 | int color; | ||
228 | |||
229 | if (!node->rb_left) | ||
230 | child = node->rb_right; | ||
231 | else if (!node->rb_right) | ||
232 | child = node->rb_left; | ||
233 | else | ||
234 | { | ||
235 | struct rb_node *old = node, *left; | ||
236 | |||
237 | node = node->rb_right; | ||
238 | while ((left = node->rb_left) != NULL) | ||
239 | node = left; | ||
240 | child = node->rb_right; | ||
241 | parent = node->rb_parent; | ||
242 | color = node->rb_color; | ||
243 | |||
244 | if (child) | ||
245 | child->rb_parent = parent; | ||
246 | if (parent) | ||
247 | { | ||
248 | if (parent->rb_left == node) | ||
249 | parent->rb_left = child; | ||
250 | else | ||
251 | parent->rb_right = child; | ||
252 | } | ||
253 | else | ||
254 | root->rb_node = child; | ||
255 | |||
256 | if (node->rb_parent == old) | ||
257 | parent = node; | ||
258 | node->rb_parent = old->rb_parent; | ||
259 | node->rb_color = old->rb_color; | ||
260 | node->rb_right = old->rb_right; | ||
261 | node->rb_left = old->rb_left; | ||
262 | |||
263 | if (old->rb_parent) | ||
264 | { | ||
265 | if (old->rb_parent->rb_left == old) | ||
266 | old->rb_parent->rb_left = node; | ||
267 | else | ||
268 | old->rb_parent->rb_right = node; | ||
269 | } else | ||
270 | root->rb_node = node; | ||
271 | |||
272 | old->rb_left->rb_parent = node; | ||
273 | if (old->rb_right) | ||
274 | old->rb_right->rb_parent = node; | ||
275 | goto color; | ||
276 | } | ||
277 | |||
278 | parent = node->rb_parent; | ||
279 | color = node->rb_color; | ||
280 | |||
281 | if (child) | ||
282 | child->rb_parent = parent; | ||
283 | if (parent) | ||
284 | { | ||
285 | if (parent->rb_left == node) | ||
286 | parent->rb_left = child; | ||
287 | else | ||
288 | parent->rb_right = child; | ||
289 | } | ||
290 | else | ||
291 | root->rb_node = child; | ||
292 | |||
293 | color: | ||
294 | if (color == RB_BLACK) | ||
295 | __rb_erase_color(child, parent, root); | ||
296 | } | ||
297 | EXPORT_SYMBOL(rb_erase); | ||
298 | |||
299 | /* | ||
300 | * This function returns the first node (in sort order) of the tree. | ||
301 | */ | ||
302 | struct rb_node *rb_first(struct rb_root *root) | ||
303 | { | ||
304 | struct rb_node *n; | ||
305 | |||
306 | n = root->rb_node; | ||
307 | if (!n) | ||
308 | return NULL; | ||
309 | while (n->rb_left) | ||
310 | n = n->rb_left; | ||
311 | return n; | ||
312 | } | ||
313 | EXPORT_SYMBOL(rb_first); | ||
314 | |||
315 | struct rb_node *rb_last(struct rb_root *root) | ||
316 | { | ||
317 | struct rb_node *n; | ||
318 | |||
319 | n = root->rb_node; | ||
320 | if (!n) | ||
321 | return NULL; | ||
322 | while (n->rb_right) | ||
323 | n = n->rb_right; | ||
324 | return n; | ||
325 | } | ||
326 | EXPORT_SYMBOL(rb_last); | ||
327 | |||
328 | struct rb_node *rb_next(struct rb_node *node) | ||
329 | { | ||
330 | /* If we have a right-hand child, go down and then left as far | ||
331 | as we can. */ | ||
332 | if (node->rb_right) { | ||
333 | node = node->rb_right; | ||
334 | while (node->rb_left) | ||
335 | node=node->rb_left; | ||
336 | return node; | ||
337 | } | ||
338 | |||
339 | /* No right-hand children. Everything down and left is | ||
340 | smaller than us, so any 'next' node must be in the general | ||
341 | direction of our parent. Go up the tree; any time the | ||
342 | ancestor is a right-hand child of its parent, keep going | ||
343 | up. First time it's a left-hand child of its parent, said | ||
344 | parent is our 'next' node. */ | ||
345 | while (node->rb_parent && node == node->rb_parent->rb_right) | ||
346 | node = node->rb_parent; | ||
347 | |||
348 | return node->rb_parent; | ||
349 | } | ||
350 | EXPORT_SYMBOL(rb_next); | ||
351 | |||
352 | struct rb_node *rb_prev(struct rb_node *node) | ||
353 | { | ||
354 | /* If we have a left-hand child, go down and then right as far | ||
355 | as we can. */ | ||
356 | if (node->rb_left) { | ||
357 | node = node->rb_left; | ||
358 | while (node->rb_right) | ||
359 | node=node->rb_right; | ||
360 | return node; | ||
361 | } | ||
362 | |||
363 | /* No left-hand children. Go up till we find an ancestor which | ||
364 | is a right-hand child of its parent */ | ||
365 | while (node->rb_parent && node == node->rb_parent->rb_left) | ||
366 | node = node->rb_parent; | ||
367 | |||
368 | return node->rb_parent; | ||
369 | } | ||
370 | EXPORT_SYMBOL(rb_prev); | ||
371 | |||
372 | void rb_replace_node(struct rb_node *victim, struct rb_node *new, | ||
373 | struct rb_root *root) | ||
374 | { | ||
375 | struct rb_node *parent = victim->rb_parent; | ||
376 | |||
377 | /* Set the surrounding nodes to point to the replacement */ | ||
378 | if (parent) { | ||
379 | if (victim == parent->rb_left) | ||
380 | parent->rb_left = new; | ||
381 | else | ||
382 | parent->rb_right = new; | ||
383 | } else { | ||
384 | root->rb_node = new; | ||
385 | } | ||
386 | if (victim->rb_left) | ||
387 | victim->rb_left->rb_parent = new; | ||
388 | if (victim->rb_right) | ||
389 | victim->rb_right->rb_parent = new; | ||
390 | |||
391 | /* Copy the pointers/colour from the victim to the replacement */ | ||
392 | *new = *victim; | ||
393 | } | ||
394 | EXPORT_SYMBOL(rb_replace_node); | ||
diff --git a/lib/reed_solomon/Makefile b/lib/reed_solomon/Makefile new file mode 100644 index 000000000000..747a2de29346 --- /dev/null +++ b/lib/reed_solomon/Makefile | |||
@@ -0,0 +1,6 @@ | |||
1 | # | ||
2 | # This is a modified version of reed solomon lib, | ||
3 | # | ||
4 | |||
5 | obj-$(CONFIG_REED_SOLOMON) += reed_solomon.o | ||
6 | |||
diff --git a/lib/reed_solomon/decode_rs.c b/lib/reed_solomon/decode_rs.c new file mode 100644 index 000000000000..d401decd6289 --- /dev/null +++ b/lib/reed_solomon/decode_rs.c | |||
@@ -0,0 +1,272 @@ | |||
1 | /* | ||
2 | * lib/reed_solomon/decode_rs.c | ||
3 | * | ||
4 | * Overview: | ||
5 | * Generic Reed Solomon encoder / decoder library | ||
6 | * | ||
7 | * Copyright 2002, Phil Karn, KA9Q | ||
8 | * May be used under the terms of the GNU General Public License (GPL) | ||
9 | * | ||
10 | * Adaption to the kernel by Thomas Gleixner (tglx@linutronix.de) | ||
11 | * | ||
12 | * $Id: decode_rs.c,v 1.6 2004/10/22 15:41:47 gleixner Exp $ | ||
13 | * | ||
14 | */ | ||
15 | |||
16 | /* Generic data width independent code which is included by the | ||
17 | * wrappers. | ||
18 | */ | ||
19 | { | ||
20 | int deg_lambda, el, deg_omega; | ||
21 | int i, j, r, k, pad; | ||
22 | int nn = rs->nn; | ||
23 | int nroots = rs->nroots; | ||
24 | int fcr = rs->fcr; | ||
25 | int prim = rs->prim; | ||
26 | int iprim = rs->iprim; | ||
27 | uint16_t *alpha_to = rs->alpha_to; | ||
28 | uint16_t *index_of = rs->index_of; | ||
29 | uint16_t u, q, tmp, num1, num2, den, discr_r, syn_error; | ||
30 | /* Err+Eras Locator poly and syndrome poly The maximum value | ||
31 | * of nroots is 8. So the necessary stack size will be about | ||
32 | * 220 bytes max. | ||
33 | */ | ||
34 | uint16_t lambda[nroots + 1], syn[nroots]; | ||
35 | uint16_t b[nroots + 1], t[nroots + 1], omega[nroots + 1]; | ||
36 | uint16_t root[nroots], reg[nroots + 1], loc[nroots]; | ||
37 | int count = 0; | ||
38 | uint16_t msk = (uint16_t) rs->nn; | ||
39 | |||
40 | /* Check length parameter for validity */ | ||
41 | pad = nn - nroots - len; | ||
42 | if (pad < 0 || pad >= nn) | ||
43 | return -ERANGE; | ||
44 | |||
45 | /* Does the caller provide the syndrome ? */ | ||
46 | if (s != NULL) | ||
47 | goto decode; | ||
48 | |||
49 | /* form the syndromes; i.e., evaluate data(x) at roots of | ||
50 | * g(x) */ | ||
51 | for (i = 0; i < nroots; i++) | ||
52 | syn[i] = (((uint16_t) data[0]) ^ invmsk) & msk; | ||
53 | |||
54 | for (j = 1; j < len; j++) { | ||
55 | for (i = 0; i < nroots; i++) { | ||
56 | if (syn[i] == 0) { | ||
57 | syn[i] = (((uint16_t) data[j]) ^ | ||
58 | invmsk) & msk; | ||
59 | } else { | ||
60 | syn[i] = ((((uint16_t) data[j]) ^ | ||
61 | invmsk) & msk) ^ | ||
62 | alpha_to[rs_modnn(rs, index_of[syn[i]] + | ||
63 | (fcr + i) * prim)]; | ||
64 | } | ||
65 | } | ||
66 | } | ||
67 | |||
68 | for (j = 0; j < nroots; j++) { | ||
69 | for (i = 0; i < nroots; i++) { | ||
70 | if (syn[i] == 0) { | ||
71 | syn[i] = ((uint16_t) par[j]) & msk; | ||
72 | } else { | ||
73 | syn[i] = (((uint16_t) par[j]) & msk) ^ | ||
74 | alpha_to[rs_modnn(rs, index_of[syn[i]] + | ||
75 | (fcr+i)*prim)]; | ||
76 | } | ||
77 | } | ||
78 | } | ||
79 | s = syn; | ||
80 | |||
81 | /* Convert syndromes to index form, checking for nonzero condition */ | ||
82 | syn_error = 0; | ||
83 | for (i = 0; i < nroots; i++) { | ||
84 | syn_error |= s[i]; | ||
85 | s[i] = index_of[s[i]]; | ||
86 | } | ||
87 | |||
88 | if (!syn_error) { | ||
89 | /* if syndrome is zero, data[] is a codeword and there are no | ||
90 | * errors to correct. So return data[] unmodified | ||
91 | */ | ||
92 | count = 0; | ||
93 | goto finish; | ||
94 | } | ||
95 | |||
96 | decode: | ||
97 | memset(&lambda[1], 0, nroots * sizeof(lambda[0])); | ||
98 | lambda[0] = 1; | ||
99 | |||
100 | if (no_eras > 0) { | ||
101 | /* Init lambda to be the erasure locator polynomial */ | ||
102 | lambda[1] = alpha_to[rs_modnn(rs, | ||
103 | prim * (nn - 1 - eras_pos[0]))]; | ||
104 | for (i = 1; i < no_eras; i++) { | ||
105 | u = rs_modnn(rs, prim * (nn - 1 - eras_pos[i])); | ||
106 | for (j = i + 1; j > 0; j--) { | ||
107 | tmp = index_of[lambda[j - 1]]; | ||
108 | if (tmp != nn) { | ||
109 | lambda[j] ^= | ||
110 | alpha_to[rs_modnn(rs, u + tmp)]; | ||
111 | } | ||
112 | } | ||
113 | } | ||
114 | } | ||
115 | |||
116 | for (i = 0; i < nroots + 1; i++) | ||
117 | b[i] = index_of[lambda[i]]; | ||
118 | |||
119 | /* | ||
120 | * Begin Berlekamp-Massey algorithm to determine error+erasure | ||
121 | * locator polynomial | ||
122 | */ | ||
123 | r = no_eras; | ||
124 | el = no_eras; | ||
125 | while (++r <= nroots) { /* r is the step number */ | ||
126 | /* Compute discrepancy at the r-th step in poly-form */ | ||
127 | discr_r = 0; | ||
128 | for (i = 0; i < r; i++) { | ||
129 | if ((lambda[i] != 0) && (s[r - i - 1] != nn)) { | ||
130 | discr_r ^= | ||
131 | alpha_to[rs_modnn(rs, | ||
132 | index_of[lambda[i]] + | ||
133 | s[r - i - 1])]; | ||
134 | } | ||
135 | } | ||
136 | discr_r = index_of[discr_r]; /* Index form */ | ||
137 | if (discr_r == nn) { | ||
138 | /* 2 lines below: B(x) <-- x*B(x) */ | ||
139 | memmove (&b[1], b, nroots * sizeof (b[0])); | ||
140 | b[0] = nn; | ||
141 | } else { | ||
142 | /* 7 lines below: T(x) <-- lambda(x)-discr_r*x*b(x) */ | ||
143 | t[0] = lambda[0]; | ||
144 | for (i = 0; i < nroots; i++) { | ||
145 | if (b[i] != nn) { | ||
146 | t[i + 1] = lambda[i + 1] ^ | ||
147 | alpha_to[rs_modnn(rs, discr_r + | ||
148 | b[i])]; | ||
149 | } else | ||
150 | t[i + 1] = lambda[i + 1]; | ||
151 | } | ||
152 | if (2 * el <= r + no_eras - 1) { | ||
153 | el = r + no_eras - el; | ||
154 | /* | ||
155 | * 2 lines below: B(x) <-- inv(discr_r) * | ||
156 | * lambda(x) | ||
157 | */ | ||
158 | for (i = 0; i <= nroots; i++) { | ||
159 | b[i] = (lambda[i] == 0) ? nn : | ||
160 | rs_modnn(rs, index_of[lambda[i]] | ||
161 | - discr_r + nn); | ||
162 | } | ||
163 | } else { | ||
164 | /* 2 lines below: B(x) <-- x*B(x) */ | ||
165 | memmove(&b[1], b, nroots * sizeof(b[0])); | ||
166 | b[0] = nn; | ||
167 | } | ||
168 | memcpy(lambda, t, (nroots + 1) * sizeof(t[0])); | ||
169 | } | ||
170 | } | ||
171 | |||
172 | /* Convert lambda to index form and compute deg(lambda(x)) */ | ||
173 | deg_lambda = 0; | ||
174 | for (i = 0; i < nroots + 1; i++) { | ||
175 | lambda[i] = index_of[lambda[i]]; | ||
176 | if (lambda[i] != nn) | ||
177 | deg_lambda = i; | ||
178 | } | ||
179 | /* Find roots of error+erasure locator polynomial by Chien search */ | ||
180 | memcpy(®[1], &lambda[1], nroots * sizeof(reg[0])); | ||
181 | count = 0; /* Number of roots of lambda(x) */ | ||
182 | for (i = 1, k = iprim - 1; i <= nn; i++, k = rs_modnn(rs, k + iprim)) { | ||
183 | q = 1; /* lambda[0] is always 0 */ | ||
184 | for (j = deg_lambda; j > 0; j--) { | ||
185 | if (reg[j] != nn) { | ||
186 | reg[j] = rs_modnn(rs, reg[j] + j); | ||
187 | q ^= alpha_to[reg[j]]; | ||
188 | } | ||
189 | } | ||
190 | if (q != 0) | ||
191 | continue; /* Not a root */ | ||
192 | /* store root (index-form) and error location number */ | ||
193 | root[count] = i; | ||
194 | loc[count] = k; | ||
195 | /* If we've already found max possible roots, | ||
196 | * abort the search to save time | ||
197 | */ | ||
198 | if (++count == deg_lambda) | ||
199 | break; | ||
200 | } | ||
201 | if (deg_lambda != count) { | ||
202 | /* | ||
203 | * deg(lambda) unequal to number of roots => uncorrectable | ||
204 | * error detected | ||
205 | */ | ||
206 | count = -1; | ||
207 | goto finish; | ||
208 | } | ||
209 | /* | ||
210 | * Compute err+eras evaluator poly omega(x) = s(x)*lambda(x) (modulo | ||
211 | * x**nroots). in index form. Also find deg(omega). | ||
212 | */ | ||
213 | deg_omega = deg_lambda - 1; | ||
214 | for (i = 0; i <= deg_omega; i++) { | ||
215 | tmp = 0; | ||
216 | for (j = i; j >= 0; j--) { | ||
217 | if ((s[i - j] != nn) && (lambda[j] != nn)) | ||
218 | tmp ^= | ||
219 | alpha_to[rs_modnn(rs, s[i - j] + lambda[j])]; | ||
220 | } | ||
221 | omega[i] = index_of[tmp]; | ||
222 | } | ||
223 | |||
224 | /* | ||
225 | * Compute error values in poly-form. num1 = omega(inv(X(l))), num2 = | ||
226 | * inv(X(l))**(fcr-1) and den = lambda_pr(inv(X(l))) all in poly-form | ||
227 | */ | ||
228 | for (j = count - 1; j >= 0; j--) { | ||
229 | num1 = 0; | ||
230 | for (i = deg_omega; i >= 0; i--) { | ||
231 | if (omega[i] != nn) | ||
232 | num1 ^= alpha_to[rs_modnn(rs, omega[i] + | ||
233 | i * root[j])]; | ||
234 | } | ||
235 | num2 = alpha_to[rs_modnn(rs, root[j] * (fcr - 1) + nn)]; | ||
236 | den = 0; | ||
237 | |||
238 | /* lambda[i+1] for i even is the formal derivative | ||
239 | * lambda_pr of lambda[i] */ | ||
240 | for (i = min(deg_lambda, nroots - 1) & ~1; i >= 0; i -= 2) { | ||
241 | if (lambda[i + 1] != nn) { | ||
242 | den ^= alpha_to[rs_modnn(rs, lambda[i + 1] + | ||
243 | i * root[j])]; | ||
244 | } | ||
245 | } | ||
246 | /* Apply error to data */ | ||
247 | if (num1 != 0 && loc[j] >= pad) { | ||
248 | uint16_t cor = alpha_to[rs_modnn(rs,index_of[num1] + | ||
249 | index_of[num2] + | ||
250 | nn - index_of[den])]; | ||
251 | /* Store the error correction pattern, if a | ||
252 | * correction buffer is available */ | ||
253 | if (corr) { | ||
254 | corr[j] = cor; | ||
255 | } else { | ||
256 | /* If a data buffer is given and the | ||
257 | * error is inside the message, | ||
258 | * correct it */ | ||
259 | if (data && (loc[j] < (nn - nroots))) | ||
260 | data[loc[j] - pad] ^= cor; | ||
261 | } | ||
262 | } | ||
263 | } | ||
264 | |||
265 | finish: | ||
266 | if (eras_pos != NULL) { | ||
267 | for (i = 0; i < count; i++) | ||
268 | eras_pos[i] = loc[i] - pad; | ||
269 | } | ||
270 | return count; | ||
271 | |||
272 | } | ||
diff --git a/lib/reed_solomon/encode_rs.c b/lib/reed_solomon/encode_rs.c new file mode 100644 index 000000000000..237bf65ae886 --- /dev/null +++ b/lib/reed_solomon/encode_rs.c | |||
@@ -0,0 +1,54 @@ | |||
1 | /* | ||
2 | * lib/reed_solomon/encode_rs.c | ||
3 | * | ||
4 | * Overview: | ||
5 | * Generic Reed Solomon encoder / decoder library | ||
6 | * | ||
7 | * Copyright 2002, Phil Karn, KA9Q | ||
8 | * May be used under the terms of the GNU General Public License (GPL) | ||
9 | * | ||
10 | * Adaption to the kernel by Thomas Gleixner (tglx@linutronix.de) | ||
11 | * | ||
12 | * $Id: encode_rs.c,v 1.4 2004/10/22 15:41:47 gleixner Exp $ | ||
13 | * | ||
14 | */ | ||
15 | |||
16 | /* Generic data width independent code which is included by the | ||
17 | * wrappers. | ||
18 | * int encode_rsX (struct rs_control *rs, uintX_t *data, int len, uintY_t *par) | ||
19 | */ | ||
20 | { | ||
21 | int i, j, pad; | ||
22 | int nn = rs->nn; | ||
23 | int nroots = rs->nroots; | ||
24 | uint16_t *alpha_to = rs->alpha_to; | ||
25 | uint16_t *index_of = rs->index_of; | ||
26 | uint16_t *genpoly = rs->genpoly; | ||
27 | uint16_t fb; | ||
28 | uint16_t msk = (uint16_t) rs->nn; | ||
29 | |||
30 | /* Check length parameter for validity */ | ||
31 | pad = nn - nroots - len; | ||
32 | if (pad < 0 || pad >= nn) | ||
33 | return -ERANGE; | ||
34 | |||
35 | for (i = 0; i < len; i++) { | ||
36 | fb = index_of[((((uint16_t) data[i])^invmsk) & msk) ^ par[0]]; | ||
37 | /* feedback term is non-zero */ | ||
38 | if (fb != nn) { | ||
39 | for (j = 1; j < nroots; j++) { | ||
40 | par[j] ^= alpha_to[rs_modnn(rs, fb + | ||
41 | genpoly[nroots - j])]; | ||
42 | } | ||
43 | } | ||
44 | /* Shift */ | ||
45 | memmove(&par[0], &par[1], sizeof(uint16_t) * (nroots - 1)); | ||
46 | if (fb != nn) { | ||
47 | par[nroots - 1] = alpha_to[rs_modnn(rs, | ||
48 | fb + genpoly[0])]; | ||
49 | } else { | ||
50 | par[nroots - 1] = 0; | ||
51 | } | ||
52 | } | ||
53 | return 0; | ||
54 | } | ||
diff --git a/lib/reed_solomon/reed_solomon.c b/lib/reed_solomon/reed_solomon.c new file mode 100644 index 000000000000..6604e3b1940c --- /dev/null +++ b/lib/reed_solomon/reed_solomon.c | |||
@@ -0,0 +1,335 @@ | |||
1 | /* | ||
2 | * lib/reed_solomon/rslib.c | ||
3 | * | ||
4 | * Overview: | ||
5 | * Generic Reed Solomon encoder / decoder library | ||
6 | * | ||
7 | * Copyright (C) 2004 Thomas Gleixner (tglx@linutronix.de) | ||
8 | * | ||
9 | * Reed Solomon code lifted from reed solomon library written by Phil Karn | ||
10 | * Copyright 2002 Phil Karn, KA9Q | ||
11 | * | ||
12 | * $Id: rslib.c,v 1.5 2004/10/22 15:41:47 gleixner Exp $ | ||
13 | * | ||
14 | * This program is free software; you can redistribute it and/or modify | ||
15 | * it under the terms of the GNU General Public License version 2 as | ||
16 | * published by the Free Software Foundation. | ||
17 | * | ||
18 | * Description: | ||
19 | * | ||
20 | * The generic Reed Solomon library provides runtime configurable | ||
21 | * encoding / decoding of RS codes. | ||
22 | * Each user must call init_rs to get a pointer to a rs_control | ||
23 | * structure for the given rs parameters. This structure is either | ||
24 | * generated or a already available matching control structure is used. | ||
25 | * If a structure is generated then the polynomial arrays for | ||
26 | * fast encoding / decoding are built. This can take some time so | ||
27 | * make sure not to call this function from a time critical path. | ||
28 | * Usually a module / driver should initialize the necessary | ||
29 | * rs_control structure on module / driver init and release it | ||
30 | * on exit. | ||
31 | * The encoding puts the calculated syndrome into a given syndrome | ||
32 | * buffer. | ||
33 | * The decoding is a two step process. The first step calculates | ||
34 | * the syndrome over the received (data + syndrome) and calls the | ||
35 | * second stage, which does the decoding / error correction itself. | ||
36 | * Many hw encoders provide a syndrome calculation over the received | ||
37 | * data + syndrome and can call the second stage directly. | ||
38 | * | ||
39 | */ | ||
40 | |||
41 | #include <linux/errno.h> | ||
42 | #include <linux/kernel.h> | ||
43 | #include <linux/init.h> | ||
44 | #include <linux/module.h> | ||
45 | #include <linux/rslib.h> | ||
46 | #include <linux/slab.h> | ||
47 | #include <asm/semaphore.h> | ||
48 | |||
49 | /* This list holds all currently allocated rs control structures */ | ||
50 | static LIST_HEAD (rslist); | ||
51 | /* Protection for the list */ | ||
52 | static DECLARE_MUTEX(rslistlock); | ||
53 | |||
54 | /** | ||
55 | * rs_init - Initialize a Reed-Solomon codec | ||
56 | * | ||
57 | * @symsize: symbol size, bits (1-8) | ||
58 | * @gfpoly: Field generator polynomial coefficients | ||
59 | * @fcr: first root of RS code generator polynomial, index form | ||
60 | * @prim: primitive element to generate polynomial roots | ||
61 | * @nroots: RS code generator polynomial degree (number of roots) | ||
62 | * | ||
63 | * Allocate a control structure and the polynom arrays for faster | ||
64 | * en/decoding. Fill the arrays according to the given parameters | ||
65 | */ | ||
66 | static struct rs_control *rs_init(int symsize, int gfpoly, int fcr, | ||
67 | int prim, int nroots) | ||
68 | { | ||
69 | struct rs_control *rs; | ||
70 | int i, j, sr, root, iprim; | ||
71 | |||
72 | /* Allocate the control structure */ | ||
73 | rs = kmalloc(sizeof (struct rs_control), GFP_KERNEL); | ||
74 | if (rs == NULL) | ||
75 | return NULL; | ||
76 | |||
77 | INIT_LIST_HEAD(&rs->list); | ||
78 | |||
79 | rs->mm = symsize; | ||
80 | rs->nn = (1 << symsize) - 1; | ||
81 | rs->fcr = fcr; | ||
82 | rs->prim = prim; | ||
83 | rs->nroots = nroots; | ||
84 | rs->gfpoly = gfpoly; | ||
85 | |||
86 | /* Allocate the arrays */ | ||
87 | rs->alpha_to = kmalloc(sizeof(uint16_t) * (rs->nn + 1), GFP_KERNEL); | ||
88 | if (rs->alpha_to == NULL) | ||
89 | goto errrs; | ||
90 | |||
91 | rs->index_of = kmalloc(sizeof(uint16_t) * (rs->nn + 1), GFP_KERNEL); | ||
92 | if (rs->index_of == NULL) | ||
93 | goto erralp; | ||
94 | |||
95 | rs->genpoly = kmalloc(sizeof(uint16_t) * (rs->nroots + 1), GFP_KERNEL); | ||
96 | if(rs->genpoly == NULL) | ||
97 | goto erridx; | ||
98 | |||
99 | /* Generate Galois field lookup tables */ | ||
100 | rs->index_of[0] = rs->nn; /* log(zero) = -inf */ | ||
101 | rs->alpha_to[rs->nn] = 0; /* alpha**-inf = 0 */ | ||
102 | sr = 1; | ||
103 | for (i = 0; i < rs->nn; i++) { | ||
104 | rs->index_of[sr] = i; | ||
105 | rs->alpha_to[i] = sr; | ||
106 | sr <<= 1; | ||
107 | if (sr & (1 << symsize)) | ||
108 | sr ^= gfpoly; | ||
109 | sr &= rs->nn; | ||
110 | } | ||
111 | /* If it's not primitive, exit */ | ||
112 | if(sr != 1) | ||
113 | goto errpol; | ||
114 | |||
115 | /* Find prim-th root of 1, used in decoding */ | ||
116 | for(iprim = 1; (iprim % prim) != 0; iprim += rs->nn); | ||
117 | /* prim-th root of 1, index form */ | ||
118 | rs->iprim = iprim / prim; | ||
119 | |||
120 | /* Form RS code generator polynomial from its roots */ | ||
121 | rs->genpoly[0] = 1; | ||
122 | for (i = 0, root = fcr * prim; i < nroots; i++, root += prim) { | ||
123 | rs->genpoly[i + 1] = 1; | ||
124 | /* Multiply rs->genpoly[] by @**(root + x) */ | ||
125 | for (j = i; j > 0; j--) { | ||
126 | if (rs->genpoly[j] != 0) { | ||
127 | rs->genpoly[j] = rs->genpoly[j -1] ^ | ||
128 | rs->alpha_to[rs_modnn(rs, | ||
129 | rs->index_of[rs->genpoly[j]] + root)]; | ||
130 | } else | ||
131 | rs->genpoly[j] = rs->genpoly[j - 1]; | ||
132 | } | ||
133 | /* rs->genpoly[0] can never be zero */ | ||
134 | rs->genpoly[0] = | ||
135 | rs->alpha_to[rs_modnn(rs, | ||
136 | rs->index_of[rs->genpoly[0]] + root)]; | ||
137 | } | ||
138 | /* convert rs->genpoly[] to index form for quicker encoding */ | ||
139 | for (i = 0; i <= nroots; i++) | ||
140 | rs->genpoly[i] = rs->index_of[rs->genpoly[i]]; | ||
141 | return rs; | ||
142 | |||
143 | /* Error exit */ | ||
144 | errpol: | ||
145 | kfree(rs->genpoly); | ||
146 | erridx: | ||
147 | kfree(rs->index_of); | ||
148 | erralp: | ||
149 | kfree(rs->alpha_to); | ||
150 | errrs: | ||
151 | kfree(rs); | ||
152 | return NULL; | ||
153 | } | ||
154 | |||
155 | |||
156 | /** | ||
157 | * free_rs - Free the rs control structure, if its not longer used | ||
158 | * | ||
159 | * @rs: the control structure which is not longer used by the | ||
160 | * caller | ||
161 | */ | ||
162 | void free_rs(struct rs_control *rs) | ||
163 | { | ||
164 | down(&rslistlock); | ||
165 | rs->users--; | ||
166 | if(!rs->users) { | ||
167 | list_del(&rs->list); | ||
168 | kfree(rs->alpha_to); | ||
169 | kfree(rs->index_of); | ||
170 | kfree(rs->genpoly); | ||
171 | kfree(rs); | ||
172 | } | ||
173 | up(&rslistlock); | ||
174 | } | ||
175 | |||
176 | /** | ||
177 | * init_rs - Find a matching or allocate a new rs control structure | ||
178 | * | ||
179 | * @symsize: the symbol size (number of bits) | ||
180 | * @gfpoly: the extended Galois field generator polynomial coefficients, | ||
181 | * with the 0th coefficient in the low order bit. The polynomial | ||
182 | * must be primitive; | ||
183 | * @fcr: the first consecutive root of the rs code generator polynomial | ||
184 | * in index form | ||
185 | * @prim: primitive element to generate polynomial roots | ||
186 | * @nroots: RS code generator polynomial degree (number of roots) | ||
187 | */ | ||
188 | struct rs_control *init_rs(int symsize, int gfpoly, int fcr, int prim, | ||
189 | int nroots) | ||
190 | { | ||
191 | struct list_head *tmp; | ||
192 | struct rs_control *rs; | ||
193 | |||
194 | /* Sanity checks */ | ||
195 | if (symsize < 1) | ||
196 | return NULL; | ||
197 | if (fcr < 0 || fcr >= (1<<symsize)) | ||
198 | return NULL; | ||
199 | if (prim <= 0 || prim >= (1<<symsize)) | ||
200 | return NULL; | ||
201 | if (nroots < 0 || nroots >= (1<<symsize) || nroots > 8) | ||
202 | return NULL; | ||
203 | |||
204 | down(&rslistlock); | ||
205 | |||
206 | /* Walk through the list and look for a matching entry */ | ||
207 | list_for_each(tmp, &rslist) { | ||
208 | rs = list_entry(tmp, struct rs_control, list); | ||
209 | if (symsize != rs->mm) | ||
210 | continue; | ||
211 | if (gfpoly != rs->gfpoly) | ||
212 | continue; | ||
213 | if (fcr != rs->fcr) | ||
214 | continue; | ||
215 | if (prim != rs->prim) | ||
216 | continue; | ||
217 | if (nroots != rs->nroots) | ||
218 | continue; | ||
219 | /* We have a matching one already */ | ||
220 | rs->users++; | ||
221 | goto out; | ||
222 | } | ||
223 | |||
224 | /* Create a new one */ | ||
225 | rs = rs_init(symsize, gfpoly, fcr, prim, nroots); | ||
226 | if (rs) { | ||
227 | rs->users = 1; | ||
228 | list_add(&rs->list, &rslist); | ||
229 | } | ||
230 | out: | ||
231 | up(&rslistlock); | ||
232 | return rs; | ||
233 | } | ||
234 | |||
235 | #ifdef CONFIG_REED_SOLOMON_ENC8 | ||
236 | /** | ||
237 | * encode_rs8 - Calculate the parity for data values (8bit data width) | ||
238 | * | ||
239 | * @rs: the rs control structure | ||
240 | * @data: data field of a given type | ||
241 | * @len: data length | ||
242 | * @par: parity data, must be initialized by caller (usually all 0) | ||
243 | * @invmsk: invert data mask (will be xored on data) | ||
244 | * | ||
245 | * The parity uses a uint16_t data type to enable | ||
246 | * symbol size > 8. The calling code must take care of encoding of the | ||
247 | * syndrome result for storage itself. | ||
248 | */ | ||
249 | int encode_rs8(struct rs_control *rs, uint8_t *data, int len, uint16_t *par, | ||
250 | uint16_t invmsk) | ||
251 | { | ||
252 | #include "encode_rs.c" | ||
253 | } | ||
254 | EXPORT_SYMBOL_GPL(encode_rs8); | ||
255 | #endif | ||
256 | |||
257 | #ifdef CONFIG_REED_SOLOMON_DEC8 | ||
258 | /** | ||
259 | * decode_rs8 - Decode codeword (8bit data width) | ||
260 | * | ||
261 | * @rs: the rs control structure | ||
262 | * @data: data field of a given type | ||
263 | * @par: received parity data field | ||
264 | * @len: data length | ||
265 | * @s: syndrome data field (if NULL, syndrome is calculated) | ||
266 | * @no_eras: number of erasures | ||
267 | * @eras_pos: position of erasures, can be NULL | ||
268 | * @invmsk: invert data mask (will be xored on data, not on parity!) | ||
269 | * @corr: buffer to store correction bitmask on eras_pos | ||
270 | * | ||
271 | * The syndrome and parity uses a uint16_t data type to enable | ||
272 | * symbol size > 8. The calling code must take care of decoding of the | ||
273 | * syndrome result and the received parity before calling this code. | ||
274 | */ | ||
275 | int decode_rs8(struct rs_control *rs, uint8_t *data, uint16_t *par, int len, | ||
276 | uint16_t *s, int no_eras, int *eras_pos, uint16_t invmsk, | ||
277 | uint16_t *corr) | ||
278 | { | ||
279 | #include "decode_rs.c" | ||
280 | } | ||
281 | EXPORT_SYMBOL_GPL(decode_rs8); | ||
282 | #endif | ||
283 | |||
284 | #ifdef CONFIG_REED_SOLOMON_ENC16 | ||
285 | /** | ||
286 | * encode_rs16 - Calculate the parity for data values (16bit data width) | ||
287 | * | ||
288 | * @rs: the rs control structure | ||
289 | * @data: data field of a given type | ||
290 | * @len: data length | ||
291 | * @par: parity data, must be initialized by caller (usually all 0) | ||
292 | * @invmsk: invert data mask (will be xored on data, not on parity!) | ||
293 | * | ||
294 | * Each field in the data array contains up to symbol size bits of valid data. | ||
295 | */ | ||
296 | int encode_rs16(struct rs_control *rs, uint16_t *data, int len, uint16_t *par, | ||
297 | uint16_t invmsk) | ||
298 | { | ||
299 | #include "encode_rs.c" | ||
300 | } | ||
301 | EXPORT_SYMBOL_GPL(encode_rs16); | ||
302 | #endif | ||
303 | |||
304 | #ifdef CONFIG_REED_SOLOMON_DEC16 | ||
305 | /** | ||
306 | * decode_rs16 - Decode codeword (16bit data width) | ||
307 | * | ||
308 | * @rs: the rs control structure | ||
309 | * @data: data field of a given type | ||
310 | * @par: received parity data field | ||
311 | * @len: data length | ||
312 | * @s: syndrome data field (if NULL, syndrome is calculated) | ||
313 | * @no_eras: number of erasures | ||
314 | * @eras_pos: position of erasures, can be NULL | ||
315 | * @invmsk: invert data mask (will be xored on data, not on parity!) | ||
316 | * @corr: buffer to store correction bitmask on eras_pos | ||
317 | * | ||
318 | * Each field in the data array contains up to symbol size bits of valid data. | ||
319 | */ | ||
320 | int decode_rs16(struct rs_control *rs, uint16_t *data, uint16_t *par, int len, | ||
321 | uint16_t *s, int no_eras, int *eras_pos, uint16_t invmsk, | ||
322 | uint16_t *corr) | ||
323 | { | ||
324 | #include "decode_rs.c" | ||
325 | } | ||
326 | EXPORT_SYMBOL_GPL(decode_rs16); | ||
327 | #endif | ||
328 | |||
329 | EXPORT_SYMBOL_GPL(init_rs); | ||
330 | EXPORT_SYMBOL_GPL(free_rs); | ||
331 | |||
332 | MODULE_LICENSE("GPL"); | ||
333 | MODULE_DESCRIPTION("Reed Solomon encoder/decoder"); | ||
334 | MODULE_AUTHOR("Phil Karn, Thomas Gleixner"); | ||
335 | |||
diff --git a/lib/rwsem-spinlock.c b/lib/rwsem-spinlock.c new file mode 100644 index 000000000000..21f0db2c9711 --- /dev/null +++ b/lib/rwsem-spinlock.c | |||
@@ -0,0 +1,344 @@ | |||
1 | /* rwsem-spinlock.c: R/W semaphores: contention handling functions for | ||
2 | * generic spinlock implementation | ||
3 | * | ||
4 | * Copyright (c) 2001 David Howells (dhowells@redhat.com). | ||
5 | * - Derived partially from idea by Andrea Arcangeli <andrea@suse.de> | ||
6 | * - Derived also from comments by Linus | ||
7 | */ | ||
8 | #include <linux/rwsem.h> | ||
9 | #include <linux/sched.h> | ||
10 | #include <linux/module.h> | ||
11 | |||
12 | struct rwsem_waiter { | ||
13 | struct list_head list; | ||
14 | struct task_struct *task; | ||
15 | unsigned int flags; | ||
16 | #define RWSEM_WAITING_FOR_READ 0x00000001 | ||
17 | #define RWSEM_WAITING_FOR_WRITE 0x00000002 | ||
18 | }; | ||
19 | |||
20 | #if RWSEM_DEBUG | ||
21 | void rwsemtrace(struct rw_semaphore *sem, const char *str) | ||
22 | { | ||
23 | if (sem->debug) | ||
24 | printk("[%d] %s({%d,%d})\n", | ||
25 | current->pid, str, sem->activity, | ||
26 | list_empty(&sem->wait_list) ? 0 : 1); | ||
27 | } | ||
28 | #endif | ||
29 | |||
30 | /* | ||
31 | * initialise the semaphore | ||
32 | */ | ||
33 | void fastcall init_rwsem(struct rw_semaphore *sem) | ||
34 | { | ||
35 | sem->activity = 0; | ||
36 | spin_lock_init(&sem->wait_lock); | ||
37 | INIT_LIST_HEAD(&sem->wait_list); | ||
38 | #if RWSEM_DEBUG | ||
39 | sem->debug = 0; | ||
40 | #endif | ||
41 | } | ||
42 | |||
43 | /* | ||
44 | * handle the lock release when processes blocked on it that can now run | ||
45 | * - if we come here, then: | ||
46 | * - the 'active count' _reached_ zero | ||
47 | * - the 'waiting count' is non-zero | ||
48 | * - the spinlock must be held by the caller | ||
49 | * - woken process blocks are discarded from the list after having task zeroed | ||
50 | * - writers are only woken if wakewrite is non-zero | ||
51 | */ | ||
52 | static inline struct rw_semaphore * | ||
53 | __rwsem_do_wake(struct rw_semaphore *sem, int wakewrite) | ||
54 | { | ||
55 | struct rwsem_waiter *waiter; | ||
56 | struct task_struct *tsk; | ||
57 | int woken; | ||
58 | |||
59 | rwsemtrace(sem, "Entering __rwsem_do_wake"); | ||
60 | |||
61 | waiter = list_entry(sem->wait_list.next, struct rwsem_waiter, list); | ||
62 | |||
63 | if (!wakewrite) { | ||
64 | if (waiter->flags & RWSEM_WAITING_FOR_WRITE) | ||
65 | goto out; | ||
66 | goto dont_wake_writers; | ||
67 | } | ||
68 | |||
69 | /* if we are allowed to wake writers try to grant a single write lock | ||
70 | * if there's a writer at the front of the queue | ||
71 | * - we leave the 'waiting count' incremented to signify potential | ||
72 | * contention | ||
73 | */ | ||
74 | if (waiter->flags & RWSEM_WAITING_FOR_WRITE) { | ||
75 | sem->activity = -1; | ||
76 | list_del(&waiter->list); | ||
77 | tsk = waiter->task; | ||
78 | /* Don't touch waiter after ->task has been NULLed */ | ||
79 | mb(); | ||
80 | waiter->task = NULL; | ||
81 | wake_up_process(tsk); | ||
82 | put_task_struct(tsk); | ||
83 | goto out; | ||
84 | } | ||
85 | |||
86 | /* grant an infinite number of read locks to the front of the queue */ | ||
87 | dont_wake_writers: | ||
88 | woken = 0; | ||
89 | while (waiter->flags & RWSEM_WAITING_FOR_READ) { | ||
90 | struct list_head *next = waiter->list.next; | ||
91 | |||
92 | list_del(&waiter->list); | ||
93 | tsk = waiter->task; | ||
94 | mb(); | ||
95 | waiter->task = NULL; | ||
96 | wake_up_process(tsk); | ||
97 | put_task_struct(tsk); | ||
98 | woken++; | ||
99 | if (list_empty(&sem->wait_list)) | ||
100 | break; | ||
101 | waiter = list_entry(next, struct rwsem_waiter, list); | ||
102 | } | ||
103 | |||
104 | sem->activity += woken; | ||
105 | |||
106 | out: | ||
107 | rwsemtrace(sem, "Leaving __rwsem_do_wake"); | ||
108 | return sem; | ||
109 | } | ||
110 | |||
111 | /* | ||
112 | * wake a single writer | ||
113 | */ | ||
114 | static inline struct rw_semaphore * | ||
115 | __rwsem_wake_one_writer(struct rw_semaphore *sem) | ||
116 | { | ||
117 | struct rwsem_waiter *waiter; | ||
118 | struct task_struct *tsk; | ||
119 | |||
120 | sem->activity = -1; | ||
121 | |||
122 | waiter = list_entry(sem->wait_list.next, struct rwsem_waiter, list); | ||
123 | list_del(&waiter->list); | ||
124 | |||
125 | tsk = waiter->task; | ||
126 | mb(); | ||
127 | waiter->task = NULL; | ||
128 | wake_up_process(tsk); | ||
129 | put_task_struct(tsk); | ||
130 | return sem; | ||
131 | } | ||
132 | |||
133 | /* | ||
134 | * get a read lock on the semaphore | ||
135 | */ | ||
136 | void fastcall __sched __down_read(struct rw_semaphore *sem) | ||
137 | { | ||
138 | struct rwsem_waiter waiter; | ||
139 | struct task_struct *tsk; | ||
140 | |||
141 | rwsemtrace(sem, "Entering __down_read"); | ||
142 | |||
143 | spin_lock_irq(&sem->wait_lock); | ||
144 | |||
145 | if (sem->activity >= 0 && list_empty(&sem->wait_list)) { | ||
146 | /* granted */ | ||
147 | sem->activity++; | ||
148 | spin_unlock_irq(&sem->wait_lock); | ||
149 | goto out; | ||
150 | } | ||
151 | |||
152 | tsk = current; | ||
153 | set_task_state(tsk, TASK_UNINTERRUPTIBLE); | ||
154 | |||
155 | /* set up my own style of waitqueue */ | ||
156 | waiter.task = tsk; | ||
157 | waiter.flags = RWSEM_WAITING_FOR_READ; | ||
158 | get_task_struct(tsk); | ||
159 | |||
160 | list_add_tail(&waiter.list, &sem->wait_list); | ||
161 | |||
162 | /* we don't need to touch the semaphore struct anymore */ | ||
163 | spin_unlock_irq(&sem->wait_lock); | ||
164 | |||
165 | /* wait to be given the lock */ | ||
166 | for (;;) { | ||
167 | if (!waiter.task) | ||
168 | break; | ||
169 | schedule(); | ||
170 | set_task_state(tsk, TASK_UNINTERRUPTIBLE); | ||
171 | } | ||
172 | |||
173 | tsk->state = TASK_RUNNING; | ||
174 | |||
175 | out: | ||
176 | rwsemtrace(sem, "Leaving __down_read"); | ||
177 | } | ||
178 | |||
179 | /* | ||
180 | * trylock for reading -- returns 1 if successful, 0 if contention | ||
181 | */ | ||
182 | int fastcall __down_read_trylock(struct rw_semaphore *sem) | ||
183 | { | ||
184 | unsigned long flags; | ||
185 | int ret = 0; | ||
186 | |||
187 | rwsemtrace(sem, "Entering __down_read_trylock"); | ||
188 | |||
189 | spin_lock_irqsave(&sem->wait_lock, flags); | ||
190 | |||
191 | if (sem->activity >= 0 && list_empty(&sem->wait_list)) { | ||
192 | /* granted */ | ||
193 | sem->activity++; | ||
194 | ret = 1; | ||
195 | } | ||
196 | |||
197 | spin_unlock_irqrestore(&sem->wait_lock, flags); | ||
198 | |||
199 | rwsemtrace(sem, "Leaving __down_read_trylock"); | ||
200 | return ret; | ||
201 | } | ||
202 | |||
203 | /* | ||
204 | * get a write lock on the semaphore | ||
205 | * - we increment the waiting count anyway to indicate an exclusive lock | ||
206 | */ | ||
207 | void fastcall __sched __down_write(struct rw_semaphore *sem) | ||
208 | { | ||
209 | struct rwsem_waiter waiter; | ||
210 | struct task_struct *tsk; | ||
211 | |||
212 | rwsemtrace(sem, "Entering __down_write"); | ||
213 | |||
214 | spin_lock_irq(&sem->wait_lock); | ||
215 | |||
216 | if (sem->activity == 0 && list_empty(&sem->wait_list)) { | ||
217 | /* granted */ | ||
218 | sem->activity = -1; | ||
219 | spin_unlock_irq(&sem->wait_lock); | ||
220 | goto out; | ||
221 | } | ||
222 | |||
223 | tsk = current; | ||
224 | set_task_state(tsk, TASK_UNINTERRUPTIBLE); | ||
225 | |||
226 | /* set up my own style of waitqueue */ | ||
227 | waiter.task = tsk; | ||
228 | waiter.flags = RWSEM_WAITING_FOR_WRITE; | ||
229 | get_task_struct(tsk); | ||
230 | |||
231 | list_add_tail(&waiter.list, &sem->wait_list); | ||
232 | |||
233 | /* we don't need to touch the semaphore struct anymore */ | ||
234 | spin_unlock_irq(&sem->wait_lock); | ||
235 | |||
236 | /* wait to be given the lock */ | ||
237 | for (;;) { | ||
238 | if (!waiter.task) | ||
239 | break; | ||
240 | schedule(); | ||
241 | set_task_state(tsk, TASK_UNINTERRUPTIBLE); | ||
242 | } | ||
243 | |||
244 | tsk->state = TASK_RUNNING; | ||
245 | |||
246 | out: | ||
247 | rwsemtrace(sem, "Leaving __down_write"); | ||
248 | } | ||
249 | |||
250 | /* | ||
251 | * trylock for writing -- returns 1 if successful, 0 if contention | ||
252 | */ | ||
253 | int fastcall __down_write_trylock(struct rw_semaphore *sem) | ||
254 | { | ||
255 | unsigned long flags; | ||
256 | int ret = 0; | ||
257 | |||
258 | rwsemtrace(sem, "Entering __down_write_trylock"); | ||
259 | |||
260 | spin_lock_irqsave(&sem->wait_lock, flags); | ||
261 | |||
262 | if (sem->activity == 0 && list_empty(&sem->wait_list)) { | ||
263 | /* granted */ | ||
264 | sem->activity = -1; | ||
265 | ret = 1; | ||
266 | } | ||
267 | |||
268 | spin_unlock_irqrestore(&sem->wait_lock, flags); | ||
269 | |||
270 | rwsemtrace(sem, "Leaving __down_write_trylock"); | ||
271 | return ret; | ||
272 | } | ||
273 | |||
274 | /* | ||
275 | * release a read lock on the semaphore | ||
276 | */ | ||
277 | void fastcall __up_read(struct rw_semaphore *sem) | ||
278 | { | ||
279 | unsigned long flags; | ||
280 | |||
281 | rwsemtrace(sem, "Entering __up_read"); | ||
282 | |||
283 | spin_lock_irqsave(&sem->wait_lock, flags); | ||
284 | |||
285 | if (--sem->activity == 0 && !list_empty(&sem->wait_list)) | ||
286 | sem = __rwsem_wake_one_writer(sem); | ||
287 | |||
288 | spin_unlock_irqrestore(&sem->wait_lock, flags); | ||
289 | |||
290 | rwsemtrace(sem, "Leaving __up_read"); | ||
291 | } | ||
292 | |||
293 | /* | ||
294 | * release a write lock on the semaphore | ||
295 | */ | ||
296 | void fastcall __up_write(struct rw_semaphore *sem) | ||
297 | { | ||
298 | unsigned long flags; | ||
299 | |||
300 | rwsemtrace(sem, "Entering __up_write"); | ||
301 | |||
302 | spin_lock_irqsave(&sem->wait_lock, flags); | ||
303 | |||
304 | sem->activity = 0; | ||
305 | if (!list_empty(&sem->wait_list)) | ||
306 | sem = __rwsem_do_wake(sem, 1); | ||
307 | |||
308 | spin_unlock_irqrestore(&sem->wait_lock, flags); | ||
309 | |||
310 | rwsemtrace(sem, "Leaving __up_write"); | ||
311 | } | ||
312 | |||
313 | /* | ||
314 | * downgrade a write lock into a read lock | ||
315 | * - just wake up any readers at the front of the queue | ||
316 | */ | ||
317 | void fastcall __downgrade_write(struct rw_semaphore *sem) | ||
318 | { | ||
319 | unsigned long flags; | ||
320 | |||
321 | rwsemtrace(sem, "Entering __downgrade_write"); | ||
322 | |||
323 | spin_lock_irqsave(&sem->wait_lock, flags); | ||
324 | |||
325 | sem->activity = 1; | ||
326 | if (!list_empty(&sem->wait_list)) | ||
327 | sem = __rwsem_do_wake(sem, 0); | ||
328 | |||
329 | spin_unlock_irqrestore(&sem->wait_lock, flags); | ||
330 | |||
331 | rwsemtrace(sem, "Leaving __downgrade_write"); | ||
332 | } | ||
333 | |||
334 | EXPORT_SYMBOL(init_rwsem); | ||
335 | EXPORT_SYMBOL(__down_read); | ||
336 | EXPORT_SYMBOL(__down_read_trylock); | ||
337 | EXPORT_SYMBOL(__down_write); | ||
338 | EXPORT_SYMBOL(__down_write_trylock); | ||
339 | EXPORT_SYMBOL(__up_read); | ||
340 | EXPORT_SYMBOL(__up_write); | ||
341 | EXPORT_SYMBOL(__downgrade_write); | ||
342 | #if RWSEM_DEBUG | ||
343 | EXPORT_SYMBOL(rwsemtrace); | ||
344 | #endif | ||
diff --git a/lib/rwsem.c b/lib/rwsem.c new file mode 100644 index 000000000000..7644089ec8fa --- /dev/null +++ b/lib/rwsem.c | |||
@@ -0,0 +1,268 @@ | |||
1 | /* rwsem.c: R/W semaphores: contention handling functions | ||
2 | * | ||
3 | * Written by David Howells (dhowells@redhat.com). | ||
4 | * Derived from arch/i386/kernel/semaphore.c | ||
5 | */ | ||
6 | #include <linux/rwsem.h> | ||
7 | #include <linux/sched.h> | ||
8 | #include <linux/init.h> | ||
9 | #include <linux/module.h> | ||
10 | |||
11 | struct rwsem_waiter { | ||
12 | struct list_head list; | ||
13 | struct task_struct *task; | ||
14 | unsigned int flags; | ||
15 | #define RWSEM_WAITING_FOR_READ 0x00000001 | ||
16 | #define RWSEM_WAITING_FOR_WRITE 0x00000002 | ||
17 | }; | ||
18 | |||
19 | #if RWSEM_DEBUG | ||
20 | #undef rwsemtrace | ||
21 | void rwsemtrace(struct rw_semaphore *sem, const char *str) | ||
22 | { | ||
23 | printk("sem=%p\n", sem); | ||
24 | printk("(sem)=%08lx\n", sem->count); | ||
25 | if (sem->debug) | ||
26 | printk("[%d] %s({%08lx})\n", current->pid, str, sem->count); | ||
27 | } | ||
28 | #endif | ||
29 | |||
30 | /* | ||
31 | * handle the lock release when processes blocked on it that can now run | ||
32 | * - if we come here from up_xxxx(), then: | ||
33 | * - the 'active part' of count (&0x0000ffff) reached 0 (but may have changed) | ||
34 | * - the 'waiting part' of count (&0xffff0000) is -ve (and will still be so) | ||
35 | * - there must be someone on the queue | ||
36 | * - the spinlock must be held by the caller | ||
37 | * - woken process blocks are discarded from the list after having task zeroed | ||
38 | * - writers are only woken if downgrading is false | ||
39 | */ | ||
40 | static inline struct rw_semaphore * | ||
41 | __rwsem_do_wake(struct rw_semaphore *sem, int downgrading) | ||
42 | { | ||
43 | struct rwsem_waiter *waiter; | ||
44 | struct task_struct *tsk; | ||
45 | struct list_head *next; | ||
46 | signed long oldcount, woken, loop; | ||
47 | |||
48 | rwsemtrace(sem, "Entering __rwsem_do_wake"); | ||
49 | |||
50 | if (downgrading) | ||
51 | goto dont_wake_writers; | ||
52 | |||
53 | /* if we came through an up_xxxx() call, we only only wake someone up | ||
54 | * if we can transition the active part of the count from 0 -> 1 | ||
55 | */ | ||
56 | try_again: | ||
57 | oldcount = rwsem_atomic_update(RWSEM_ACTIVE_BIAS, sem) | ||
58 | - RWSEM_ACTIVE_BIAS; | ||
59 | if (oldcount & RWSEM_ACTIVE_MASK) | ||
60 | goto undo; | ||
61 | |||
62 | waiter = list_entry(sem->wait_list.next, struct rwsem_waiter, list); | ||
63 | |||
64 | /* try to grant a single write lock if there's a writer at the front | ||
65 | * of the queue - note we leave the 'active part' of the count | ||
66 | * incremented by 1 and the waiting part incremented by 0x00010000 | ||
67 | */ | ||
68 | if (!(waiter->flags & RWSEM_WAITING_FOR_WRITE)) | ||
69 | goto readers_only; | ||
70 | |||
71 | /* We must be careful not to touch 'waiter' after we set ->task = NULL. | ||
72 | * It is an allocated on the waiter's stack and may become invalid at | ||
73 | * any time after that point (due to a wakeup from another source). | ||
74 | */ | ||
75 | list_del(&waiter->list); | ||
76 | tsk = waiter->task; | ||
77 | mb(); | ||
78 | waiter->task = NULL; | ||
79 | wake_up_process(tsk); | ||
80 | put_task_struct(tsk); | ||
81 | goto out; | ||
82 | |||
83 | /* don't want to wake any writers */ | ||
84 | dont_wake_writers: | ||
85 | waiter = list_entry(sem->wait_list.next, struct rwsem_waiter, list); | ||
86 | if (waiter->flags & RWSEM_WAITING_FOR_WRITE) | ||
87 | goto out; | ||
88 | |||
89 | /* grant an infinite number of read locks to the readers at the front | ||
90 | * of the queue | ||
91 | * - note we increment the 'active part' of the count by the number of | ||
92 | * readers before waking any processes up | ||
93 | */ | ||
94 | readers_only: | ||
95 | woken = 0; | ||
96 | do { | ||
97 | woken++; | ||
98 | |||
99 | if (waiter->list.next == &sem->wait_list) | ||
100 | break; | ||
101 | |||
102 | waiter = list_entry(waiter->list.next, | ||
103 | struct rwsem_waiter, list); | ||
104 | |||
105 | } while (waiter->flags & RWSEM_WAITING_FOR_READ); | ||
106 | |||
107 | loop = woken; | ||
108 | woken *= RWSEM_ACTIVE_BIAS - RWSEM_WAITING_BIAS; | ||
109 | if (!downgrading) | ||
110 | /* we'd already done one increment earlier */ | ||
111 | woken -= RWSEM_ACTIVE_BIAS; | ||
112 | |||
113 | rwsem_atomic_add(woken, sem); | ||
114 | |||
115 | next = sem->wait_list.next; | ||
116 | for (; loop > 0; loop--) { | ||
117 | waiter = list_entry(next, struct rwsem_waiter, list); | ||
118 | next = waiter->list.next; | ||
119 | tsk = waiter->task; | ||
120 | mb(); | ||
121 | waiter->task = NULL; | ||
122 | wake_up_process(tsk); | ||
123 | put_task_struct(tsk); | ||
124 | } | ||
125 | |||
126 | sem->wait_list.next = next; | ||
127 | next->prev = &sem->wait_list; | ||
128 | |||
129 | out: | ||
130 | rwsemtrace(sem, "Leaving __rwsem_do_wake"); | ||
131 | return sem; | ||
132 | |||
133 | /* undo the change to count, but check for a transition 1->0 */ | ||
134 | undo: | ||
135 | if (rwsem_atomic_update(-RWSEM_ACTIVE_BIAS, sem) != 0) | ||
136 | goto out; | ||
137 | goto try_again; | ||
138 | } | ||
139 | |||
140 | /* | ||
141 | * wait for a lock to be granted | ||
142 | */ | ||
143 | static inline struct rw_semaphore * | ||
144 | rwsem_down_failed_common(struct rw_semaphore *sem, | ||
145 | struct rwsem_waiter *waiter, signed long adjustment) | ||
146 | { | ||
147 | struct task_struct *tsk = current; | ||
148 | signed long count; | ||
149 | |||
150 | set_task_state(tsk, TASK_UNINTERRUPTIBLE); | ||
151 | |||
152 | /* set up my own style of waitqueue */ | ||
153 | spin_lock_irq(&sem->wait_lock); | ||
154 | waiter->task = tsk; | ||
155 | get_task_struct(tsk); | ||
156 | |||
157 | list_add_tail(&waiter->list, &sem->wait_list); | ||
158 | |||
159 | /* we're now waiting on the lock, but no longer actively read-locking */ | ||
160 | count = rwsem_atomic_update(adjustment, sem); | ||
161 | |||
162 | /* if there are no active locks, wake the front queued process(es) up */ | ||
163 | if (!(count & RWSEM_ACTIVE_MASK)) | ||
164 | sem = __rwsem_do_wake(sem, 0); | ||
165 | |||
166 | spin_unlock_irq(&sem->wait_lock); | ||
167 | |||
168 | /* wait to be given the lock */ | ||
169 | for (;;) { | ||
170 | if (!waiter->task) | ||
171 | break; | ||
172 | schedule(); | ||
173 | set_task_state(tsk, TASK_UNINTERRUPTIBLE); | ||
174 | } | ||
175 | |||
176 | tsk->state = TASK_RUNNING; | ||
177 | |||
178 | return sem; | ||
179 | } | ||
180 | |||
181 | /* | ||
182 | * wait for the read lock to be granted | ||
183 | */ | ||
184 | struct rw_semaphore fastcall __sched * | ||
185 | rwsem_down_read_failed(struct rw_semaphore *sem) | ||
186 | { | ||
187 | struct rwsem_waiter waiter; | ||
188 | |||
189 | rwsemtrace(sem, "Entering rwsem_down_read_failed"); | ||
190 | |||
191 | waiter.flags = RWSEM_WAITING_FOR_READ; | ||
192 | rwsem_down_failed_common(sem, &waiter, | ||
193 | RWSEM_WAITING_BIAS - RWSEM_ACTIVE_BIAS); | ||
194 | |||
195 | rwsemtrace(sem, "Leaving rwsem_down_read_failed"); | ||
196 | return sem; | ||
197 | } | ||
198 | |||
199 | /* | ||
200 | * wait for the write lock to be granted | ||
201 | */ | ||
202 | struct rw_semaphore fastcall __sched * | ||
203 | rwsem_down_write_failed(struct rw_semaphore *sem) | ||
204 | { | ||
205 | struct rwsem_waiter waiter; | ||
206 | |||
207 | rwsemtrace(sem, "Entering rwsem_down_write_failed"); | ||
208 | |||
209 | waiter.flags = RWSEM_WAITING_FOR_WRITE; | ||
210 | rwsem_down_failed_common(sem, &waiter, -RWSEM_ACTIVE_BIAS); | ||
211 | |||
212 | rwsemtrace(sem, "Leaving rwsem_down_write_failed"); | ||
213 | return sem; | ||
214 | } | ||
215 | |||
216 | /* | ||
217 | * handle waking up a waiter on the semaphore | ||
218 | * - up_read/up_write has decremented the active part of count if we come here | ||
219 | */ | ||
220 | struct rw_semaphore fastcall *rwsem_wake(struct rw_semaphore *sem) | ||
221 | { | ||
222 | unsigned long flags; | ||
223 | |||
224 | rwsemtrace(sem, "Entering rwsem_wake"); | ||
225 | |||
226 | spin_lock_irqsave(&sem->wait_lock, flags); | ||
227 | |||
228 | /* do nothing if list empty */ | ||
229 | if (!list_empty(&sem->wait_list)) | ||
230 | sem = __rwsem_do_wake(sem, 0); | ||
231 | |||
232 | spin_unlock_irqrestore(&sem->wait_lock, flags); | ||
233 | |||
234 | rwsemtrace(sem, "Leaving rwsem_wake"); | ||
235 | |||
236 | return sem; | ||
237 | } | ||
238 | |||
239 | /* | ||
240 | * downgrade a write lock into a read lock | ||
241 | * - caller incremented waiting part of count and discovered it still negative | ||
242 | * - just wake up any readers at the front of the queue | ||
243 | */ | ||
244 | struct rw_semaphore fastcall *rwsem_downgrade_wake(struct rw_semaphore *sem) | ||
245 | { | ||
246 | unsigned long flags; | ||
247 | |||
248 | rwsemtrace(sem, "Entering rwsem_downgrade_wake"); | ||
249 | |||
250 | spin_lock_irqsave(&sem->wait_lock, flags); | ||
251 | |||
252 | /* do nothing if list empty */ | ||
253 | if (!list_empty(&sem->wait_list)) | ||
254 | sem = __rwsem_do_wake(sem, 1); | ||
255 | |||
256 | spin_unlock_irqrestore(&sem->wait_lock, flags); | ||
257 | |||
258 | rwsemtrace(sem, "Leaving rwsem_downgrade_wake"); | ||
259 | return sem; | ||
260 | } | ||
261 | |||
262 | EXPORT_SYMBOL(rwsem_down_read_failed); | ||
263 | EXPORT_SYMBOL(rwsem_down_write_failed); | ||
264 | EXPORT_SYMBOL(rwsem_wake); | ||
265 | EXPORT_SYMBOL(rwsem_downgrade_wake); | ||
266 | #if RWSEM_DEBUG | ||
267 | EXPORT_SYMBOL(rwsemtrace); | ||
268 | #endif | ||
diff --git a/lib/sha1.c b/lib/sha1.c new file mode 100644 index 000000000000..2f7f1148dfde --- /dev/null +++ b/lib/sha1.c | |||
@@ -0,0 +1,96 @@ | |||
1 | /* | ||
2 | * SHA transform algorithm, originally taken from code written by | ||
3 | * Peter Gutmann, and placed in the public domain. | ||
4 | */ | ||
5 | |||
6 | #include <linux/kernel.h> | ||
7 | #include <linux/module.h> | ||
8 | #include <linux/cryptohash.h> | ||
9 | |||
10 | /* The SHA f()-functions. */ | ||
11 | |||
12 | #define f1(x,y,z) (z ^ (x & (y ^ z))) /* x ? y : z */ | ||
13 | #define f2(x,y,z) (x ^ y ^ z) /* XOR */ | ||
14 | #define f3(x,y,z) ((x & y) + (z & (x ^ y))) /* majority */ | ||
15 | |||
16 | /* The SHA Mysterious Constants */ | ||
17 | |||
18 | #define K1 0x5A827999L /* Rounds 0-19: sqrt(2) * 2^30 */ | ||
19 | #define K2 0x6ED9EBA1L /* Rounds 20-39: sqrt(3) * 2^30 */ | ||
20 | #define K3 0x8F1BBCDCL /* Rounds 40-59: sqrt(5) * 2^30 */ | ||
21 | #define K4 0xCA62C1D6L /* Rounds 60-79: sqrt(10) * 2^30 */ | ||
22 | |||
23 | /* | ||
24 | * sha_transform: single block SHA1 transform | ||
25 | * | ||
26 | * @digest: 160 bit digest to update | ||
27 | * @data: 512 bits of data to hash | ||
28 | * @W: 80 words of workspace (see note) | ||
29 | * | ||
30 | * This function generates a SHA1 digest for a single 512-bit block. | ||
31 | * Be warned, it does not handle padding and message digest, do not | ||
32 | * confuse it with the full FIPS 180-1 digest algorithm for variable | ||
33 | * length messages. | ||
34 | * | ||
35 | * Note: If the hash is security sensitive, the caller should be sure | ||
36 | * to clear the workspace. This is left to the caller to avoid | ||
37 | * unnecessary clears between chained hashing operations. | ||
38 | */ | ||
39 | void sha_transform(__u32 *digest, const char *in, __u32 *W) | ||
40 | { | ||
41 | __u32 a, b, c, d, e, t, i; | ||
42 | |||
43 | for (i = 0; i < 16; i++) | ||
44 | W[i] = be32_to_cpu(((const __u32 *)in)[i]); | ||
45 | |||
46 | for (i = 0; i < 64; i++) | ||
47 | W[i+16] = rol32(W[i+13] ^ W[i+8] ^ W[i+2] ^ W[i], 1); | ||
48 | |||
49 | a = digest[0]; | ||
50 | b = digest[1]; | ||
51 | c = digest[2]; | ||
52 | d = digest[3]; | ||
53 | e = digest[4]; | ||
54 | |||
55 | for (i = 0; i < 20; i++) { | ||
56 | t = f1(b, c, d) + K1 + rol32(a, 5) + e + W[i]; | ||
57 | e = d; d = c; c = rol32(b, 30); b = a; a = t; | ||
58 | } | ||
59 | |||
60 | for (; i < 40; i ++) { | ||
61 | t = f2(b, c, d) + K2 + rol32(a, 5) + e + W[i]; | ||
62 | e = d; d = c; c = rol32(b, 30); b = a; a = t; | ||
63 | } | ||
64 | |||
65 | for (; i < 60; i ++) { | ||
66 | t = f3(b, c, d) + K3 + rol32(a, 5) + e + W[i]; | ||
67 | e = d; d = c; c = rol32(b, 30); b = a; a = t; | ||
68 | } | ||
69 | |||
70 | for (; i < 80; i ++) { | ||
71 | t = f2(b, c, d) + K4 + rol32(a, 5) + e + W[i]; | ||
72 | e = d; d = c; c = rol32(b, 30); b = a; a = t; | ||
73 | } | ||
74 | |||
75 | digest[0] += a; | ||
76 | digest[1] += b; | ||
77 | digest[2] += c; | ||
78 | digest[3] += d; | ||
79 | digest[4] += e; | ||
80 | } | ||
81 | EXPORT_SYMBOL(sha_transform); | ||
82 | |||
83 | /* | ||
84 | * sha_init: initialize the vectors for a SHA1 digest | ||
85 | * | ||
86 | * @buf: vector to initialize | ||
87 | */ | ||
88 | void sha_init(__u32 *buf) | ||
89 | { | ||
90 | buf[0] = 0x67452301; | ||
91 | buf[1] = 0xefcdab89; | ||
92 | buf[2] = 0x98badcfe; | ||
93 | buf[3] = 0x10325476; | ||
94 | buf[4] = 0xc3d2e1f0; | ||
95 | } | ||
96 | |||
diff --git a/lib/sort.c b/lib/sort.c new file mode 100644 index 000000000000..ea3caedeabdb --- /dev/null +++ b/lib/sort.c | |||
@@ -0,0 +1,119 @@ | |||
1 | /* | ||
2 | * A fast, small, non-recursive O(nlog n) sort for the Linux kernel | ||
3 | * | ||
4 | * Jan 23 2005 Matt Mackall <mpm@selenic.com> | ||
5 | */ | ||
6 | |||
7 | #include <linux/kernel.h> | ||
8 | #include <linux/module.h> | ||
9 | |||
10 | void u32_swap(void *a, void *b, int size) | ||
11 | { | ||
12 | u32 t = *(u32 *)a; | ||
13 | *(u32 *)a = *(u32 *)b; | ||
14 | *(u32 *)b = t; | ||
15 | } | ||
16 | |||
17 | void generic_swap(void *a, void *b, int size) | ||
18 | { | ||
19 | char t; | ||
20 | |||
21 | do { | ||
22 | t = *(char *)a; | ||
23 | *(char *)a++ = *(char *)b; | ||
24 | *(char *)b++ = t; | ||
25 | } while (--size > 0); | ||
26 | } | ||
27 | |||
28 | /* | ||
29 | * sort - sort an array of elements | ||
30 | * @base: pointer to data to sort | ||
31 | * @num: number of elements | ||
32 | * @size: size of each element | ||
33 | * @cmp: pointer to comparison function | ||
34 | * @swap: pointer to swap function or NULL | ||
35 | * | ||
36 | * This function does a heapsort on the given array. You may provide a | ||
37 | * swap function optimized to your element type. | ||
38 | * | ||
39 | * Sorting time is O(n log n) both on average and worst-case. While | ||
40 | * qsort is about 20% faster on average, it suffers from exploitable | ||
41 | * O(n*n) worst-case behavior and extra memory requirements that make | ||
42 | * it less suitable for kernel use. | ||
43 | */ | ||
44 | |||
45 | void sort(void *base, size_t num, size_t size, | ||
46 | int (*cmp)(const void *, const void *), | ||
47 | void (*swap)(void *, void *, int size)) | ||
48 | { | ||
49 | /* pre-scale counters for performance */ | ||
50 | int i = (num/2) * size, n = num * size, c, r; | ||
51 | |||
52 | if (!swap) | ||
53 | swap = (size == 4 ? u32_swap : generic_swap); | ||
54 | |||
55 | /* heapify */ | ||
56 | for ( ; i >= 0; i -= size) { | ||
57 | for (r = i; r * 2 < n; r = c) { | ||
58 | c = r * 2; | ||
59 | if (c < n - size && cmp(base + c, base + c + size) < 0) | ||
60 | c += size; | ||
61 | if (cmp(base + r, base + c) >= 0) | ||
62 | break; | ||
63 | swap(base + r, base + c, size); | ||
64 | } | ||
65 | } | ||
66 | |||
67 | /* sort */ | ||
68 | for (i = n - size; i >= 0; i -= size) { | ||
69 | swap(base, base + i, size); | ||
70 | for (r = 0; r * 2 < i; r = c) { | ||
71 | c = r * 2; | ||
72 | if (c < i - size && cmp(base + c, base + c + size) < 0) | ||
73 | c += size; | ||
74 | if (cmp(base + r, base + c) >= 0) | ||
75 | break; | ||
76 | swap(base + r, base + c, size); | ||
77 | } | ||
78 | } | ||
79 | } | ||
80 | |||
81 | EXPORT_SYMBOL(sort); | ||
82 | |||
83 | #if 0 | ||
84 | /* a simple boot-time regression test */ | ||
85 | |||
86 | int cmpint(const void *a, const void *b) | ||
87 | { | ||
88 | return *(int *)a - *(int *)b; | ||
89 | } | ||
90 | |||
91 | static int sort_test(void) | ||
92 | { | ||
93 | int *a, i, r = 0; | ||
94 | |||
95 | a = kmalloc(1000 * sizeof(int), GFP_KERNEL); | ||
96 | BUG_ON(!a); | ||
97 | |||
98 | printk("testing sort()\n"); | ||
99 | |||
100 | for (i = 0; i < 1000; i++) { | ||
101 | r = (r * 725861) % 6599; | ||
102 | a[i] = r; | ||
103 | } | ||
104 | |||
105 | sort(a, 1000, sizeof(int), cmpint, NULL); | ||
106 | |||
107 | for (i = 0; i < 999; i++) | ||
108 | if (a[i] > a[i+1]) { | ||
109 | printk("sort() failed!\n"); | ||
110 | break; | ||
111 | } | ||
112 | |||
113 | kfree(a); | ||
114 | |||
115 | return 0; | ||
116 | } | ||
117 | |||
118 | module_init(sort_test); | ||
119 | #endif | ||
diff --git a/lib/string.c b/lib/string.c new file mode 100644 index 000000000000..4bb93ad23c60 --- /dev/null +++ b/lib/string.c | |||
@@ -0,0 +1,601 @@ | |||
1 | /* | ||
2 | * linux/lib/string.c | ||
3 | * | ||
4 | * Copyright (C) 1991, 1992 Linus Torvalds | ||
5 | */ | ||
6 | |||
7 | /* | ||
8 | * stupid library routines.. The optimized versions should generally be found | ||
9 | * as inline code in <asm-xx/string.h> | ||
10 | * | ||
11 | * These are buggy as well.. | ||
12 | * | ||
13 | * * Fri Jun 25 1999, Ingo Oeser <ioe@informatik.tu-chemnitz.de> | ||
14 | * - Added strsep() which will replace strtok() soon (because strsep() is | ||
15 | * reentrant and should be faster). Use only strsep() in new code, please. | ||
16 | * | ||
17 | * * Sat Feb 09 2002, Jason Thomas <jason@topic.com.au>, | ||
18 | * Matthew Hawkins <matt@mh.dropbear.id.au> | ||
19 | * - Kissed strtok() goodbye | ||
20 | */ | ||
21 | |||
22 | #include <linux/types.h> | ||
23 | #include <linux/string.h> | ||
24 | #include <linux/ctype.h> | ||
25 | #include <linux/module.h> | ||
26 | |||
27 | #ifndef __HAVE_ARCH_STRNICMP | ||
28 | /** | ||
29 | * strnicmp - Case insensitive, length-limited string comparison | ||
30 | * @s1: One string | ||
31 | * @s2: The other string | ||
32 | * @len: the maximum number of characters to compare | ||
33 | */ | ||
34 | int strnicmp(const char *s1, const char *s2, size_t len) | ||
35 | { | ||
36 | /* Yes, Virginia, it had better be unsigned */ | ||
37 | unsigned char c1, c2; | ||
38 | |||
39 | c1 = 0; c2 = 0; | ||
40 | if (len) { | ||
41 | do { | ||
42 | c1 = *s1; c2 = *s2; | ||
43 | s1++; s2++; | ||
44 | if (!c1) | ||
45 | break; | ||
46 | if (!c2) | ||
47 | break; | ||
48 | if (c1 == c2) | ||
49 | continue; | ||
50 | c1 = tolower(c1); | ||
51 | c2 = tolower(c2); | ||
52 | if (c1 != c2) | ||
53 | break; | ||
54 | } while (--len); | ||
55 | } | ||
56 | return (int)c1 - (int)c2; | ||
57 | } | ||
58 | |||
59 | EXPORT_SYMBOL(strnicmp); | ||
60 | #endif | ||
61 | |||
62 | #ifndef __HAVE_ARCH_STRCPY | ||
63 | /** | ||
64 | * strcpy - Copy a %NUL terminated string | ||
65 | * @dest: Where to copy the string to | ||
66 | * @src: Where to copy the string from | ||
67 | */ | ||
68 | char * strcpy(char * dest,const char *src) | ||
69 | { | ||
70 | char *tmp = dest; | ||
71 | |||
72 | while ((*dest++ = *src++) != '\0') | ||
73 | /* nothing */; | ||
74 | return tmp; | ||
75 | } | ||
76 | EXPORT_SYMBOL(strcpy); | ||
77 | #endif | ||
78 | |||
79 | #ifndef __HAVE_ARCH_STRNCPY | ||
80 | /** | ||
81 | * strncpy - Copy a length-limited, %NUL-terminated string | ||
82 | * @dest: Where to copy the string to | ||
83 | * @src: Where to copy the string from | ||
84 | * @count: The maximum number of bytes to copy | ||
85 | * | ||
86 | * The result is not %NUL-terminated if the source exceeds | ||
87 | * @count bytes. | ||
88 | */ | ||
89 | char * strncpy(char * dest,const char *src,size_t count) | ||
90 | { | ||
91 | char *tmp = dest; | ||
92 | |||
93 | while (count) { | ||
94 | if ((*tmp = *src) != 0) src++; | ||
95 | tmp++; | ||
96 | count--; | ||
97 | } | ||
98 | return dest; | ||
99 | } | ||
100 | EXPORT_SYMBOL(strncpy); | ||
101 | #endif | ||
102 | |||
103 | #ifndef __HAVE_ARCH_STRLCPY | ||
104 | /** | ||
105 | * strlcpy - Copy a %NUL terminated string into a sized buffer | ||
106 | * @dest: Where to copy the string to | ||
107 | * @src: Where to copy the string from | ||
108 | * @size: size of destination buffer | ||
109 | * | ||
110 | * Compatible with *BSD: the result is always a valid | ||
111 | * NUL-terminated string that fits in the buffer (unless, | ||
112 | * of course, the buffer size is zero). It does not pad | ||
113 | * out the result like strncpy() does. | ||
114 | */ | ||
115 | size_t strlcpy(char *dest, const char *src, size_t size) | ||
116 | { | ||
117 | size_t ret = strlen(src); | ||
118 | |||
119 | if (size) { | ||
120 | size_t len = (ret >= size) ? size-1 : ret; | ||
121 | memcpy(dest, src, len); | ||
122 | dest[len] = '\0'; | ||
123 | } | ||
124 | return ret; | ||
125 | } | ||
126 | EXPORT_SYMBOL(strlcpy); | ||
127 | #endif | ||
128 | |||
129 | #ifndef __HAVE_ARCH_STRCAT | ||
130 | /** | ||
131 | * strcat - Append one %NUL-terminated string to another | ||
132 | * @dest: The string to be appended to | ||
133 | * @src: The string to append to it | ||
134 | */ | ||
135 | char * strcat(char * dest, const char * src) | ||
136 | { | ||
137 | char *tmp = dest; | ||
138 | |||
139 | while (*dest) | ||
140 | dest++; | ||
141 | while ((*dest++ = *src++) != '\0') | ||
142 | ; | ||
143 | |||
144 | return tmp; | ||
145 | } | ||
146 | EXPORT_SYMBOL(strcat); | ||
147 | #endif | ||
148 | |||
149 | #ifndef __HAVE_ARCH_STRNCAT | ||
150 | /** | ||
151 | * strncat - Append a length-limited, %NUL-terminated string to another | ||
152 | * @dest: The string to be appended to | ||
153 | * @src: The string to append to it | ||
154 | * @count: The maximum numbers of bytes to copy | ||
155 | * | ||
156 | * Note that in contrast to strncpy, strncat ensures the result is | ||
157 | * terminated. | ||
158 | */ | ||
159 | char * strncat(char *dest, const char *src, size_t count) | ||
160 | { | ||
161 | char *tmp = dest; | ||
162 | |||
163 | if (count) { | ||
164 | while (*dest) | ||
165 | dest++; | ||
166 | while ((*dest++ = *src++) != 0) { | ||
167 | if (--count == 0) { | ||
168 | *dest = '\0'; | ||
169 | break; | ||
170 | } | ||
171 | } | ||
172 | } | ||
173 | |||
174 | return tmp; | ||
175 | } | ||
176 | EXPORT_SYMBOL(strncat); | ||
177 | #endif | ||
178 | |||
179 | #ifndef __HAVE_ARCH_STRLCAT | ||
180 | /** | ||
181 | * strlcat - Append a length-limited, %NUL-terminated string to another | ||
182 | * @dest: The string to be appended to | ||
183 | * @src: The string to append to it | ||
184 | * @count: The size of the destination buffer. | ||
185 | */ | ||
186 | size_t strlcat(char *dest, const char *src, size_t count) | ||
187 | { | ||
188 | size_t dsize = strlen(dest); | ||
189 | size_t len = strlen(src); | ||
190 | size_t res = dsize + len; | ||
191 | |||
192 | /* This would be a bug */ | ||
193 | BUG_ON(dsize >= count); | ||
194 | |||
195 | dest += dsize; | ||
196 | count -= dsize; | ||
197 | if (len >= count) | ||
198 | len = count-1; | ||
199 | memcpy(dest, src, len); | ||
200 | dest[len] = 0; | ||
201 | return res; | ||
202 | } | ||
203 | EXPORT_SYMBOL(strlcat); | ||
204 | #endif | ||
205 | |||
206 | #ifndef __HAVE_ARCH_STRCMP | ||
207 | /** | ||
208 | * strcmp - Compare two strings | ||
209 | * @cs: One string | ||
210 | * @ct: Another string | ||
211 | */ | ||
212 | int strcmp(const char * cs,const char * ct) | ||
213 | { | ||
214 | register signed char __res; | ||
215 | |||
216 | while (1) { | ||
217 | if ((__res = *cs - *ct++) != 0 || !*cs++) | ||
218 | break; | ||
219 | } | ||
220 | |||
221 | return __res; | ||
222 | } | ||
223 | EXPORT_SYMBOL(strcmp); | ||
224 | #endif | ||
225 | |||
226 | #ifndef __HAVE_ARCH_STRNCMP | ||
227 | /** | ||
228 | * strncmp - Compare two length-limited strings | ||
229 | * @cs: One string | ||
230 | * @ct: Another string | ||
231 | * @count: The maximum number of bytes to compare | ||
232 | */ | ||
233 | int strncmp(const char * cs,const char * ct,size_t count) | ||
234 | { | ||
235 | register signed char __res = 0; | ||
236 | |||
237 | while (count) { | ||
238 | if ((__res = *cs - *ct++) != 0 || !*cs++) | ||
239 | break; | ||
240 | count--; | ||
241 | } | ||
242 | |||
243 | return __res; | ||
244 | } | ||
245 | EXPORT_SYMBOL(strncmp); | ||
246 | #endif | ||
247 | |||
248 | #ifndef __HAVE_ARCH_STRCHR | ||
249 | /** | ||
250 | * strchr - Find the first occurrence of a character in a string | ||
251 | * @s: The string to be searched | ||
252 | * @c: The character to search for | ||
253 | */ | ||
254 | char * strchr(const char * s, int c) | ||
255 | { | ||
256 | for(; *s != (char) c; ++s) | ||
257 | if (*s == '\0') | ||
258 | return NULL; | ||
259 | return (char *) s; | ||
260 | } | ||
261 | EXPORT_SYMBOL(strchr); | ||
262 | #endif | ||
263 | |||
264 | #ifndef __HAVE_ARCH_STRRCHR | ||
265 | /** | ||
266 | * strrchr - Find the last occurrence of a character in a string | ||
267 | * @s: The string to be searched | ||
268 | * @c: The character to search for | ||
269 | */ | ||
270 | char * strrchr(const char * s, int c) | ||
271 | { | ||
272 | const char *p = s + strlen(s); | ||
273 | do { | ||
274 | if (*p == (char)c) | ||
275 | return (char *)p; | ||
276 | } while (--p >= s); | ||
277 | return NULL; | ||
278 | } | ||
279 | EXPORT_SYMBOL(strrchr); | ||
280 | #endif | ||
281 | |||
282 | #ifndef __HAVE_ARCH_STRNCHR | ||
283 | /** | ||
284 | * strnchr - Find a character in a length limited string | ||
285 | * @s: The string to be searched | ||
286 | * @count: The number of characters to be searched | ||
287 | * @c: The character to search for | ||
288 | */ | ||
289 | char *strnchr(const char *s, size_t count, int c) | ||
290 | { | ||
291 | for (; count-- && *s != '\0'; ++s) | ||
292 | if (*s == (char) c) | ||
293 | return (char *) s; | ||
294 | return NULL; | ||
295 | } | ||
296 | EXPORT_SYMBOL(strnchr); | ||
297 | #endif | ||
298 | |||
299 | #ifndef __HAVE_ARCH_STRLEN | ||
300 | /** | ||
301 | * strlen - Find the length of a string | ||
302 | * @s: The string to be sized | ||
303 | */ | ||
304 | size_t strlen(const char * s) | ||
305 | { | ||
306 | const char *sc; | ||
307 | |||
308 | for (sc = s; *sc != '\0'; ++sc) | ||
309 | /* nothing */; | ||
310 | return sc - s; | ||
311 | } | ||
312 | EXPORT_SYMBOL(strlen); | ||
313 | #endif | ||
314 | |||
315 | #ifndef __HAVE_ARCH_STRNLEN | ||
316 | /** | ||
317 | * strnlen - Find the length of a length-limited string | ||
318 | * @s: The string to be sized | ||
319 | * @count: The maximum number of bytes to search | ||
320 | */ | ||
321 | size_t strnlen(const char * s, size_t count) | ||
322 | { | ||
323 | const char *sc; | ||
324 | |||
325 | for (sc = s; count-- && *sc != '\0'; ++sc) | ||
326 | /* nothing */; | ||
327 | return sc - s; | ||
328 | } | ||
329 | EXPORT_SYMBOL(strnlen); | ||
330 | #endif | ||
331 | |||
332 | #ifndef __HAVE_ARCH_STRSPN | ||
333 | /** | ||
334 | * strspn - Calculate the length of the initial substring of @s which only | ||
335 | * contain letters in @accept | ||
336 | * @s: The string to be searched | ||
337 | * @accept: The string to search for | ||
338 | */ | ||
339 | size_t strspn(const char *s, const char *accept) | ||
340 | { | ||
341 | const char *p; | ||
342 | const char *a; | ||
343 | size_t count = 0; | ||
344 | |||
345 | for (p = s; *p != '\0'; ++p) { | ||
346 | for (a = accept; *a != '\0'; ++a) { | ||
347 | if (*p == *a) | ||
348 | break; | ||
349 | } | ||
350 | if (*a == '\0') | ||
351 | return count; | ||
352 | ++count; | ||
353 | } | ||
354 | |||
355 | return count; | ||
356 | } | ||
357 | |||
358 | EXPORT_SYMBOL(strspn); | ||
359 | #endif | ||
360 | |||
361 | /** | ||
362 | * strcspn - Calculate the length of the initial substring of @s which does | ||
363 | * not contain letters in @reject | ||
364 | * @s: The string to be searched | ||
365 | * @reject: The string to avoid | ||
366 | */ | ||
367 | size_t strcspn(const char *s, const char *reject) | ||
368 | { | ||
369 | const char *p; | ||
370 | const char *r; | ||
371 | size_t count = 0; | ||
372 | |||
373 | for (p = s; *p != '\0'; ++p) { | ||
374 | for (r = reject; *r != '\0'; ++r) { | ||
375 | if (*p == *r) | ||
376 | return count; | ||
377 | } | ||
378 | ++count; | ||
379 | } | ||
380 | |||
381 | return count; | ||
382 | } | ||
383 | EXPORT_SYMBOL(strcspn); | ||
384 | |||
385 | #ifndef __HAVE_ARCH_STRPBRK | ||
386 | /** | ||
387 | * strpbrk - Find the first occurrence of a set of characters | ||
388 | * @cs: The string to be searched | ||
389 | * @ct: The characters to search for | ||
390 | */ | ||
391 | char * strpbrk(const char * cs,const char * ct) | ||
392 | { | ||
393 | const char *sc1,*sc2; | ||
394 | |||
395 | for( sc1 = cs; *sc1 != '\0'; ++sc1) { | ||
396 | for( sc2 = ct; *sc2 != '\0'; ++sc2) { | ||
397 | if (*sc1 == *sc2) | ||
398 | return (char *) sc1; | ||
399 | } | ||
400 | } | ||
401 | return NULL; | ||
402 | } | ||
403 | EXPORT_SYMBOL(strpbrk); | ||
404 | #endif | ||
405 | |||
406 | #ifndef __HAVE_ARCH_STRSEP | ||
407 | /** | ||
408 | * strsep - Split a string into tokens | ||
409 | * @s: The string to be searched | ||
410 | * @ct: The characters to search for | ||
411 | * | ||
412 | * strsep() updates @s to point after the token, ready for the next call. | ||
413 | * | ||
414 | * It returns empty tokens, too, behaving exactly like the libc function | ||
415 | * of that name. In fact, it was stolen from glibc2 and de-fancy-fied. | ||
416 | * Same semantics, slimmer shape. ;) | ||
417 | */ | ||
418 | char * strsep(char **s, const char *ct) | ||
419 | { | ||
420 | char *sbegin = *s, *end; | ||
421 | |||
422 | if (sbegin == NULL) | ||
423 | return NULL; | ||
424 | |||
425 | end = strpbrk(sbegin, ct); | ||
426 | if (end) | ||
427 | *end++ = '\0'; | ||
428 | *s = end; | ||
429 | |||
430 | return sbegin; | ||
431 | } | ||
432 | |||
433 | EXPORT_SYMBOL(strsep); | ||
434 | #endif | ||
435 | |||
436 | #ifndef __HAVE_ARCH_MEMSET | ||
437 | /** | ||
438 | * memset - Fill a region of memory with the given value | ||
439 | * @s: Pointer to the start of the area. | ||
440 | * @c: The byte to fill the area with | ||
441 | * @count: The size of the area. | ||
442 | * | ||
443 | * Do not use memset() to access IO space, use memset_io() instead. | ||
444 | */ | ||
445 | void * memset(void * s,int c,size_t count) | ||
446 | { | ||
447 | char *xs = (char *) s; | ||
448 | |||
449 | while (count--) | ||
450 | *xs++ = c; | ||
451 | |||
452 | return s; | ||
453 | } | ||
454 | EXPORT_SYMBOL(memset); | ||
455 | #endif | ||
456 | |||
457 | #ifndef __HAVE_ARCH_MEMCPY | ||
458 | /** | ||
459 | * memcpy - Copy one area of memory to another | ||
460 | * @dest: Where to copy to | ||
461 | * @src: Where to copy from | ||
462 | * @count: The size of the area. | ||
463 | * | ||
464 | * You should not use this function to access IO space, use memcpy_toio() | ||
465 | * or memcpy_fromio() instead. | ||
466 | */ | ||
467 | void * memcpy(void * dest,const void *src,size_t count) | ||
468 | { | ||
469 | char *tmp = (char *) dest, *s = (char *) src; | ||
470 | |||
471 | while (count--) | ||
472 | *tmp++ = *s++; | ||
473 | |||
474 | return dest; | ||
475 | } | ||
476 | EXPORT_SYMBOL(memcpy); | ||
477 | #endif | ||
478 | |||
479 | #ifndef __HAVE_ARCH_MEMMOVE | ||
480 | /** | ||
481 | * memmove - Copy one area of memory to another | ||
482 | * @dest: Where to copy to | ||
483 | * @src: Where to copy from | ||
484 | * @count: The size of the area. | ||
485 | * | ||
486 | * Unlike memcpy(), memmove() copes with overlapping areas. | ||
487 | */ | ||
488 | void * memmove(void * dest,const void *src,size_t count) | ||
489 | { | ||
490 | char *tmp, *s; | ||
491 | |||
492 | if (dest <= src) { | ||
493 | tmp = (char *) dest; | ||
494 | s = (char *) src; | ||
495 | while (count--) | ||
496 | *tmp++ = *s++; | ||
497 | } | ||
498 | else { | ||
499 | tmp = (char *) dest + count; | ||
500 | s = (char *) src + count; | ||
501 | while (count--) | ||
502 | *--tmp = *--s; | ||
503 | } | ||
504 | |||
505 | return dest; | ||
506 | } | ||
507 | EXPORT_SYMBOL(memmove); | ||
508 | #endif | ||
509 | |||
510 | #ifndef __HAVE_ARCH_MEMCMP | ||
511 | /** | ||
512 | * memcmp - Compare two areas of memory | ||
513 | * @cs: One area of memory | ||
514 | * @ct: Another area of memory | ||
515 | * @count: The size of the area. | ||
516 | */ | ||
517 | int memcmp(const void * cs,const void * ct,size_t count) | ||
518 | { | ||
519 | const unsigned char *su1, *su2; | ||
520 | int res = 0; | ||
521 | |||
522 | for( su1 = cs, su2 = ct; 0 < count; ++su1, ++su2, count--) | ||
523 | if ((res = *su1 - *su2) != 0) | ||
524 | break; | ||
525 | return res; | ||
526 | } | ||
527 | EXPORT_SYMBOL(memcmp); | ||
528 | #endif | ||
529 | |||
530 | #ifndef __HAVE_ARCH_MEMSCAN | ||
531 | /** | ||
532 | * memscan - Find a character in an area of memory. | ||
533 | * @addr: The memory area | ||
534 | * @c: The byte to search for | ||
535 | * @size: The size of the area. | ||
536 | * | ||
537 | * returns the address of the first occurrence of @c, or 1 byte past | ||
538 | * the area if @c is not found | ||
539 | */ | ||
540 | void * memscan(void * addr, int c, size_t size) | ||
541 | { | ||
542 | unsigned char * p = (unsigned char *) addr; | ||
543 | |||
544 | while (size) { | ||
545 | if (*p == c) | ||
546 | return (void *) p; | ||
547 | p++; | ||
548 | size--; | ||
549 | } | ||
550 | return (void *) p; | ||
551 | } | ||
552 | EXPORT_SYMBOL(memscan); | ||
553 | #endif | ||
554 | |||
555 | #ifndef __HAVE_ARCH_STRSTR | ||
556 | /** | ||
557 | * strstr - Find the first substring in a %NUL terminated string | ||
558 | * @s1: The string to be searched | ||
559 | * @s2: The string to search for | ||
560 | */ | ||
561 | char * strstr(const char * s1,const char * s2) | ||
562 | { | ||
563 | int l1, l2; | ||
564 | |||
565 | l2 = strlen(s2); | ||
566 | if (!l2) | ||
567 | return (char *) s1; | ||
568 | l1 = strlen(s1); | ||
569 | while (l1 >= l2) { | ||
570 | l1--; | ||
571 | if (!memcmp(s1,s2,l2)) | ||
572 | return (char *) s1; | ||
573 | s1++; | ||
574 | } | ||
575 | return NULL; | ||
576 | } | ||
577 | EXPORT_SYMBOL(strstr); | ||
578 | #endif | ||
579 | |||
580 | #ifndef __HAVE_ARCH_MEMCHR | ||
581 | /** | ||
582 | * memchr - Find a character in an area of memory. | ||
583 | * @s: The memory area | ||
584 | * @c: The byte to search for | ||
585 | * @n: The size of the area. | ||
586 | * | ||
587 | * returns the address of the first occurrence of @c, or %NULL | ||
588 | * if @c is not found | ||
589 | */ | ||
590 | void *memchr(const void *s, int c, size_t n) | ||
591 | { | ||
592 | const unsigned char *p = s; | ||
593 | while (n-- != 0) { | ||
594 | if ((unsigned char)c == *p++) { | ||
595 | return (void *)(p-1); | ||
596 | } | ||
597 | } | ||
598 | return NULL; | ||
599 | } | ||
600 | EXPORT_SYMBOL(memchr); | ||
601 | #endif | ||
diff --git a/lib/vsprintf.c b/lib/vsprintf.c new file mode 100644 index 000000000000..a9bda0a361f3 --- /dev/null +++ b/lib/vsprintf.c | |||
@@ -0,0 +1,846 @@ | |||
1 | /* | ||
2 | * linux/lib/vsprintf.c | ||
3 | * | ||
4 | * Copyright (C) 1991, 1992 Linus Torvalds | ||
5 | */ | ||
6 | |||
7 | /* vsprintf.c -- Lars Wirzenius & Linus Torvalds. */ | ||
8 | /* | ||
9 | * Wirzenius wrote this portably, Torvalds fucked it up :-) | ||
10 | */ | ||
11 | |||
12 | /* | ||
13 | * Fri Jul 13 2001 Crutcher Dunnavant <crutcher+kernel@datastacks.com> | ||
14 | * - changed to provide snprintf and vsnprintf functions | ||
15 | * So Feb 1 16:51:32 CET 2004 Juergen Quade <quade@hsnr.de> | ||
16 | * - scnprintf and vscnprintf | ||
17 | */ | ||
18 | |||
19 | #include <stdarg.h> | ||
20 | #include <linux/module.h> | ||
21 | #include <linux/types.h> | ||
22 | #include <linux/string.h> | ||
23 | #include <linux/ctype.h> | ||
24 | #include <linux/kernel.h> | ||
25 | |||
26 | #include <asm/div64.h> | ||
27 | |||
28 | /** | ||
29 | * simple_strtoul - convert a string to an unsigned long | ||
30 | * @cp: The start of the string | ||
31 | * @endp: A pointer to the end of the parsed string will be placed here | ||
32 | * @base: The number base to use | ||
33 | */ | ||
34 | unsigned long simple_strtoul(const char *cp,char **endp,unsigned int base) | ||
35 | { | ||
36 | unsigned long result = 0,value; | ||
37 | |||
38 | if (!base) { | ||
39 | base = 10; | ||
40 | if (*cp == '0') { | ||
41 | base = 8; | ||
42 | cp++; | ||
43 | if ((toupper(*cp) == 'X') && isxdigit(cp[1])) { | ||
44 | cp++; | ||
45 | base = 16; | ||
46 | } | ||
47 | } | ||
48 | } else if (base == 16) { | ||
49 | if (cp[0] == '0' && toupper(cp[1]) == 'X') | ||
50 | cp += 2; | ||
51 | } | ||
52 | while (isxdigit(*cp) && | ||
53 | (value = isdigit(*cp) ? *cp-'0' : toupper(*cp)-'A'+10) < base) { | ||
54 | result = result*base + value; | ||
55 | cp++; | ||
56 | } | ||
57 | if (endp) | ||
58 | *endp = (char *)cp; | ||
59 | return result; | ||
60 | } | ||
61 | |||
62 | EXPORT_SYMBOL(simple_strtoul); | ||
63 | |||
64 | /** | ||
65 | * simple_strtol - convert a string to a signed long | ||
66 | * @cp: The start of the string | ||
67 | * @endp: A pointer to the end of the parsed string will be placed here | ||
68 | * @base: The number base to use | ||
69 | */ | ||
70 | long simple_strtol(const char *cp,char **endp,unsigned int base) | ||
71 | { | ||
72 | if(*cp=='-') | ||
73 | return -simple_strtoul(cp+1,endp,base); | ||
74 | return simple_strtoul(cp,endp,base); | ||
75 | } | ||
76 | |||
77 | EXPORT_SYMBOL(simple_strtol); | ||
78 | |||
79 | /** | ||
80 | * simple_strtoull - convert a string to an unsigned long long | ||
81 | * @cp: The start of the string | ||
82 | * @endp: A pointer to the end of the parsed string will be placed here | ||
83 | * @base: The number base to use | ||
84 | */ | ||
85 | unsigned long long simple_strtoull(const char *cp,char **endp,unsigned int base) | ||
86 | { | ||
87 | unsigned long long result = 0,value; | ||
88 | |||
89 | if (!base) { | ||
90 | base = 10; | ||
91 | if (*cp == '0') { | ||
92 | base = 8; | ||
93 | cp++; | ||
94 | if ((toupper(*cp) == 'X') && isxdigit(cp[1])) { | ||
95 | cp++; | ||
96 | base = 16; | ||
97 | } | ||
98 | } | ||
99 | } else if (base == 16) { | ||
100 | if (cp[0] == '0' && toupper(cp[1]) == 'X') | ||
101 | cp += 2; | ||
102 | } | ||
103 | while (isxdigit(*cp) && (value = isdigit(*cp) ? *cp-'0' : (islower(*cp) | ||
104 | ? toupper(*cp) : *cp)-'A'+10) < base) { | ||
105 | result = result*base + value; | ||
106 | cp++; | ||
107 | } | ||
108 | if (endp) | ||
109 | *endp = (char *)cp; | ||
110 | return result; | ||
111 | } | ||
112 | |||
113 | EXPORT_SYMBOL(simple_strtoull); | ||
114 | |||
115 | /** | ||
116 | * simple_strtoll - convert a string to a signed long long | ||
117 | * @cp: The start of the string | ||
118 | * @endp: A pointer to the end of the parsed string will be placed here | ||
119 | * @base: The number base to use | ||
120 | */ | ||
121 | long long simple_strtoll(const char *cp,char **endp,unsigned int base) | ||
122 | { | ||
123 | if(*cp=='-') | ||
124 | return -simple_strtoull(cp+1,endp,base); | ||
125 | return simple_strtoull(cp,endp,base); | ||
126 | } | ||
127 | |||
128 | static int skip_atoi(const char **s) | ||
129 | { | ||
130 | int i=0; | ||
131 | |||
132 | while (isdigit(**s)) | ||
133 | i = i*10 + *((*s)++) - '0'; | ||
134 | return i; | ||
135 | } | ||
136 | |||
137 | #define ZEROPAD 1 /* pad with zero */ | ||
138 | #define SIGN 2 /* unsigned/signed long */ | ||
139 | #define PLUS 4 /* show plus */ | ||
140 | #define SPACE 8 /* space if plus */ | ||
141 | #define LEFT 16 /* left justified */ | ||
142 | #define SPECIAL 32 /* 0x */ | ||
143 | #define LARGE 64 /* use 'ABCDEF' instead of 'abcdef' */ | ||
144 | |||
145 | static char * number(char * buf, char * end, unsigned long long num, int base, int size, int precision, int type) | ||
146 | { | ||
147 | char c,sign,tmp[66]; | ||
148 | const char *digits; | ||
149 | static const char small_digits[] = "0123456789abcdefghijklmnopqrstuvwxyz"; | ||
150 | static const char large_digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; | ||
151 | int i; | ||
152 | |||
153 | digits = (type & LARGE) ? large_digits : small_digits; | ||
154 | if (type & LEFT) | ||
155 | type &= ~ZEROPAD; | ||
156 | if (base < 2 || base > 36) | ||
157 | return NULL; | ||
158 | c = (type & ZEROPAD) ? '0' : ' '; | ||
159 | sign = 0; | ||
160 | if (type & SIGN) { | ||
161 | if ((signed long long) num < 0) { | ||
162 | sign = '-'; | ||
163 | num = - (signed long long) num; | ||
164 | size--; | ||
165 | } else if (type & PLUS) { | ||
166 | sign = '+'; | ||
167 | size--; | ||
168 | } else if (type & SPACE) { | ||
169 | sign = ' '; | ||
170 | size--; | ||
171 | } | ||
172 | } | ||
173 | if (type & SPECIAL) { | ||
174 | if (base == 16) | ||
175 | size -= 2; | ||
176 | else if (base == 8) | ||
177 | size--; | ||
178 | } | ||
179 | i = 0; | ||
180 | if (num == 0) | ||
181 | tmp[i++]='0'; | ||
182 | else while (num != 0) | ||
183 | tmp[i++] = digits[do_div(num,base)]; | ||
184 | if (i > precision) | ||
185 | precision = i; | ||
186 | size -= precision; | ||
187 | if (!(type&(ZEROPAD+LEFT))) { | ||
188 | while(size-->0) { | ||
189 | if (buf <= end) | ||
190 | *buf = ' '; | ||
191 | ++buf; | ||
192 | } | ||
193 | } | ||
194 | if (sign) { | ||
195 | if (buf <= end) | ||
196 | *buf = sign; | ||
197 | ++buf; | ||
198 | } | ||
199 | if (type & SPECIAL) { | ||
200 | if (base==8) { | ||
201 | if (buf <= end) | ||
202 | *buf = '0'; | ||
203 | ++buf; | ||
204 | } else if (base==16) { | ||
205 | if (buf <= end) | ||
206 | *buf = '0'; | ||
207 | ++buf; | ||
208 | if (buf <= end) | ||
209 | *buf = digits[33]; | ||
210 | ++buf; | ||
211 | } | ||
212 | } | ||
213 | if (!(type & LEFT)) { | ||
214 | while (size-- > 0) { | ||
215 | if (buf <= end) | ||
216 | *buf = c; | ||
217 | ++buf; | ||
218 | } | ||
219 | } | ||
220 | while (i < precision--) { | ||
221 | if (buf <= end) | ||
222 | *buf = '0'; | ||
223 | ++buf; | ||
224 | } | ||
225 | while (i-- > 0) { | ||
226 | if (buf <= end) | ||
227 | *buf = tmp[i]; | ||
228 | ++buf; | ||
229 | } | ||
230 | while (size-- > 0) { | ||
231 | if (buf <= end) | ||
232 | *buf = ' '; | ||
233 | ++buf; | ||
234 | } | ||
235 | return buf; | ||
236 | } | ||
237 | |||
238 | /** | ||
239 | * vsnprintf - Format a string and place it in a buffer | ||
240 | * @buf: The buffer to place the result into | ||
241 | * @size: The size of the buffer, including the trailing null space | ||
242 | * @fmt: The format string to use | ||
243 | * @args: Arguments for the format string | ||
244 | * | ||
245 | * The return value is the number of characters which would | ||
246 | * be generated for the given input, excluding the trailing | ||
247 | * '\0', as per ISO C99. If you want to have the exact | ||
248 | * number of characters written into @buf as return value | ||
249 | * (not including the trailing '\0'), use vscnprintf. If the | ||
250 | * return is greater than or equal to @size, the resulting | ||
251 | * string is truncated. | ||
252 | * | ||
253 | * Call this function if you are already dealing with a va_list. | ||
254 | * You probably want snprintf instead. | ||
255 | */ | ||
256 | int vsnprintf(char *buf, size_t size, const char *fmt, va_list args) | ||
257 | { | ||
258 | int len; | ||
259 | unsigned long long num; | ||
260 | int i, base; | ||
261 | char *str, *end, c; | ||
262 | const char *s; | ||
263 | |||
264 | int flags; /* flags to number() */ | ||
265 | |||
266 | int field_width; /* width of output field */ | ||
267 | int precision; /* min. # of digits for integers; max | ||
268 | number of chars for from string */ | ||
269 | int qualifier; /* 'h', 'l', or 'L' for integer fields */ | ||
270 | /* 'z' support added 23/7/1999 S.H. */ | ||
271 | /* 'z' changed to 'Z' --davidm 1/25/99 */ | ||
272 | |||
273 | /* Reject out-of-range values early */ | ||
274 | if (unlikely((int) size < 0)) { | ||
275 | /* There can be only one.. */ | ||
276 | static int warn = 1; | ||
277 | WARN_ON(warn); | ||
278 | warn = 0; | ||
279 | return 0; | ||
280 | } | ||
281 | |||
282 | str = buf; | ||
283 | end = buf + size - 1; | ||
284 | |||
285 | if (end < buf - 1) { | ||
286 | end = ((void *) -1); | ||
287 | size = end - buf + 1; | ||
288 | } | ||
289 | |||
290 | for (; *fmt ; ++fmt) { | ||
291 | if (*fmt != '%') { | ||
292 | if (str <= end) | ||
293 | *str = *fmt; | ||
294 | ++str; | ||
295 | continue; | ||
296 | } | ||
297 | |||
298 | /* process flags */ | ||
299 | flags = 0; | ||
300 | repeat: | ||
301 | ++fmt; /* this also skips first '%' */ | ||
302 | switch (*fmt) { | ||
303 | case '-': flags |= LEFT; goto repeat; | ||
304 | case '+': flags |= PLUS; goto repeat; | ||
305 | case ' ': flags |= SPACE; goto repeat; | ||
306 | case '#': flags |= SPECIAL; goto repeat; | ||
307 | case '0': flags |= ZEROPAD; goto repeat; | ||
308 | } | ||
309 | |||
310 | /* get field width */ | ||
311 | field_width = -1; | ||
312 | if (isdigit(*fmt)) | ||
313 | field_width = skip_atoi(&fmt); | ||
314 | else if (*fmt == '*') { | ||
315 | ++fmt; | ||
316 | /* it's the next argument */ | ||
317 | field_width = va_arg(args, int); | ||
318 | if (field_width < 0) { | ||
319 | field_width = -field_width; | ||
320 | flags |= LEFT; | ||
321 | } | ||
322 | } | ||
323 | |||
324 | /* get the precision */ | ||
325 | precision = -1; | ||
326 | if (*fmt == '.') { | ||
327 | ++fmt; | ||
328 | if (isdigit(*fmt)) | ||
329 | precision = skip_atoi(&fmt); | ||
330 | else if (*fmt == '*') { | ||
331 | ++fmt; | ||
332 | /* it's the next argument */ | ||
333 | precision = va_arg(args, int); | ||
334 | } | ||
335 | if (precision < 0) | ||
336 | precision = 0; | ||
337 | } | ||
338 | |||
339 | /* get the conversion qualifier */ | ||
340 | qualifier = -1; | ||
341 | if (*fmt == 'h' || *fmt == 'l' || *fmt == 'L' || | ||
342 | *fmt =='Z' || *fmt == 'z') { | ||
343 | qualifier = *fmt; | ||
344 | ++fmt; | ||
345 | if (qualifier == 'l' && *fmt == 'l') { | ||
346 | qualifier = 'L'; | ||
347 | ++fmt; | ||
348 | } | ||
349 | } | ||
350 | |||
351 | /* default base */ | ||
352 | base = 10; | ||
353 | |||
354 | switch (*fmt) { | ||
355 | case 'c': | ||
356 | if (!(flags & LEFT)) { | ||
357 | while (--field_width > 0) { | ||
358 | if (str <= end) | ||
359 | *str = ' '; | ||
360 | ++str; | ||
361 | } | ||
362 | } | ||
363 | c = (unsigned char) va_arg(args, int); | ||
364 | if (str <= end) | ||
365 | *str = c; | ||
366 | ++str; | ||
367 | while (--field_width > 0) { | ||
368 | if (str <= end) | ||
369 | *str = ' '; | ||
370 | ++str; | ||
371 | } | ||
372 | continue; | ||
373 | |||
374 | case 's': | ||
375 | s = va_arg(args, char *); | ||
376 | if ((unsigned long)s < PAGE_SIZE) | ||
377 | s = "<NULL>"; | ||
378 | |||
379 | len = strnlen(s, precision); | ||
380 | |||
381 | if (!(flags & LEFT)) { | ||
382 | while (len < field_width--) { | ||
383 | if (str <= end) | ||
384 | *str = ' '; | ||
385 | ++str; | ||
386 | } | ||
387 | } | ||
388 | for (i = 0; i < len; ++i) { | ||
389 | if (str <= end) | ||
390 | *str = *s; | ||
391 | ++str; ++s; | ||
392 | } | ||
393 | while (len < field_width--) { | ||
394 | if (str <= end) | ||
395 | *str = ' '; | ||
396 | ++str; | ||
397 | } | ||
398 | continue; | ||
399 | |||
400 | case 'p': | ||
401 | if (field_width == -1) { | ||
402 | field_width = 2*sizeof(void *); | ||
403 | flags |= ZEROPAD; | ||
404 | } | ||
405 | str = number(str, end, | ||
406 | (unsigned long) va_arg(args, void *), | ||
407 | 16, field_width, precision, flags); | ||
408 | continue; | ||
409 | |||
410 | |||
411 | case 'n': | ||
412 | /* FIXME: | ||
413 | * What does C99 say about the overflow case here? */ | ||
414 | if (qualifier == 'l') { | ||
415 | long * ip = va_arg(args, long *); | ||
416 | *ip = (str - buf); | ||
417 | } else if (qualifier == 'Z' || qualifier == 'z') { | ||
418 | size_t * ip = va_arg(args, size_t *); | ||
419 | *ip = (str - buf); | ||
420 | } else { | ||
421 | int * ip = va_arg(args, int *); | ||
422 | *ip = (str - buf); | ||
423 | } | ||
424 | continue; | ||
425 | |||
426 | case '%': | ||
427 | if (str <= end) | ||
428 | *str = '%'; | ||
429 | ++str; | ||
430 | continue; | ||
431 | |||
432 | /* integer number formats - set up the flags and "break" */ | ||
433 | case 'o': | ||
434 | base = 8; | ||
435 | break; | ||
436 | |||
437 | case 'X': | ||
438 | flags |= LARGE; | ||
439 | case 'x': | ||
440 | base = 16; | ||
441 | break; | ||
442 | |||
443 | case 'd': | ||
444 | case 'i': | ||
445 | flags |= SIGN; | ||
446 | case 'u': | ||
447 | break; | ||
448 | |||
449 | default: | ||
450 | if (str <= end) | ||
451 | *str = '%'; | ||
452 | ++str; | ||
453 | if (*fmt) { | ||
454 | if (str <= end) | ||
455 | *str = *fmt; | ||
456 | ++str; | ||
457 | } else { | ||
458 | --fmt; | ||
459 | } | ||
460 | continue; | ||
461 | } | ||
462 | if (qualifier == 'L') | ||
463 | num = va_arg(args, long long); | ||
464 | else if (qualifier == 'l') { | ||
465 | num = va_arg(args, unsigned long); | ||
466 | if (flags & SIGN) | ||
467 | num = (signed long) num; | ||
468 | } else if (qualifier == 'Z' || qualifier == 'z') { | ||
469 | num = va_arg(args, size_t); | ||
470 | } else if (qualifier == 'h') { | ||
471 | num = (unsigned short) va_arg(args, int); | ||
472 | if (flags & SIGN) | ||
473 | num = (signed short) num; | ||
474 | } else { | ||
475 | num = va_arg(args, unsigned int); | ||
476 | if (flags & SIGN) | ||
477 | num = (signed int) num; | ||
478 | } | ||
479 | str = number(str, end, num, base, | ||
480 | field_width, precision, flags); | ||
481 | } | ||
482 | if (str <= end) | ||
483 | *str = '\0'; | ||
484 | else if (size > 0) | ||
485 | /* don't write out a null byte if the buf size is zero */ | ||
486 | *end = '\0'; | ||
487 | /* the trailing null byte doesn't count towards the total | ||
488 | * ++str; | ||
489 | */ | ||
490 | return str-buf; | ||
491 | } | ||
492 | |||
493 | EXPORT_SYMBOL(vsnprintf); | ||
494 | |||
495 | /** | ||
496 | * vscnprintf - Format a string and place it in a buffer | ||
497 | * @buf: The buffer to place the result into | ||
498 | * @size: The size of the buffer, including the trailing null space | ||
499 | * @fmt: The format string to use | ||
500 | * @args: Arguments for the format string | ||
501 | * | ||
502 | * The return value is the number of characters which have been written into | ||
503 | * the @buf not including the trailing '\0'. If @size is <= 0 the function | ||
504 | * returns 0. | ||
505 | * | ||
506 | * Call this function if you are already dealing with a va_list. | ||
507 | * You probably want scnprintf instead. | ||
508 | */ | ||
509 | int vscnprintf(char *buf, size_t size, const char *fmt, va_list args) | ||
510 | { | ||
511 | int i; | ||
512 | |||
513 | i=vsnprintf(buf,size,fmt,args); | ||
514 | return (i >= size) ? (size - 1) : i; | ||
515 | } | ||
516 | |||
517 | EXPORT_SYMBOL(vscnprintf); | ||
518 | |||
519 | /** | ||
520 | * snprintf - Format a string and place it in a buffer | ||
521 | * @buf: The buffer to place the result into | ||
522 | * @size: The size of the buffer, including the trailing null space | ||
523 | * @fmt: The format string to use | ||
524 | * @...: Arguments for the format string | ||
525 | * | ||
526 | * The return value is the number of characters which would be | ||
527 | * generated for the given input, excluding the trailing null, | ||
528 | * as per ISO C99. If the return is greater than or equal to | ||
529 | * @size, the resulting string is truncated. | ||
530 | */ | ||
531 | int snprintf(char * buf, size_t size, const char *fmt, ...) | ||
532 | { | ||
533 | va_list args; | ||
534 | int i; | ||
535 | |||
536 | va_start(args, fmt); | ||
537 | i=vsnprintf(buf,size,fmt,args); | ||
538 | va_end(args); | ||
539 | return i; | ||
540 | } | ||
541 | |||
542 | EXPORT_SYMBOL(snprintf); | ||
543 | |||
544 | /** | ||
545 | * scnprintf - Format a string and place it in a buffer | ||
546 | * @buf: The buffer to place the result into | ||
547 | * @size: The size of the buffer, including the trailing null space | ||
548 | * @fmt: The format string to use | ||
549 | * @...: Arguments for the format string | ||
550 | * | ||
551 | * The return value is the number of characters written into @buf not including | ||
552 | * the trailing '\0'. If @size is <= 0 the function returns 0. If the return is | ||
553 | * greater than or equal to @size, the resulting string is truncated. | ||
554 | */ | ||
555 | |||
556 | int scnprintf(char * buf, size_t size, const char *fmt, ...) | ||
557 | { | ||
558 | va_list args; | ||
559 | int i; | ||
560 | |||
561 | va_start(args, fmt); | ||
562 | i = vsnprintf(buf, size, fmt, args); | ||
563 | va_end(args); | ||
564 | return (i >= size) ? (size - 1) : i; | ||
565 | } | ||
566 | EXPORT_SYMBOL(scnprintf); | ||
567 | |||
568 | /** | ||
569 | * vsprintf - Format a string and place it in a buffer | ||
570 | * @buf: The buffer to place the result into | ||
571 | * @fmt: The format string to use | ||
572 | * @args: Arguments for the format string | ||
573 | * | ||
574 | * The function returns the number of characters written | ||
575 | * into @buf. Use vsnprintf or vscnprintf in order to avoid | ||
576 | * buffer overflows. | ||
577 | * | ||
578 | * Call this function if you are already dealing with a va_list. | ||
579 | * You probably want sprintf instead. | ||
580 | */ | ||
581 | int vsprintf(char *buf, const char *fmt, va_list args) | ||
582 | { | ||
583 | return vsnprintf(buf, INT_MAX, fmt, args); | ||
584 | } | ||
585 | |||
586 | EXPORT_SYMBOL(vsprintf); | ||
587 | |||
588 | /** | ||
589 | * sprintf - Format a string and place it in a buffer | ||
590 | * @buf: The buffer to place the result into | ||
591 | * @fmt: The format string to use | ||
592 | * @...: Arguments for the format string | ||
593 | * | ||
594 | * The function returns the number of characters written | ||
595 | * into @buf. Use snprintf or scnprintf in order to avoid | ||
596 | * buffer overflows. | ||
597 | */ | ||
598 | int sprintf(char * buf, const char *fmt, ...) | ||
599 | { | ||
600 | va_list args; | ||
601 | int i; | ||
602 | |||
603 | va_start(args, fmt); | ||
604 | i=vsnprintf(buf, INT_MAX, fmt, args); | ||
605 | va_end(args); | ||
606 | return i; | ||
607 | } | ||
608 | |||
609 | EXPORT_SYMBOL(sprintf); | ||
610 | |||
611 | /** | ||
612 | * vsscanf - Unformat a buffer into a list of arguments | ||
613 | * @buf: input buffer | ||
614 | * @fmt: format of buffer | ||
615 | * @args: arguments | ||
616 | */ | ||
617 | int vsscanf(const char * buf, const char * fmt, va_list args) | ||
618 | { | ||
619 | const char *str = buf; | ||
620 | char *next; | ||
621 | char digit; | ||
622 | int num = 0; | ||
623 | int qualifier; | ||
624 | int base; | ||
625 | int field_width; | ||
626 | int is_sign = 0; | ||
627 | |||
628 | while(*fmt && *str) { | ||
629 | /* skip any white space in format */ | ||
630 | /* white space in format matchs any amount of | ||
631 | * white space, including none, in the input. | ||
632 | */ | ||
633 | if (isspace(*fmt)) { | ||
634 | while (isspace(*fmt)) | ||
635 | ++fmt; | ||
636 | while (isspace(*str)) | ||
637 | ++str; | ||
638 | } | ||
639 | |||
640 | /* anything that is not a conversion must match exactly */ | ||
641 | if (*fmt != '%' && *fmt) { | ||
642 | if (*fmt++ != *str++) | ||
643 | break; | ||
644 | continue; | ||
645 | } | ||
646 | |||
647 | if (!*fmt) | ||
648 | break; | ||
649 | ++fmt; | ||
650 | |||
651 | /* skip this conversion. | ||
652 | * advance both strings to next white space | ||
653 | */ | ||
654 | if (*fmt == '*') { | ||
655 | while (!isspace(*fmt) && *fmt) | ||
656 | fmt++; | ||
657 | while (!isspace(*str) && *str) | ||
658 | str++; | ||
659 | continue; | ||
660 | } | ||
661 | |||
662 | /* get field width */ | ||
663 | field_width = -1; | ||
664 | if (isdigit(*fmt)) | ||
665 | field_width = skip_atoi(&fmt); | ||
666 | |||
667 | /* get conversion qualifier */ | ||
668 | qualifier = -1; | ||
669 | if (*fmt == 'h' || *fmt == 'l' || *fmt == 'L' || | ||
670 | *fmt == 'Z' || *fmt == 'z') { | ||
671 | qualifier = *fmt++; | ||
672 | if (unlikely(qualifier == *fmt)) { | ||
673 | if (qualifier == 'h') { | ||
674 | qualifier = 'H'; | ||
675 | fmt++; | ||
676 | } else if (qualifier == 'l') { | ||
677 | qualifier = 'L'; | ||
678 | fmt++; | ||
679 | } | ||
680 | } | ||
681 | } | ||
682 | base = 10; | ||
683 | is_sign = 0; | ||
684 | |||
685 | if (!*fmt || !*str) | ||
686 | break; | ||
687 | |||
688 | switch(*fmt++) { | ||
689 | case 'c': | ||
690 | { | ||
691 | char *s = (char *) va_arg(args,char*); | ||
692 | if (field_width == -1) | ||
693 | field_width = 1; | ||
694 | do { | ||
695 | *s++ = *str++; | ||
696 | } while (--field_width > 0 && *str); | ||
697 | num++; | ||
698 | } | ||
699 | continue; | ||
700 | case 's': | ||
701 | { | ||
702 | char *s = (char *) va_arg(args, char *); | ||
703 | if(field_width == -1) | ||
704 | field_width = INT_MAX; | ||
705 | /* first, skip leading white space in buffer */ | ||
706 | while (isspace(*str)) | ||
707 | str++; | ||
708 | |||
709 | /* now copy until next white space */ | ||
710 | while (*str && !isspace(*str) && field_width--) { | ||
711 | *s++ = *str++; | ||
712 | } | ||
713 | *s = '\0'; | ||
714 | num++; | ||
715 | } | ||
716 | continue; | ||
717 | case 'n': | ||
718 | /* return number of characters read so far */ | ||
719 | { | ||
720 | int *i = (int *)va_arg(args,int*); | ||
721 | *i = str - buf; | ||
722 | } | ||
723 | continue; | ||
724 | case 'o': | ||
725 | base = 8; | ||
726 | break; | ||
727 | case 'x': | ||
728 | case 'X': | ||
729 | base = 16; | ||
730 | break; | ||
731 | case 'i': | ||
732 | base = 0; | ||
733 | case 'd': | ||
734 | is_sign = 1; | ||
735 | case 'u': | ||
736 | break; | ||
737 | case '%': | ||
738 | /* looking for '%' in str */ | ||
739 | if (*str++ != '%') | ||
740 | return num; | ||
741 | continue; | ||
742 | default: | ||
743 | /* invalid format; stop here */ | ||
744 | return num; | ||
745 | } | ||
746 | |||
747 | /* have some sort of integer conversion. | ||
748 | * first, skip white space in buffer. | ||
749 | */ | ||
750 | while (isspace(*str)) | ||
751 | str++; | ||
752 | |||
753 | digit = *str; | ||
754 | if (is_sign && digit == '-') | ||
755 | digit = *(str + 1); | ||
756 | |||
757 | if (!digit | ||
758 | || (base == 16 && !isxdigit(digit)) | ||
759 | || (base == 10 && !isdigit(digit)) | ||
760 | || (base == 8 && (!isdigit(digit) || digit > '7')) | ||
761 | || (base == 0 && !isdigit(digit))) | ||
762 | break; | ||
763 | |||
764 | switch(qualifier) { | ||
765 | case 'H': /* that's 'hh' in format */ | ||
766 | if (is_sign) { | ||
767 | signed char *s = (signed char *) va_arg(args,signed char *); | ||
768 | *s = (signed char) simple_strtol(str,&next,base); | ||
769 | } else { | ||
770 | unsigned char *s = (unsigned char *) va_arg(args, unsigned char *); | ||
771 | *s = (unsigned char) simple_strtoul(str, &next, base); | ||
772 | } | ||
773 | break; | ||
774 | case 'h': | ||
775 | if (is_sign) { | ||
776 | short *s = (short *) va_arg(args,short *); | ||
777 | *s = (short) simple_strtol(str,&next,base); | ||
778 | } else { | ||
779 | unsigned short *s = (unsigned short *) va_arg(args, unsigned short *); | ||
780 | *s = (unsigned short) simple_strtoul(str, &next, base); | ||
781 | } | ||
782 | break; | ||
783 | case 'l': | ||
784 | if (is_sign) { | ||
785 | long *l = (long *) va_arg(args,long *); | ||
786 | *l = simple_strtol(str,&next,base); | ||
787 | } else { | ||
788 | unsigned long *l = (unsigned long*) va_arg(args,unsigned long*); | ||
789 | *l = simple_strtoul(str,&next,base); | ||
790 | } | ||
791 | break; | ||
792 | case 'L': | ||
793 | if (is_sign) { | ||
794 | long long *l = (long long*) va_arg(args,long long *); | ||
795 | *l = simple_strtoll(str,&next,base); | ||
796 | } else { | ||
797 | unsigned long long *l = (unsigned long long*) va_arg(args,unsigned long long*); | ||
798 | *l = simple_strtoull(str,&next,base); | ||
799 | } | ||
800 | break; | ||
801 | case 'Z': | ||
802 | case 'z': | ||
803 | { | ||
804 | size_t *s = (size_t*) va_arg(args,size_t*); | ||
805 | *s = (size_t) simple_strtoul(str,&next,base); | ||
806 | } | ||
807 | break; | ||
808 | default: | ||
809 | if (is_sign) { | ||
810 | int *i = (int *) va_arg(args, int*); | ||
811 | *i = (int) simple_strtol(str,&next,base); | ||
812 | } else { | ||
813 | unsigned int *i = (unsigned int*) va_arg(args, unsigned int*); | ||
814 | *i = (unsigned int) simple_strtoul(str,&next,base); | ||
815 | } | ||
816 | break; | ||
817 | } | ||
818 | num++; | ||
819 | |||
820 | if (!next) | ||
821 | break; | ||
822 | str = next; | ||
823 | } | ||
824 | return num; | ||
825 | } | ||
826 | |||
827 | EXPORT_SYMBOL(vsscanf); | ||
828 | |||
829 | /** | ||
830 | * sscanf - Unformat a buffer into a list of arguments | ||
831 | * @buf: input buffer | ||
832 | * @fmt: formatting of buffer | ||
833 | * @...: resulting arguments | ||
834 | */ | ||
835 | int sscanf(const char * buf, const char * fmt, ...) | ||
836 | { | ||
837 | va_list args; | ||
838 | int i; | ||
839 | |||
840 | va_start(args,fmt); | ||
841 | i = vsscanf(buf,fmt,args); | ||
842 | va_end(args); | ||
843 | return i; | ||
844 | } | ||
845 | |||
846 | EXPORT_SYMBOL(sscanf); | ||
diff --git a/lib/zlib_deflate/Makefile b/lib/zlib_deflate/Makefile new file mode 100644 index 000000000000..86275e3fdcbc --- /dev/null +++ b/lib/zlib_deflate/Makefile | |||
@@ -0,0 +1,11 @@ | |||
1 | # | ||
2 | # This is a modified version of zlib, which does all memory | ||
3 | # allocation ahead of time. | ||
4 | # | ||
5 | # This is the compression code, see zlib_inflate for the | ||
6 | # decompression code. | ||
7 | # | ||
8 | |||
9 | obj-$(CONFIG_ZLIB_DEFLATE) += zlib_deflate.o | ||
10 | |||
11 | zlib_deflate-objs := deflate.o deftree.o deflate_syms.o | ||
diff --git a/lib/zlib_deflate/deflate.c b/lib/zlib_deflate/deflate.c new file mode 100644 index 000000000000..ad9a1bf4fc63 --- /dev/null +++ b/lib/zlib_deflate/deflate.c | |||
@@ -0,0 +1,1268 @@ | |||
1 | /* +++ deflate.c */ | ||
2 | /* deflate.c -- compress data using the deflation algorithm | ||
3 | * Copyright (C) 1995-1996 Jean-loup Gailly. | ||
4 | * For conditions of distribution and use, see copyright notice in zlib.h | ||
5 | */ | ||
6 | |||
7 | /* | ||
8 | * ALGORITHM | ||
9 | * | ||
10 | * The "deflation" process depends on being able to identify portions | ||
11 | * of the input text which are identical to earlier input (within a | ||
12 | * sliding window trailing behind the input currently being processed). | ||
13 | * | ||
14 | * The most straightforward technique turns out to be the fastest for | ||
15 | * most input files: try all possible matches and select the longest. | ||
16 | * The key feature of this algorithm is that insertions into the string | ||
17 | * dictionary are very simple and thus fast, and deletions are avoided | ||
18 | * completely. Insertions are performed at each input character, whereas | ||
19 | * string matches are performed only when the previous match ends. So it | ||
20 | * is preferable to spend more time in matches to allow very fast string | ||
21 | * insertions and avoid deletions. The matching algorithm for small | ||
22 | * strings is inspired from that of Rabin & Karp. A brute force approach | ||
23 | * is used to find longer strings when a small match has been found. | ||
24 | * A similar algorithm is used in comic (by Jan-Mark Wams) and freeze | ||
25 | * (by Leonid Broukhis). | ||
26 | * A previous version of this file used a more sophisticated algorithm | ||
27 | * (by Fiala and Greene) which is guaranteed to run in linear amortized | ||
28 | * time, but has a larger average cost, uses more memory and is patented. | ||
29 | * However the F&G algorithm may be faster for some highly redundant | ||
30 | * files if the parameter max_chain_length (described below) is too large. | ||
31 | * | ||
32 | * ACKNOWLEDGEMENTS | ||
33 | * | ||
34 | * The idea of lazy evaluation of matches is due to Jan-Mark Wams, and | ||
35 | * I found it in 'freeze' written by Leonid Broukhis. | ||
36 | * Thanks to many people for bug reports and testing. | ||
37 | * | ||
38 | * REFERENCES | ||
39 | * | ||
40 | * Deutsch, L.P.,"DEFLATE Compressed Data Format Specification". | ||
41 | * Available in ftp://ds.internic.net/rfc/rfc1951.txt | ||
42 | * | ||
43 | * A description of the Rabin and Karp algorithm is given in the book | ||
44 | * "Algorithms" by R. Sedgewick, Addison-Wesley, p252. | ||
45 | * | ||
46 | * Fiala,E.R., and Greene,D.H. | ||
47 | * Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595 | ||
48 | * | ||
49 | */ | ||
50 | |||
51 | #include <linux/module.h> | ||
52 | #include <linux/zutil.h> | ||
53 | #include "defutil.h" | ||
54 | |||
55 | |||
56 | /* =========================================================================== | ||
57 | * Function prototypes. | ||
58 | */ | ||
59 | typedef enum { | ||
60 | need_more, /* block not completed, need more input or more output */ | ||
61 | block_done, /* block flush performed */ | ||
62 | finish_started, /* finish started, need only more output at next deflate */ | ||
63 | finish_done /* finish done, accept no more input or output */ | ||
64 | } block_state; | ||
65 | |||
66 | typedef block_state (*compress_func) (deflate_state *s, int flush); | ||
67 | /* Compression function. Returns the block state after the call. */ | ||
68 | |||
69 | static void fill_window (deflate_state *s); | ||
70 | static block_state deflate_stored (deflate_state *s, int flush); | ||
71 | static block_state deflate_fast (deflate_state *s, int flush); | ||
72 | static block_state deflate_slow (deflate_state *s, int flush); | ||
73 | static void lm_init (deflate_state *s); | ||
74 | static void putShortMSB (deflate_state *s, uInt b); | ||
75 | static void flush_pending (z_streamp strm); | ||
76 | static int read_buf (z_streamp strm, Byte *buf, unsigned size); | ||
77 | static uInt longest_match (deflate_state *s, IPos cur_match); | ||
78 | |||
79 | #ifdef DEBUG_ZLIB | ||
80 | static void check_match (deflate_state *s, IPos start, IPos match, | ||
81 | int length); | ||
82 | #endif | ||
83 | |||
84 | /* =========================================================================== | ||
85 | * Local data | ||
86 | */ | ||
87 | |||
88 | #define NIL 0 | ||
89 | /* Tail of hash chains */ | ||
90 | |||
91 | #ifndef TOO_FAR | ||
92 | # define TOO_FAR 4096 | ||
93 | #endif | ||
94 | /* Matches of length 3 are discarded if their distance exceeds TOO_FAR */ | ||
95 | |||
96 | #define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) | ||
97 | /* Minimum amount of lookahead, except at the end of the input file. | ||
98 | * See deflate.c for comments about the MIN_MATCH+1. | ||
99 | */ | ||
100 | |||
101 | /* Values for max_lazy_match, good_match and max_chain_length, depending on | ||
102 | * the desired pack level (0..9). The values given below have been tuned to | ||
103 | * exclude worst case performance for pathological files. Better values may be | ||
104 | * found for specific files. | ||
105 | */ | ||
106 | typedef struct config_s { | ||
107 | ush good_length; /* reduce lazy search above this match length */ | ||
108 | ush max_lazy; /* do not perform lazy search above this match length */ | ||
109 | ush nice_length; /* quit search above this match length */ | ||
110 | ush max_chain; | ||
111 | compress_func func; | ||
112 | } config; | ||
113 | |||
114 | static const config configuration_table[10] = { | ||
115 | /* good lazy nice chain */ | ||
116 | /* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ | ||
117 | /* 1 */ {4, 4, 8, 4, deflate_fast}, /* maximum speed, no lazy matches */ | ||
118 | /* 2 */ {4, 5, 16, 8, deflate_fast}, | ||
119 | /* 3 */ {4, 6, 32, 32, deflate_fast}, | ||
120 | |||
121 | /* 4 */ {4, 4, 16, 16, deflate_slow}, /* lazy matches */ | ||
122 | /* 5 */ {8, 16, 32, 32, deflate_slow}, | ||
123 | /* 6 */ {8, 16, 128, 128, deflate_slow}, | ||
124 | /* 7 */ {8, 32, 128, 256, deflate_slow}, | ||
125 | /* 8 */ {32, 128, 258, 1024, deflate_slow}, | ||
126 | /* 9 */ {32, 258, 258, 4096, deflate_slow}}; /* maximum compression */ | ||
127 | |||
128 | /* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4 | ||
129 | * For deflate_fast() (levels <= 3) good is ignored and lazy has a different | ||
130 | * meaning. | ||
131 | */ | ||
132 | |||
133 | #define EQUAL 0 | ||
134 | /* result of memcmp for equal strings */ | ||
135 | |||
136 | /* =========================================================================== | ||
137 | * Update a hash value with the given input byte | ||
138 | * IN assertion: all calls to to UPDATE_HASH are made with consecutive | ||
139 | * input characters, so that a running hash key can be computed from the | ||
140 | * previous key instead of complete recalculation each time. | ||
141 | */ | ||
142 | #define UPDATE_HASH(s,h,c) (h = (((h)<<s->hash_shift) ^ (c)) & s->hash_mask) | ||
143 | |||
144 | |||
145 | /* =========================================================================== | ||
146 | * Insert string str in the dictionary and set match_head to the previous head | ||
147 | * of the hash chain (the most recent string with same hash key). Return | ||
148 | * the previous length of the hash chain. | ||
149 | * IN assertion: all calls to to INSERT_STRING are made with consecutive | ||
150 | * input characters and the first MIN_MATCH bytes of str are valid | ||
151 | * (except for the last MIN_MATCH-1 bytes of the input file). | ||
152 | */ | ||
153 | #define INSERT_STRING(s, str, match_head) \ | ||
154 | (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ | ||
155 | s->prev[(str) & s->w_mask] = match_head = s->head[s->ins_h], \ | ||
156 | s->head[s->ins_h] = (Pos)(str)) | ||
157 | |||
158 | /* =========================================================================== | ||
159 | * Initialize the hash table (avoiding 64K overflow for 16 bit systems). | ||
160 | * prev[] will be initialized on the fly. | ||
161 | */ | ||
162 | #define CLEAR_HASH(s) \ | ||
163 | s->head[s->hash_size-1] = NIL; \ | ||
164 | memset((char *)s->head, 0, (unsigned)(s->hash_size-1)*sizeof(*s->head)); | ||
165 | |||
166 | /* ========================================================================= */ | ||
167 | int zlib_deflateInit_( | ||
168 | z_streamp strm, | ||
169 | int level, | ||
170 | const char *version, | ||
171 | int stream_size | ||
172 | ) | ||
173 | { | ||
174 | return zlib_deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, | ||
175 | DEF_MEM_LEVEL, | ||
176 | Z_DEFAULT_STRATEGY, version, stream_size); | ||
177 | /* To do: ignore strm->next_in if we use it as window */ | ||
178 | } | ||
179 | |||
180 | /* ========================================================================= */ | ||
181 | int zlib_deflateInit2_( | ||
182 | z_streamp strm, | ||
183 | int level, | ||
184 | int method, | ||
185 | int windowBits, | ||
186 | int memLevel, | ||
187 | int strategy, | ||
188 | const char *version, | ||
189 | int stream_size | ||
190 | ) | ||
191 | { | ||
192 | deflate_state *s; | ||
193 | int noheader = 0; | ||
194 | static char* my_version = ZLIB_VERSION; | ||
195 | deflate_workspace *mem; | ||
196 | |||
197 | ush *overlay; | ||
198 | /* We overlay pending_buf and d_buf+l_buf. This works since the average | ||
199 | * output size for (length,distance) codes is <= 24 bits. | ||
200 | */ | ||
201 | |||
202 | if (version == NULL || version[0] != my_version[0] || | ||
203 | stream_size != sizeof(z_stream)) { | ||
204 | return Z_VERSION_ERROR; | ||
205 | } | ||
206 | if (strm == NULL) return Z_STREAM_ERROR; | ||
207 | |||
208 | strm->msg = NULL; | ||
209 | |||
210 | if (level == Z_DEFAULT_COMPRESSION) level = 6; | ||
211 | |||
212 | mem = (deflate_workspace *) strm->workspace; | ||
213 | |||
214 | if (windowBits < 0) { /* undocumented feature: suppress zlib header */ | ||
215 | noheader = 1; | ||
216 | windowBits = -windowBits; | ||
217 | } | ||
218 | if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED || | ||
219 | windowBits < 9 || windowBits > 15 || level < 0 || level > 9 || | ||
220 | strategy < 0 || strategy > Z_HUFFMAN_ONLY) { | ||
221 | return Z_STREAM_ERROR; | ||
222 | } | ||
223 | s = (deflate_state *) &(mem->deflate_memory); | ||
224 | strm->state = (struct internal_state *)s; | ||
225 | s->strm = strm; | ||
226 | |||
227 | s->noheader = noheader; | ||
228 | s->w_bits = windowBits; | ||
229 | s->w_size = 1 << s->w_bits; | ||
230 | s->w_mask = s->w_size - 1; | ||
231 | |||
232 | s->hash_bits = memLevel + 7; | ||
233 | s->hash_size = 1 << s->hash_bits; | ||
234 | s->hash_mask = s->hash_size - 1; | ||
235 | s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH); | ||
236 | |||
237 | s->window = (Byte *) mem->window_memory; | ||
238 | s->prev = (Pos *) mem->prev_memory; | ||
239 | s->head = (Pos *) mem->head_memory; | ||
240 | |||
241 | s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ | ||
242 | |||
243 | overlay = (ush *) mem->overlay_memory; | ||
244 | s->pending_buf = (uch *) overlay; | ||
245 | s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L); | ||
246 | |||
247 | s->d_buf = overlay + s->lit_bufsize/sizeof(ush); | ||
248 | s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize; | ||
249 | |||
250 | s->level = level; | ||
251 | s->strategy = strategy; | ||
252 | s->method = (Byte)method; | ||
253 | |||
254 | return zlib_deflateReset(strm); | ||
255 | } | ||
256 | |||
257 | /* ========================================================================= */ | ||
258 | int zlib_deflateSetDictionary( | ||
259 | z_streamp strm, | ||
260 | const Byte *dictionary, | ||
261 | uInt dictLength | ||
262 | ) | ||
263 | { | ||
264 | deflate_state *s; | ||
265 | uInt length = dictLength; | ||
266 | uInt n; | ||
267 | IPos hash_head = 0; | ||
268 | |||
269 | if (strm == NULL || strm->state == NULL || dictionary == NULL) | ||
270 | return Z_STREAM_ERROR; | ||
271 | |||
272 | s = (deflate_state *) strm->state; | ||
273 | if (s->status != INIT_STATE) return Z_STREAM_ERROR; | ||
274 | |||
275 | strm->adler = zlib_adler32(strm->adler, dictionary, dictLength); | ||
276 | |||
277 | if (length < MIN_MATCH) return Z_OK; | ||
278 | if (length > MAX_DIST(s)) { | ||
279 | length = MAX_DIST(s); | ||
280 | #ifndef USE_DICT_HEAD | ||
281 | dictionary += dictLength - length; /* use the tail of the dictionary */ | ||
282 | #endif | ||
283 | } | ||
284 | memcpy((char *)s->window, dictionary, length); | ||
285 | s->strstart = length; | ||
286 | s->block_start = (long)length; | ||
287 | |||
288 | /* Insert all strings in the hash table (except for the last two bytes). | ||
289 | * s->lookahead stays null, so s->ins_h will be recomputed at the next | ||
290 | * call of fill_window. | ||
291 | */ | ||
292 | s->ins_h = s->window[0]; | ||
293 | UPDATE_HASH(s, s->ins_h, s->window[1]); | ||
294 | for (n = 0; n <= length - MIN_MATCH; n++) { | ||
295 | INSERT_STRING(s, n, hash_head); | ||
296 | } | ||
297 | if (hash_head) hash_head = 0; /* to make compiler happy */ | ||
298 | return Z_OK; | ||
299 | } | ||
300 | |||
301 | /* ========================================================================= */ | ||
302 | int zlib_deflateReset( | ||
303 | z_streamp strm | ||
304 | ) | ||
305 | { | ||
306 | deflate_state *s; | ||
307 | |||
308 | if (strm == NULL || strm->state == NULL) | ||
309 | return Z_STREAM_ERROR; | ||
310 | |||
311 | strm->total_in = strm->total_out = 0; | ||
312 | strm->msg = NULL; | ||
313 | strm->data_type = Z_UNKNOWN; | ||
314 | |||
315 | s = (deflate_state *)strm->state; | ||
316 | s->pending = 0; | ||
317 | s->pending_out = s->pending_buf; | ||
318 | |||
319 | if (s->noheader < 0) { | ||
320 | s->noheader = 0; /* was set to -1 by deflate(..., Z_FINISH); */ | ||
321 | } | ||
322 | s->status = s->noheader ? BUSY_STATE : INIT_STATE; | ||
323 | strm->adler = 1; | ||
324 | s->last_flush = Z_NO_FLUSH; | ||
325 | |||
326 | zlib_tr_init(s); | ||
327 | lm_init(s); | ||
328 | |||
329 | return Z_OK; | ||
330 | } | ||
331 | |||
332 | /* ========================================================================= */ | ||
333 | int zlib_deflateParams( | ||
334 | z_streamp strm, | ||
335 | int level, | ||
336 | int strategy | ||
337 | ) | ||
338 | { | ||
339 | deflate_state *s; | ||
340 | compress_func func; | ||
341 | int err = Z_OK; | ||
342 | |||
343 | if (strm == NULL || strm->state == NULL) return Z_STREAM_ERROR; | ||
344 | s = (deflate_state *) strm->state; | ||
345 | |||
346 | if (level == Z_DEFAULT_COMPRESSION) { | ||
347 | level = 6; | ||
348 | } | ||
349 | if (level < 0 || level > 9 || strategy < 0 || strategy > Z_HUFFMAN_ONLY) { | ||
350 | return Z_STREAM_ERROR; | ||
351 | } | ||
352 | func = configuration_table[s->level].func; | ||
353 | |||
354 | if (func != configuration_table[level].func && strm->total_in != 0) { | ||
355 | /* Flush the last buffer: */ | ||
356 | err = zlib_deflate(strm, Z_PARTIAL_FLUSH); | ||
357 | } | ||
358 | if (s->level != level) { | ||
359 | s->level = level; | ||
360 | s->max_lazy_match = configuration_table[level].max_lazy; | ||
361 | s->good_match = configuration_table[level].good_length; | ||
362 | s->nice_match = configuration_table[level].nice_length; | ||
363 | s->max_chain_length = configuration_table[level].max_chain; | ||
364 | } | ||
365 | s->strategy = strategy; | ||
366 | return err; | ||
367 | } | ||
368 | |||
369 | /* ========================================================================= | ||
370 | * Put a short in the pending buffer. The 16-bit value is put in MSB order. | ||
371 | * IN assertion: the stream state is correct and there is enough room in | ||
372 | * pending_buf. | ||
373 | */ | ||
374 | static void putShortMSB( | ||
375 | deflate_state *s, | ||
376 | uInt b | ||
377 | ) | ||
378 | { | ||
379 | put_byte(s, (Byte)(b >> 8)); | ||
380 | put_byte(s, (Byte)(b & 0xff)); | ||
381 | } | ||
382 | |||
383 | /* ========================================================================= | ||
384 | * Flush as much pending output as possible. All deflate() output goes | ||
385 | * through this function so some applications may wish to modify it | ||
386 | * to avoid allocating a large strm->next_out buffer and copying into it. | ||
387 | * (See also read_buf()). | ||
388 | */ | ||
389 | static void flush_pending( | ||
390 | z_streamp strm | ||
391 | ) | ||
392 | { | ||
393 | deflate_state *s = (deflate_state *) strm->state; | ||
394 | unsigned len = s->pending; | ||
395 | |||
396 | if (len > strm->avail_out) len = strm->avail_out; | ||
397 | if (len == 0) return; | ||
398 | |||
399 | if (strm->next_out != NULL) { | ||
400 | memcpy(strm->next_out, s->pending_out, len); | ||
401 | strm->next_out += len; | ||
402 | } | ||
403 | s->pending_out += len; | ||
404 | strm->total_out += len; | ||
405 | strm->avail_out -= len; | ||
406 | s->pending -= len; | ||
407 | if (s->pending == 0) { | ||
408 | s->pending_out = s->pending_buf; | ||
409 | } | ||
410 | } | ||
411 | |||
412 | /* ========================================================================= */ | ||
413 | int zlib_deflate( | ||
414 | z_streamp strm, | ||
415 | int flush | ||
416 | ) | ||
417 | { | ||
418 | int old_flush; /* value of flush param for previous deflate call */ | ||
419 | deflate_state *s; | ||
420 | |||
421 | if (strm == NULL || strm->state == NULL || | ||
422 | flush > Z_FINISH || flush < 0) { | ||
423 | return Z_STREAM_ERROR; | ||
424 | } | ||
425 | s = (deflate_state *) strm->state; | ||
426 | |||
427 | if ((strm->next_in == NULL && strm->avail_in != 0) || | ||
428 | (s->status == FINISH_STATE && flush != Z_FINISH)) { | ||
429 | return Z_STREAM_ERROR; | ||
430 | } | ||
431 | if (strm->avail_out == 0) return Z_BUF_ERROR; | ||
432 | |||
433 | s->strm = strm; /* just in case */ | ||
434 | old_flush = s->last_flush; | ||
435 | s->last_flush = flush; | ||
436 | |||
437 | /* Write the zlib header */ | ||
438 | if (s->status == INIT_STATE) { | ||
439 | |||
440 | uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8; | ||
441 | uInt level_flags = (s->level-1) >> 1; | ||
442 | |||
443 | if (level_flags > 3) level_flags = 3; | ||
444 | header |= (level_flags << 6); | ||
445 | if (s->strstart != 0) header |= PRESET_DICT; | ||
446 | header += 31 - (header % 31); | ||
447 | |||
448 | s->status = BUSY_STATE; | ||
449 | putShortMSB(s, header); | ||
450 | |||
451 | /* Save the adler32 of the preset dictionary: */ | ||
452 | if (s->strstart != 0) { | ||
453 | putShortMSB(s, (uInt)(strm->adler >> 16)); | ||
454 | putShortMSB(s, (uInt)(strm->adler & 0xffff)); | ||
455 | } | ||
456 | strm->adler = 1L; | ||
457 | } | ||
458 | |||
459 | /* Flush as much pending output as possible */ | ||
460 | if (s->pending != 0) { | ||
461 | flush_pending(strm); | ||
462 | if (strm->avail_out == 0) { | ||
463 | /* Since avail_out is 0, deflate will be called again with | ||
464 | * more output space, but possibly with both pending and | ||
465 | * avail_in equal to zero. There won't be anything to do, | ||
466 | * but this is not an error situation so make sure we | ||
467 | * return OK instead of BUF_ERROR at next call of deflate: | ||
468 | */ | ||
469 | s->last_flush = -1; | ||
470 | return Z_OK; | ||
471 | } | ||
472 | |||
473 | /* Make sure there is something to do and avoid duplicate consecutive | ||
474 | * flushes. For repeated and useless calls with Z_FINISH, we keep | ||
475 | * returning Z_STREAM_END instead of Z_BUFF_ERROR. | ||
476 | */ | ||
477 | } else if (strm->avail_in == 0 && flush <= old_flush && | ||
478 | flush != Z_FINISH) { | ||
479 | return Z_BUF_ERROR; | ||
480 | } | ||
481 | |||
482 | /* User must not provide more input after the first FINISH: */ | ||
483 | if (s->status == FINISH_STATE && strm->avail_in != 0) { | ||
484 | return Z_BUF_ERROR; | ||
485 | } | ||
486 | |||
487 | /* Start a new block or continue the current one. | ||
488 | */ | ||
489 | if (strm->avail_in != 0 || s->lookahead != 0 || | ||
490 | (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) { | ||
491 | block_state bstate; | ||
492 | |||
493 | bstate = (*(configuration_table[s->level].func))(s, flush); | ||
494 | |||
495 | if (bstate == finish_started || bstate == finish_done) { | ||
496 | s->status = FINISH_STATE; | ||
497 | } | ||
498 | if (bstate == need_more || bstate == finish_started) { | ||
499 | if (strm->avail_out == 0) { | ||
500 | s->last_flush = -1; /* avoid BUF_ERROR next call, see above */ | ||
501 | } | ||
502 | return Z_OK; | ||
503 | /* If flush != Z_NO_FLUSH && avail_out == 0, the next call | ||
504 | * of deflate should use the same flush parameter to make sure | ||
505 | * that the flush is complete. So we don't have to output an | ||
506 | * empty block here, this will be done at next call. This also | ||
507 | * ensures that for a very small output buffer, we emit at most | ||
508 | * one empty block. | ||
509 | */ | ||
510 | } | ||
511 | if (bstate == block_done) { | ||
512 | if (flush == Z_PARTIAL_FLUSH) { | ||
513 | zlib_tr_align(s); | ||
514 | } else if (flush == Z_PACKET_FLUSH) { | ||
515 | /* Output just the 3-bit `stored' block type value, | ||
516 | but not a zero length. */ | ||
517 | zlib_tr_stored_type_only(s); | ||
518 | } else { /* FULL_FLUSH or SYNC_FLUSH */ | ||
519 | zlib_tr_stored_block(s, (char*)0, 0L, 0); | ||
520 | /* For a full flush, this empty block will be recognized | ||
521 | * as a special marker by inflate_sync(). | ||
522 | */ | ||
523 | if (flush == Z_FULL_FLUSH) { | ||
524 | CLEAR_HASH(s); /* forget history */ | ||
525 | } | ||
526 | } | ||
527 | flush_pending(strm); | ||
528 | if (strm->avail_out == 0) { | ||
529 | s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */ | ||
530 | return Z_OK; | ||
531 | } | ||
532 | } | ||
533 | } | ||
534 | Assert(strm->avail_out > 0, "bug2"); | ||
535 | |||
536 | if (flush != Z_FINISH) return Z_OK; | ||
537 | if (s->noheader) return Z_STREAM_END; | ||
538 | |||
539 | /* Write the zlib trailer (adler32) */ | ||
540 | putShortMSB(s, (uInt)(strm->adler >> 16)); | ||
541 | putShortMSB(s, (uInt)(strm->adler & 0xffff)); | ||
542 | flush_pending(strm); | ||
543 | /* If avail_out is zero, the application will call deflate again | ||
544 | * to flush the rest. | ||
545 | */ | ||
546 | s->noheader = -1; /* write the trailer only once! */ | ||
547 | return s->pending != 0 ? Z_OK : Z_STREAM_END; | ||
548 | } | ||
549 | |||
550 | /* ========================================================================= */ | ||
551 | int zlib_deflateEnd( | ||
552 | z_streamp strm | ||
553 | ) | ||
554 | { | ||
555 | int status; | ||
556 | deflate_state *s; | ||
557 | |||
558 | if (strm == NULL || strm->state == NULL) return Z_STREAM_ERROR; | ||
559 | s = (deflate_state *) strm->state; | ||
560 | |||
561 | status = s->status; | ||
562 | if (status != INIT_STATE && status != BUSY_STATE && | ||
563 | status != FINISH_STATE) { | ||
564 | return Z_STREAM_ERROR; | ||
565 | } | ||
566 | |||
567 | strm->state = NULL; | ||
568 | |||
569 | return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK; | ||
570 | } | ||
571 | |||
572 | /* ========================================================================= | ||
573 | * Copy the source state to the destination state. | ||
574 | */ | ||
575 | int zlib_deflateCopy ( | ||
576 | z_streamp dest, | ||
577 | z_streamp source | ||
578 | ) | ||
579 | { | ||
580 | #ifdef MAXSEG_64K | ||
581 | return Z_STREAM_ERROR; | ||
582 | #else | ||
583 | deflate_state *ds; | ||
584 | deflate_state *ss; | ||
585 | ush *overlay; | ||
586 | deflate_workspace *mem; | ||
587 | |||
588 | |||
589 | if (source == NULL || dest == NULL || source->state == NULL) { | ||
590 | return Z_STREAM_ERROR; | ||
591 | } | ||
592 | |||
593 | ss = (deflate_state *) source->state; | ||
594 | |||
595 | *dest = *source; | ||
596 | |||
597 | mem = (deflate_workspace *) dest->workspace; | ||
598 | |||
599 | ds = &(mem->deflate_memory); | ||
600 | |||
601 | dest->state = (struct internal_state *) ds; | ||
602 | *ds = *ss; | ||
603 | ds->strm = dest; | ||
604 | |||
605 | ds->window = (Byte *) mem->window_memory; | ||
606 | ds->prev = (Pos *) mem->prev_memory; | ||
607 | ds->head = (Pos *) mem->head_memory; | ||
608 | overlay = (ush *) mem->overlay_memory; | ||
609 | ds->pending_buf = (uch *) overlay; | ||
610 | |||
611 | memcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte)); | ||
612 | memcpy(ds->prev, ss->prev, ds->w_size * sizeof(Pos)); | ||
613 | memcpy(ds->head, ss->head, ds->hash_size * sizeof(Pos)); | ||
614 | memcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size); | ||
615 | |||
616 | ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf); | ||
617 | ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush); | ||
618 | ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize; | ||
619 | |||
620 | ds->l_desc.dyn_tree = ds->dyn_ltree; | ||
621 | ds->d_desc.dyn_tree = ds->dyn_dtree; | ||
622 | ds->bl_desc.dyn_tree = ds->bl_tree; | ||
623 | |||
624 | return Z_OK; | ||
625 | #endif | ||
626 | } | ||
627 | |||
628 | /* =========================================================================== | ||
629 | * Read a new buffer from the current input stream, update the adler32 | ||
630 | * and total number of bytes read. All deflate() input goes through | ||
631 | * this function so some applications may wish to modify it to avoid | ||
632 | * allocating a large strm->next_in buffer and copying from it. | ||
633 | * (See also flush_pending()). | ||
634 | */ | ||
635 | static int read_buf( | ||
636 | z_streamp strm, | ||
637 | Byte *buf, | ||
638 | unsigned size | ||
639 | ) | ||
640 | { | ||
641 | unsigned len = strm->avail_in; | ||
642 | |||
643 | if (len > size) len = size; | ||
644 | if (len == 0) return 0; | ||
645 | |||
646 | strm->avail_in -= len; | ||
647 | |||
648 | if (!((deflate_state *)(strm->state))->noheader) { | ||
649 | strm->adler = zlib_adler32(strm->adler, strm->next_in, len); | ||
650 | } | ||
651 | memcpy(buf, strm->next_in, len); | ||
652 | strm->next_in += len; | ||
653 | strm->total_in += len; | ||
654 | |||
655 | return (int)len; | ||
656 | } | ||
657 | |||
658 | /* =========================================================================== | ||
659 | * Initialize the "longest match" routines for a new zlib stream | ||
660 | */ | ||
661 | static void lm_init( | ||
662 | deflate_state *s | ||
663 | ) | ||
664 | { | ||
665 | s->window_size = (ulg)2L*s->w_size; | ||
666 | |||
667 | CLEAR_HASH(s); | ||
668 | |||
669 | /* Set the default configuration parameters: | ||
670 | */ | ||
671 | s->max_lazy_match = configuration_table[s->level].max_lazy; | ||
672 | s->good_match = configuration_table[s->level].good_length; | ||
673 | s->nice_match = configuration_table[s->level].nice_length; | ||
674 | s->max_chain_length = configuration_table[s->level].max_chain; | ||
675 | |||
676 | s->strstart = 0; | ||
677 | s->block_start = 0L; | ||
678 | s->lookahead = 0; | ||
679 | s->match_length = s->prev_length = MIN_MATCH-1; | ||
680 | s->match_available = 0; | ||
681 | s->ins_h = 0; | ||
682 | } | ||
683 | |||
684 | /* =========================================================================== | ||
685 | * Set match_start to the longest match starting at the given string and | ||
686 | * return its length. Matches shorter or equal to prev_length are discarded, | ||
687 | * in which case the result is equal to prev_length and match_start is | ||
688 | * garbage. | ||
689 | * IN assertions: cur_match is the head of the hash chain for the current | ||
690 | * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 | ||
691 | * OUT assertion: the match length is not greater than s->lookahead. | ||
692 | */ | ||
693 | /* For 80x86 and 680x0, an optimized version will be provided in match.asm or | ||
694 | * match.S. The code will be functionally equivalent. | ||
695 | */ | ||
696 | static uInt longest_match( | ||
697 | deflate_state *s, | ||
698 | IPos cur_match /* current match */ | ||
699 | ) | ||
700 | { | ||
701 | unsigned chain_length = s->max_chain_length;/* max hash chain length */ | ||
702 | register Byte *scan = s->window + s->strstart; /* current string */ | ||
703 | register Byte *match; /* matched string */ | ||
704 | register int len; /* length of current match */ | ||
705 | int best_len = s->prev_length; /* best match length so far */ | ||
706 | int nice_match = s->nice_match; /* stop if match long enough */ | ||
707 | IPos limit = s->strstart > (IPos)MAX_DIST(s) ? | ||
708 | s->strstart - (IPos)MAX_DIST(s) : NIL; | ||
709 | /* Stop when cur_match becomes <= limit. To simplify the code, | ||
710 | * we prevent matches with the string of window index 0. | ||
711 | */ | ||
712 | Pos *prev = s->prev; | ||
713 | uInt wmask = s->w_mask; | ||
714 | |||
715 | #ifdef UNALIGNED_OK | ||
716 | /* Compare two bytes at a time. Note: this is not always beneficial. | ||
717 | * Try with and without -DUNALIGNED_OK to check. | ||
718 | */ | ||
719 | register Byte *strend = s->window + s->strstart + MAX_MATCH - 1; | ||
720 | register ush scan_start = *(ush*)scan; | ||
721 | register ush scan_end = *(ush*)(scan+best_len-1); | ||
722 | #else | ||
723 | register Byte *strend = s->window + s->strstart + MAX_MATCH; | ||
724 | register Byte scan_end1 = scan[best_len-1]; | ||
725 | register Byte scan_end = scan[best_len]; | ||
726 | #endif | ||
727 | |||
728 | /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. | ||
729 | * It is easy to get rid of this optimization if necessary. | ||
730 | */ | ||
731 | Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); | ||
732 | |||
733 | /* Do not waste too much time if we already have a good match: */ | ||
734 | if (s->prev_length >= s->good_match) { | ||
735 | chain_length >>= 2; | ||
736 | } | ||
737 | /* Do not look for matches beyond the end of the input. This is necessary | ||
738 | * to make deflate deterministic. | ||
739 | */ | ||
740 | if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; | ||
741 | |||
742 | Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); | ||
743 | |||
744 | do { | ||
745 | Assert(cur_match < s->strstart, "no future"); | ||
746 | match = s->window + cur_match; | ||
747 | |||
748 | /* Skip to next match if the match length cannot increase | ||
749 | * or if the match length is less than 2: | ||
750 | */ | ||
751 | #if (defined(UNALIGNED_OK) && MAX_MATCH == 258) | ||
752 | /* This code assumes sizeof(unsigned short) == 2. Do not use | ||
753 | * UNALIGNED_OK if your compiler uses a different size. | ||
754 | */ | ||
755 | if (*(ush*)(match+best_len-1) != scan_end || | ||
756 | *(ush*)match != scan_start) continue; | ||
757 | |||
758 | /* It is not necessary to compare scan[2] and match[2] since they are | ||
759 | * always equal when the other bytes match, given that the hash keys | ||
760 | * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at | ||
761 | * strstart+3, +5, ... up to strstart+257. We check for insufficient | ||
762 | * lookahead only every 4th comparison; the 128th check will be made | ||
763 | * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is | ||
764 | * necessary to put more guard bytes at the end of the window, or | ||
765 | * to check more often for insufficient lookahead. | ||
766 | */ | ||
767 | Assert(scan[2] == match[2], "scan[2]?"); | ||
768 | scan++, match++; | ||
769 | do { | ||
770 | } while (*(ush*)(scan+=2) == *(ush*)(match+=2) && | ||
771 | *(ush*)(scan+=2) == *(ush*)(match+=2) && | ||
772 | *(ush*)(scan+=2) == *(ush*)(match+=2) && | ||
773 | *(ush*)(scan+=2) == *(ush*)(match+=2) && | ||
774 | scan < strend); | ||
775 | /* The funny "do {}" generates better code on most compilers */ | ||
776 | |||
777 | /* Here, scan <= window+strstart+257 */ | ||
778 | Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); | ||
779 | if (*scan == *match) scan++; | ||
780 | |||
781 | len = (MAX_MATCH - 1) - (int)(strend-scan); | ||
782 | scan = strend - (MAX_MATCH-1); | ||
783 | |||
784 | #else /* UNALIGNED_OK */ | ||
785 | |||
786 | if (match[best_len] != scan_end || | ||
787 | match[best_len-1] != scan_end1 || | ||
788 | *match != *scan || | ||
789 | *++match != scan[1]) continue; | ||
790 | |||
791 | /* The check at best_len-1 can be removed because it will be made | ||
792 | * again later. (This heuristic is not always a win.) | ||
793 | * It is not necessary to compare scan[2] and match[2] since they | ||
794 | * are always equal when the other bytes match, given that | ||
795 | * the hash keys are equal and that HASH_BITS >= 8. | ||
796 | */ | ||
797 | scan += 2, match++; | ||
798 | Assert(*scan == *match, "match[2]?"); | ||
799 | |||
800 | /* We check for insufficient lookahead only every 8th comparison; | ||
801 | * the 256th check will be made at strstart+258. | ||
802 | */ | ||
803 | do { | ||
804 | } while (*++scan == *++match && *++scan == *++match && | ||
805 | *++scan == *++match && *++scan == *++match && | ||
806 | *++scan == *++match && *++scan == *++match && | ||
807 | *++scan == *++match && *++scan == *++match && | ||
808 | scan < strend); | ||
809 | |||
810 | Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); | ||
811 | |||
812 | len = MAX_MATCH - (int)(strend - scan); | ||
813 | scan = strend - MAX_MATCH; | ||
814 | |||
815 | #endif /* UNALIGNED_OK */ | ||
816 | |||
817 | if (len > best_len) { | ||
818 | s->match_start = cur_match; | ||
819 | best_len = len; | ||
820 | if (len >= nice_match) break; | ||
821 | #ifdef UNALIGNED_OK | ||
822 | scan_end = *(ush*)(scan+best_len-1); | ||
823 | #else | ||
824 | scan_end1 = scan[best_len-1]; | ||
825 | scan_end = scan[best_len]; | ||
826 | #endif | ||
827 | } | ||
828 | } while ((cur_match = prev[cur_match & wmask]) > limit | ||
829 | && --chain_length != 0); | ||
830 | |||
831 | if ((uInt)best_len <= s->lookahead) return best_len; | ||
832 | return s->lookahead; | ||
833 | } | ||
834 | |||
835 | #ifdef DEBUG_ZLIB | ||
836 | /* =========================================================================== | ||
837 | * Check that the match at match_start is indeed a match. | ||
838 | */ | ||
839 | static void check_match( | ||
840 | deflate_state *s, | ||
841 | IPos start, | ||
842 | IPos match, | ||
843 | int length | ||
844 | ) | ||
845 | { | ||
846 | /* check that the match is indeed a match */ | ||
847 | if (memcmp((char *)s->window + match, | ||
848 | (char *)s->window + start, length) != EQUAL) { | ||
849 | fprintf(stderr, " start %u, match %u, length %d\n", | ||
850 | start, match, length); | ||
851 | do { | ||
852 | fprintf(stderr, "%c%c", s->window[match++], s->window[start++]); | ||
853 | } while (--length != 0); | ||
854 | z_error("invalid match"); | ||
855 | } | ||
856 | if (z_verbose > 1) { | ||
857 | fprintf(stderr,"\\[%d,%d]", start-match, length); | ||
858 | do { putc(s->window[start++], stderr); } while (--length != 0); | ||
859 | } | ||
860 | } | ||
861 | #else | ||
862 | # define check_match(s, start, match, length) | ||
863 | #endif | ||
864 | |||
865 | /* =========================================================================== | ||
866 | * Fill the window when the lookahead becomes insufficient. | ||
867 | * Updates strstart and lookahead. | ||
868 | * | ||
869 | * IN assertion: lookahead < MIN_LOOKAHEAD | ||
870 | * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD | ||
871 | * At least one byte has been read, or avail_in == 0; reads are | ||
872 | * performed for at least two bytes (required for the zip translate_eol | ||
873 | * option -- not supported here). | ||
874 | */ | ||
875 | static void fill_window( | ||
876 | deflate_state *s | ||
877 | ) | ||
878 | { | ||
879 | register unsigned n, m; | ||
880 | register Pos *p; | ||
881 | unsigned more; /* Amount of free space at the end of the window. */ | ||
882 | uInt wsize = s->w_size; | ||
883 | |||
884 | do { | ||
885 | more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart); | ||
886 | |||
887 | /* Deal with !@#$% 64K limit: */ | ||
888 | if (more == 0 && s->strstart == 0 && s->lookahead == 0) { | ||
889 | more = wsize; | ||
890 | |||
891 | } else if (more == (unsigned)(-1)) { | ||
892 | /* Very unlikely, but possible on 16 bit machine if strstart == 0 | ||
893 | * and lookahead == 1 (input done one byte at time) | ||
894 | */ | ||
895 | more--; | ||
896 | |||
897 | /* If the window is almost full and there is insufficient lookahead, | ||
898 | * move the upper half to the lower one to make room in the upper half. | ||
899 | */ | ||
900 | } else if (s->strstart >= wsize+MAX_DIST(s)) { | ||
901 | |||
902 | memcpy((char *)s->window, (char *)s->window+wsize, | ||
903 | (unsigned)wsize); | ||
904 | s->match_start -= wsize; | ||
905 | s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ | ||
906 | s->block_start -= (long) wsize; | ||
907 | |||
908 | /* Slide the hash table (could be avoided with 32 bit values | ||
909 | at the expense of memory usage). We slide even when level == 0 | ||
910 | to keep the hash table consistent if we switch back to level > 0 | ||
911 | later. (Using level 0 permanently is not an optimal usage of | ||
912 | zlib, so we don't care about this pathological case.) | ||
913 | */ | ||
914 | n = s->hash_size; | ||
915 | p = &s->head[n]; | ||
916 | do { | ||
917 | m = *--p; | ||
918 | *p = (Pos)(m >= wsize ? m-wsize : NIL); | ||
919 | } while (--n); | ||
920 | |||
921 | n = wsize; | ||
922 | p = &s->prev[n]; | ||
923 | do { | ||
924 | m = *--p; | ||
925 | *p = (Pos)(m >= wsize ? m-wsize : NIL); | ||
926 | /* If n is not on any hash chain, prev[n] is garbage but | ||
927 | * its value will never be used. | ||
928 | */ | ||
929 | } while (--n); | ||
930 | more += wsize; | ||
931 | } | ||
932 | if (s->strm->avail_in == 0) return; | ||
933 | |||
934 | /* If there was no sliding: | ||
935 | * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && | ||
936 | * more == window_size - lookahead - strstart | ||
937 | * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) | ||
938 | * => more >= window_size - 2*WSIZE + 2 | ||
939 | * In the BIG_MEM or MMAP case (not yet supported), | ||
940 | * window_size == input_size + MIN_LOOKAHEAD && | ||
941 | * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. | ||
942 | * Otherwise, window_size == 2*WSIZE so more >= 2. | ||
943 | * If there was sliding, more >= WSIZE. So in all cases, more >= 2. | ||
944 | */ | ||
945 | Assert(more >= 2, "more < 2"); | ||
946 | |||
947 | n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more); | ||
948 | s->lookahead += n; | ||
949 | |||
950 | /* Initialize the hash value now that we have some input: */ | ||
951 | if (s->lookahead >= MIN_MATCH) { | ||
952 | s->ins_h = s->window[s->strstart]; | ||
953 | UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); | ||
954 | #if MIN_MATCH != 3 | ||
955 | Call UPDATE_HASH() MIN_MATCH-3 more times | ||
956 | #endif | ||
957 | } | ||
958 | /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, | ||
959 | * but this is not important since only literal bytes will be emitted. | ||
960 | */ | ||
961 | |||
962 | } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0); | ||
963 | } | ||
964 | |||
965 | /* =========================================================================== | ||
966 | * Flush the current block, with given end-of-file flag. | ||
967 | * IN assertion: strstart is set to the end of the current match. | ||
968 | */ | ||
969 | #define FLUSH_BLOCK_ONLY(s, eof) { \ | ||
970 | zlib_tr_flush_block(s, (s->block_start >= 0L ? \ | ||
971 | (char *)&s->window[(unsigned)s->block_start] : \ | ||
972 | NULL), \ | ||
973 | (ulg)((long)s->strstart - s->block_start), \ | ||
974 | (eof)); \ | ||
975 | s->block_start = s->strstart; \ | ||
976 | flush_pending(s->strm); \ | ||
977 | Tracev((stderr,"[FLUSH]")); \ | ||
978 | } | ||
979 | |||
980 | /* Same but force premature exit if necessary. */ | ||
981 | #define FLUSH_BLOCK(s, eof) { \ | ||
982 | FLUSH_BLOCK_ONLY(s, eof); \ | ||
983 | if (s->strm->avail_out == 0) return (eof) ? finish_started : need_more; \ | ||
984 | } | ||
985 | |||
986 | /* =========================================================================== | ||
987 | * Copy without compression as much as possible from the input stream, return | ||
988 | * the current block state. | ||
989 | * This function does not insert new strings in the dictionary since | ||
990 | * uncompressible data is probably not useful. This function is used | ||
991 | * only for the level=0 compression option. | ||
992 | * NOTE: this function should be optimized to avoid extra copying from | ||
993 | * window to pending_buf. | ||
994 | */ | ||
995 | static block_state deflate_stored( | ||
996 | deflate_state *s, | ||
997 | int flush | ||
998 | ) | ||
999 | { | ||
1000 | /* Stored blocks are limited to 0xffff bytes, pending_buf is limited | ||
1001 | * to pending_buf_size, and each stored block has a 5 byte header: | ||
1002 | */ | ||
1003 | ulg max_block_size = 0xffff; | ||
1004 | ulg max_start; | ||
1005 | |||
1006 | if (max_block_size > s->pending_buf_size - 5) { | ||
1007 | max_block_size = s->pending_buf_size - 5; | ||
1008 | } | ||
1009 | |||
1010 | /* Copy as much as possible from input to output: */ | ||
1011 | for (;;) { | ||
1012 | /* Fill the window as much as possible: */ | ||
1013 | if (s->lookahead <= 1) { | ||
1014 | |||
1015 | Assert(s->strstart < s->w_size+MAX_DIST(s) || | ||
1016 | s->block_start >= (long)s->w_size, "slide too late"); | ||
1017 | |||
1018 | fill_window(s); | ||
1019 | if (s->lookahead == 0 && flush == Z_NO_FLUSH) return need_more; | ||
1020 | |||
1021 | if (s->lookahead == 0) break; /* flush the current block */ | ||
1022 | } | ||
1023 | Assert(s->block_start >= 0L, "block gone"); | ||
1024 | |||
1025 | s->strstart += s->lookahead; | ||
1026 | s->lookahead = 0; | ||
1027 | |||
1028 | /* Emit a stored block if pending_buf will be full: */ | ||
1029 | max_start = s->block_start + max_block_size; | ||
1030 | if (s->strstart == 0 || (ulg)s->strstart >= max_start) { | ||
1031 | /* strstart == 0 is possible when wraparound on 16-bit machine */ | ||
1032 | s->lookahead = (uInt)(s->strstart - max_start); | ||
1033 | s->strstart = (uInt)max_start; | ||
1034 | FLUSH_BLOCK(s, 0); | ||
1035 | } | ||
1036 | /* Flush if we may have to slide, otherwise block_start may become | ||
1037 | * negative and the data will be gone: | ||
1038 | */ | ||
1039 | if (s->strstart - (uInt)s->block_start >= MAX_DIST(s)) { | ||
1040 | FLUSH_BLOCK(s, 0); | ||
1041 | } | ||
1042 | } | ||
1043 | FLUSH_BLOCK(s, flush == Z_FINISH); | ||
1044 | return flush == Z_FINISH ? finish_done : block_done; | ||
1045 | } | ||
1046 | |||
1047 | /* =========================================================================== | ||
1048 | * Compress as much as possible from the input stream, return the current | ||
1049 | * block state. | ||
1050 | * This function does not perform lazy evaluation of matches and inserts | ||
1051 | * new strings in the dictionary only for unmatched strings or for short | ||
1052 | * matches. It is used only for the fast compression options. | ||
1053 | */ | ||
1054 | static block_state deflate_fast( | ||
1055 | deflate_state *s, | ||
1056 | int flush | ||
1057 | ) | ||
1058 | { | ||
1059 | IPos hash_head = NIL; /* head of the hash chain */ | ||
1060 | int bflush; /* set if current block must be flushed */ | ||
1061 | |||
1062 | for (;;) { | ||
1063 | /* Make sure that we always have enough lookahead, except | ||
1064 | * at the end of the input file. We need MAX_MATCH bytes | ||
1065 | * for the next match, plus MIN_MATCH bytes to insert the | ||
1066 | * string following the next match. | ||
1067 | */ | ||
1068 | if (s->lookahead < MIN_LOOKAHEAD) { | ||
1069 | fill_window(s); | ||
1070 | if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { | ||
1071 | return need_more; | ||
1072 | } | ||
1073 | if (s->lookahead == 0) break; /* flush the current block */ | ||
1074 | } | ||
1075 | |||
1076 | /* Insert the string window[strstart .. strstart+2] in the | ||
1077 | * dictionary, and set hash_head to the head of the hash chain: | ||
1078 | */ | ||
1079 | if (s->lookahead >= MIN_MATCH) { | ||
1080 | INSERT_STRING(s, s->strstart, hash_head); | ||
1081 | } | ||
1082 | |||
1083 | /* Find the longest match, discarding those <= prev_length. | ||
1084 | * At this point we have always match_length < MIN_MATCH | ||
1085 | */ | ||
1086 | if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) { | ||
1087 | /* To simplify the code, we prevent matches with the string | ||
1088 | * of window index 0 (in particular we have to avoid a match | ||
1089 | * of the string with itself at the start of the input file). | ||
1090 | */ | ||
1091 | if (s->strategy != Z_HUFFMAN_ONLY) { | ||
1092 | s->match_length = longest_match (s, hash_head); | ||
1093 | } | ||
1094 | /* longest_match() sets match_start */ | ||
1095 | } | ||
1096 | if (s->match_length >= MIN_MATCH) { | ||
1097 | check_match(s, s->strstart, s->match_start, s->match_length); | ||
1098 | |||
1099 | bflush = zlib_tr_tally(s, s->strstart - s->match_start, | ||
1100 | s->match_length - MIN_MATCH); | ||
1101 | |||
1102 | s->lookahead -= s->match_length; | ||
1103 | |||
1104 | /* Insert new strings in the hash table only if the match length | ||
1105 | * is not too large. This saves time but degrades compression. | ||
1106 | */ | ||
1107 | if (s->match_length <= s->max_insert_length && | ||
1108 | s->lookahead >= MIN_MATCH) { | ||
1109 | s->match_length--; /* string at strstart already in hash table */ | ||
1110 | do { | ||
1111 | s->strstart++; | ||
1112 | INSERT_STRING(s, s->strstart, hash_head); | ||
1113 | /* strstart never exceeds WSIZE-MAX_MATCH, so there are | ||
1114 | * always MIN_MATCH bytes ahead. | ||
1115 | */ | ||
1116 | } while (--s->match_length != 0); | ||
1117 | s->strstart++; | ||
1118 | } else { | ||
1119 | s->strstart += s->match_length; | ||
1120 | s->match_length = 0; | ||
1121 | s->ins_h = s->window[s->strstart]; | ||
1122 | UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); | ||
1123 | #if MIN_MATCH != 3 | ||
1124 | Call UPDATE_HASH() MIN_MATCH-3 more times | ||
1125 | #endif | ||
1126 | /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not | ||
1127 | * matter since it will be recomputed at next deflate call. | ||
1128 | */ | ||
1129 | } | ||
1130 | } else { | ||
1131 | /* No match, output a literal byte */ | ||
1132 | Tracevv((stderr,"%c", s->window[s->strstart])); | ||
1133 | bflush = zlib_tr_tally (s, 0, s->window[s->strstart]); | ||
1134 | s->lookahead--; | ||
1135 | s->strstart++; | ||
1136 | } | ||
1137 | if (bflush) FLUSH_BLOCK(s, 0); | ||
1138 | } | ||
1139 | FLUSH_BLOCK(s, flush == Z_FINISH); | ||
1140 | return flush == Z_FINISH ? finish_done : block_done; | ||
1141 | } | ||
1142 | |||
1143 | /* =========================================================================== | ||
1144 | * Same as above, but achieves better compression. We use a lazy | ||
1145 | * evaluation for matches: a match is finally adopted only if there is | ||
1146 | * no better match at the next window position. | ||
1147 | */ | ||
1148 | static block_state deflate_slow( | ||
1149 | deflate_state *s, | ||
1150 | int flush | ||
1151 | ) | ||
1152 | { | ||
1153 | IPos hash_head = NIL; /* head of hash chain */ | ||
1154 | int bflush; /* set if current block must be flushed */ | ||
1155 | |||
1156 | /* Process the input block. */ | ||
1157 | for (;;) { | ||
1158 | /* Make sure that we always have enough lookahead, except | ||
1159 | * at the end of the input file. We need MAX_MATCH bytes | ||
1160 | * for the next match, plus MIN_MATCH bytes to insert the | ||
1161 | * string following the next match. | ||
1162 | */ | ||
1163 | if (s->lookahead < MIN_LOOKAHEAD) { | ||
1164 | fill_window(s); | ||
1165 | if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { | ||
1166 | return need_more; | ||
1167 | } | ||
1168 | if (s->lookahead == 0) break; /* flush the current block */ | ||
1169 | } | ||
1170 | |||
1171 | /* Insert the string window[strstart .. strstart+2] in the | ||
1172 | * dictionary, and set hash_head to the head of the hash chain: | ||
1173 | */ | ||
1174 | if (s->lookahead >= MIN_MATCH) { | ||
1175 | INSERT_STRING(s, s->strstart, hash_head); | ||
1176 | } | ||
1177 | |||
1178 | /* Find the longest match, discarding those <= prev_length. | ||
1179 | */ | ||
1180 | s->prev_length = s->match_length, s->prev_match = s->match_start; | ||
1181 | s->match_length = MIN_MATCH-1; | ||
1182 | |||
1183 | if (hash_head != NIL && s->prev_length < s->max_lazy_match && | ||
1184 | s->strstart - hash_head <= MAX_DIST(s)) { | ||
1185 | /* To simplify the code, we prevent matches with the string | ||
1186 | * of window index 0 (in particular we have to avoid a match | ||
1187 | * of the string with itself at the start of the input file). | ||
1188 | */ | ||
1189 | if (s->strategy != Z_HUFFMAN_ONLY) { | ||
1190 | s->match_length = longest_match (s, hash_head); | ||
1191 | } | ||
1192 | /* longest_match() sets match_start */ | ||
1193 | |||
1194 | if (s->match_length <= 5 && (s->strategy == Z_FILTERED || | ||
1195 | (s->match_length == MIN_MATCH && | ||
1196 | s->strstart - s->match_start > TOO_FAR))) { | ||
1197 | |||
1198 | /* If prev_match is also MIN_MATCH, match_start is garbage | ||
1199 | * but we will ignore the current match anyway. | ||
1200 | */ | ||
1201 | s->match_length = MIN_MATCH-1; | ||
1202 | } | ||
1203 | } | ||
1204 | /* If there was a match at the previous step and the current | ||
1205 | * match is not better, output the previous match: | ||
1206 | */ | ||
1207 | if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) { | ||
1208 | uInt max_insert = s->strstart + s->lookahead - MIN_MATCH; | ||
1209 | /* Do not insert strings in hash table beyond this. */ | ||
1210 | |||
1211 | check_match(s, s->strstart-1, s->prev_match, s->prev_length); | ||
1212 | |||
1213 | bflush = zlib_tr_tally(s, s->strstart -1 - s->prev_match, | ||
1214 | s->prev_length - MIN_MATCH); | ||
1215 | |||
1216 | /* Insert in hash table all strings up to the end of the match. | ||
1217 | * strstart-1 and strstart are already inserted. If there is not | ||
1218 | * enough lookahead, the last two strings are not inserted in | ||
1219 | * the hash table. | ||
1220 | */ | ||
1221 | s->lookahead -= s->prev_length-1; | ||
1222 | s->prev_length -= 2; | ||
1223 | do { | ||
1224 | if (++s->strstart <= max_insert) { | ||
1225 | INSERT_STRING(s, s->strstart, hash_head); | ||
1226 | } | ||
1227 | } while (--s->prev_length != 0); | ||
1228 | s->match_available = 0; | ||
1229 | s->match_length = MIN_MATCH-1; | ||
1230 | s->strstart++; | ||
1231 | |||
1232 | if (bflush) FLUSH_BLOCK(s, 0); | ||
1233 | |||
1234 | } else if (s->match_available) { | ||
1235 | /* If there was no match at the previous position, output a | ||
1236 | * single literal. If there was a match but the current match | ||
1237 | * is longer, truncate the previous match to a single literal. | ||
1238 | */ | ||
1239 | Tracevv((stderr,"%c", s->window[s->strstart-1])); | ||
1240 | if (zlib_tr_tally (s, 0, s->window[s->strstart-1])) { | ||
1241 | FLUSH_BLOCK_ONLY(s, 0); | ||
1242 | } | ||
1243 | s->strstart++; | ||
1244 | s->lookahead--; | ||
1245 | if (s->strm->avail_out == 0) return need_more; | ||
1246 | } else { | ||
1247 | /* There is no previous match to compare with, wait for | ||
1248 | * the next step to decide. | ||
1249 | */ | ||
1250 | s->match_available = 1; | ||
1251 | s->strstart++; | ||
1252 | s->lookahead--; | ||
1253 | } | ||
1254 | } | ||
1255 | Assert (flush != Z_NO_FLUSH, "no flush?"); | ||
1256 | if (s->match_available) { | ||
1257 | Tracevv((stderr,"%c", s->window[s->strstart-1])); | ||
1258 | zlib_tr_tally (s, 0, s->window[s->strstart-1]); | ||
1259 | s->match_available = 0; | ||
1260 | } | ||
1261 | FLUSH_BLOCK(s, flush == Z_FINISH); | ||
1262 | return flush == Z_FINISH ? finish_done : block_done; | ||
1263 | } | ||
1264 | |||
1265 | int zlib_deflate_workspacesize(void) | ||
1266 | { | ||
1267 | return sizeof(deflate_workspace); | ||
1268 | } | ||
diff --git a/lib/zlib_deflate/deflate_syms.c b/lib/zlib_deflate/deflate_syms.c new file mode 100644 index 000000000000..5985b28c8e30 --- /dev/null +++ b/lib/zlib_deflate/deflate_syms.c | |||
@@ -0,0 +1,21 @@ | |||
1 | /* | ||
2 | * linux/lib/zlib_deflate/deflate_syms.c | ||
3 | * | ||
4 | * Exported symbols for the deflate functionality. | ||
5 | * | ||
6 | */ | ||
7 | |||
8 | #include <linux/module.h> | ||
9 | #include <linux/init.h> | ||
10 | |||
11 | #include <linux/zlib.h> | ||
12 | |||
13 | EXPORT_SYMBOL(zlib_deflate_workspacesize); | ||
14 | EXPORT_SYMBOL(zlib_deflate); | ||
15 | EXPORT_SYMBOL(zlib_deflateInit_); | ||
16 | EXPORT_SYMBOL(zlib_deflateInit2_); | ||
17 | EXPORT_SYMBOL(zlib_deflateEnd); | ||
18 | EXPORT_SYMBOL(zlib_deflateReset); | ||
19 | EXPORT_SYMBOL(zlib_deflateCopy); | ||
20 | EXPORT_SYMBOL(zlib_deflateParams); | ||
21 | MODULE_LICENSE("GPL"); | ||
diff --git a/lib/zlib_deflate/deftree.c b/lib/zlib_deflate/deftree.c new file mode 100644 index 000000000000..ddf348299f24 --- /dev/null +++ b/lib/zlib_deflate/deftree.c | |||
@@ -0,0 +1,1113 @@ | |||
1 | /* +++ trees.c */ | ||
2 | /* trees.c -- output deflated data using Huffman coding | ||
3 | * Copyright (C) 1995-1996 Jean-loup Gailly | ||
4 | * For conditions of distribution and use, see copyright notice in zlib.h | ||
5 | */ | ||
6 | |||
7 | /* | ||
8 | * ALGORITHM | ||
9 | * | ||
10 | * The "deflation" process uses several Huffman trees. The more | ||
11 | * common source values are represented by shorter bit sequences. | ||
12 | * | ||
13 | * Each code tree is stored in a compressed form which is itself | ||
14 | * a Huffman encoding of the lengths of all the code strings (in | ||
15 | * ascending order by source values). The actual code strings are | ||
16 | * reconstructed from the lengths in the inflate process, as described | ||
17 | * in the deflate specification. | ||
18 | * | ||
19 | * REFERENCES | ||
20 | * | ||
21 | * Deutsch, L.P.,"'Deflate' Compressed Data Format Specification". | ||
22 | * Available in ftp.uu.net:/pub/archiving/zip/doc/deflate-1.1.doc | ||
23 | * | ||
24 | * Storer, James A. | ||
25 | * Data Compression: Methods and Theory, pp. 49-50. | ||
26 | * Computer Science Press, 1988. ISBN 0-7167-8156-5. | ||
27 | * | ||
28 | * Sedgewick, R. | ||
29 | * Algorithms, p290. | ||
30 | * Addison-Wesley, 1983. ISBN 0-201-06672-6. | ||
31 | */ | ||
32 | |||
33 | /* From: trees.c,v 1.11 1996/07/24 13:41:06 me Exp $ */ | ||
34 | |||
35 | /* #include "deflate.h" */ | ||
36 | |||
37 | #include <linux/zutil.h> | ||
38 | #include "defutil.h" | ||
39 | |||
40 | #ifdef DEBUG_ZLIB | ||
41 | # include <ctype.h> | ||
42 | #endif | ||
43 | |||
44 | /* =========================================================================== | ||
45 | * Constants | ||
46 | */ | ||
47 | |||
48 | #define MAX_BL_BITS 7 | ||
49 | /* Bit length codes must not exceed MAX_BL_BITS bits */ | ||
50 | |||
51 | #define END_BLOCK 256 | ||
52 | /* end of block literal code */ | ||
53 | |||
54 | #define REP_3_6 16 | ||
55 | /* repeat previous bit length 3-6 times (2 bits of repeat count) */ | ||
56 | |||
57 | #define REPZ_3_10 17 | ||
58 | /* repeat a zero length 3-10 times (3 bits of repeat count) */ | ||
59 | |||
60 | #define REPZ_11_138 18 | ||
61 | /* repeat a zero length 11-138 times (7 bits of repeat count) */ | ||
62 | |||
63 | static const int extra_lbits[LENGTH_CODES] /* extra bits for each length code */ | ||
64 | = {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0}; | ||
65 | |||
66 | static const int extra_dbits[D_CODES] /* extra bits for each distance code */ | ||
67 | = {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; | ||
68 | |||
69 | static const int extra_blbits[BL_CODES]/* extra bits for each bit length code */ | ||
70 | = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7}; | ||
71 | |||
72 | static const uch bl_order[BL_CODES] | ||
73 | = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15}; | ||
74 | /* The lengths of the bit length codes are sent in order of decreasing | ||
75 | * probability, to avoid transmitting the lengths for unused bit length codes. | ||
76 | */ | ||
77 | |||
78 | #define Buf_size (8 * 2*sizeof(char)) | ||
79 | /* Number of bits used within bi_buf. (bi_buf might be implemented on | ||
80 | * more than 16 bits on some systems.) | ||
81 | */ | ||
82 | |||
83 | /* =========================================================================== | ||
84 | * Local data. These are initialized only once. | ||
85 | */ | ||
86 | |||
87 | static ct_data static_ltree[L_CODES+2]; | ||
88 | /* The static literal tree. Since the bit lengths are imposed, there is no | ||
89 | * need for the L_CODES extra codes used during heap construction. However | ||
90 | * The codes 286 and 287 are needed to build a canonical tree (see zlib_tr_init | ||
91 | * below). | ||
92 | */ | ||
93 | |||
94 | static ct_data static_dtree[D_CODES]; | ||
95 | /* The static distance tree. (Actually a trivial tree since all codes use | ||
96 | * 5 bits.) | ||
97 | */ | ||
98 | |||
99 | static uch dist_code[512]; | ||
100 | /* distance codes. The first 256 values correspond to the distances | ||
101 | * 3 .. 258, the last 256 values correspond to the top 8 bits of | ||
102 | * the 15 bit distances. | ||
103 | */ | ||
104 | |||
105 | static uch length_code[MAX_MATCH-MIN_MATCH+1]; | ||
106 | /* length code for each normalized match length (0 == MIN_MATCH) */ | ||
107 | |||
108 | static int base_length[LENGTH_CODES]; | ||
109 | /* First normalized length for each code (0 = MIN_MATCH) */ | ||
110 | |||
111 | static int base_dist[D_CODES]; | ||
112 | /* First normalized distance for each code (0 = distance of 1) */ | ||
113 | |||
114 | struct static_tree_desc_s { | ||
115 | const ct_data *static_tree; /* static tree or NULL */ | ||
116 | const int *extra_bits; /* extra bits for each code or NULL */ | ||
117 | int extra_base; /* base index for extra_bits */ | ||
118 | int elems; /* max number of elements in the tree */ | ||
119 | int max_length; /* max bit length for the codes */ | ||
120 | }; | ||
121 | |||
122 | static static_tree_desc static_l_desc = | ||
123 | {static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS}; | ||
124 | |||
125 | static static_tree_desc static_d_desc = | ||
126 | {static_dtree, extra_dbits, 0, D_CODES, MAX_BITS}; | ||
127 | |||
128 | static static_tree_desc static_bl_desc = | ||
129 | {(const ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS}; | ||
130 | |||
131 | /* =========================================================================== | ||
132 | * Local (static) routines in this file. | ||
133 | */ | ||
134 | |||
135 | static void tr_static_init (void); | ||
136 | static void init_block (deflate_state *s); | ||
137 | static void pqdownheap (deflate_state *s, ct_data *tree, int k); | ||
138 | static void gen_bitlen (deflate_state *s, tree_desc *desc); | ||
139 | static void gen_codes (ct_data *tree, int max_code, ush *bl_count); | ||
140 | static void build_tree (deflate_state *s, tree_desc *desc); | ||
141 | static void scan_tree (deflate_state *s, ct_data *tree, int max_code); | ||
142 | static void send_tree (deflate_state *s, ct_data *tree, int max_code); | ||
143 | static int build_bl_tree (deflate_state *s); | ||
144 | static void send_all_trees (deflate_state *s, int lcodes, int dcodes, | ||
145 | int blcodes); | ||
146 | static void compress_block (deflate_state *s, ct_data *ltree, | ||
147 | ct_data *dtree); | ||
148 | static void set_data_type (deflate_state *s); | ||
149 | static unsigned bi_reverse (unsigned value, int length); | ||
150 | static void bi_windup (deflate_state *s); | ||
151 | static void bi_flush (deflate_state *s); | ||
152 | static void copy_block (deflate_state *s, char *buf, unsigned len, | ||
153 | int header); | ||
154 | |||
155 | #ifndef DEBUG_ZLIB | ||
156 | # define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len) | ||
157 | /* Send a code of the given tree. c and tree must not have side effects */ | ||
158 | |||
159 | #else /* DEBUG_ZLIB */ | ||
160 | # define send_code(s, c, tree) \ | ||
161 | { if (z_verbose>2) fprintf(stderr,"\ncd %3d ",(c)); \ | ||
162 | send_bits(s, tree[c].Code, tree[c].Len); } | ||
163 | #endif | ||
164 | |||
165 | #define d_code(dist) \ | ||
166 | ((dist) < 256 ? dist_code[dist] : dist_code[256+((dist)>>7)]) | ||
167 | /* Mapping from a distance to a distance code. dist is the distance - 1 and | ||
168 | * must not have side effects. dist_code[256] and dist_code[257] are never | ||
169 | * used. | ||
170 | */ | ||
171 | |||
172 | /* =========================================================================== | ||
173 | * Send a value on a given number of bits. | ||
174 | * IN assertion: length <= 16 and value fits in length bits. | ||
175 | */ | ||
176 | #ifdef DEBUG_ZLIB | ||
177 | static void send_bits (deflate_state *s, int value, int length); | ||
178 | |||
179 | static void send_bits( | ||
180 | deflate_state *s, | ||
181 | int value, /* value to send */ | ||
182 | int length /* number of bits */ | ||
183 | ) | ||
184 | { | ||
185 | Tracevv((stderr," l %2d v %4x ", length, value)); | ||
186 | Assert(length > 0 && length <= 15, "invalid length"); | ||
187 | s->bits_sent += (ulg)length; | ||
188 | |||
189 | /* If not enough room in bi_buf, use (valid) bits from bi_buf and | ||
190 | * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid)) | ||
191 | * unused bits in value. | ||
192 | */ | ||
193 | if (s->bi_valid > (int)Buf_size - length) { | ||
194 | s->bi_buf |= (value << s->bi_valid); | ||
195 | put_short(s, s->bi_buf); | ||
196 | s->bi_buf = (ush)value >> (Buf_size - s->bi_valid); | ||
197 | s->bi_valid += length - Buf_size; | ||
198 | } else { | ||
199 | s->bi_buf |= value << s->bi_valid; | ||
200 | s->bi_valid += length; | ||
201 | } | ||
202 | } | ||
203 | #else /* !DEBUG_ZLIB */ | ||
204 | |||
205 | #define send_bits(s, value, length) \ | ||
206 | { int len = length;\ | ||
207 | if (s->bi_valid > (int)Buf_size - len) {\ | ||
208 | int val = value;\ | ||
209 | s->bi_buf |= (val << s->bi_valid);\ | ||
210 | put_short(s, s->bi_buf);\ | ||
211 | s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\ | ||
212 | s->bi_valid += len - Buf_size;\ | ||
213 | } else {\ | ||
214 | s->bi_buf |= (value) << s->bi_valid;\ | ||
215 | s->bi_valid += len;\ | ||
216 | }\ | ||
217 | } | ||
218 | #endif /* DEBUG_ZLIB */ | ||
219 | |||
220 | /* =========================================================================== | ||
221 | * Initialize the various 'constant' tables. In a multi-threaded environment, | ||
222 | * this function may be called by two threads concurrently, but this is | ||
223 | * harmless since both invocations do exactly the same thing. | ||
224 | */ | ||
225 | static void tr_static_init(void) | ||
226 | { | ||
227 | static int static_init_done; | ||
228 | int n; /* iterates over tree elements */ | ||
229 | int bits; /* bit counter */ | ||
230 | int length; /* length value */ | ||
231 | int code; /* code value */ | ||
232 | int dist; /* distance index */ | ||
233 | ush bl_count[MAX_BITS+1]; | ||
234 | /* number of codes at each bit length for an optimal tree */ | ||
235 | |||
236 | if (static_init_done) return; | ||
237 | |||
238 | /* Initialize the mapping length (0..255) -> length code (0..28) */ | ||
239 | length = 0; | ||
240 | for (code = 0; code < LENGTH_CODES-1; code++) { | ||
241 | base_length[code] = length; | ||
242 | for (n = 0; n < (1<<extra_lbits[code]); n++) { | ||
243 | length_code[length++] = (uch)code; | ||
244 | } | ||
245 | } | ||
246 | Assert (length == 256, "tr_static_init: length != 256"); | ||
247 | /* Note that the length 255 (match length 258) can be represented | ||
248 | * in two different ways: code 284 + 5 bits or code 285, so we | ||
249 | * overwrite length_code[255] to use the best encoding: | ||
250 | */ | ||
251 | length_code[length-1] = (uch)code; | ||
252 | |||
253 | /* Initialize the mapping dist (0..32K) -> dist code (0..29) */ | ||
254 | dist = 0; | ||
255 | for (code = 0 ; code < 16; code++) { | ||
256 | base_dist[code] = dist; | ||
257 | for (n = 0; n < (1<<extra_dbits[code]); n++) { | ||
258 | dist_code[dist++] = (uch)code; | ||
259 | } | ||
260 | } | ||
261 | Assert (dist == 256, "tr_static_init: dist != 256"); | ||
262 | dist >>= 7; /* from now on, all distances are divided by 128 */ | ||
263 | for ( ; code < D_CODES; code++) { | ||
264 | base_dist[code] = dist << 7; | ||
265 | for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) { | ||
266 | dist_code[256 + dist++] = (uch)code; | ||
267 | } | ||
268 | } | ||
269 | Assert (dist == 256, "tr_static_init: 256+dist != 512"); | ||
270 | |||
271 | /* Construct the codes of the static literal tree */ | ||
272 | for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0; | ||
273 | n = 0; | ||
274 | while (n <= 143) static_ltree[n++].Len = 8, bl_count[8]++; | ||
275 | while (n <= 255) static_ltree[n++].Len = 9, bl_count[9]++; | ||
276 | while (n <= 279) static_ltree[n++].Len = 7, bl_count[7]++; | ||
277 | while (n <= 287) static_ltree[n++].Len = 8, bl_count[8]++; | ||
278 | /* Codes 286 and 287 do not exist, but we must include them in the | ||
279 | * tree construction to get a canonical Huffman tree (longest code | ||
280 | * all ones) | ||
281 | */ | ||
282 | gen_codes((ct_data *)static_ltree, L_CODES+1, bl_count); | ||
283 | |||
284 | /* The static distance tree is trivial: */ | ||
285 | for (n = 0; n < D_CODES; n++) { | ||
286 | static_dtree[n].Len = 5; | ||
287 | static_dtree[n].Code = bi_reverse((unsigned)n, 5); | ||
288 | } | ||
289 | static_init_done = 1; | ||
290 | } | ||
291 | |||
292 | /* =========================================================================== | ||
293 | * Initialize the tree data structures for a new zlib stream. | ||
294 | */ | ||
295 | void zlib_tr_init( | ||
296 | deflate_state *s | ||
297 | ) | ||
298 | { | ||
299 | tr_static_init(); | ||
300 | |||
301 | s->compressed_len = 0L; | ||
302 | |||
303 | s->l_desc.dyn_tree = s->dyn_ltree; | ||
304 | s->l_desc.stat_desc = &static_l_desc; | ||
305 | |||
306 | s->d_desc.dyn_tree = s->dyn_dtree; | ||
307 | s->d_desc.stat_desc = &static_d_desc; | ||
308 | |||
309 | s->bl_desc.dyn_tree = s->bl_tree; | ||
310 | s->bl_desc.stat_desc = &static_bl_desc; | ||
311 | |||
312 | s->bi_buf = 0; | ||
313 | s->bi_valid = 0; | ||
314 | s->last_eob_len = 8; /* enough lookahead for inflate */ | ||
315 | #ifdef DEBUG_ZLIB | ||
316 | s->bits_sent = 0L; | ||
317 | #endif | ||
318 | |||
319 | /* Initialize the first block of the first file: */ | ||
320 | init_block(s); | ||
321 | } | ||
322 | |||
323 | /* =========================================================================== | ||
324 | * Initialize a new block. | ||
325 | */ | ||
326 | static void init_block( | ||
327 | deflate_state *s | ||
328 | ) | ||
329 | { | ||
330 | int n; /* iterates over tree elements */ | ||
331 | |||
332 | /* Initialize the trees. */ | ||
333 | for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0; | ||
334 | for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0; | ||
335 | for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0; | ||
336 | |||
337 | s->dyn_ltree[END_BLOCK].Freq = 1; | ||
338 | s->opt_len = s->static_len = 0L; | ||
339 | s->last_lit = s->matches = 0; | ||
340 | } | ||
341 | |||
342 | #define SMALLEST 1 | ||
343 | /* Index within the heap array of least frequent node in the Huffman tree */ | ||
344 | |||
345 | |||
346 | /* =========================================================================== | ||
347 | * Remove the smallest element from the heap and recreate the heap with | ||
348 | * one less element. Updates heap and heap_len. | ||
349 | */ | ||
350 | #define pqremove(s, tree, top) \ | ||
351 | {\ | ||
352 | top = s->heap[SMALLEST]; \ | ||
353 | s->heap[SMALLEST] = s->heap[s->heap_len--]; \ | ||
354 | pqdownheap(s, tree, SMALLEST); \ | ||
355 | } | ||
356 | |||
357 | /* =========================================================================== | ||
358 | * Compares to subtrees, using the tree depth as tie breaker when | ||
359 | * the subtrees have equal frequency. This minimizes the worst case length. | ||
360 | */ | ||
361 | #define smaller(tree, n, m, depth) \ | ||
362 | (tree[n].Freq < tree[m].Freq || \ | ||
363 | (tree[n].Freq == tree[m].Freq && depth[n] <= depth[m])) | ||
364 | |||
365 | /* =========================================================================== | ||
366 | * Restore the heap property by moving down the tree starting at node k, | ||
367 | * exchanging a node with the smallest of its two sons if necessary, stopping | ||
368 | * when the heap property is re-established (each father smaller than its | ||
369 | * two sons). | ||
370 | */ | ||
371 | static void pqdownheap( | ||
372 | deflate_state *s, | ||
373 | ct_data *tree, /* the tree to restore */ | ||
374 | int k /* node to move down */ | ||
375 | ) | ||
376 | { | ||
377 | int v = s->heap[k]; | ||
378 | int j = k << 1; /* left son of k */ | ||
379 | while (j <= s->heap_len) { | ||
380 | /* Set j to the smallest of the two sons: */ | ||
381 | if (j < s->heap_len && | ||
382 | smaller(tree, s->heap[j+1], s->heap[j], s->depth)) { | ||
383 | j++; | ||
384 | } | ||
385 | /* Exit if v is smaller than both sons */ | ||
386 | if (smaller(tree, v, s->heap[j], s->depth)) break; | ||
387 | |||
388 | /* Exchange v with the smallest son */ | ||
389 | s->heap[k] = s->heap[j]; k = j; | ||
390 | |||
391 | /* And continue down the tree, setting j to the left son of k */ | ||
392 | j <<= 1; | ||
393 | } | ||
394 | s->heap[k] = v; | ||
395 | } | ||
396 | |||
397 | /* =========================================================================== | ||
398 | * Compute the optimal bit lengths for a tree and update the total bit length | ||
399 | * for the current block. | ||
400 | * IN assertion: the fields freq and dad are set, heap[heap_max] and | ||
401 | * above are the tree nodes sorted by increasing frequency. | ||
402 | * OUT assertions: the field len is set to the optimal bit length, the | ||
403 | * array bl_count contains the frequencies for each bit length. | ||
404 | * The length opt_len is updated; static_len is also updated if stree is | ||
405 | * not null. | ||
406 | */ | ||
407 | static void gen_bitlen( | ||
408 | deflate_state *s, | ||
409 | tree_desc *desc /* the tree descriptor */ | ||
410 | ) | ||
411 | { | ||
412 | ct_data *tree = desc->dyn_tree; | ||
413 | int max_code = desc->max_code; | ||
414 | const ct_data *stree = desc->stat_desc->static_tree; | ||
415 | const int *extra = desc->stat_desc->extra_bits; | ||
416 | int base = desc->stat_desc->extra_base; | ||
417 | int max_length = desc->stat_desc->max_length; | ||
418 | int h; /* heap index */ | ||
419 | int n, m; /* iterate over the tree elements */ | ||
420 | int bits; /* bit length */ | ||
421 | int xbits; /* extra bits */ | ||
422 | ush f; /* frequency */ | ||
423 | int overflow = 0; /* number of elements with bit length too large */ | ||
424 | |||
425 | for (bits = 0; bits <= MAX_BITS; bits++) s->bl_count[bits] = 0; | ||
426 | |||
427 | /* In a first pass, compute the optimal bit lengths (which may | ||
428 | * overflow in the case of the bit length tree). | ||
429 | */ | ||
430 | tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */ | ||
431 | |||
432 | for (h = s->heap_max+1; h < HEAP_SIZE; h++) { | ||
433 | n = s->heap[h]; | ||
434 | bits = tree[tree[n].Dad].Len + 1; | ||
435 | if (bits > max_length) bits = max_length, overflow++; | ||
436 | tree[n].Len = (ush)bits; | ||
437 | /* We overwrite tree[n].Dad which is no longer needed */ | ||
438 | |||
439 | if (n > max_code) continue; /* not a leaf node */ | ||
440 | |||
441 | s->bl_count[bits]++; | ||
442 | xbits = 0; | ||
443 | if (n >= base) xbits = extra[n-base]; | ||
444 | f = tree[n].Freq; | ||
445 | s->opt_len += (ulg)f * (bits + xbits); | ||
446 | if (stree) s->static_len += (ulg)f * (stree[n].Len + xbits); | ||
447 | } | ||
448 | if (overflow == 0) return; | ||
449 | |||
450 | Trace((stderr,"\nbit length overflow\n")); | ||
451 | /* This happens for example on obj2 and pic of the Calgary corpus */ | ||
452 | |||
453 | /* Find the first bit length which could increase: */ | ||
454 | do { | ||
455 | bits = max_length-1; | ||
456 | while (s->bl_count[bits] == 0) bits--; | ||
457 | s->bl_count[bits]--; /* move one leaf down the tree */ | ||
458 | s->bl_count[bits+1] += 2; /* move one overflow item as its brother */ | ||
459 | s->bl_count[max_length]--; | ||
460 | /* The brother of the overflow item also moves one step up, | ||
461 | * but this does not affect bl_count[max_length] | ||
462 | */ | ||
463 | overflow -= 2; | ||
464 | } while (overflow > 0); | ||
465 | |||
466 | /* Now recompute all bit lengths, scanning in increasing frequency. | ||
467 | * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all | ||
468 | * lengths instead of fixing only the wrong ones. This idea is taken | ||
469 | * from 'ar' written by Haruhiko Okumura.) | ||
470 | */ | ||
471 | for (bits = max_length; bits != 0; bits--) { | ||
472 | n = s->bl_count[bits]; | ||
473 | while (n != 0) { | ||
474 | m = s->heap[--h]; | ||
475 | if (m > max_code) continue; | ||
476 | if (tree[m].Len != (unsigned) bits) { | ||
477 | Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); | ||
478 | s->opt_len += ((long)bits - (long)tree[m].Len) | ||
479 | *(long)tree[m].Freq; | ||
480 | tree[m].Len = (ush)bits; | ||
481 | } | ||
482 | n--; | ||
483 | } | ||
484 | } | ||
485 | } | ||
486 | |||
487 | /* =========================================================================== | ||
488 | * Generate the codes for a given tree and bit counts (which need not be | ||
489 | * optimal). | ||
490 | * IN assertion: the array bl_count contains the bit length statistics for | ||
491 | * the given tree and the field len is set for all tree elements. | ||
492 | * OUT assertion: the field code is set for all tree elements of non | ||
493 | * zero code length. | ||
494 | */ | ||
495 | static void gen_codes( | ||
496 | ct_data *tree, /* the tree to decorate */ | ||
497 | int max_code, /* largest code with non zero frequency */ | ||
498 | ush *bl_count /* number of codes at each bit length */ | ||
499 | ) | ||
500 | { | ||
501 | ush next_code[MAX_BITS+1]; /* next code value for each bit length */ | ||
502 | ush code = 0; /* running code value */ | ||
503 | int bits; /* bit index */ | ||
504 | int n; /* code index */ | ||
505 | |||
506 | /* The distribution counts are first used to generate the code values | ||
507 | * without bit reversal. | ||
508 | */ | ||
509 | for (bits = 1; bits <= MAX_BITS; bits++) { | ||
510 | next_code[bits] = code = (code + bl_count[bits-1]) << 1; | ||
511 | } | ||
512 | /* Check that the bit counts in bl_count are consistent. The last code | ||
513 | * must be all ones. | ||
514 | */ | ||
515 | Assert (code + bl_count[MAX_BITS]-1 == (1<<MAX_BITS)-1, | ||
516 | "inconsistent bit counts"); | ||
517 | Tracev((stderr,"\ngen_codes: max_code %d ", max_code)); | ||
518 | |||
519 | for (n = 0; n <= max_code; n++) { | ||
520 | int len = tree[n].Len; | ||
521 | if (len == 0) continue; | ||
522 | /* Now reverse the bits */ | ||
523 | tree[n].Code = bi_reverse(next_code[len]++, len); | ||
524 | |||
525 | Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ", | ||
526 | n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1)); | ||
527 | } | ||
528 | } | ||
529 | |||
530 | /* =========================================================================== | ||
531 | * Construct one Huffman tree and assigns the code bit strings and lengths. | ||
532 | * Update the total bit length for the current block. | ||
533 | * IN assertion: the field freq is set for all tree elements. | ||
534 | * OUT assertions: the fields len and code are set to the optimal bit length | ||
535 | * and corresponding code. The length opt_len is updated; static_len is | ||
536 | * also updated if stree is not null. The field max_code is set. | ||
537 | */ | ||
538 | static void build_tree( | ||
539 | deflate_state *s, | ||
540 | tree_desc *desc /* the tree descriptor */ | ||
541 | ) | ||
542 | { | ||
543 | ct_data *tree = desc->dyn_tree; | ||
544 | const ct_data *stree = desc->stat_desc->static_tree; | ||
545 | int elems = desc->stat_desc->elems; | ||
546 | int n, m; /* iterate over heap elements */ | ||
547 | int max_code = -1; /* largest code with non zero frequency */ | ||
548 | int node; /* new node being created */ | ||
549 | |||
550 | /* Construct the initial heap, with least frequent element in | ||
551 | * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. | ||
552 | * heap[0] is not used. | ||
553 | */ | ||
554 | s->heap_len = 0, s->heap_max = HEAP_SIZE; | ||
555 | |||
556 | for (n = 0; n < elems; n++) { | ||
557 | if (tree[n].Freq != 0) { | ||
558 | s->heap[++(s->heap_len)] = max_code = n; | ||
559 | s->depth[n] = 0; | ||
560 | } else { | ||
561 | tree[n].Len = 0; | ||
562 | } | ||
563 | } | ||
564 | |||
565 | /* The pkzip format requires that at least one distance code exists, | ||
566 | * and that at least one bit should be sent even if there is only one | ||
567 | * possible code. So to avoid special checks later on we force at least | ||
568 | * two codes of non zero frequency. | ||
569 | */ | ||
570 | while (s->heap_len < 2) { | ||
571 | node = s->heap[++(s->heap_len)] = (max_code < 2 ? ++max_code : 0); | ||
572 | tree[node].Freq = 1; | ||
573 | s->depth[node] = 0; | ||
574 | s->opt_len--; if (stree) s->static_len -= stree[node].Len; | ||
575 | /* node is 0 or 1 so it does not have extra bits */ | ||
576 | } | ||
577 | desc->max_code = max_code; | ||
578 | |||
579 | /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, | ||
580 | * establish sub-heaps of increasing lengths: | ||
581 | */ | ||
582 | for (n = s->heap_len/2; n >= 1; n--) pqdownheap(s, tree, n); | ||
583 | |||
584 | /* Construct the Huffman tree by repeatedly combining the least two | ||
585 | * frequent nodes. | ||
586 | */ | ||
587 | node = elems; /* next internal node of the tree */ | ||
588 | do { | ||
589 | pqremove(s, tree, n); /* n = node of least frequency */ | ||
590 | m = s->heap[SMALLEST]; /* m = node of next least frequency */ | ||
591 | |||
592 | s->heap[--(s->heap_max)] = n; /* keep the nodes sorted by frequency */ | ||
593 | s->heap[--(s->heap_max)] = m; | ||
594 | |||
595 | /* Create a new node father of n and m */ | ||
596 | tree[node].Freq = tree[n].Freq + tree[m].Freq; | ||
597 | s->depth[node] = (uch) (max(s->depth[n], s->depth[m]) + 1); | ||
598 | tree[n].Dad = tree[m].Dad = (ush)node; | ||
599 | #ifdef DUMP_BL_TREE | ||
600 | if (tree == s->bl_tree) { | ||
601 | fprintf(stderr,"\nnode %d(%d), sons %d(%d) %d(%d)", | ||
602 | node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq); | ||
603 | } | ||
604 | #endif | ||
605 | /* and insert the new node in the heap */ | ||
606 | s->heap[SMALLEST] = node++; | ||
607 | pqdownheap(s, tree, SMALLEST); | ||
608 | |||
609 | } while (s->heap_len >= 2); | ||
610 | |||
611 | s->heap[--(s->heap_max)] = s->heap[SMALLEST]; | ||
612 | |||
613 | /* At this point, the fields freq and dad are set. We can now | ||
614 | * generate the bit lengths. | ||
615 | */ | ||
616 | gen_bitlen(s, (tree_desc *)desc); | ||
617 | |||
618 | /* The field len is now set, we can generate the bit codes */ | ||
619 | gen_codes ((ct_data *)tree, max_code, s->bl_count); | ||
620 | } | ||
621 | |||
622 | /* =========================================================================== | ||
623 | * Scan a literal or distance tree to determine the frequencies of the codes | ||
624 | * in the bit length tree. | ||
625 | */ | ||
626 | static void scan_tree( | ||
627 | deflate_state *s, | ||
628 | ct_data *tree, /* the tree to be scanned */ | ||
629 | int max_code /* and its largest code of non zero frequency */ | ||
630 | ) | ||
631 | { | ||
632 | int n; /* iterates over all tree elements */ | ||
633 | int prevlen = -1; /* last emitted length */ | ||
634 | int curlen; /* length of current code */ | ||
635 | int nextlen = tree[0].Len; /* length of next code */ | ||
636 | int count = 0; /* repeat count of the current code */ | ||
637 | int max_count = 7; /* max repeat count */ | ||
638 | int min_count = 4; /* min repeat count */ | ||
639 | |||
640 | if (nextlen == 0) max_count = 138, min_count = 3; | ||
641 | tree[max_code+1].Len = (ush)0xffff; /* guard */ | ||
642 | |||
643 | for (n = 0; n <= max_code; n++) { | ||
644 | curlen = nextlen; nextlen = tree[n+1].Len; | ||
645 | if (++count < max_count && curlen == nextlen) { | ||
646 | continue; | ||
647 | } else if (count < min_count) { | ||
648 | s->bl_tree[curlen].Freq += count; | ||
649 | } else if (curlen != 0) { | ||
650 | if (curlen != prevlen) s->bl_tree[curlen].Freq++; | ||
651 | s->bl_tree[REP_3_6].Freq++; | ||
652 | } else if (count <= 10) { | ||
653 | s->bl_tree[REPZ_3_10].Freq++; | ||
654 | } else { | ||
655 | s->bl_tree[REPZ_11_138].Freq++; | ||
656 | } | ||
657 | count = 0; prevlen = curlen; | ||
658 | if (nextlen == 0) { | ||
659 | max_count = 138, min_count = 3; | ||
660 | } else if (curlen == nextlen) { | ||
661 | max_count = 6, min_count = 3; | ||
662 | } else { | ||
663 | max_count = 7, min_count = 4; | ||
664 | } | ||
665 | } | ||
666 | } | ||
667 | |||
668 | /* =========================================================================== | ||
669 | * Send a literal or distance tree in compressed form, using the codes in | ||
670 | * bl_tree. | ||
671 | */ | ||
672 | static void send_tree( | ||
673 | deflate_state *s, | ||
674 | ct_data *tree, /* the tree to be scanned */ | ||
675 | int max_code /* and its largest code of non zero frequency */ | ||
676 | ) | ||
677 | { | ||
678 | int n; /* iterates over all tree elements */ | ||
679 | int prevlen = -1; /* last emitted length */ | ||
680 | int curlen; /* length of current code */ | ||
681 | int nextlen = tree[0].Len; /* length of next code */ | ||
682 | int count = 0; /* repeat count of the current code */ | ||
683 | int max_count = 7; /* max repeat count */ | ||
684 | int min_count = 4; /* min repeat count */ | ||
685 | |||
686 | /* tree[max_code+1].Len = -1; */ /* guard already set */ | ||
687 | if (nextlen == 0) max_count = 138, min_count = 3; | ||
688 | |||
689 | for (n = 0; n <= max_code; n++) { | ||
690 | curlen = nextlen; nextlen = tree[n+1].Len; | ||
691 | if (++count < max_count && curlen == nextlen) { | ||
692 | continue; | ||
693 | } else if (count < min_count) { | ||
694 | do { send_code(s, curlen, s->bl_tree); } while (--count != 0); | ||
695 | |||
696 | } else if (curlen != 0) { | ||
697 | if (curlen != prevlen) { | ||
698 | send_code(s, curlen, s->bl_tree); count--; | ||
699 | } | ||
700 | Assert(count >= 3 && count <= 6, " 3_6?"); | ||
701 | send_code(s, REP_3_6, s->bl_tree); send_bits(s, count-3, 2); | ||
702 | |||
703 | } else if (count <= 10) { | ||
704 | send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count-3, 3); | ||
705 | |||
706 | } else { | ||
707 | send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count-11, 7); | ||
708 | } | ||
709 | count = 0; prevlen = curlen; | ||
710 | if (nextlen == 0) { | ||
711 | max_count = 138, min_count = 3; | ||
712 | } else if (curlen == nextlen) { | ||
713 | max_count = 6, min_count = 3; | ||
714 | } else { | ||
715 | max_count = 7, min_count = 4; | ||
716 | } | ||
717 | } | ||
718 | } | ||
719 | |||
720 | /* =========================================================================== | ||
721 | * Construct the Huffman tree for the bit lengths and return the index in | ||
722 | * bl_order of the last bit length code to send. | ||
723 | */ | ||
724 | static int build_bl_tree( | ||
725 | deflate_state *s | ||
726 | ) | ||
727 | { | ||
728 | int max_blindex; /* index of last bit length code of non zero freq */ | ||
729 | |||
730 | /* Determine the bit length frequencies for literal and distance trees */ | ||
731 | scan_tree(s, (ct_data *)s->dyn_ltree, s->l_desc.max_code); | ||
732 | scan_tree(s, (ct_data *)s->dyn_dtree, s->d_desc.max_code); | ||
733 | |||
734 | /* Build the bit length tree: */ | ||
735 | build_tree(s, (tree_desc *)(&(s->bl_desc))); | ||
736 | /* opt_len now includes the length of the tree representations, except | ||
737 | * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. | ||
738 | */ | ||
739 | |||
740 | /* Determine the number of bit length codes to send. The pkzip format | ||
741 | * requires that at least 4 bit length codes be sent. (appnote.txt says | ||
742 | * 3 but the actual value used is 4.) | ||
743 | */ | ||
744 | for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) { | ||
745 | if (s->bl_tree[bl_order[max_blindex]].Len != 0) break; | ||
746 | } | ||
747 | /* Update opt_len to include the bit length tree and counts */ | ||
748 | s->opt_len += 3*(max_blindex+1) + 5+5+4; | ||
749 | Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", | ||
750 | s->opt_len, s->static_len)); | ||
751 | |||
752 | return max_blindex; | ||
753 | } | ||
754 | |||
755 | /* =========================================================================== | ||
756 | * Send the header for a block using dynamic Huffman trees: the counts, the | ||
757 | * lengths of the bit length codes, the literal tree and the distance tree. | ||
758 | * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. | ||
759 | */ | ||
760 | static void send_all_trees( | ||
761 | deflate_state *s, | ||
762 | int lcodes, /* number of codes for each tree */ | ||
763 | int dcodes, /* number of codes for each tree */ | ||
764 | int blcodes /* number of codes for each tree */ | ||
765 | ) | ||
766 | { | ||
767 | int rank; /* index in bl_order */ | ||
768 | |||
769 | Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); | ||
770 | Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, | ||
771 | "too many codes"); | ||
772 | Tracev((stderr, "\nbl counts: ")); | ||
773 | send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */ | ||
774 | send_bits(s, dcodes-1, 5); | ||
775 | send_bits(s, blcodes-4, 4); /* not -3 as stated in appnote.txt */ | ||
776 | for (rank = 0; rank < blcodes; rank++) { | ||
777 | Tracev((stderr, "\nbl code %2d ", bl_order[rank])); | ||
778 | send_bits(s, s->bl_tree[bl_order[rank]].Len, 3); | ||
779 | } | ||
780 | Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); | ||
781 | |||
782 | send_tree(s, (ct_data *)s->dyn_ltree, lcodes-1); /* literal tree */ | ||
783 | Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); | ||
784 | |||
785 | send_tree(s, (ct_data *)s->dyn_dtree, dcodes-1); /* distance tree */ | ||
786 | Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); | ||
787 | } | ||
788 | |||
789 | /* =========================================================================== | ||
790 | * Send a stored block | ||
791 | */ | ||
792 | void zlib_tr_stored_block( | ||
793 | deflate_state *s, | ||
794 | char *buf, /* input block */ | ||
795 | ulg stored_len, /* length of input block */ | ||
796 | int eof /* true if this is the last block for a file */ | ||
797 | ) | ||
798 | { | ||
799 | send_bits(s, (STORED_BLOCK<<1)+eof, 3); /* send block type */ | ||
800 | s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L; | ||
801 | s->compressed_len += (stored_len + 4) << 3; | ||
802 | |||
803 | copy_block(s, buf, (unsigned)stored_len, 1); /* with header */ | ||
804 | } | ||
805 | |||
806 | /* Send just the `stored block' type code without any length bytes or data. | ||
807 | */ | ||
808 | void zlib_tr_stored_type_only( | ||
809 | deflate_state *s | ||
810 | ) | ||
811 | { | ||
812 | send_bits(s, (STORED_BLOCK << 1), 3); | ||
813 | bi_windup(s); | ||
814 | s->compressed_len = (s->compressed_len + 3) & ~7L; | ||
815 | } | ||
816 | |||
817 | |||
818 | /* =========================================================================== | ||
819 | * Send one empty static block to give enough lookahead for inflate. | ||
820 | * This takes 10 bits, of which 7 may remain in the bit buffer. | ||
821 | * The current inflate code requires 9 bits of lookahead. If the | ||
822 | * last two codes for the previous block (real code plus EOB) were coded | ||
823 | * on 5 bits or less, inflate may have only 5+3 bits of lookahead to decode | ||
824 | * the last real code. In this case we send two empty static blocks instead | ||
825 | * of one. (There are no problems if the previous block is stored or fixed.) | ||
826 | * To simplify the code, we assume the worst case of last real code encoded | ||
827 | * on one bit only. | ||
828 | */ | ||
829 | void zlib_tr_align( | ||
830 | deflate_state *s | ||
831 | ) | ||
832 | { | ||
833 | send_bits(s, STATIC_TREES<<1, 3); | ||
834 | send_code(s, END_BLOCK, static_ltree); | ||
835 | s->compressed_len += 10L; /* 3 for block type, 7 for EOB */ | ||
836 | bi_flush(s); | ||
837 | /* Of the 10 bits for the empty block, we have already sent | ||
838 | * (10 - bi_valid) bits. The lookahead for the last real code (before | ||
839 | * the EOB of the previous block) was thus at least one plus the length | ||
840 | * of the EOB plus what we have just sent of the empty static block. | ||
841 | */ | ||
842 | if (1 + s->last_eob_len + 10 - s->bi_valid < 9) { | ||
843 | send_bits(s, STATIC_TREES<<1, 3); | ||
844 | send_code(s, END_BLOCK, static_ltree); | ||
845 | s->compressed_len += 10L; | ||
846 | bi_flush(s); | ||
847 | } | ||
848 | s->last_eob_len = 7; | ||
849 | } | ||
850 | |||
851 | /* =========================================================================== | ||
852 | * Determine the best encoding for the current block: dynamic trees, static | ||
853 | * trees or store, and output the encoded block to the zip file. This function | ||
854 | * returns the total compressed length for the file so far. | ||
855 | */ | ||
856 | ulg zlib_tr_flush_block( | ||
857 | deflate_state *s, | ||
858 | char *buf, /* input block, or NULL if too old */ | ||
859 | ulg stored_len, /* length of input block */ | ||
860 | int eof /* true if this is the last block for a file */ | ||
861 | ) | ||
862 | { | ||
863 | ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */ | ||
864 | int max_blindex = 0; /* index of last bit length code of non zero freq */ | ||
865 | |||
866 | /* Build the Huffman trees unless a stored block is forced */ | ||
867 | if (s->level > 0) { | ||
868 | |||
869 | /* Check if the file is ascii or binary */ | ||
870 | if (s->data_type == Z_UNKNOWN) set_data_type(s); | ||
871 | |||
872 | /* Construct the literal and distance trees */ | ||
873 | build_tree(s, (tree_desc *)(&(s->l_desc))); | ||
874 | Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, | ||
875 | s->static_len)); | ||
876 | |||
877 | build_tree(s, (tree_desc *)(&(s->d_desc))); | ||
878 | Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, | ||
879 | s->static_len)); | ||
880 | /* At this point, opt_len and static_len are the total bit lengths of | ||
881 | * the compressed block data, excluding the tree representations. | ||
882 | */ | ||
883 | |||
884 | /* Build the bit length tree for the above two trees, and get the index | ||
885 | * in bl_order of the last bit length code to send. | ||
886 | */ | ||
887 | max_blindex = build_bl_tree(s); | ||
888 | |||
889 | /* Determine the best encoding. Compute first the block length in bytes*/ | ||
890 | opt_lenb = (s->opt_len+3+7)>>3; | ||
891 | static_lenb = (s->static_len+3+7)>>3; | ||
892 | |||
893 | Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", | ||
894 | opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, | ||
895 | s->last_lit)); | ||
896 | |||
897 | if (static_lenb <= opt_lenb) opt_lenb = static_lenb; | ||
898 | |||
899 | } else { | ||
900 | Assert(buf != (char*)0, "lost buf"); | ||
901 | opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ | ||
902 | } | ||
903 | |||
904 | /* If compression failed and this is the first and last block, | ||
905 | * and if the .zip file can be seeked (to rewrite the local header), | ||
906 | * the whole file is transformed into a stored file: | ||
907 | */ | ||
908 | #ifdef STORED_FILE_OK | ||
909 | # ifdef FORCE_STORED_FILE | ||
910 | if (eof && s->compressed_len == 0L) { /* force stored file */ | ||
911 | # else | ||
912 | if (stored_len <= opt_lenb && eof && s->compressed_len==0L && seekable()) { | ||
913 | # endif | ||
914 | /* Since LIT_BUFSIZE <= 2*WSIZE, the input data must be there: */ | ||
915 | if (buf == (char*)0) error ("block vanished"); | ||
916 | |||
917 | copy_block(s, buf, (unsigned)stored_len, 0); /* without header */ | ||
918 | s->compressed_len = stored_len << 3; | ||
919 | s->method = STORED; | ||
920 | } else | ||
921 | #endif /* STORED_FILE_OK */ | ||
922 | |||
923 | #ifdef FORCE_STORED | ||
924 | if (buf != (char*)0) { /* force stored block */ | ||
925 | #else | ||
926 | if (stored_len+4 <= opt_lenb && buf != (char*)0) { | ||
927 | /* 4: two words for the lengths */ | ||
928 | #endif | ||
929 | /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. | ||
930 | * Otherwise we can't have processed more than WSIZE input bytes since | ||
931 | * the last block flush, because compression would have been | ||
932 | * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to | ||
933 | * transform a block into a stored block. | ||
934 | */ | ||
935 | zlib_tr_stored_block(s, buf, stored_len, eof); | ||
936 | |||
937 | #ifdef FORCE_STATIC | ||
938 | } else if (static_lenb >= 0) { /* force static trees */ | ||
939 | #else | ||
940 | } else if (static_lenb == opt_lenb) { | ||
941 | #endif | ||
942 | send_bits(s, (STATIC_TREES<<1)+eof, 3); | ||
943 | compress_block(s, (ct_data *)static_ltree, (ct_data *)static_dtree); | ||
944 | s->compressed_len += 3 + s->static_len; | ||
945 | } else { | ||
946 | send_bits(s, (DYN_TREES<<1)+eof, 3); | ||
947 | send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1, | ||
948 | max_blindex+1); | ||
949 | compress_block(s, (ct_data *)s->dyn_ltree, (ct_data *)s->dyn_dtree); | ||
950 | s->compressed_len += 3 + s->opt_len; | ||
951 | } | ||
952 | Assert (s->compressed_len == s->bits_sent, "bad compressed size"); | ||
953 | init_block(s); | ||
954 | |||
955 | if (eof) { | ||
956 | bi_windup(s); | ||
957 | s->compressed_len += 7; /* align on byte boundary */ | ||
958 | } | ||
959 | Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, | ||
960 | s->compressed_len-7*eof)); | ||
961 | |||
962 | return s->compressed_len >> 3; | ||
963 | } | ||
964 | |||
965 | /* =========================================================================== | ||
966 | * Save the match info and tally the frequency counts. Return true if | ||
967 | * the current block must be flushed. | ||
968 | */ | ||
969 | int zlib_tr_tally( | ||
970 | deflate_state *s, | ||
971 | unsigned dist, /* distance of matched string */ | ||
972 | unsigned lc /* match length-MIN_MATCH or unmatched char (if dist==0) */ | ||
973 | ) | ||
974 | { | ||
975 | s->d_buf[s->last_lit] = (ush)dist; | ||
976 | s->l_buf[s->last_lit++] = (uch)lc; | ||
977 | if (dist == 0) { | ||
978 | /* lc is the unmatched char */ | ||
979 | s->dyn_ltree[lc].Freq++; | ||
980 | } else { | ||
981 | s->matches++; | ||
982 | /* Here, lc is the match length - MIN_MATCH */ | ||
983 | dist--; /* dist = match distance - 1 */ | ||
984 | Assert((ush)dist < (ush)MAX_DIST(s) && | ||
985 | (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && | ||
986 | (ush)d_code(dist) < (ush)D_CODES, "zlib_tr_tally: bad match"); | ||
987 | |||
988 | s->dyn_ltree[length_code[lc]+LITERALS+1].Freq++; | ||
989 | s->dyn_dtree[d_code(dist)].Freq++; | ||
990 | } | ||
991 | |||
992 | /* Try to guess if it is profitable to stop the current block here */ | ||
993 | if ((s->last_lit & 0xfff) == 0 && s->level > 2) { | ||
994 | /* Compute an upper bound for the compressed length */ | ||
995 | ulg out_length = (ulg)s->last_lit*8L; | ||
996 | ulg in_length = (ulg)((long)s->strstart - s->block_start); | ||
997 | int dcode; | ||
998 | for (dcode = 0; dcode < D_CODES; dcode++) { | ||
999 | out_length += (ulg)s->dyn_dtree[dcode].Freq * | ||
1000 | (5L+extra_dbits[dcode]); | ||
1001 | } | ||
1002 | out_length >>= 3; | ||
1003 | Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", | ||
1004 | s->last_lit, in_length, out_length, | ||
1005 | 100L - out_length*100L/in_length)); | ||
1006 | if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1; | ||
1007 | } | ||
1008 | return (s->last_lit == s->lit_bufsize-1); | ||
1009 | /* We avoid equality with lit_bufsize because of wraparound at 64K | ||
1010 | * on 16 bit machines and because stored blocks are restricted to | ||
1011 | * 64K-1 bytes. | ||
1012 | */ | ||
1013 | } | ||
1014 | |||
1015 | /* =========================================================================== | ||
1016 | * Send the block data compressed using the given Huffman trees | ||
1017 | */ | ||
1018 | static void compress_block( | ||
1019 | deflate_state *s, | ||
1020 | ct_data *ltree, /* literal tree */ | ||
1021 | ct_data *dtree /* distance tree */ | ||
1022 | ) | ||
1023 | { | ||
1024 | unsigned dist; /* distance of matched string */ | ||
1025 | int lc; /* match length or unmatched char (if dist == 0) */ | ||
1026 | unsigned lx = 0; /* running index in l_buf */ | ||
1027 | unsigned code; /* the code to send */ | ||
1028 | int extra; /* number of extra bits to send */ | ||
1029 | |||
1030 | if (s->last_lit != 0) do { | ||
1031 | dist = s->d_buf[lx]; | ||
1032 | lc = s->l_buf[lx++]; | ||
1033 | if (dist == 0) { | ||
1034 | send_code(s, lc, ltree); /* send a literal byte */ | ||
1035 | Tracecv(isgraph(lc), (stderr," '%c' ", lc)); | ||
1036 | } else { | ||
1037 | /* Here, lc is the match length - MIN_MATCH */ | ||
1038 | code = length_code[lc]; | ||
1039 | send_code(s, code+LITERALS+1, ltree); /* send the length code */ | ||
1040 | extra = extra_lbits[code]; | ||
1041 | if (extra != 0) { | ||
1042 | lc -= base_length[code]; | ||
1043 | send_bits(s, lc, extra); /* send the extra length bits */ | ||
1044 | } | ||
1045 | dist--; /* dist is now the match distance - 1 */ | ||
1046 | code = d_code(dist); | ||
1047 | Assert (code < D_CODES, "bad d_code"); | ||
1048 | |||
1049 | send_code(s, code, dtree); /* send the distance code */ | ||
1050 | extra = extra_dbits[code]; | ||
1051 | if (extra != 0) { | ||
1052 | dist -= base_dist[code]; | ||
1053 | send_bits(s, dist, extra); /* send the extra distance bits */ | ||
1054 | } | ||
1055 | } /* literal or match pair ? */ | ||
1056 | |||
1057 | /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ | ||
1058 | Assert(s->pending < s->lit_bufsize + 2*lx, "pendingBuf overflow"); | ||
1059 | |||
1060 | } while (lx < s->last_lit); | ||
1061 | |||
1062 | send_code(s, END_BLOCK, ltree); | ||
1063 | s->last_eob_len = ltree[END_BLOCK].Len; | ||
1064 | } | ||
1065 | |||
1066 | /* =========================================================================== | ||
1067 | * Set the data type to ASCII or BINARY, using a crude approximation: | ||
1068 | * binary if more than 20% of the bytes are <= 6 or >= 128, ascii otherwise. | ||
1069 | * IN assertion: the fields freq of dyn_ltree are set and the total of all | ||
1070 | * frequencies does not exceed 64K (to fit in an int on 16 bit machines). | ||
1071 | */ | ||
1072 | static void set_data_type( | ||
1073 | deflate_state *s | ||
1074 | ) | ||
1075 | { | ||
1076 | int n = 0; | ||
1077 | unsigned ascii_freq = 0; | ||
1078 | unsigned bin_freq = 0; | ||
1079 | while (n < 7) bin_freq += s->dyn_ltree[n++].Freq; | ||
1080 | while (n < 128) ascii_freq += s->dyn_ltree[n++].Freq; | ||
1081 | while (n < LITERALS) bin_freq += s->dyn_ltree[n++].Freq; | ||
1082 | s->data_type = (Byte)(bin_freq > (ascii_freq >> 2) ? Z_BINARY : Z_ASCII); | ||
1083 | } | ||
1084 | |||
1085 | /* =========================================================================== | ||
1086 | * Copy a stored block, storing first the length and its | ||
1087 | * one's complement if requested. | ||
1088 | */ | ||
1089 | static void copy_block( | ||
1090 | deflate_state *s, | ||
1091 | char *buf, /* the input data */ | ||
1092 | unsigned len, /* its length */ | ||
1093 | int header /* true if block header must be written */ | ||
1094 | ) | ||
1095 | { | ||
1096 | bi_windup(s); /* align on byte boundary */ | ||
1097 | s->last_eob_len = 8; /* enough lookahead for inflate */ | ||
1098 | |||
1099 | if (header) { | ||
1100 | put_short(s, (ush)len); | ||
1101 | put_short(s, (ush)~len); | ||
1102 | #ifdef DEBUG_ZLIB | ||
1103 | s->bits_sent += 2*16; | ||
1104 | #endif | ||
1105 | } | ||
1106 | #ifdef DEBUG_ZLIB | ||
1107 | s->bits_sent += (ulg)len<<3; | ||
1108 | #endif | ||
1109 | /* bundle up the put_byte(s, *buf++) calls */ | ||
1110 | memcpy(&s->pending_buf[s->pending], buf, len); | ||
1111 | s->pending += len; | ||
1112 | } | ||
1113 | |||
diff --git a/lib/zlib_deflate/defutil.h b/lib/zlib_deflate/defutil.h new file mode 100644 index 000000000000..d9feaf638608 --- /dev/null +++ b/lib/zlib_deflate/defutil.h | |||
@@ -0,0 +1,334 @@ | |||
1 | |||
2 | |||
3 | |||
4 | #define Assert(err, str) | ||
5 | #define Trace(dummy) | ||
6 | #define Tracev(dummy) | ||
7 | #define Tracecv(err, dummy) | ||
8 | #define Tracevv(dummy) | ||
9 | |||
10 | |||
11 | |||
12 | #define LENGTH_CODES 29 | ||
13 | /* number of length codes, not counting the special END_BLOCK code */ | ||
14 | |||
15 | #define LITERALS 256 | ||
16 | /* number of literal bytes 0..255 */ | ||
17 | |||
18 | #define L_CODES (LITERALS+1+LENGTH_CODES) | ||
19 | /* number of Literal or Length codes, including the END_BLOCK code */ | ||
20 | |||
21 | #define D_CODES 30 | ||
22 | /* number of distance codes */ | ||
23 | |||
24 | #define BL_CODES 19 | ||
25 | /* number of codes used to transfer the bit lengths */ | ||
26 | |||
27 | #define HEAP_SIZE (2*L_CODES+1) | ||
28 | /* maximum heap size */ | ||
29 | |||
30 | #define MAX_BITS 15 | ||
31 | /* All codes must not exceed MAX_BITS bits */ | ||
32 | |||
33 | #define INIT_STATE 42 | ||
34 | #define BUSY_STATE 113 | ||
35 | #define FINISH_STATE 666 | ||
36 | /* Stream status */ | ||
37 | |||
38 | |||
39 | /* Data structure describing a single value and its code string. */ | ||
40 | typedef struct ct_data_s { | ||
41 | union { | ||
42 | ush freq; /* frequency count */ | ||
43 | ush code; /* bit string */ | ||
44 | } fc; | ||
45 | union { | ||
46 | ush dad; /* father node in Huffman tree */ | ||
47 | ush len; /* length of bit string */ | ||
48 | } dl; | ||
49 | } ct_data; | ||
50 | |||
51 | #define Freq fc.freq | ||
52 | #define Code fc.code | ||
53 | #define Dad dl.dad | ||
54 | #define Len dl.len | ||
55 | |||
56 | typedef struct static_tree_desc_s static_tree_desc; | ||
57 | |||
58 | typedef struct tree_desc_s { | ||
59 | ct_data *dyn_tree; /* the dynamic tree */ | ||
60 | int max_code; /* largest code with non zero frequency */ | ||
61 | static_tree_desc *stat_desc; /* the corresponding static tree */ | ||
62 | } tree_desc; | ||
63 | |||
64 | typedef ush Pos; | ||
65 | typedef unsigned IPos; | ||
66 | |||
67 | /* A Pos is an index in the character window. We use short instead of int to | ||
68 | * save space in the various tables. IPos is used only for parameter passing. | ||
69 | */ | ||
70 | |||
71 | typedef struct deflate_state { | ||
72 | z_streamp strm; /* pointer back to this zlib stream */ | ||
73 | int status; /* as the name implies */ | ||
74 | Byte *pending_buf; /* output still pending */ | ||
75 | ulg pending_buf_size; /* size of pending_buf */ | ||
76 | Byte *pending_out; /* next pending byte to output to the stream */ | ||
77 | int pending; /* nb of bytes in the pending buffer */ | ||
78 | int noheader; /* suppress zlib header and adler32 */ | ||
79 | Byte data_type; /* UNKNOWN, BINARY or ASCII */ | ||
80 | Byte method; /* STORED (for zip only) or DEFLATED */ | ||
81 | int last_flush; /* value of flush param for previous deflate call */ | ||
82 | |||
83 | /* used by deflate.c: */ | ||
84 | |||
85 | uInt w_size; /* LZ77 window size (32K by default) */ | ||
86 | uInt w_bits; /* log2(w_size) (8..16) */ | ||
87 | uInt w_mask; /* w_size - 1 */ | ||
88 | |||
89 | Byte *window; | ||
90 | /* Sliding window. Input bytes are read into the second half of the window, | ||
91 | * and move to the first half later to keep a dictionary of at least wSize | ||
92 | * bytes. With this organization, matches are limited to a distance of | ||
93 | * wSize-MAX_MATCH bytes, but this ensures that IO is always | ||
94 | * performed with a length multiple of the block size. Also, it limits | ||
95 | * the window size to 64K, which is quite useful on MSDOS. | ||
96 | * To do: use the user input buffer as sliding window. | ||
97 | */ | ||
98 | |||
99 | ulg window_size; | ||
100 | /* Actual size of window: 2*wSize, except when the user input buffer | ||
101 | * is directly used as sliding window. | ||
102 | */ | ||
103 | |||
104 | Pos *prev; | ||
105 | /* Link to older string with same hash index. To limit the size of this | ||
106 | * array to 64K, this link is maintained only for the last 32K strings. | ||
107 | * An index in this array is thus a window index modulo 32K. | ||
108 | */ | ||
109 | |||
110 | Pos *head; /* Heads of the hash chains or NIL. */ | ||
111 | |||
112 | uInt ins_h; /* hash index of string to be inserted */ | ||
113 | uInt hash_size; /* number of elements in hash table */ | ||
114 | uInt hash_bits; /* log2(hash_size) */ | ||
115 | uInt hash_mask; /* hash_size-1 */ | ||
116 | |||
117 | uInt hash_shift; | ||
118 | /* Number of bits by which ins_h must be shifted at each input | ||
119 | * step. It must be such that after MIN_MATCH steps, the oldest | ||
120 | * byte no longer takes part in the hash key, that is: | ||
121 | * hash_shift * MIN_MATCH >= hash_bits | ||
122 | */ | ||
123 | |||
124 | long block_start; | ||
125 | /* Window position at the beginning of the current output block. Gets | ||
126 | * negative when the window is moved backwards. | ||
127 | */ | ||
128 | |||
129 | uInt match_length; /* length of best match */ | ||
130 | IPos prev_match; /* previous match */ | ||
131 | int match_available; /* set if previous match exists */ | ||
132 | uInt strstart; /* start of string to insert */ | ||
133 | uInt match_start; /* start of matching string */ | ||
134 | uInt lookahead; /* number of valid bytes ahead in window */ | ||
135 | |||
136 | uInt prev_length; | ||
137 | /* Length of the best match at previous step. Matches not greater than this | ||
138 | * are discarded. This is used in the lazy match evaluation. | ||
139 | */ | ||
140 | |||
141 | uInt max_chain_length; | ||
142 | /* To speed up deflation, hash chains are never searched beyond this | ||
143 | * length. A higher limit improves compression ratio but degrades the | ||
144 | * speed. | ||
145 | */ | ||
146 | |||
147 | uInt max_lazy_match; | ||
148 | /* Attempt to find a better match only when the current match is strictly | ||
149 | * smaller than this value. This mechanism is used only for compression | ||
150 | * levels >= 4. | ||
151 | */ | ||
152 | # define max_insert_length max_lazy_match | ||
153 | /* Insert new strings in the hash table only if the match length is not | ||
154 | * greater than this length. This saves time but degrades compression. | ||
155 | * max_insert_length is used only for compression levels <= 3. | ||
156 | */ | ||
157 | |||
158 | int level; /* compression level (1..9) */ | ||
159 | int strategy; /* favor or force Huffman coding*/ | ||
160 | |||
161 | uInt good_match; | ||
162 | /* Use a faster search when the previous match is longer than this */ | ||
163 | |||
164 | int nice_match; /* Stop searching when current match exceeds this */ | ||
165 | |||
166 | /* used by trees.c: */ | ||
167 | /* Didn't use ct_data typedef below to supress compiler warning */ | ||
168 | struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ | ||
169 | struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ | ||
170 | struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ | ||
171 | |||
172 | struct tree_desc_s l_desc; /* desc. for literal tree */ | ||
173 | struct tree_desc_s d_desc; /* desc. for distance tree */ | ||
174 | struct tree_desc_s bl_desc; /* desc. for bit length tree */ | ||
175 | |||
176 | ush bl_count[MAX_BITS+1]; | ||
177 | /* number of codes at each bit length for an optimal tree */ | ||
178 | |||
179 | int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ | ||
180 | int heap_len; /* number of elements in the heap */ | ||
181 | int heap_max; /* element of largest frequency */ | ||
182 | /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. | ||
183 | * The same heap array is used to build all trees. | ||
184 | */ | ||
185 | |||
186 | uch depth[2*L_CODES+1]; | ||
187 | /* Depth of each subtree used as tie breaker for trees of equal frequency | ||
188 | */ | ||
189 | |||
190 | uch *l_buf; /* buffer for literals or lengths */ | ||
191 | |||
192 | uInt lit_bufsize; | ||
193 | /* Size of match buffer for literals/lengths. There are 4 reasons for | ||
194 | * limiting lit_bufsize to 64K: | ||
195 | * - frequencies can be kept in 16 bit counters | ||
196 | * - if compression is not successful for the first block, all input | ||
197 | * data is still in the window so we can still emit a stored block even | ||
198 | * when input comes from standard input. (This can also be done for | ||
199 | * all blocks if lit_bufsize is not greater than 32K.) | ||
200 | * - if compression is not successful for a file smaller than 64K, we can | ||
201 | * even emit a stored file instead of a stored block (saving 5 bytes). | ||
202 | * This is applicable only for zip (not gzip or zlib). | ||
203 | * - creating new Huffman trees less frequently may not provide fast | ||
204 | * adaptation to changes in the input data statistics. (Take for | ||
205 | * example a binary file with poorly compressible code followed by | ||
206 | * a highly compressible string table.) Smaller buffer sizes give | ||
207 | * fast adaptation but have of course the overhead of transmitting | ||
208 | * trees more frequently. | ||
209 | * - I can't count above 4 | ||
210 | */ | ||
211 | |||
212 | uInt last_lit; /* running index in l_buf */ | ||
213 | |||
214 | ush *d_buf; | ||
215 | /* Buffer for distances. To simplify the code, d_buf and l_buf have | ||
216 | * the same number of elements. To use different lengths, an extra flag | ||
217 | * array would be necessary. | ||
218 | */ | ||
219 | |||
220 | ulg opt_len; /* bit length of current block with optimal trees */ | ||
221 | ulg static_len; /* bit length of current block with static trees */ | ||
222 | ulg compressed_len; /* total bit length of compressed file */ | ||
223 | uInt matches; /* number of string matches in current block */ | ||
224 | int last_eob_len; /* bit length of EOB code for last block */ | ||
225 | |||
226 | #ifdef DEBUG_ZLIB | ||
227 | ulg bits_sent; /* bit length of the compressed data */ | ||
228 | #endif | ||
229 | |||
230 | ush bi_buf; | ||
231 | /* Output buffer. bits are inserted starting at the bottom (least | ||
232 | * significant bits). | ||
233 | */ | ||
234 | int bi_valid; | ||
235 | /* Number of valid bits in bi_buf. All bits above the last valid bit | ||
236 | * are always zero. | ||
237 | */ | ||
238 | |||
239 | } deflate_state; | ||
240 | |||
241 | typedef struct deflate_workspace { | ||
242 | /* State memory for the deflator */ | ||
243 | deflate_state deflate_memory; | ||
244 | Byte window_memory[2 * (1 << MAX_WBITS)]; | ||
245 | Pos prev_memory[1 << MAX_WBITS]; | ||
246 | Pos head_memory[1 << (MAX_MEM_LEVEL + 7)]; | ||
247 | char overlay_memory[(1 << (MAX_MEM_LEVEL + 6)) * (sizeof(ush)+2)]; | ||
248 | } deflate_workspace; | ||
249 | |||
250 | /* Output a byte on the stream. | ||
251 | * IN assertion: there is enough room in pending_buf. | ||
252 | */ | ||
253 | #define put_byte(s, c) {s->pending_buf[s->pending++] = (c);} | ||
254 | |||
255 | |||
256 | #define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) | ||
257 | /* Minimum amount of lookahead, except at the end of the input file. | ||
258 | * See deflate.c for comments about the MIN_MATCH+1. | ||
259 | */ | ||
260 | |||
261 | #define MAX_DIST(s) ((s)->w_size-MIN_LOOKAHEAD) | ||
262 | /* In order to simplify the code, particularly on 16 bit machines, match | ||
263 | * distances are limited to MAX_DIST instead of WSIZE. | ||
264 | */ | ||
265 | |||
266 | /* in trees.c */ | ||
267 | void zlib_tr_init (deflate_state *s); | ||
268 | int zlib_tr_tally (deflate_state *s, unsigned dist, unsigned lc); | ||
269 | ulg zlib_tr_flush_block (deflate_state *s, char *buf, ulg stored_len, | ||
270 | int eof); | ||
271 | void zlib_tr_align (deflate_state *s); | ||
272 | void zlib_tr_stored_block (deflate_state *s, char *buf, ulg stored_len, | ||
273 | int eof); | ||
274 | void zlib_tr_stored_type_only (deflate_state *); | ||
275 | |||
276 | |||
277 | /* =========================================================================== | ||
278 | * Output a short LSB first on the stream. | ||
279 | * IN assertion: there is enough room in pendingBuf. | ||
280 | */ | ||
281 | #define put_short(s, w) { \ | ||
282 | put_byte(s, (uch)((w) & 0xff)); \ | ||
283 | put_byte(s, (uch)((ush)(w) >> 8)); \ | ||
284 | } | ||
285 | |||
286 | /* =========================================================================== | ||
287 | * Reverse the first len bits of a code, using straightforward code (a faster | ||
288 | * method would use a table) | ||
289 | * IN assertion: 1 <= len <= 15 | ||
290 | */ | ||
291 | static inline unsigned bi_reverse(unsigned code, /* the value to invert */ | ||
292 | int len) /* its bit length */ | ||
293 | { | ||
294 | register unsigned res = 0; | ||
295 | do { | ||
296 | res |= code & 1; | ||
297 | code >>= 1, res <<= 1; | ||
298 | } while (--len > 0); | ||
299 | return res >> 1; | ||
300 | } | ||
301 | |||
302 | /* =========================================================================== | ||
303 | * Flush the bit buffer, keeping at most 7 bits in it. | ||
304 | */ | ||
305 | static inline void bi_flush(deflate_state *s) | ||
306 | { | ||
307 | if (s->bi_valid == 16) { | ||
308 | put_short(s, s->bi_buf); | ||
309 | s->bi_buf = 0; | ||
310 | s->bi_valid = 0; | ||
311 | } else if (s->bi_valid >= 8) { | ||
312 | put_byte(s, (Byte)s->bi_buf); | ||
313 | s->bi_buf >>= 8; | ||
314 | s->bi_valid -= 8; | ||
315 | } | ||
316 | } | ||
317 | |||
318 | /* =========================================================================== | ||
319 | * Flush the bit buffer and align the output on a byte boundary | ||
320 | */ | ||
321 | static inline void bi_windup(deflate_state *s) | ||
322 | { | ||
323 | if (s->bi_valid > 8) { | ||
324 | put_short(s, s->bi_buf); | ||
325 | } else if (s->bi_valid > 0) { | ||
326 | put_byte(s, (Byte)s->bi_buf); | ||
327 | } | ||
328 | s->bi_buf = 0; | ||
329 | s->bi_valid = 0; | ||
330 | #ifdef DEBUG_ZLIB | ||
331 | s->bits_sent = (s->bits_sent+7) & ~7; | ||
332 | #endif | ||
333 | } | ||
334 | |||
diff --git a/lib/zlib_inflate/Makefile b/lib/zlib_inflate/Makefile new file mode 100644 index 000000000000..221c139e0df1 --- /dev/null +++ b/lib/zlib_inflate/Makefile | |||
@@ -0,0 +1,19 @@ | |||
1 | # | ||
2 | # This is a modified version of zlib, which does all memory | ||
3 | # allocation ahead of time. | ||
4 | # | ||
5 | # This is only the decompression, see zlib_deflate for the | ||
6 | # the compression | ||
7 | # | ||
8 | # Decompression needs to be serialized for each memory | ||
9 | # allocation. | ||
10 | # | ||
11 | # (The upsides of the simplification is that you can't get in | ||
12 | # any nasty situations wrt memory management, and that the | ||
13 | # uncompression can be done without blocking on allocation). | ||
14 | # | ||
15 | |||
16 | obj-$(CONFIG_ZLIB_INFLATE) += zlib_inflate.o | ||
17 | |||
18 | zlib_inflate-objs := infblock.o infcodes.o inffast.o inflate.o \ | ||
19 | inflate_sync.o inftrees.o infutil.o inflate_syms.o | ||
diff --git a/lib/zlib_inflate/infblock.c b/lib/zlib_inflate/infblock.c new file mode 100644 index 000000000000..50f21ca4ef7f --- /dev/null +++ b/lib/zlib_inflate/infblock.c | |||
@@ -0,0 +1,361 @@ | |||
1 | /* infblock.c -- interpret and process block types to last block | ||
2 | * Copyright (C) 1995-1998 Mark Adler | ||
3 | * For conditions of distribution and use, see copyright notice in zlib.h | ||
4 | */ | ||
5 | |||
6 | #include <linux/zutil.h> | ||
7 | #include "infblock.h" | ||
8 | #include "inftrees.h" | ||
9 | #include "infcodes.h" | ||
10 | #include "infutil.h" | ||
11 | |||
12 | struct inflate_codes_state; | ||
13 | |||
14 | /* simplify the use of the inflate_huft type with some defines */ | ||
15 | #define exop word.what.Exop | ||
16 | #define bits word.what.Bits | ||
17 | |||
18 | /* Table for deflate from PKZIP's appnote.txt. */ | ||
19 | static const uInt border[] = { /* Order of the bit length code lengths */ | ||
20 | 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; | ||
21 | |||
22 | /* | ||
23 | Notes beyond the 1.93a appnote.txt: | ||
24 | |||
25 | 1. Distance pointers never point before the beginning of the output | ||
26 | stream. | ||
27 | 2. Distance pointers can point back across blocks, up to 32k away. | ||
28 | 3. There is an implied maximum of 7 bits for the bit length table and | ||
29 | 15 bits for the actual data. | ||
30 | 4. If only one code exists, then it is encoded using one bit. (Zero | ||
31 | would be more efficient, but perhaps a little confusing.) If two | ||
32 | codes exist, they are coded using one bit each (0 and 1). | ||
33 | 5. There is no way of sending zero distance codes--a dummy must be | ||
34 | sent if there are none. (History: a pre 2.0 version of PKZIP would | ||
35 | store blocks with no distance codes, but this was discovered to be | ||
36 | too harsh a criterion.) Valid only for 1.93a. 2.04c does allow | ||
37 | zero distance codes, which is sent as one code of zero bits in | ||
38 | length. | ||
39 | 6. There are up to 286 literal/length codes. Code 256 represents the | ||
40 | end-of-block. Note however that the static length tree defines | ||
41 | 288 codes just to fill out the Huffman codes. Codes 286 and 287 | ||
42 | cannot be used though, since there is no length base or extra bits | ||
43 | defined for them. Similarily, there are up to 30 distance codes. | ||
44 | However, static trees define 32 codes (all 5 bits) to fill out the | ||
45 | Huffman codes, but the last two had better not show up in the data. | ||
46 | 7. Unzip can check dynamic Huffman blocks for complete code sets. | ||
47 | The exception is that a single code would not be complete (see #4). | ||
48 | 8. The five bits following the block type is really the number of | ||
49 | literal codes sent minus 257. | ||
50 | 9. Length codes 8,16,16 are interpreted as 13 length codes of 8 bits | ||
51 | (1+6+6). Therefore, to output three times the length, you output | ||
52 | three codes (1+1+1), whereas to output four times the same length, | ||
53 | you only need two codes (1+3). Hmm. | ||
54 | 10. In the tree reconstruction algorithm, Code = Code + Increment | ||
55 | only if BitLength(i) is not zero. (Pretty obvious.) | ||
56 | 11. Correction: 4 Bits: # of Bit Length codes - 4 (4 - 19) | ||
57 | 12. Note: length code 284 can represent 227-258, but length code 285 | ||
58 | really is 258. The last length deserves its own, short code | ||
59 | since it gets used a lot in very redundant files. The length | ||
60 | 258 is special since 258 - 3 (the min match length) is 255. | ||
61 | 13. The literal/length and distance code bit lengths are read as a | ||
62 | single stream of lengths. It is possible (and advantageous) for | ||
63 | a repeat code (16, 17, or 18) to go across the boundary between | ||
64 | the two sets of lengths. | ||
65 | */ | ||
66 | |||
67 | |||
68 | void zlib_inflate_blocks_reset( | ||
69 | inflate_blocks_statef *s, | ||
70 | z_streamp z, | ||
71 | uLong *c | ||
72 | ) | ||
73 | { | ||
74 | if (c != NULL) | ||
75 | *c = s->check; | ||
76 | if (s->mode == CODES) | ||
77 | zlib_inflate_codes_free(s->sub.decode.codes, z); | ||
78 | s->mode = TYPE; | ||
79 | s->bitk = 0; | ||
80 | s->bitb = 0; | ||
81 | s->read = s->write = s->window; | ||
82 | if (s->checkfn != NULL) | ||
83 | z->adler = s->check = (*s->checkfn)(0L, NULL, 0); | ||
84 | } | ||
85 | |||
86 | inflate_blocks_statef *zlib_inflate_blocks_new( | ||
87 | z_streamp z, | ||
88 | check_func c, | ||
89 | uInt w | ||
90 | ) | ||
91 | { | ||
92 | inflate_blocks_statef *s; | ||
93 | |||
94 | s = &WS(z)->working_blocks_state; | ||
95 | s->hufts = WS(z)->working_hufts; | ||
96 | s->window = WS(z)->working_window; | ||
97 | s->end = s->window + w; | ||
98 | s->checkfn = c; | ||
99 | s->mode = TYPE; | ||
100 | zlib_inflate_blocks_reset(s, z, NULL); | ||
101 | return s; | ||
102 | } | ||
103 | |||
104 | |||
105 | int zlib_inflate_blocks( | ||
106 | inflate_blocks_statef *s, | ||
107 | z_streamp z, | ||
108 | int r | ||
109 | ) | ||
110 | { | ||
111 | uInt t; /* temporary storage */ | ||
112 | uLong b; /* bit buffer */ | ||
113 | uInt k; /* bits in bit buffer */ | ||
114 | Byte *p; /* input data pointer */ | ||
115 | uInt n; /* bytes available there */ | ||
116 | Byte *q; /* output window write pointer */ | ||
117 | uInt m; /* bytes to end of window or read pointer */ | ||
118 | |||
119 | /* copy input/output information to locals (UPDATE macro restores) */ | ||
120 | LOAD | ||
121 | |||
122 | /* process input based on current state */ | ||
123 | while (1) switch (s->mode) | ||
124 | { | ||
125 | case TYPE: | ||
126 | NEEDBITS(3) | ||
127 | t = (uInt)b & 7; | ||
128 | s->last = t & 1; | ||
129 | switch (t >> 1) | ||
130 | { | ||
131 | case 0: /* stored */ | ||
132 | DUMPBITS(3) | ||
133 | t = k & 7; /* go to byte boundary */ | ||
134 | DUMPBITS(t) | ||
135 | s->mode = LENS; /* get length of stored block */ | ||
136 | break; | ||
137 | case 1: /* fixed */ | ||
138 | { | ||
139 | uInt bl, bd; | ||
140 | inflate_huft *tl, *td; | ||
141 | |||
142 | zlib_inflate_trees_fixed(&bl, &bd, &tl, &td, s->hufts, z); | ||
143 | s->sub.decode.codes = zlib_inflate_codes_new(bl, bd, tl, td, z); | ||
144 | if (s->sub.decode.codes == NULL) | ||
145 | { | ||
146 | r = Z_MEM_ERROR; | ||
147 | LEAVE | ||
148 | } | ||
149 | } | ||
150 | DUMPBITS(3) | ||
151 | s->mode = CODES; | ||
152 | break; | ||
153 | case 2: /* dynamic */ | ||
154 | DUMPBITS(3) | ||
155 | s->mode = TABLE; | ||
156 | break; | ||
157 | case 3: /* illegal */ | ||
158 | DUMPBITS(3) | ||
159 | s->mode = B_BAD; | ||
160 | z->msg = (char*)"invalid block type"; | ||
161 | r = Z_DATA_ERROR; | ||
162 | LEAVE | ||
163 | } | ||
164 | break; | ||
165 | case LENS: | ||
166 | NEEDBITS(32) | ||
167 | if ((((~b) >> 16) & 0xffff) != (b & 0xffff)) | ||
168 | { | ||
169 | s->mode = B_BAD; | ||
170 | z->msg = (char*)"invalid stored block lengths"; | ||
171 | r = Z_DATA_ERROR; | ||
172 | LEAVE | ||
173 | } | ||
174 | s->sub.left = (uInt)b & 0xffff; | ||
175 | b = k = 0; /* dump bits */ | ||
176 | s->mode = s->sub.left ? STORED : (s->last ? DRY : TYPE); | ||
177 | break; | ||
178 | case STORED: | ||
179 | if (n == 0) | ||
180 | LEAVE | ||
181 | NEEDOUT | ||
182 | t = s->sub.left; | ||
183 | if (t > n) t = n; | ||
184 | if (t > m) t = m; | ||
185 | memcpy(q, p, t); | ||
186 | p += t; n -= t; | ||
187 | q += t; m -= t; | ||
188 | if ((s->sub.left -= t) != 0) | ||
189 | break; | ||
190 | s->mode = s->last ? DRY : TYPE; | ||
191 | break; | ||
192 | case TABLE: | ||
193 | NEEDBITS(14) | ||
194 | s->sub.trees.table = t = (uInt)b & 0x3fff; | ||
195 | #ifndef PKZIP_BUG_WORKAROUND | ||
196 | if ((t & 0x1f) > 29 || ((t >> 5) & 0x1f) > 29) | ||
197 | { | ||
198 | s->mode = B_BAD; | ||
199 | z->msg = (char*)"too many length or distance symbols"; | ||
200 | r = Z_DATA_ERROR; | ||
201 | LEAVE | ||
202 | } | ||
203 | #endif | ||
204 | { | ||
205 | s->sub.trees.blens = WS(z)->working_blens; | ||
206 | } | ||
207 | DUMPBITS(14) | ||
208 | s->sub.trees.index = 0; | ||
209 | s->mode = BTREE; | ||
210 | case BTREE: | ||
211 | while (s->sub.trees.index < 4 + (s->sub.trees.table >> 10)) | ||
212 | { | ||
213 | NEEDBITS(3) | ||
214 | s->sub.trees.blens[border[s->sub.trees.index++]] = (uInt)b & 7; | ||
215 | DUMPBITS(3) | ||
216 | } | ||
217 | while (s->sub.trees.index < 19) | ||
218 | s->sub.trees.blens[border[s->sub.trees.index++]] = 0; | ||
219 | s->sub.trees.bb = 7; | ||
220 | t = zlib_inflate_trees_bits(s->sub.trees.blens, &s->sub.trees.bb, | ||
221 | &s->sub.trees.tb, s->hufts, z); | ||
222 | if (t != Z_OK) | ||
223 | { | ||
224 | r = t; | ||
225 | if (r == Z_DATA_ERROR) | ||
226 | s->mode = B_BAD; | ||
227 | LEAVE | ||
228 | } | ||
229 | s->sub.trees.index = 0; | ||
230 | s->mode = DTREE; | ||
231 | case DTREE: | ||
232 | while (t = s->sub.trees.table, | ||
233 | s->sub.trees.index < 258 + (t & 0x1f) + ((t >> 5) & 0x1f)) | ||
234 | { | ||
235 | inflate_huft *h; | ||
236 | uInt i, j, c; | ||
237 | |||
238 | t = s->sub.trees.bb; | ||
239 | NEEDBITS(t) | ||
240 | h = s->sub.trees.tb + ((uInt)b & zlib_inflate_mask[t]); | ||
241 | t = h->bits; | ||
242 | c = h->base; | ||
243 | if (c < 16) | ||
244 | { | ||
245 | DUMPBITS(t) | ||
246 | s->sub.trees.blens[s->sub.trees.index++] = c; | ||
247 | } | ||
248 | else /* c == 16..18 */ | ||
249 | { | ||
250 | i = c == 18 ? 7 : c - 14; | ||
251 | j = c == 18 ? 11 : 3; | ||
252 | NEEDBITS(t + i) | ||
253 | DUMPBITS(t) | ||
254 | j += (uInt)b & zlib_inflate_mask[i]; | ||
255 | DUMPBITS(i) | ||
256 | i = s->sub.trees.index; | ||
257 | t = s->sub.trees.table; | ||
258 | if (i + j > 258 + (t & 0x1f) + ((t >> 5) & 0x1f) || | ||
259 | (c == 16 && i < 1)) | ||
260 | { | ||
261 | s->mode = B_BAD; | ||
262 | z->msg = (char*)"invalid bit length repeat"; | ||
263 | r = Z_DATA_ERROR; | ||
264 | LEAVE | ||
265 | } | ||
266 | c = c == 16 ? s->sub.trees.blens[i - 1] : 0; | ||
267 | do { | ||
268 | s->sub.trees.blens[i++] = c; | ||
269 | } while (--j); | ||
270 | s->sub.trees.index = i; | ||
271 | } | ||
272 | } | ||
273 | s->sub.trees.tb = NULL; | ||
274 | { | ||
275 | uInt bl, bd; | ||
276 | inflate_huft *tl, *td; | ||
277 | inflate_codes_statef *c; | ||
278 | |||
279 | bl = 9; /* must be <= 9 for lookahead assumptions */ | ||
280 | bd = 6; /* must be <= 9 for lookahead assumptions */ | ||
281 | t = s->sub.trees.table; | ||
282 | t = zlib_inflate_trees_dynamic(257 + (t & 0x1f), 1 + ((t >> 5) & 0x1f), | ||
283 | s->sub.trees.blens, &bl, &bd, &tl, &td, | ||
284 | s->hufts, z); | ||
285 | if (t != Z_OK) | ||
286 | { | ||
287 | if (t == (uInt)Z_DATA_ERROR) | ||
288 | s->mode = B_BAD; | ||
289 | r = t; | ||
290 | LEAVE | ||
291 | } | ||
292 | if ((c = zlib_inflate_codes_new(bl, bd, tl, td, z)) == NULL) | ||
293 | { | ||
294 | r = Z_MEM_ERROR; | ||
295 | LEAVE | ||
296 | } | ||
297 | s->sub.decode.codes = c; | ||
298 | } | ||
299 | s->mode = CODES; | ||
300 | case CODES: | ||
301 | UPDATE | ||
302 | if ((r = zlib_inflate_codes(s, z, r)) != Z_STREAM_END) | ||
303 | return zlib_inflate_flush(s, z, r); | ||
304 | r = Z_OK; | ||
305 | zlib_inflate_codes_free(s->sub.decode.codes, z); | ||
306 | LOAD | ||
307 | if (!s->last) | ||
308 | { | ||
309 | s->mode = TYPE; | ||
310 | break; | ||
311 | } | ||
312 | s->mode = DRY; | ||
313 | case DRY: | ||
314 | FLUSH | ||
315 | if (s->read != s->write) | ||
316 | LEAVE | ||
317 | s->mode = B_DONE; | ||
318 | case B_DONE: | ||
319 | r = Z_STREAM_END; | ||
320 | LEAVE | ||
321 | case B_BAD: | ||
322 | r = Z_DATA_ERROR; | ||
323 | LEAVE | ||
324 | default: | ||
325 | r = Z_STREAM_ERROR; | ||
326 | LEAVE | ||
327 | } | ||
328 | } | ||
329 | |||
330 | |||
331 | int zlib_inflate_blocks_free( | ||
332 | inflate_blocks_statef *s, | ||
333 | z_streamp z | ||
334 | ) | ||
335 | { | ||
336 | zlib_inflate_blocks_reset(s, z, NULL); | ||
337 | return Z_OK; | ||
338 | } | ||
339 | |||
340 | |||
341 | void zlib_inflate_set_dictionary( | ||
342 | inflate_blocks_statef *s, | ||
343 | const Byte *d, | ||
344 | uInt n | ||
345 | ) | ||
346 | { | ||
347 | memcpy(s->window, d, n); | ||
348 | s->read = s->write = s->window + n; | ||
349 | } | ||
350 | |||
351 | |||
352 | /* Returns true if inflate is currently at the end of a block generated | ||
353 | * by Z_SYNC_FLUSH or Z_FULL_FLUSH. | ||
354 | * IN assertion: s != NULL | ||
355 | */ | ||
356 | int zlib_inflate_blocks_sync_point( | ||
357 | inflate_blocks_statef *s | ||
358 | ) | ||
359 | { | ||
360 | return s->mode == LENS; | ||
361 | } | ||
diff --git a/lib/zlib_inflate/infblock.h b/lib/zlib_inflate/infblock.h new file mode 100644 index 000000000000..f5221ddf6054 --- /dev/null +++ b/lib/zlib_inflate/infblock.h | |||
@@ -0,0 +1,44 @@ | |||
1 | /* infblock.h -- header to use infblock.c | ||
2 | * Copyright (C) 1995-1998 Mark Adler | ||
3 | * For conditions of distribution and use, see copyright notice in zlib.h | ||
4 | */ | ||
5 | |||
6 | /* WARNING: this file should *not* be used by applications. It is | ||
7 | part of the implementation of the compression library and is | ||
8 | subject to change. Applications should only use zlib.h. | ||
9 | */ | ||
10 | |||
11 | #ifndef _INFBLOCK_H | ||
12 | #define _INFBLOCK_H | ||
13 | |||
14 | struct inflate_blocks_state; | ||
15 | typedef struct inflate_blocks_state inflate_blocks_statef; | ||
16 | |||
17 | extern inflate_blocks_statef * zlib_inflate_blocks_new ( | ||
18 | z_streamp z, | ||
19 | check_func c, /* check function */ | ||
20 | uInt w); /* window size */ | ||
21 | |||
22 | extern int zlib_inflate_blocks ( | ||
23 | inflate_blocks_statef *, | ||
24 | z_streamp , | ||
25 | int); /* initial return code */ | ||
26 | |||
27 | extern void zlib_inflate_blocks_reset ( | ||
28 | inflate_blocks_statef *, | ||
29 | z_streamp , | ||
30 | uLong *); /* check value on output */ | ||
31 | |||
32 | extern int zlib_inflate_blocks_free ( | ||
33 | inflate_blocks_statef *, | ||
34 | z_streamp); | ||
35 | |||
36 | extern void zlib_inflate_set_dictionary ( | ||
37 | inflate_blocks_statef *s, | ||
38 | const Byte *d, /* dictionary */ | ||
39 | uInt n); /* dictionary length */ | ||
40 | |||
41 | extern int zlib_inflate_blocks_sync_point ( | ||
42 | inflate_blocks_statef *s); | ||
43 | |||
44 | #endif /* _INFBLOCK_H */ | ||
diff --git a/lib/zlib_inflate/infcodes.c b/lib/zlib_inflate/infcodes.c new file mode 100644 index 000000000000..07cd7591cbb7 --- /dev/null +++ b/lib/zlib_inflate/infcodes.c | |||
@@ -0,0 +1,202 @@ | |||
1 | /* infcodes.c -- process literals and length/distance pairs | ||
2 | * Copyright (C) 1995-1998 Mark Adler | ||
3 | * For conditions of distribution and use, see copyright notice in zlib.h | ||
4 | */ | ||
5 | |||
6 | #include <linux/zutil.h> | ||
7 | #include "inftrees.h" | ||
8 | #include "infblock.h" | ||
9 | #include "infcodes.h" | ||
10 | #include "infutil.h" | ||
11 | #include "inffast.h" | ||
12 | |||
13 | /* simplify the use of the inflate_huft type with some defines */ | ||
14 | #define exop word.what.Exop | ||
15 | #define bits word.what.Bits | ||
16 | |||
17 | inflate_codes_statef *zlib_inflate_codes_new( | ||
18 | uInt bl, | ||
19 | uInt bd, | ||
20 | inflate_huft *tl, | ||
21 | inflate_huft *td, /* need separate declaration for Borland C++ */ | ||
22 | z_streamp z | ||
23 | ) | ||
24 | { | ||
25 | inflate_codes_statef *c; | ||
26 | |||
27 | c = &WS(z)->working_state; | ||
28 | { | ||
29 | c->mode = START; | ||
30 | c->lbits = (Byte)bl; | ||
31 | c->dbits = (Byte)bd; | ||
32 | c->ltree = tl; | ||
33 | c->dtree = td; | ||
34 | } | ||
35 | return c; | ||
36 | } | ||
37 | |||
38 | |||
39 | int zlib_inflate_codes( | ||
40 | inflate_blocks_statef *s, | ||
41 | z_streamp z, | ||
42 | int r | ||
43 | ) | ||
44 | { | ||
45 | uInt j; /* temporary storage */ | ||
46 | inflate_huft *t; /* temporary pointer */ | ||
47 | uInt e; /* extra bits or operation */ | ||
48 | uLong b; /* bit buffer */ | ||
49 | uInt k; /* bits in bit buffer */ | ||
50 | Byte *p; /* input data pointer */ | ||
51 | uInt n; /* bytes available there */ | ||
52 | Byte *q; /* output window write pointer */ | ||
53 | uInt m; /* bytes to end of window or read pointer */ | ||
54 | Byte *f; /* pointer to copy strings from */ | ||
55 | inflate_codes_statef *c = s->sub.decode.codes; /* codes state */ | ||
56 | |||
57 | /* copy input/output information to locals (UPDATE macro restores) */ | ||
58 | LOAD | ||
59 | |||
60 | /* process input and output based on current state */ | ||
61 | while (1) switch (c->mode) | ||
62 | { /* waiting for "i:"=input, "o:"=output, "x:"=nothing */ | ||
63 | case START: /* x: set up for LEN */ | ||
64 | #ifndef SLOW | ||
65 | if (m >= 258 && n >= 10) | ||
66 | { | ||
67 | UPDATE | ||
68 | r = zlib_inflate_fast(c->lbits, c->dbits, c->ltree, c->dtree, s, z); | ||
69 | LOAD | ||
70 | if (r != Z_OK) | ||
71 | { | ||
72 | c->mode = r == Z_STREAM_END ? WASH : BADCODE; | ||
73 | break; | ||
74 | } | ||
75 | } | ||
76 | #endif /* !SLOW */ | ||
77 | c->sub.code.need = c->lbits; | ||
78 | c->sub.code.tree = c->ltree; | ||
79 | c->mode = LEN; | ||
80 | case LEN: /* i: get length/literal/eob next */ | ||
81 | j = c->sub.code.need; | ||
82 | NEEDBITS(j) | ||
83 | t = c->sub.code.tree + ((uInt)b & zlib_inflate_mask[j]); | ||
84 | DUMPBITS(t->bits) | ||
85 | e = (uInt)(t->exop); | ||
86 | if (e == 0) /* literal */ | ||
87 | { | ||
88 | c->sub.lit = t->base; | ||
89 | c->mode = LIT; | ||
90 | break; | ||
91 | } | ||
92 | if (e & 16) /* length */ | ||
93 | { | ||
94 | c->sub.copy.get = e & 15; | ||
95 | c->len = t->base; | ||
96 | c->mode = LENEXT; | ||
97 | break; | ||
98 | } | ||
99 | if ((e & 64) == 0) /* next table */ | ||
100 | { | ||
101 | c->sub.code.need = e; | ||
102 | c->sub.code.tree = t + t->base; | ||
103 | break; | ||
104 | } | ||
105 | if (e & 32) /* end of block */ | ||
106 | { | ||
107 | c->mode = WASH; | ||
108 | break; | ||
109 | } | ||
110 | c->mode = BADCODE; /* invalid code */ | ||
111 | z->msg = (char*)"invalid literal/length code"; | ||
112 | r = Z_DATA_ERROR; | ||
113 | LEAVE | ||
114 | case LENEXT: /* i: getting length extra (have base) */ | ||
115 | j = c->sub.copy.get; | ||
116 | NEEDBITS(j) | ||
117 | c->len += (uInt)b & zlib_inflate_mask[j]; | ||
118 | DUMPBITS(j) | ||
119 | c->sub.code.need = c->dbits; | ||
120 | c->sub.code.tree = c->dtree; | ||
121 | c->mode = DIST; | ||
122 | case DIST: /* i: get distance next */ | ||
123 | j = c->sub.code.need; | ||
124 | NEEDBITS(j) | ||
125 | t = c->sub.code.tree + ((uInt)b & zlib_inflate_mask[j]); | ||
126 | DUMPBITS(t->bits) | ||
127 | e = (uInt)(t->exop); | ||
128 | if (e & 16) /* distance */ | ||
129 | { | ||
130 | c->sub.copy.get = e & 15; | ||
131 | c->sub.copy.dist = t->base; | ||
132 | c->mode = DISTEXT; | ||
133 | break; | ||
134 | } | ||
135 | if ((e & 64) == 0) /* next table */ | ||
136 | { | ||
137 | c->sub.code.need = e; | ||
138 | c->sub.code.tree = t + t->base; | ||
139 | break; | ||
140 | } | ||
141 | c->mode = BADCODE; /* invalid code */ | ||
142 | z->msg = (char*)"invalid distance code"; | ||
143 | r = Z_DATA_ERROR; | ||
144 | LEAVE | ||
145 | case DISTEXT: /* i: getting distance extra */ | ||
146 | j = c->sub.copy.get; | ||
147 | NEEDBITS(j) | ||
148 | c->sub.copy.dist += (uInt)b & zlib_inflate_mask[j]; | ||
149 | DUMPBITS(j) | ||
150 | c->mode = COPY; | ||
151 | case COPY: /* o: copying bytes in window, waiting for space */ | ||
152 | f = q - c->sub.copy.dist; | ||
153 | while (f < s->window) /* modulo window size-"while" instead */ | ||
154 | f += s->end - s->window; /* of "if" handles invalid distances */ | ||
155 | while (c->len) | ||
156 | { | ||
157 | NEEDOUT | ||
158 | OUTBYTE(*f++) | ||
159 | if (f == s->end) | ||
160 | f = s->window; | ||
161 | c->len--; | ||
162 | } | ||
163 | c->mode = START; | ||
164 | break; | ||
165 | case LIT: /* o: got literal, waiting for output space */ | ||
166 | NEEDOUT | ||
167 | OUTBYTE(c->sub.lit) | ||
168 | c->mode = START; | ||
169 | break; | ||
170 | case WASH: /* o: got eob, possibly more output */ | ||
171 | if (k > 7) /* return unused byte, if any */ | ||
172 | { | ||
173 | k -= 8; | ||
174 | n++; | ||
175 | p--; /* can always return one */ | ||
176 | } | ||
177 | FLUSH | ||
178 | if (s->read != s->write) | ||
179 | LEAVE | ||
180 | c->mode = END; | ||
181 | case END: | ||
182 | r = Z_STREAM_END; | ||
183 | LEAVE | ||
184 | case BADCODE: /* x: got error */ | ||
185 | r = Z_DATA_ERROR; | ||
186 | LEAVE | ||
187 | default: | ||
188 | r = Z_STREAM_ERROR; | ||
189 | LEAVE | ||
190 | } | ||
191 | #ifdef NEED_DUMMY_RETURN | ||
192 | return Z_STREAM_ERROR; /* Some dumb compilers complain without this */ | ||
193 | #endif | ||
194 | } | ||
195 | |||
196 | |||
197 | void zlib_inflate_codes_free( | ||
198 | inflate_codes_statef *c, | ||
199 | z_streamp z | ||
200 | ) | ||
201 | { | ||
202 | } | ||
diff --git a/lib/zlib_inflate/infcodes.h b/lib/zlib_inflate/infcodes.h new file mode 100644 index 000000000000..5cff417523b0 --- /dev/null +++ b/lib/zlib_inflate/infcodes.h | |||
@@ -0,0 +1,33 @@ | |||
1 | /* infcodes.h -- header to use infcodes.c | ||
2 | * Copyright (C) 1995-1998 Mark Adler | ||
3 | * For conditions of distribution and use, see copyright notice in zlib.h | ||
4 | */ | ||
5 | |||
6 | /* WARNING: this file should *not* be used by applications. It is | ||
7 | part of the implementation of the compression library and is | ||
8 | subject to change. Applications should only use zlib.h. | ||
9 | */ | ||
10 | |||
11 | #ifndef _INFCODES_H | ||
12 | #define _INFCODES_H | ||
13 | |||
14 | #include "infblock.h" | ||
15 | |||
16 | struct inflate_codes_state; | ||
17 | typedef struct inflate_codes_state inflate_codes_statef; | ||
18 | |||
19 | extern inflate_codes_statef *zlib_inflate_codes_new ( | ||
20 | uInt, uInt, | ||
21 | inflate_huft *, inflate_huft *, | ||
22 | z_streamp ); | ||
23 | |||
24 | extern int zlib_inflate_codes ( | ||
25 | inflate_blocks_statef *, | ||
26 | z_streamp , | ||
27 | int); | ||
28 | |||
29 | extern void zlib_inflate_codes_free ( | ||
30 | inflate_codes_statef *, | ||
31 | z_streamp ); | ||
32 | |||
33 | #endif /* _INFCODES_H */ | ||
diff --git a/lib/zlib_inflate/inffast.c b/lib/zlib_inflate/inffast.c new file mode 100644 index 000000000000..0bd7623fc85a --- /dev/null +++ b/lib/zlib_inflate/inffast.c | |||
@@ -0,0 +1,176 @@ | |||
1 | /* inffast.c -- process literals and length/distance pairs fast | ||
2 | * Copyright (C) 1995-1998 Mark Adler | ||
3 | * For conditions of distribution and use, see copyright notice in zlib.h | ||
4 | */ | ||
5 | |||
6 | #include <linux/zutil.h> | ||
7 | #include "inftrees.h" | ||
8 | #include "infblock.h" | ||
9 | #include "infcodes.h" | ||
10 | #include "infutil.h" | ||
11 | #include "inffast.h" | ||
12 | |||
13 | struct inflate_codes_state; | ||
14 | |||
15 | /* simplify the use of the inflate_huft type with some defines */ | ||
16 | #define exop word.what.Exop | ||
17 | #define bits word.what.Bits | ||
18 | |||
19 | /* macros for bit input with no checking and for returning unused bytes */ | ||
20 | #define GRABBITS(j) {while(k<(j)){b|=((uLong)NEXTBYTE)<<k;k+=8;}} | ||
21 | #define UNGRAB {c=z->avail_in-n;c=(k>>3)<c?k>>3:c;n+=c;p-=c;k-=c<<3;} | ||
22 | |||
23 | /* Called with number of bytes left to write in window at least 258 | ||
24 | (the maximum string length) and number of input bytes available | ||
25 | at least ten. The ten bytes are six bytes for the longest length/ | ||
26 | distance pair plus four bytes for overloading the bit buffer. */ | ||
27 | |||
28 | int zlib_inflate_fast( | ||
29 | uInt bl, | ||
30 | uInt bd, | ||
31 | inflate_huft *tl, | ||
32 | inflate_huft *td, /* need separate declaration for Borland C++ */ | ||
33 | inflate_blocks_statef *s, | ||
34 | z_streamp z | ||
35 | ) | ||
36 | { | ||
37 | inflate_huft *t; /* temporary pointer */ | ||
38 | uInt e; /* extra bits or operation */ | ||
39 | uLong b; /* bit buffer */ | ||
40 | uInt k; /* bits in bit buffer */ | ||
41 | Byte *p; /* input data pointer */ | ||
42 | uInt n; /* bytes available there */ | ||
43 | Byte *q; /* output window write pointer */ | ||
44 | uInt m; /* bytes to end of window or read pointer */ | ||
45 | uInt ml; /* mask for literal/length tree */ | ||
46 | uInt md; /* mask for distance tree */ | ||
47 | uInt c; /* bytes to copy */ | ||
48 | uInt d; /* distance back to copy from */ | ||
49 | Byte *r; /* copy source pointer */ | ||
50 | |||
51 | /* load input, output, bit values */ | ||
52 | LOAD | ||
53 | |||
54 | /* initialize masks */ | ||
55 | ml = zlib_inflate_mask[bl]; | ||
56 | md = zlib_inflate_mask[bd]; | ||
57 | |||
58 | /* do until not enough input or output space for fast loop */ | ||
59 | do { /* assume called with m >= 258 && n >= 10 */ | ||
60 | /* get literal/length code */ | ||
61 | GRABBITS(20) /* max bits for literal/length code */ | ||
62 | if ((e = (t = tl + ((uInt)b & ml))->exop) == 0) | ||
63 | { | ||
64 | DUMPBITS(t->bits) | ||
65 | *q++ = (Byte)t->base; | ||
66 | m--; | ||
67 | continue; | ||
68 | } | ||
69 | do { | ||
70 | DUMPBITS(t->bits) | ||
71 | if (e & 16) | ||
72 | { | ||
73 | /* get extra bits for length */ | ||
74 | e &= 15; | ||
75 | c = t->base + ((uInt)b & zlib_inflate_mask[e]); | ||
76 | DUMPBITS(e) | ||
77 | |||
78 | /* decode distance base of block to copy */ | ||
79 | GRABBITS(15); /* max bits for distance code */ | ||
80 | e = (t = td + ((uInt)b & md))->exop; | ||
81 | do { | ||
82 | DUMPBITS(t->bits) | ||
83 | if (e & 16) | ||
84 | { | ||
85 | /* get extra bits to add to distance base */ | ||
86 | e &= 15; | ||
87 | GRABBITS(e) /* get extra bits (up to 13) */ | ||
88 | d = t->base + ((uInt)b & zlib_inflate_mask[e]); | ||
89 | DUMPBITS(e) | ||
90 | |||
91 | /* do the copy */ | ||
92 | m -= c; | ||
93 | r = q - d; | ||
94 | if (r < s->window) /* wrap if needed */ | ||
95 | { | ||
96 | do { | ||
97 | r += s->end - s->window; /* force pointer in window */ | ||
98 | } while (r < s->window); /* covers invalid distances */ | ||
99 | e = s->end - r; | ||
100 | if (c > e) | ||
101 | { | ||
102 | c -= e; /* wrapped copy */ | ||
103 | do { | ||
104 | *q++ = *r++; | ||
105 | } while (--e); | ||
106 | r = s->window; | ||
107 | do { | ||
108 | *q++ = *r++; | ||
109 | } while (--c); | ||
110 | } | ||
111 | else /* normal copy */ | ||
112 | { | ||
113 | *q++ = *r++; c--; | ||
114 | *q++ = *r++; c--; | ||
115 | do { | ||
116 | *q++ = *r++; | ||
117 | } while (--c); | ||
118 | } | ||
119 | } | ||
120 | else /* normal copy */ | ||
121 | { | ||
122 | *q++ = *r++; c--; | ||
123 | *q++ = *r++; c--; | ||
124 | do { | ||
125 | *q++ = *r++; | ||
126 | } while (--c); | ||
127 | } | ||
128 | break; | ||
129 | } | ||
130 | else if ((e & 64) == 0) | ||
131 | { | ||
132 | t += t->base; | ||
133 | e = (t += ((uInt)b & zlib_inflate_mask[e]))->exop; | ||
134 | } | ||
135 | else | ||
136 | { | ||
137 | z->msg = (char*)"invalid distance code"; | ||
138 | UNGRAB | ||
139 | UPDATE | ||
140 | return Z_DATA_ERROR; | ||
141 | } | ||
142 | } while (1); | ||
143 | break; | ||
144 | } | ||
145 | if ((e & 64) == 0) | ||
146 | { | ||
147 | t += t->base; | ||
148 | if ((e = (t += ((uInt)b & zlib_inflate_mask[e]))->exop) == 0) | ||
149 | { | ||
150 | DUMPBITS(t->bits) | ||
151 | *q++ = (Byte)t->base; | ||
152 | m--; | ||
153 | break; | ||
154 | } | ||
155 | } | ||
156 | else if (e & 32) | ||
157 | { | ||
158 | UNGRAB | ||
159 | UPDATE | ||
160 | return Z_STREAM_END; | ||
161 | } | ||
162 | else | ||
163 | { | ||
164 | z->msg = (char*)"invalid literal/length code"; | ||
165 | UNGRAB | ||
166 | UPDATE | ||
167 | return Z_DATA_ERROR; | ||
168 | } | ||
169 | } while (1); | ||
170 | } while (m >= 258 && n >= 10); | ||
171 | |||
172 | /* not enough input or output--restore pointers and return */ | ||
173 | UNGRAB | ||
174 | UPDATE | ||
175 | return Z_OK; | ||
176 | } | ||
diff --git a/lib/zlib_inflate/inffast.h b/lib/zlib_inflate/inffast.h new file mode 100644 index 000000000000..fc720f0fa7f5 --- /dev/null +++ b/lib/zlib_inflate/inffast.h | |||
@@ -0,0 +1,17 @@ | |||
1 | /* inffast.h -- header to use inffast.c | ||
2 | * Copyright (C) 1995-1998 Mark Adler | ||
3 | * For conditions of distribution and use, see copyright notice in zlib.h | ||
4 | */ | ||
5 | |||
6 | /* WARNING: this file should *not* be used by applications. It is | ||
7 | part of the implementation of the compression library and is | ||
8 | subject to change. Applications should only use zlib.h. | ||
9 | */ | ||
10 | |||
11 | extern int zlib_inflate_fast ( | ||
12 | uInt, | ||
13 | uInt, | ||
14 | inflate_huft *, | ||
15 | inflate_huft *, | ||
16 | inflate_blocks_statef *, | ||
17 | z_streamp ); | ||
diff --git a/lib/zlib_inflate/inflate.c b/lib/zlib_inflate/inflate.c new file mode 100644 index 000000000000..3d94cb90c1d3 --- /dev/null +++ b/lib/zlib_inflate/inflate.c | |||
@@ -0,0 +1,248 @@ | |||
1 | /* inflate.c -- zlib interface to inflate modules | ||
2 | * Copyright (C) 1995-1998 Mark Adler | ||
3 | * For conditions of distribution and use, see copyright notice in zlib.h | ||
4 | */ | ||
5 | |||
6 | #include <linux/module.h> | ||
7 | #include <linux/zutil.h> | ||
8 | #include "infblock.h" | ||
9 | #include "infutil.h" | ||
10 | |||
11 | int zlib_inflate_workspacesize(void) | ||
12 | { | ||
13 | return sizeof(struct inflate_workspace); | ||
14 | } | ||
15 | |||
16 | |||
17 | int zlib_inflateReset( | ||
18 | z_streamp z | ||
19 | ) | ||
20 | { | ||
21 | if (z == NULL || z->state == NULL || z->workspace == NULL) | ||
22 | return Z_STREAM_ERROR; | ||
23 | z->total_in = z->total_out = 0; | ||
24 | z->msg = NULL; | ||
25 | z->state->mode = z->state->nowrap ? BLOCKS : METHOD; | ||
26 | zlib_inflate_blocks_reset(z->state->blocks, z, NULL); | ||
27 | return Z_OK; | ||
28 | } | ||
29 | |||
30 | |||
31 | int zlib_inflateEnd( | ||
32 | z_streamp z | ||
33 | ) | ||
34 | { | ||
35 | if (z == NULL || z->state == NULL || z->workspace == NULL) | ||
36 | return Z_STREAM_ERROR; | ||
37 | if (z->state->blocks != NULL) | ||
38 | zlib_inflate_blocks_free(z->state->blocks, z); | ||
39 | z->state = NULL; | ||
40 | return Z_OK; | ||
41 | } | ||
42 | |||
43 | |||
44 | int zlib_inflateInit2_( | ||
45 | z_streamp z, | ||
46 | int w, | ||
47 | const char *version, | ||
48 | int stream_size | ||
49 | ) | ||
50 | { | ||
51 | if (version == NULL || version[0] != ZLIB_VERSION[0] || | ||
52 | stream_size != sizeof(z_stream) || z->workspace == NULL) | ||
53 | return Z_VERSION_ERROR; | ||
54 | |||
55 | /* initialize state */ | ||
56 | z->msg = NULL; | ||
57 | z->state = &WS(z)->internal_state; | ||
58 | z->state->blocks = NULL; | ||
59 | |||
60 | /* handle undocumented nowrap option (no zlib header or check) */ | ||
61 | z->state->nowrap = 0; | ||
62 | if (w < 0) | ||
63 | { | ||
64 | w = - w; | ||
65 | z->state->nowrap = 1; | ||
66 | } | ||
67 | |||
68 | /* set window size */ | ||
69 | if (w < 8 || w > 15) | ||
70 | { | ||
71 | zlib_inflateEnd(z); | ||
72 | return Z_STREAM_ERROR; | ||
73 | } | ||
74 | z->state->wbits = (uInt)w; | ||
75 | |||
76 | /* create inflate_blocks state */ | ||
77 | if ((z->state->blocks = | ||
78 | zlib_inflate_blocks_new(z, z->state->nowrap ? NULL : zlib_adler32, (uInt)1 << w)) | ||
79 | == NULL) | ||
80 | { | ||
81 | zlib_inflateEnd(z); | ||
82 | return Z_MEM_ERROR; | ||
83 | } | ||
84 | |||
85 | /* reset state */ | ||
86 | zlib_inflateReset(z); | ||
87 | return Z_OK; | ||
88 | } | ||
89 | |||
90 | |||
91 | /* | ||
92 | * At the end of a Deflate-compressed PPP packet, we expect to have seen | ||
93 | * a `stored' block type value but not the (zero) length bytes. | ||
94 | */ | ||
95 | static int zlib_inflate_packet_flush(inflate_blocks_statef *s) | ||
96 | { | ||
97 | if (s->mode != LENS) | ||
98 | return Z_DATA_ERROR; | ||
99 | s->mode = TYPE; | ||
100 | return Z_OK; | ||
101 | } | ||
102 | |||
103 | |||
104 | int zlib_inflateInit_( | ||
105 | z_streamp z, | ||
106 | const char *version, | ||
107 | int stream_size | ||
108 | ) | ||
109 | { | ||
110 | return zlib_inflateInit2_(z, DEF_WBITS, version, stream_size); | ||
111 | } | ||
112 | |||
113 | #undef NEEDBYTE | ||
114 | #undef NEXTBYTE | ||
115 | #define NEEDBYTE {if(z->avail_in==0)goto empty;r=trv;} | ||
116 | #define NEXTBYTE (z->avail_in--,z->total_in++,*z->next_in++) | ||
117 | |||
118 | int zlib_inflate( | ||
119 | z_streamp z, | ||
120 | int f | ||
121 | ) | ||
122 | { | ||
123 | int r, trv; | ||
124 | uInt b; | ||
125 | |||
126 | if (z == NULL || z->state == NULL || z->next_in == NULL) | ||
127 | return Z_STREAM_ERROR; | ||
128 | trv = f == Z_FINISH ? Z_BUF_ERROR : Z_OK; | ||
129 | r = Z_BUF_ERROR; | ||
130 | while (1) switch (z->state->mode) | ||
131 | { | ||
132 | case METHOD: | ||
133 | NEEDBYTE | ||
134 | if (((z->state->sub.method = NEXTBYTE) & 0xf) != Z_DEFLATED) | ||
135 | { | ||
136 | z->state->mode = I_BAD; | ||
137 | z->msg = (char*)"unknown compression method"; | ||
138 | z->state->sub.marker = 5; /* can't try inflateSync */ | ||
139 | break; | ||
140 | } | ||
141 | if ((z->state->sub.method >> 4) + 8 > z->state->wbits) | ||
142 | { | ||
143 | z->state->mode = I_BAD; | ||
144 | z->msg = (char*)"invalid window size"; | ||
145 | z->state->sub.marker = 5; /* can't try inflateSync */ | ||
146 | break; | ||
147 | } | ||
148 | z->state->mode = FLAG; | ||
149 | case FLAG: | ||
150 | NEEDBYTE | ||
151 | b = NEXTBYTE; | ||
152 | if (((z->state->sub.method << 8) + b) % 31) | ||
153 | { | ||
154 | z->state->mode = I_BAD; | ||
155 | z->msg = (char*)"incorrect header check"; | ||
156 | z->state->sub.marker = 5; /* can't try inflateSync */ | ||
157 | break; | ||
158 | } | ||
159 | if (!(b & PRESET_DICT)) | ||
160 | { | ||
161 | z->state->mode = BLOCKS; | ||
162 | break; | ||
163 | } | ||
164 | z->state->mode = DICT4; | ||
165 | case DICT4: | ||
166 | NEEDBYTE | ||
167 | z->state->sub.check.need = (uLong)NEXTBYTE << 24; | ||
168 | z->state->mode = DICT3; | ||
169 | case DICT3: | ||
170 | NEEDBYTE | ||
171 | z->state->sub.check.need += (uLong)NEXTBYTE << 16; | ||
172 | z->state->mode = DICT2; | ||
173 | case DICT2: | ||
174 | NEEDBYTE | ||
175 | z->state->sub.check.need += (uLong)NEXTBYTE << 8; | ||
176 | z->state->mode = DICT1; | ||
177 | case DICT1: | ||
178 | NEEDBYTE | ||
179 | z->state->sub.check.need += (uLong)NEXTBYTE; | ||
180 | z->adler = z->state->sub.check.need; | ||
181 | z->state->mode = DICT0; | ||
182 | return Z_NEED_DICT; | ||
183 | case DICT0: | ||
184 | z->state->mode = I_BAD; | ||
185 | z->msg = (char*)"need dictionary"; | ||
186 | z->state->sub.marker = 0; /* can try inflateSync */ | ||
187 | return Z_STREAM_ERROR; | ||
188 | case BLOCKS: | ||
189 | r = zlib_inflate_blocks(z->state->blocks, z, r); | ||
190 | if (f == Z_PACKET_FLUSH && z->avail_in == 0 && z->avail_out != 0) | ||
191 | r = zlib_inflate_packet_flush(z->state->blocks); | ||
192 | if (r == Z_DATA_ERROR) | ||
193 | { | ||
194 | z->state->mode = I_BAD; | ||
195 | z->state->sub.marker = 0; /* can try inflateSync */ | ||
196 | break; | ||
197 | } | ||
198 | if (r == Z_OK) | ||
199 | r = trv; | ||
200 | if (r != Z_STREAM_END) | ||
201 | return r; | ||
202 | r = trv; | ||
203 | zlib_inflate_blocks_reset(z->state->blocks, z, &z->state->sub.check.was); | ||
204 | if (z->state->nowrap) | ||
205 | { | ||
206 | z->state->mode = I_DONE; | ||
207 | break; | ||
208 | } | ||
209 | z->state->mode = CHECK4; | ||
210 | case CHECK4: | ||
211 | NEEDBYTE | ||
212 | z->state->sub.check.need = (uLong)NEXTBYTE << 24; | ||
213 | z->state->mode = CHECK3; | ||
214 | case CHECK3: | ||
215 | NEEDBYTE | ||
216 | z->state->sub.check.need += (uLong)NEXTBYTE << 16; | ||
217 | z->state->mode = CHECK2; | ||
218 | case CHECK2: | ||
219 | NEEDBYTE | ||
220 | z->state->sub.check.need += (uLong)NEXTBYTE << 8; | ||
221 | z->state->mode = CHECK1; | ||
222 | case CHECK1: | ||
223 | NEEDBYTE | ||
224 | z->state->sub.check.need += (uLong)NEXTBYTE; | ||
225 | |||
226 | if (z->state->sub.check.was != z->state->sub.check.need) | ||
227 | { | ||
228 | z->state->mode = I_BAD; | ||
229 | z->msg = (char*)"incorrect data check"; | ||
230 | z->state->sub.marker = 5; /* can't try inflateSync */ | ||
231 | break; | ||
232 | } | ||
233 | z->state->mode = I_DONE; | ||
234 | case I_DONE: | ||
235 | return Z_STREAM_END; | ||
236 | case I_BAD: | ||
237 | return Z_DATA_ERROR; | ||
238 | default: | ||
239 | return Z_STREAM_ERROR; | ||
240 | } | ||
241 | empty: | ||
242 | if (f != Z_PACKET_FLUSH) | ||
243 | return r; | ||
244 | z->state->mode = I_BAD; | ||
245 | z->msg = (char *)"need more for packet flush"; | ||
246 | z->state->sub.marker = 0; /* can try inflateSync */ | ||
247 | return Z_DATA_ERROR; | ||
248 | } | ||
diff --git a/lib/zlib_inflate/inflate_syms.c b/lib/zlib_inflate/inflate_syms.c new file mode 100644 index 000000000000..aa1b08189121 --- /dev/null +++ b/lib/zlib_inflate/inflate_syms.c | |||
@@ -0,0 +1,22 @@ | |||
1 | /* | ||
2 | * linux/lib/zlib_inflate/inflate_syms.c | ||
3 | * | ||
4 | * Exported symbols for the inflate functionality. | ||
5 | * | ||
6 | */ | ||
7 | |||
8 | #include <linux/module.h> | ||
9 | #include <linux/init.h> | ||
10 | |||
11 | #include <linux/zlib.h> | ||
12 | |||
13 | EXPORT_SYMBOL(zlib_inflate_workspacesize); | ||
14 | EXPORT_SYMBOL(zlib_inflate); | ||
15 | EXPORT_SYMBOL(zlib_inflateInit_); | ||
16 | EXPORT_SYMBOL(zlib_inflateInit2_); | ||
17 | EXPORT_SYMBOL(zlib_inflateEnd); | ||
18 | EXPORT_SYMBOL(zlib_inflateSync); | ||
19 | EXPORT_SYMBOL(zlib_inflateReset); | ||
20 | EXPORT_SYMBOL(zlib_inflateSyncPoint); | ||
21 | EXPORT_SYMBOL(zlib_inflateIncomp); | ||
22 | MODULE_LICENSE("GPL"); | ||
diff --git a/lib/zlib_inflate/inflate_sync.c b/lib/zlib_inflate/inflate_sync.c new file mode 100644 index 000000000000..e07bdb21f55c --- /dev/null +++ b/lib/zlib_inflate/inflate_sync.c | |||
@@ -0,0 +1,148 @@ | |||
1 | /* inflate.c -- zlib interface to inflate modules | ||
2 | * Copyright (C) 1995-1998 Mark Adler | ||
3 | * For conditions of distribution and use, see copyright notice in zlib.h | ||
4 | */ | ||
5 | |||
6 | #include <linux/zutil.h> | ||
7 | #include "infblock.h" | ||
8 | #include "infutil.h" | ||
9 | |||
10 | int zlib_inflateSync( | ||
11 | z_streamp z | ||
12 | ) | ||
13 | { | ||
14 | uInt n; /* number of bytes to look at */ | ||
15 | Byte *p; /* pointer to bytes */ | ||
16 | uInt m; /* number of marker bytes found in a row */ | ||
17 | uLong r, w; /* temporaries to save total_in and total_out */ | ||
18 | |||
19 | /* set up */ | ||
20 | if (z == NULL || z->state == NULL) | ||
21 | return Z_STREAM_ERROR; | ||
22 | if (z->state->mode != I_BAD) | ||
23 | { | ||
24 | z->state->mode = I_BAD; | ||
25 | z->state->sub.marker = 0; | ||
26 | } | ||
27 | if ((n = z->avail_in) == 0) | ||
28 | return Z_BUF_ERROR; | ||
29 | p = z->next_in; | ||
30 | m = z->state->sub.marker; | ||
31 | |||
32 | /* search */ | ||
33 | while (n && m < 4) | ||
34 | { | ||
35 | static const Byte mark[4] = {0, 0, 0xff, 0xff}; | ||
36 | if (*p == mark[m]) | ||
37 | m++; | ||
38 | else if (*p) | ||
39 | m = 0; | ||
40 | else | ||
41 | m = 4 - m; | ||
42 | p++, n--; | ||
43 | } | ||
44 | |||
45 | /* restore */ | ||
46 | z->total_in += p - z->next_in; | ||
47 | z->next_in = p; | ||
48 | z->avail_in = n; | ||
49 | z->state->sub.marker = m; | ||
50 | |||
51 | /* return no joy or set up to restart on a new block */ | ||
52 | if (m != 4) | ||
53 | return Z_DATA_ERROR; | ||
54 | r = z->total_in; w = z->total_out; | ||
55 | zlib_inflateReset(z); | ||
56 | z->total_in = r; z->total_out = w; | ||
57 | z->state->mode = BLOCKS; | ||
58 | return Z_OK; | ||
59 | } | ||
60 | |||
61 | |||
62 | /* Returns true if inflate is currently at the end of a block generated | ||
63 | * by Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP | ||
64 | * implementation to provide an additional safety check. PPP uses Z_SYNC_FLUSH | ||
65 | * but removes the length bytes of the resulting empty stored block. When | ||
66 | * decompressing, PPP checks that at the end of input packet, inflate is | ||
67 | * waiting for these length bytes. | ||
68 | */ | ||
69 | int zlib_inflateSyncPoint( | ||
70 | z_streamp z | ||
71 | ) | ||
72 | { | ||
73 | if (z == NULL || z->state == NULL || z->state->blocks == NULL) | ||
74 | return Z_STREAM_ERROR; | ||
75 | return zlib_inflate_blocks_sync_point(z->state->blocks); | ||
76 | } | ||
77 | |||
78 | /* | ||
79 | * This subroutine adds the data at next_in/avail_in to the output history | ||
80 | * without performing any output. The output buffer must be "caught up"; | ||
81 | * i.e. no pending output (hence s->read equals s->write), and the state must | ||
82 | * be BLOCKS (i.e. we should be willing to see the start of a series of | ||
83 | * BLOCKS). On exit, the output will also be caught up, and the checksum | ||
84 | * will have been updated if need be. | ||
85 | */ | ||
86 | static int zlib_inflate_addhistory(inflate_blocks_statef *s, | ||
87 | z_stream *z) | ||
88 | { | ||
89 | uLong b; /* bit buffer */ /* NOT USED HERE */ | ||
90 | uInt k; /* bits in bit buffer */ /* NOT USED HERE */ | ||
91 | uInt t; /* temporary storage */ | ||
92 | Byte *p; /* input data pointer */ | ||
93 | uInt n; /* bytes available there */ | ||
94 | Byte *q; /* output window write pointer */ | ||
95 | uInt m; /* bytes to end of window or read pointer */ | ||
96 | |||
97 | if (s->read != s->write) | ||
98 | return Z_STREAM_ERROR; | ||
99 | if (s->mode != TYPE) | ||
100 | return Z_DATA_ERROR; | ||
101 | |||
102 | /* we're ready to rock */ | ||
103 | LOAD | ||
104 | /* while there is input ready, copy to output buffer, moving | ||
105 | * pointers as needed. | ||
106 | */ | ||
107 | while (n) { | ||
108 | t = n; /* how many to do */ | ||
109 | /* is there room until end of buffer? */ | ||
110 | if (t > m) t = m; | ||
111 | /* update check information */ | ||
112 | if (s->checkfn != NULL) | ||
113 | s->check = (*s->checkfn)(s->check, q, t); | ||
114 | memcpy(q, p, t); | ||
115 | q += t; | ||
116 | p += t; | ||
117 | n -= t; | ||
118 | z->total_out += t; | ||
119 | s->read = q; /* drag read pointer forward */ | ||
120 | /* WWRAP */ /* expand WWRAP macro by hand to handle s->read */ | ||
121 | if (q == s->end) { | ||
122 | s->read = q = s->window; | ||
123 | m = WAVAIL; | ||
124 | } | ||
125 | } | ||
126 | UPDATE | ||
127 | return Z_OK; | ||
128 | } | ||
129 | |||
130 | |||
131 | /* | ||
132 | * This subroutine adds the data at next_in/avail_in to the output history | ||
133 | * without performing any output. The output buffer must be "caught up"; | ||
134 | * i.e. no pending output (hence s->read equals s->write), and the state must | ||
135 | * be BLOCKS (i.e. we should be willing to see the start of a series of | ||
136 | * BLOCKS). On exit, the output will also be caught up, and the checksum | ||
137 | * will have been updated if need be. | ||
138 | */ | ||
139 | |||
140 | int zlib_inflateIncomp( | ||
141 | z_stream *z | ||
142 | |||
143 | ) | ||
144 | { | ||
145 | if (z->state->mode != BLOCKS) | ||
146 | return Z_DATA_ERROR; | ||
147 | return zlib_inflate_addhistory(z->state->blocks, z); | ||
148 | } | ||
diff --git a/lib/zlib_inflate/inftrees.c b/lib/zlib_inflate/inftrees.c new file mode 100644 index 000000000000..874950ec4858 --- /dev/null +++ b/lib/zlib_inflate/inftrees.c | |||
@@ -0,0 +1,412 @@ | |||
1 | /* inftrees.c -- generate Huffman trees for efficient decoding | ||
2 | * Copyright (C) 1995-1998 Mark Adler | ||
3 | * For conditions of distribution and use, see copyright notice in zlib.h | ||
4 | */ | ||
5 | |||
6 | #include <linux/zutil.h> | ||
7 | #include "inftrees.h" | ||
8 | #include "infutil.h" | ||
9 | |||
10 | static const char inflate_copyright[] __attribute_used__ = | ||
11 | " inflate 1.1.3 Copyright 1995-1998 Mark Adler "; | ||
12 | /* | ||
13 | If you use the zlib library in a product, an acknowledgment is welcome | ||
14 | in the documentation of your product. If for some reason you cannot | ||
15 | include such an acknowledgment, I would appreciate that you keep this | ||
16 | copyright string in the executable of your product. | ||
17 | */ | ||
18 | struct internal_state; | ||
19 | |||
20 | /* simplify the use of the inflate_huft type with some defines */ | ||
21 | #define exop word.what.Exop | ||
22 | #define bits word.what.Bits | ||
23 | |||
24 | |||
25 | static int huft_build ( | ||
26 | uInt *, /* code lengths in bits */ | ||
27 | uInt, /* number of codes */ | ||
28 | uInt, /* number of "simple" codes */ | ||
29 | const uInt *, /* list of base values for non-simple codes */ | ||
30 | const uInt *, /* list of extra bits for non-simple codes */ | ||
31 | inflate_huft **, /* result: starting table */ | ||
32 | uInt *, /* maximum lookup bits (returns actual) */ | ||
33 | inflate_huft *, /* space for trees */ | ||
34 | uInt *, /* hufts used in space */ | ||
35 | uInt * ); /* space for values */ | ||
36 | |||
37 | /* Tables for deflate from PKZIP's appnote.txt. */ | ||
38 | static const uInt cplens[31] = { /* Copy lengths for literal codes 257..285 */ | ||
39 | 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, | ||
40 | 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; | ||
41 | /* see note #13 above about 258 */ | ||
42 | static const uInt cplext[31] = { /* Extra bits for literal codes 257..285 */ | ||
43 | 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, | ||
44 | 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 112, 112}; /* 112==invalid */ | ||
45 | static const uInt cpdist[30] = { /* Copy offsets for distance codes 0..29 */ | ||
46 | 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, | ||
47 | 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, | ||
48 | 8193, 12289, 16385, 24577}; | ||
49 | static const uInt cpdext[30] = { /* Extra bits for distance codes */ | ||
50 | 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, | ||
51 | 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, | ||
52 | 12, 12, 13, 13}; | ||
53 | |||
54 | /* | ||
55 | Huffman code decoding is performed using a multi-level table lookup. | ||
56 | The fastest way to decode is to simply build a lookup table whose | ||
57 | size is determined by the longest code. However, the time it takes | ||
58 | to build this table can also be a factor if the data being decoded | ||
59 | is not very long. The most common codes are necessarily the | ||
60 | shortest codes, so those codes dominate the decoding time, and hence | ||
61 | the speed. The idea is you can have a shorter table that decodes the | ||
62 | shorter, more probable codes, and then point to subsidiary tables for | ||
63 | the longer codes. The time it costs to decode the longer codes is | ||
64 | then traded against the time it takes to make longer tables. | ||
65 | |||
66 | This results of this trade are in the variables lbits and dbits | ||
67 | below. lbits is the number of bits the first level table for literal/ | ||
68 | length codes can decode in one step, and dbits is the same thing for | ||
69 | the distance codes. Subsequent tables are also less than or equal to | ||
70 | those sizes. These values may be adjusted either when all of the | ||
71 | codes are shorter than that, in which case the longest code length in | ||
72 | bits is used, or when the shortest code is *longer* than the requested | ||
73 | table size, in which case the length of the shortest code in bits is | ||
74 | used. | ||
75 | |||
76 | There are two different values for the two tables, since they code a | ||
77 | different number of possibilities each. The literal/length table | ||
78 | codes 286 possible values, or in a flat code, a little over eight | ||
79 | bits. The distance table codes 30 possible values, or a little less | ||
80 | than five bits, flat. The optimum values for speed end up being | ||
81 | about one bit more than those, so lbits is 8+1 and dbits is 5+1. | ||
82 | The optimum values may differ though from machine to machine, and | ||
83 | possibly even between compilers. Your mileage may vary. | ||
84 | */ | ||
85 | |||
86 | |||
87 | /* If BMAX needs to be larger than 16, then h and x[] should be uLong. */ | ||
88 | #define BMAX 15 /* maximum bit length of any code */ | ||
89 | |||
90 | static int huft_build( | ||
91 | uInt *b, /* code lengths in bits (all assumed <= BMAX) */ | ||
92 | uInt n, /* number of codes (assumed <= 288) */ | ||
93 | uInt s, /* number of simple-valued codes (0..s-1) */ | ||
94 | const uInt *d, /* list of base values for non-simple codes */ | ||
95 | const uInt *e, /* list of extra bits for non-simple codes */ | ||
96 | inflate_huft **t, /* result: starting table */ | ||
97 | uInt *m, /* maximum lookup bits, returns actual */ | ||
98 | inflate_huft *hp, /* space for trees */ | ||
99 | uInt *hn, /* hufts used in space */ | ||
100 | uInt *v /* working area: values in order of bit length */ | ||
101 | ) | ||
102 | /* Given a list of code lengths and a maximum table size, make a set of | ||
103 | tables to decode that set of codes. Return Z_OK on success, Z_BUF_ERROR | ||
104 | if the given code set is incomplete (the tables are still built in this | ||
105 | case), Z_DATA_ERROR if the input is invalid (an over-subscribed set of | ||
106 | lengths), or Z_MEM_ERROR if not enough memory. */ | ||
107 | { | ||
108 | |||
109 | uInt a; /* counter for codes of length k */ | ||
110 | uInt c[BMAX+1]; /* bit length count table */ | ||
111 | uInt f; /* i repeats in table every f entries */ | ||
112 | int g; /* maximum code length */ | ||
113 | int h; /* table level */ | ||
114 | register uInt i; /* counter, current code */ | ||
115 | register uInt j; /* counter */ | ||
116 | register int k; /* number of bits in current code */ | ||
117 | int l; /* bits per table (returned in m) */ | ||
118 | uInt mask; /* (1 << w) - 1, to avoid cc -O bug on HP */ | ||
119 | register uInt *p; /* pointer into c[], b[], or v[] */ | ||
120 | inflate_huft *q; /* points to current table */ | ||
121 | struct inflate_huft_s r; /* table entry for structure assignment */ | ||
122 | inflate_huft *u[BMAX]; /* table stack */ | ||
123 | register int w; /* bits before this table == (l * h) */ | ||
124 | uInt x[BMAX+1]; /* bit offsets, then code stack */ | ||
125 | uInt *xp; /* pointer into x */ | ||
126 | int y; /* number of dummy codes added */ | ||
127 | uInt z; /* number of entries in current table */ | ||
128 | |||
129 | |||
130 | /* Generate counts for each bit length */ | ||
131 | p = c; | ||
132 | #define C0 *p++ = 0; | ||
133 | #define C2 C0 C0 C0 C0 | ||
134 | #define C4 C2 C2 C2 C2 | ||
135 | C4 /* clear c[]--assume BMAX+1 is 16 */ | ||
136 | p = b; i = n; | ||
137 | do { | ||
138 | c[*p++]++; /* assume all entries <= BMAX */ | ||
139 | } while (--i); | ||
140 | if (c[0] == n) /* null input--all zero length codes */ | ||
141 | { | ||
142 | *t = NULL; | ||
143 | *m = 0; | ||
144 | return Z_OK; | ||
145 | } | ||
146 | |||
147 | |||
148 | /* Find minimum and maximum length, bound *m by those */ | ||
149 | l = *m; | ||
150 | for (j = 1; j <= BMAX; j++) | ||
151 | if (c[j]) | ||
152 | break; | ||
153 | k = j; /* minimum code length */ | ||
154 | if ((uInt)l < j) | ||
155 | l = j; | ||
156 | for (i = BMAX; i; i--) | ||
157 | if (c[i]) | ||
158 | break; | ||
159 | g = i; /* maximum code length */ | ||
160 | if ((uInt)l > i) | ||
161 | l = i; | ||
162 | *m = l; | ||
163 | |||
164 | |||
165 | /* Adjust last length count to fill out codes, if needed */ | ||
166 | for (y = 1 << j; j < i; j++, y <<= 1) | ||
167 | if ((y -= c[j]) < 0) | ||
168 | return Z_DATA_ERROR; | ||
169 | if ((y -= c[i]) < 0) | ||
170 | return Z_DATA_ERROR; | ||
171 | c[i] += y; | ||
172 | |||
173 | |||
174 | /* Generate starting offsets into the value table for each length */ | ||
175 | x[1] = j = 0; | ||
176 | p = c + 1; xp = x + 2; | ||
177 | while (--i) { /* note that i == g from above */ | ||
178 | *xp++ = (j += *p++); | ||
179 | } | ||
180 | |||
181 | |||
182 | /* Make a table of values in order of bit lengths */ | ||
183 | p = b; i = 0; | ||
184 | do { | ||
185 | if ((j = *p++) != 0) | ||
186 | v[x[j]++] = i; | ||
187 | } while (++i < n); | ||
188 | n = x[g]; /* set n to length of v */ | ||
189 | |||
190 | |||
191 | /* Generate the Huffman codes and for each, make the table entries */ | ||
192 | x[0] = i = 0; /* first Huffman code is zero */ | ||
193 | p = v; /* grab values in bit order */ | ||
194 | h = -1; /* no tables yet--level -1 */ | ||
195 | w = -l; /* bits decoded == (l * h) */ | ||
196 | u[0] = NULL; /* just to keep compilers happy */ | ||
197 | q = NULL; /* ditto */ | ||
198 | z = 0; /* ditto */ | ||
199 | |||
200 | /* go through the bit lengths (k already is bits in shortest code) */ | ||
201 | for (; k <= g; k++) | ||
202 | { | ||
203 | a = c[k]; | ||
204 | while (a--) | ||
205 | { | ||
206 | /* here i is the Huffman code of length k bits for value *p */ | ||
207 | /* make tables up to required level */ | ||
208 | while (k > w + l) | ||
209 | { | ||
210 | h++; | ||
211 | w += l; /* previous table always l bits */ | ||
212 | |||
213 | /* compute minimum size table less than or equal to l bits */ | ||
214 | z = g - w; | ||
215 | z = z > (uInt)l ? l : z; /* table size upper limit */ | ||
216 | if ((f = 1 << (j = k - w)) > a + 1) /* try a k-w bit table */ | ||
217 | { /* too few codes for k-w bit table */ | ||
218 | f -= a + 1; /* deduct codes from patterns left */ | ||
219 | xp = c + k; | ||
220 | if (j < z) | ||
221 | while (++j < z) /* try smaller tables up to z bits */ | ||
222 | { | ||
223 | if ((f <<= 1) <= *++xp) | ||
224 | break; /* enough codes to use up j bits */ | ||
225 | f -= *xp; /* else deduct codes from patterns */ | ||
226 | } | ||
227 | } | ||
228 | z = 1 << j; /* table entries for j-bit table */ | ||
229 | |||
230 | /* allocate new table */ | ||
231 | if (*hn + z > MANY) /* (note: doesn't matter for fixed) */ | ||
232 | return Z_DATA_ERROR; /* overflow of MANY */ | ||
233 | u[h] = q = hp + *hn; | ||
234 | *hn += z; | ||
235 | |||
236 | /* connect to last table, if there is one */ | ||
237 | if (h) | ||
238 | { | ||
239 | x[h] = i; /* save pattern for backing up */ | ||
240 | r.bits = (Byte)l; /* bits to dump before this table */ | ||
241 | r.exop = (Byte)j; /* bits in this table */ | ||
242 | j = i >> (w - l); | ||
243 | r.base = (uInt)(q - u[h-1] - j); /* offset to this table */ | ||
244 | u[h-1][j] = r; /* connect to last table */ | ||
245 | } | ||
246 | else | ||
247 | *t = q; /* first table is returned result */ | ||
248 | } | ||
249 | |||
250 | /* set up table entry in r */ | ||
251 | r.bits = (Byte)(k - w); | ||
252 | if (p >= v + n) | ||
253 | r.exop = 128 + 64; /* out of values--invalid code */ | ||
254 | else if (*p < s) | ||
255 | { | ||
256 | r.exop = (Byte)(*p < 256 ? 0 : 32 + 64); /* 256 is end-of-block */ | ||
257 | r.base = *p++; /* simple code is just the value */ | ||
258 | } | ||
259 | else | ||
260 | { | ||
261 | r.exop = (Byte)(e[*p - s] + 16 + 64);/* non-simple--look up in lists */ | ||
262 | r.base = d[*p++ - s]; | ||
263 | } | ||
264 | |||
265 | /* fill code-like entries with r */ | ||
266 | f = 1 << (k - w); | ||
267 | for (j = i >> w; j < z; j += f) | ||
268 | q[j] = r; | ||
269 | |||
270 | /* backwards increment the k-bit code i */ | ||
271 | for (j = 1 << (k - 1); i & j; j >>= 1) | ||
272 | i ^= j; | ||
273 | i ^= j; | ||
274 | |||
275 | /* backup over finished tables */ | ||
276 | mask = (1 << w) - 1; /* needed on HP, cc -O bug */ | ||
277 | while ((i & mask) != x[h]) | ||
278 | { | ||
279 | h--; /* don't need to update q */ | ||
280 | w -= l; | ||
281 | mask = (1 << w) - 1; | ||
282 | } | ||
283 | } | ||
284 | } | ||
285 | |||
286 | |||
287 | /* Return Z_BUF_ERROR if we were given an incomplete table */ | ||
288 | return y != 0 && g != 1 ? Z_BUF_ERROR : Z_OK; | ||
289 | } | ||
290 | |||
291 | |||
292 | int zlib_inflate_trees_bits( | ||
293 | uInt *c, /* 19 code lengths */ | ||
294 | uInt *bb, /* bits tree desired/actual depth */ | ||
295 | inflate_huft **tb, /* bits tree result */ | ||
296 | inflate_huft *hp, /* space for trees */ | ||
297 | z_streamp z /* for messages */ | ||
298 | ) | ||
299 | { | ||
300 | int r; | ||
301 | uInt hn = 0; /* hufts used in space */ | ||
302 | uInt *v; /* work area for huft_build */ | ||
303 | |||
304 | v = WS(z)->tree_work_area_1; | ||
305 | r = huft_build(c, 19, 19, NULL, NULL, tb, bb, hp, &hn, v); | ||
306 | if (r == Z_DATA_ERROR) | ||
307 | z->msg = (char*)"oversubscribed dynamic bit lengths tree"; | ||
308 | else if (r == Z_BUF_ERROR || *bb == 0) | ||
309 | { | ||
310 | z->msg = (char*)"incomplete dynamic bit lengths tree"; | ||
311 | r = Z_DATA_ERROR; | ||
312 | } | ||
313 | return r; | ||
314 | } | ||
315 | |||
316 | int zlib_inflate_trees_dynamic( | ||
317 | uInt nl, /* number of literal/length codes */ | ||
318 | uInt nd, /* number of distance codes */ | ||
319 | uInt *c, /* that many (total) code lengths */ | ||
320 | uInt *bl, /* literal desired/actual bit depth */ | ||
321 | uInt *bd, /* distance desired/actual bit depth */ | ||
322 | inflate_huft **tl, /* literal/length tree result */ | ||
323 | inflate_huft **td, /* distance tree result */ | ||
324 | inflate_huft *hp, /* space for trees */ | ||
325 | z_streamp z /* for messages */ | ||
326 | ) | ||
327 | { | ||
328 | int r; | ||
329 | uInt hn = 0; /* hufts used in space */ | ||
330 | uInt *v; /* work area for huft_build */ | ||
331 | |||
332 | /* allocate work area */ | ||
333 | v = WS(z)->tree_work_area_2; | ||
334 | |||
335 | /* build literal/length tree */ | ||
336 | r = huft_build(c, nl, 257, cplens, cplext, tl, bl, hp, &hn, v); | ||
337 | if (r != Z_OK || *bl == 0) | ||
338 | { | ||
339 | if (r == Z_DATA_ERROR) | ||
340 | z->msg = (char*)"oversubscribed literal/length tree"; | ||
341 | else if (r != Z_MEM_ERROR) | ||
342 | { | ||
343 | z->msg = (char*)"incomplete literal/length tree"; | ||
344 | r = Z_DATA_ERROR; | ||
345 | } | ||
346 | return r; | ||
347 | } | ||
348 | |||
349 | /* build distance tree */ | ||
350 | r = huft_build(c + nl, nd, 0, cpdist, cpdext, td, bd, hp, &hn, v); | ||
351 | if (r != Z_OK || (*bd == 0 && nl > 257)) | ||
352 | { | ||
353 | if (r == Z_DATA_ERROR) | ||
354 | z->msg = (char*)"oversubscribed distance tree"; | ||
355 | else if (r == Z_BUF_ERROR) { | ||
356 | #ifdef PKZIP_BUG_WORKAROUND | ||
357 | r = Z_OK; | ||
358 | } | ||
359 | #else | ||
360 | z->msg = (char*)"incomplete distance tree"; | ||
361 | r = Z_DATA_ERROR; | ||
362 | } | ||
363 | else if (r != Z_MEM_ERROR) | ||
364 | { | ||
365 | z->msg = (char*)"empty distance tree with lengths"; | ||
366 | r = Z_DATA_ERROR; | ||
367 | } | ||
368 | return r; | ||
369 | #endif | ||
370 | } | ||
371 | |||
372 | /* done */ | ||
373 | return Z_OK; | ||
374 | } | ||
375 | |||
376 | |||
377 | int zlib_inflate_trees_fixed( | ||
378 | uInt *bl, /* literal desired/actual bit depth */ | ||
379 | uInt *bd, /* distance desired/actual bit depth */ | ||
380 | inflate_huft **tl, /* literal/length tree result */ | ||
381 | inflate_huft **td, /* distance tree result */ | ||
382 | inflate_huft *hp, /* space for trees */ | ||
383 | z_streamp z /* for memory allocation */ | ||
384 | ) | ||
385 | { | ||
386 | int i; /* temporary variable */ | ||
387 | unsigned l[288]; /* length list for huft_build */ | ||
388 | uInt *v; /* work area for huft_build */ | ||
389 | |||
390 | /* set up literal table */ | ||
391 | for (i = 0; i < 144; i++) | ||
392 | l[i] = 8; | ||
393 | for (; i < 256; i++) | ||
394 | l[i] = 9; | ||
395 | for (; i < 280; i++) | ||
396 | l[i] = 7; | ||
397 | for (; i < 288; i++) /* make a complete, but wrong code set */ | ||
398 | l[i] = 8; | ||
399 | *bl = 9; | ||
400 | v = WS(z)->tree_work_area_1; | ||
401 | if ((i = huft_build(l, 288, 257, cplens, cplext, tl, bl, hp, &i, v)) != 0) | ||
402 | return i; | ||
403 | |||
404 | /* set up distance table */ | ||
405 | for (i = 0; i < 30; i++) /* make an incomplete code set */ | ||
406 | l[i] = 5; | ||
407 | *bd = 5; | ||
408 | if ((i = huft_build(l, 30, 0, cpdist, cpdext, td, bd, hp, &i, v)) > 1) | ||
409 | return i; | ||
410 | |||
411 | return Z_OK; | ||
412 | } | ||
diff --git a/lib/zlib_inflate/inftrees.h b/lib/zlib_inflate/inftrees.h new file mode 100644 index 000000000000..e37705adc008 --- /dev/null +++ b/lib/zlib_inflate/inftrees.h | |||
@@ -0,0 +1,64 @@ | |||
1 | /* inftrees.h -- header to use inftrees.c | ||
2 | * Copyright (C) 1995-1998 Mark Adler | ||
3 | * For conditions of distribution and use, see copyright notice in zlib.h | ||
4 | */ | ||
5 | |||
6 | /* WARNING: this file should *not* be used by applications. It is | ||
7 | part of the implementation of the compression library and is | ||
8 | subject to change. Applications should only use zlib.h. | ||
9 | */ | ||
10 | |||
11 | /* Huffman code lookup table entry--this entry is four bytes for machines | ||
12 | that have 16-bit pointers (e.g. PC's in the small or medium model). */ | ||
13 | |||
14 | #ifndef _INFTREES_H | ||
15 | #define _INFTREES_H | ||
16 | |||
17 | typedef struct inflate_huft_s inflate_huft; | ||
18 | |||
19 | struct inflate_huft_s { | ||
20 | union { | ||
21 | struct { | ||
22 | Byte Exop; /* number of extra bits or operation */ | ||
23 | Byte Bits; /* number of bits in this code or subcode */ | ||
24 | } what; | ||
25 | uInt pad; /* pad structure to a power of 2 (4 bytes for */ | ||
26 | } word; /* 16-bit, 8 bytes for 32-bit int's) */ | ||
27 | uInt base; /* literal, length base, distance base, | ||
28 | or table offset */ | ||
29 | }; | ||
30 | |||
31 | /* Maximum size of dynamic tree. The maximum found in a long but non- | ||
32 | exhaustive search was 1004 huft structures (850 for length/literals | ||
33 | and 154 for distances, the latter actually the result of an | ||
34 | exhaustive search). The actual maximum is not known, but the | ||
35 | value below is more than safe. */ | ||
36 | #define MANY 1440 | ||
37 | |||
38 | extern int zlib_inflate_trees_bits ( | ||
39 | uInt *, /* 19 code lengths */ | ||
40 | uInt *, /* bits tree desired/actual depth */ | ||
41 | inflate_huft **, /* bits tree result */ | ||
42 | inflate_huft *, /* space for trees */ | ||
43 | z_streamp); /* for messages */ | ||
44 | |||
45 | extern int zlib_inflate_trees_dynamic ( | ||
46 | uInt, /* number of literal/length codes */ | ||
47 | uInt, /* number of distance codes */ | ||
48 | uInt *, /* that many (total) code lengths */ | ||
49 | uInt *, /* literal desired/actual bit depth */ | ||
50 | uInt *, /* distance desired/actual bit depth */ | ||
51 | inflate_huft **, /* literal/length tree result */ | ||
52 | inflate_huft **, /* distance tree result */ | ||
53 | inflate_huft *, /* space for trees */ | ||
54 | z_streamp); /* for messages */ | ||
55 | |||
56 | extern int zlib_inflate_trees_fixed ( | ||
57 | uInt *, /* literal desired/actual bit depth */ | ||
58 | uInt *, /* distance desired/actual bit depth */ | ||
59 | inflate_huft **, /* literal/length tree result */ | ||
60 | inflate_huft **, /* distance tree result */ | ||
61 | inflate_huft *, /* space for trees */ | ||
62 | z_streamp); /* for memory allocation */ | ||
63 | |||
64 | #endif /* _INFTREES_H */ | ||
diff --git a/lib/zlib_inflate/infutil.c b/lib/zlib_inflate/infutil.c new file mode 100644 index 000000000000..00202b3438e1 --- /dev/null +++ b/lib/zlib_inflate/infutil.c | |||
@@ -0,0 +1,88 @@ | |||
1 | /* inflate_util.c -- data and routines common to blocks and codes | ||
2 | * Copyright (C) 1995-1998 Mark Adler | ||
3 | * For conditions of distribution and use, see copyright notice in zlib.h | ||
4 | */ | ||
5 | |||
6 | #include <linux/zutil.h> | ||
7 | #include "infblock.h" | ||
8 | #include "inftrees.h" | ||
9 | #include "infcodes.h" | ||
10 | #include "infutil.h" | ||
11 | |||
12 | struct inflate_codes_state; | ||
13 | |||
14 | /* And'ing with mask[n] masks the lower n bits */ | ||
15 | uInt zlib_inflate_mask[17] = { | ||
16 | 0x0000, | ||
17 | 0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff, | ||
18 | 0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff | ||
19 | }; | ||
20 | |||
21 | |||
22 | /* copy as much as possible from the sliding window to the output area */ | ||
23 | int zlib_inflate_flush( | ||
24 | inflate_blocks_statef *s, | ||
25 | z_streamp z, | ||
26 | int r | ||
27 | ) | ||
28 | { | ||
29 | uInt n; | ||
30 | Byte *p; | ||
31 | Byte *q; | ||
32 | |||
33 | /* local copies of source and destination pointers */ | ||
34 | p = z->next_out; | ||
35 | q = s->read; | ||
36 | |||
37 | /* compute number of bytes to copy as far as end of window */ | ||
38 | n = (uInt)((q <= s->write ? s->write : s->end) - q); | ||
39 | if (n > z->avail_out) n = z->avail_out; | ||
40 | if (n && r == Z_BUF_ERROR) r = Z_OK; | ||
41 | |||
42 | /* update counters */ | ||
43 | z->avail_out -= n; | ||
44 | z->total_out += n; | ||
45 | |||
46 | /* update check information */ | ||
47 | if (s->checkfn != NULL) | ||
48 | z->adler = s->check = (*s->checkfn)(s->check, q, n); | ||
49 | |||
50 | /* copy as far as end of window */ | ||
51 | memcpy(p, q, n); | ||
52 | p += n; | ||
53 | q += n; | ||
54 | |||
55 | /* see if more to copy at beginning of window */ | ||
56 | if (q == s->end) | ||
57 | { | ||
58 | /* wrap pointers */ | ||
59 | q = s->window; | ||
60 | if (s->write == s->end) | ||
61 | s->write = s->window; | ||
62 | |||
63 | /* compute bytes to copy */ | ||
64 | n = (uInt)(s->write - q); | ||
65 | if (n > z->avail_out) n = z->avail_out; | ||
66 | if (n && r == Z_BUF_ERROR) r = Z_OK; | ||
67 | |||
68 | /* update counters */ | ||
69 | z->avail_out -= n; | ||
70 | z->total_out += n; | ||
71 | |||
72 | /* update check information */ | ||
73 | if (s->checkfn != NULL) | ||
74 | z->adler = s->check = (*s->checkfn)(s->check, q, n); | ||
75 | |||
76 | /* copy */ | ||
77 | memcpy(p, q, n); | ||
78 | p += n; | ||
79 | q += n; | ||
80 | } | ||
81 | |||
82 | /* update pointers */ | ||
83 | z->next_out = p; | ||
84 | s->read = q; | ||
85 | |||
86 | /* done */ | ||
87 | return r; | ||
88 | } | ||
diff --git a/lib/zlib_inflate/infutil.h b/lib/zlib_inflate/infutil.h new file mode 100644 index 000000000000..a15875fc5f72 --- /dev/null +++ b/lib/zlib_inflate/infutil.h | |||
@@ -0,0 +1,197 @@ | |||
1 | /* infutil.h -- types and macros common to blocks and codes | ||
2 | * Copyright (C) 1995-1998 Mark Adler | ||
3 | * For conditions of distribution and use, see copyright notice in zlib.h | ||
4 | */ | ||
5 | |||
6 | /* WARNING: this file should *not* be used by applications. It is | ||
7 | part of the implementation of the compression library and is | ||
8 | subject to change. Applications should only use zlib.h. | ||
9 | */ | ||
10 | |||
11 | #ifndef _INFUTIL_H | ||
12 | #define _INFUTIL_H | ||
13 | |||
14 | #include <linux/zconf.h> | ||
15 | #include "inftrees.h" | ||
16 | #include "infcodes.h" | ||
17 | |||
18 | typedef enum { | ||
19 | TYPE, /* get type bits (3, including end bit) */ | ||
20 | LENS, /* get lengths for stored */ | ||
21 | STORED, /* processing stored block */ | ||
22 | TABLE, /* get table lengths */ | ||
23 | BTREE, /* get bit lengths tree for a dynamic block */ | ||
24 | DTREE, /* get length, distance trees for a dynamic block */ | ||
25 | CODES, /* processing fixed or dynamic block */ | ||
26 | DRY, /* output remaining window bytes */ | ||
27 | B_DONE, /* finished last block, done */ | ||
28 | B_BAD} /* got a data error--stuck here */ | ||
29 | inflate_block_mode; | ||
30 | |||
31 | /* inflate blocks semi-private state */ | ||
32 | struct inflate_blocks_state { | ||
33 | |||
34 | /* mode */ | ||
35 | inflate_block_mode mode; /* current inflate_block mode */ | ||
36 | |||
37 | /* mode dependent information */ | ||
38 | union { | ||
39 | uInt left; /* if STORED, bytes left to copy */ | ||
40 | struct { | ||
41 | uInt table; /* table lengths (14 bits) */ | ||
42 | uInt index; /* index into blens (or border) */ | ||
43 | uInt *blens; /* bit lengths of codes */ | ||
44 | uInt bb; /* bit length tree depth */ | ||
45 | inflate_huft *tb; /* bit length decoding tree */ | ||
46 | } trees; /* if DTREE, decoding info for trees */ | ||
47 | struct { | ||
48 | inflate_codes_statef | ||
49 | *codes; | ||
50 | } decode; /* if CODES, current state */ | ||
51 | } sub; /* submode */ | ||
52 | uInt last; /* true if this block is the last block */ | ||
53 | |||
54 | /* mode independent information */ | ||
55 | uInt bitk; /* bits in bit buffer */ | ||
56 | uLong bitb; /* bit buffer */ | ||
57 | inflate_huft *hufts; /* single malloc for tree space */ | ||
58 | Byte *window; /* sliding window */ | ||
59 | Byte *end; /* one byte after sliding window */ | ||
60 | Byte *read; /* window read pointer */ | ||
61 | Byte *write; /* window write pointer */ | ||
62 | check_func checkfn; /* check function */ | ||
63 | uLong check; /* check on output */ | ||
64 | |||
65 | }; | ||
66 | |||
67 | |||
68 | /* defines for inflate input/output */ | ||
69 | /* update pointers and return */ | ||
70 | #define UPDBITS {s->bitb=b;s->bitk=k;} | ||
71 | #define UPDIN {z->avail_in=n;z->total_in+=p-z->next_in;z->next_in=p;} | ||
72 | #define UPDOUT {s->write=q;} | ||
73 | #define UPDATE {UPDBITS UPDIN UPDOUT} | ||
74 | #define LEAVE {UPDATE return zlib_inflate_flush(s,z,r);} | ||
75 | /* get bytes and bits */ | ||
76 | #define LOADIN {p=z->next_in;n=z->avail_in;b=s->bitb;k=s->bitk;} | ||
77 | #define NEEDBYTE {if(n)r=Z_OK;else LEAVE} | ||
78 | #define NEXTBYTE (n--,*p++) | ||
79 | #define NEEDBITS(j) {while(k<(j)){NEEDBYTE;b|=((uLong)NEXTBYTE)<<k;k+=8;}} | ||
80 | #define DUMPBITS(j) {b>>=(j);k-=(j);} | ||
81 | /* output bytes */ | ||
82 | #define WAVAIL (uInt)(q<s->read?s->read-q-1:s->end-q) | ||
83 | #define LOADOUT {q=s->write;m=(uInt)WAVAIL;} | ||
84 | #define WRAP {if(q==s->end&&s->read!=s->window){q=s->window;m=(uInt)WAVAIL;}} | ||
85 | #define FLUSH {UPDOUT r=zlib_inflate_flush(s,z,r); LOADOUT} | ||
86 | #define NEEDOUT {if(m==0){WRAP if(m==0){FLUSH WRAP if(m==0) LEAVE}}r=Z_OK;} | ||
87 | #define OUTBYTE(a) {*q++=(Byte)(a);m--;} | ||
88 | /* load local pointers */ | ||
89 | #define LOAD {LOADIN LOADOUT} | ||
90 | |||
91 | /* masks for lower bits (size given to avoid silly warnings with Visual C++) */ | ||
92 | extern uInt zlib_inflate_mask[17]; | ||
93 | |||
94 | /* copy as much as possible from the sliding window to the output area */ | ||
95 | extern int zlib_inflate_flush ( | ||
96 | inflate_blocks_statef *, | ||
97 | z_streamp , | ||
98 | int); | ||
99 | |||
100 | /* inflate private state */ | ||
101 | typedef enum { | ||
102 | METHOD, /* waiting for method byte */ | ||
103 | FLAG, /* waiting for flag byte */ | ||
104 | DICT4, /* four dictionary check bytes to go */ | ||
105 | DICT3, /* three dictionary check bytes to go */ | ||
106 | DICT2, /* two dictionary check bytes to go */ | ||
107 | DICT1, /* one dictionary check byte to go */ | ||
108 | DICT0, /* waiting for inflateSetDictionary */ | ||
109 | BLOCKS, /* decompressing blocks */ | ||
110 | CHECK4, /* four check bytes to go */ | ||
111 | CHECK3, /* three check bytes to go */ | ||
112 | CHECK2, /* two check bytes to go */ | ||
113 | CHECK1, /* one check byte to go */ | ||
114 | I_DONE, /* finished check, done */ | ||
115 | I_BAD} /* got an error--stay here */ | ||
116 | inflate_mode; | ||
117 | |||
118 | struct internal_state { | ||
119 | |||
120 | /* mode */ | ||
121 | inflate_mode mode; /* current inflate mode */ | ||
122 | |||
123 | /* mode dependent information */ | ||
124 | union { | ||
125 | uInt method; /* if FLAGS, method byte */ | ||
126 | struct { | ||
127 | uLong was; /* computed check value */ | ||
128 | uLong need; /* stream check value */ | ||
129 | } check; /* if CHECK, check values to compare */ | ||
130 | uInt marker; /* if BAD, inflateSync's marker bytes count */ | ||
131 | } sub; /* submode */ | ||
132 | |||
133 | /* mode independent information */ | ||
134 | int nowrap; /* flag for no wrapper */ | ||
135 | uInt wbits; /* log2(window size) (8..15, defaults to 15) */ | ||
136 | inflate_blocks_statef | ||
137 | *blocks; /* current inflate_blocks state */ | ||
138 | |||
139 | }; | ||
140 | |||
141 | /* inflate codes private state */ | ||
142 | typedef enum { /* waiting for "i:"=input, "o:"=output, "x:"=nothing */ | ||
143 | START, /* x: set up for LEN */ | ||
144 | LEN, /* i: get length/literal/eob next */ | ||
145 | LENEXT, /* i: getting length extra (have base) */ | ||
146 | DIST, /* i: get distance next */ | ||
147 | DISTEXT, /* i: getting distance extra */ | ||
148 | COPY, /* o: copying bytes in window, waiting for space */ | ||
149 | LIT, /* o: got literal, waiting for output space */ | ||
150 | WASH, /* o: got eob, possibly still output waiting */ | ||
151 | END, /* x: got eob and all data flushed */ | ||
152 | BADCODE} /* x: got error */ | ||
153 | inflate_codes_mode; | ||
154 | |||
155 | struct inflate_codes_state { | ||
156 | |||
157 | /* mode */ | ||
158 | inflate_codes_mode mode; /* current inflate_codes mode */ | ||
159 | |||
160 | /* mode dependent information */ | ||
161 | uInt len; | ||
162 | union { | ||
163 | struct { | ||
164 | inflate_huft *tree; /* pointer into tree */ | ||
165 | uInt need; /* bits needed */ | ||
166 | } code; /* if LEN or DIST, where in tree */ | ||
167 | uInt lit; /* if LIT, literal */ | ||
168 | struct { | ||
169 | uInt get; /* bits to get for extra */ | ||
170 | uInt dist; /* distance back to copy from */ | ||
171 | } copy; /* if EXT or COPY, where and how much */ | ||
172 | } sub; /* submode */ | ||
173 | |||
174 | /* mode independent information */ | ||
175 | Byte lbits; /* ltree bits decoded per branch */ | ||
176 | Byte dbits; /* dtree bits decoder per branch */ | ||
177 | inflate_huft *ltree; /* literal/length/eob tree */ | ||
178 | inflate_huft *dtree; /* distance tree */ | ||
179 | |||
180 | }; | ||
181 | |||
182 | /* memory allocation for inflation */ | ||
183 | |||
184 | struct inflate_workspace { | ||
185 | inflate_codes_statef working_state; | ||
186 | struct inflate_blocks_state working_blocks_state; | ||
187 | struct internal_state internal_state; | ||
188 | unsigned int tree_work_area_1[19]; | ||
189 | unsigned int tree_work_area_2[288]; | ||
190 | unsigned working_blens[258 + 0x1f + 0x1f]; | ||
191 | inflate_huft working_hufts[MANY]; | ||
192 | unsigned char working_window[1 << MAX_WBITS]; | ||
193 | }; | ||
194 | |||
195 | #define WS(z) ((struct inflate_workspace *)(z->workspace)) | ||
196 | |||
197 | #endif | ||