2 * RLE Compression functions for kernel crash dumps.
4 * Created by: Matt Robinson (yakker@sourceforge.net)
5 * Copyright 2001 Matt D. Robinson. All rights reserved.
7 * This code is released under version 2 of the GNU GPL.
11 #include <linux/config.h>
12 #include <linux/module.h>
13 #include <linux/sched.h>
15 #include <linux/file.h>
16 #include <linux/init.h>
17 #include <linux/dump.h>
20 * Name: dump_compress_rle()
21 * Func: Compress a DUMP_PAGE_SIZE (hardware) page down to something more
22 * reasonable, if possible. This is the same routine we use in IRIX.
25 dump_compress_rle(const u8 *old, u16 oldsize, u8 *new, u16 newsize)
27 u16 ri, wi, count = 0;
28 u_char value = 0, cur_byte;
31 * If the block should happen to "compress" to larger than the
32 * buffer size, allocate a larger one and change cur_buf_size.
37 while (ri < oldsize) {
39 cur_byte = value = old[ri];
43 if (wi + 3 > oldsize) {
49 value = cur_byte = old[ri];
52 if ((cur_byte = old[ri]) == value) {
56 if (wi + 3 > oldsize) {
62 } else if (count == 1) {
64 if (wi + 3 > oldsize) {
71 if (wi + 2 > oldsize) {
77 } else { /* count == 0 */
79 if (wi + 2 > oldsize) {
85 if (wi + 1 > oldsize) {
95 } /* if byte == value */
97 } /* if count == 255 */
104 if (wi + 3 > oldsize) {
110 } else if (count == 1) {
112 if (wi + 3 > oldsize)
118 if (wi + 2 > oldsize)
123 } else { /* count == 0 */
125 if (wi + 2 > oldsize)
130 if (wi + 1 > oldsize)
141 /* setup the rle compression functionality */
142 static struct __dump_compress dump_rle_compression = {
143 .compress_type = DUMP_COMPRESS_RLE,
144 .compress_func = dump_compress_rle,
145 .compress_name = "RLE",
149 * Name: dump_compress_rle_init()
150 * Func: Initialize rle compression for dumping.
153 dump_compress_rle_init(void)
155 dump_register_compression(&dump_rle_compression);
160 * Name: dump_compress_rle_cleanup()
161 * Func: Remove rle compression for dumping.
164 dump_compress_rle_cleanup(void)
166 dump_unregister_compression(DUMP_COMPRESS_RLE);
169 /* module initialization */
170 module_init(dump_compress_rle_init);
171 module_exit(dump_compress_rle_cleanup);
173 MODULE_LICENSE("GPL");
174 MODULE_AUTHOR("LKCD Development Team <lkcd-devel@lists.sourceforge.net>");
175 MODULE_DESCRIPTION("RLE compression module for crash dump driver");