add bcm47xx lzma initramfs patch which is useful to workaround some CFE limitations when ramdisk kernels are too big
SVN-Revision: 16709
This commit is contained in:
		
							
								
								
									
										125
									
								
								target/linux/brcm63xx/patches-2.6.27/500-lzma_initramfs.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										125
									
								
								target/linux/brcm63xx/patches-2.6.27/500-lzma_initramfs.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,125 @@
 | 
				
			|||||||
 | 
					--- a/init/initramfs.c
 | 
				
			||||||
 | 
					+++ b/init/initramfs.c
 | 
				
			||||||
 | 
					@@ -6,6 +6,7 @@
 | 
				
			||||||
 | 
					 #include <linux/delay.h>
 | 
				
			||||||
 | 
					 #include <linux/string.h>
 | 
				
			||||||
 | 
					 #include <linux/syscalls.h>
 | 
				
			||||||
 | 
					+#include <linux/vmalloc.h>
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 static __initdata char *message;
 | 
				
			||||||
 | 
					 static void __init error(char *x)
 | 
				
			||||||
 | 
					@@ -423,6 +424,69 @@ static void __init flush_window(void)
 | 
				
			||||||
 | 
					 	outcnt = 0;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+#include <linux/LzmaDecode.h>
 | 
				
			||||||
 | 
					+static int __init lzma_unzip(void)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	unsigned int i;  /* temp value */
 | 
				
			||||||
 | 
					+	unsigned int lc; /* literal context bits */
 | 
				
			||||||
 | 
					+	unsigned int lp; /* literal pos state bits */
 | 
				
			||||||
 | 
					+	unsigned int pb; /* pos state bits */
 | 
				
			||||||
 | 
					+	unsigned int osize; /* uncompressed size */
 | 
				
			||||||
 | 
					+	unsigned char *workspace;
 | 
				
			||||||
 | 
					+	unsigned char* outputbuffer;
 | 
				
			||||||
 | 
					+	unsigned int outsizeProcessed = 0;
 | 
				
			||||||
 | 
					+	int workspace_size;
 | 
				
			||||||
 | 
					+	int res;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	// lzma args
 | 
				
			||||||
 | 
					+	i = get_byte();
 | 
				
			||||||
 | 
					+	lc = i % 9, i = i / 9;
 | 
				
			||||||
 | 
					+	lp = i % 5, pb = i / 5;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	// skip dictionary size
 | 
				
			||||||
 | 
					+	for (i = 0; i < 4; i++)
 | 
				
			||||||
 | 
					+		get_byte();
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	/* read the lower half of uncompressed size in the header */
 | 
				
			||||||
 | 
					+	osize = ((unsigned int)get_byte()) +
 | 
				
			||||||
 | 
					+		((unsigned int)get_byte() << 8) +
 | 
				
			||||||
 | 
					+		((unsigned int)get_byte() << 16) +
 | 
				
			||||||
 | 
					+		((unsigned int)get_byte() << 24);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	/* skip rest of the header (upper half of uncompressed size) */
 | 
				
			||||||
 | 
					+	for (i = 0; i < 4; i++)
 | 
				
			||||||
 | 
					+		get_byte();
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	workspace_size = ((LZMA_BASE_SIZE + (LZMA_LIT_SIZE << (lc + lp))) * sizeof(CProb)) + 100;
 | 
				
			||||||
 | 
					+	printk( KERN_NOTICE "initramfs: LZMA lc=%d,lp=%d,pb=%d,origSize=%d\n",
 | 
				
			||||||
 | 
					+	lc,lp,pb,osize);
 | 
				
			||||||
 | 
					+	outputbuffer = vmalloc(osize);
 | 
				
			||||||
 | 
					+	if (outputbuffer == 0) {
 | 
				
			||||||
 | 
					+		printk(KERN_ERR "initramfs: Couldn't allocate lzma output buffer\n");
 | 
				
			||||||
 | 
					+		return -1;
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	workspace = vmalloc(workspace_size);
 | 
				
			||||||
 | 
					+	if (workspace == NULL) {
 | 
				
			||||||
 | 
					+		printk(KERN_ERR "initramfs: Couldn't allocate lzma workspace\n");
 | 
				
			||||||
 | 
					+		return -1;
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	res = LzmaDecode(workspace, workspace_size, lc, lp, pb, inbuf + inptr, insize - inptr, outputbuffer, osize, &outsizeProcessed);
 | 
				
			||||||
 | 
					+	if( res != 0 ) {
 | 
				
			||||||
 | 
					+		panic( KERN_ERR "initramfs: Lzma decode failure\n");
 | 
				
			||||||
 | 
					+		return -1;
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	flush_buffer(outputbuffer, outsizeProcessed);
 | 
				
			||||||
 | 
					+	inptr = insize;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	vfree(outputbuffer);
 | 
				
			||||||
 | 
					+	vfree(workspace);
 | 
				
			||||||
 | 
					+	state = Reset;
 | 
				
			||||||
 | 
					+	return 0;
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 static char * __init unpack_to_rootfs(char *buf, unsigned len, int check_only)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					 	int written;
 | 
				
			||||||
 | 
					@@ -457,12 +521,28 @@ static char * __init unpack_to_rootfs(ch
 | 
				
			||||||
 | 
					 		inptr = 0;
 | 
				
			||||||
 | 
					 		outcnt = 0;		/* bytes in output buffer */
 | 
				
			||||||
 | 
					 		bytes_out = 0;
 | 
				
			||||||
 | 
					-		crc = (ulg)0xffffffffL; /* shift register contents */
 | 
				
			||||||
 | 
					-		makecrc();
 | 
				
			||||||
 | 
					-		gunzip();
 | 
				
			||||||
 | 
					-		if (state != Reset)
 | 
				
			||||||
 | 
					+		if( inbuf[0] == 037 && ((inbuf[1] == 0213) || (inbuf[1] == 0236)))
 | 
				
			||||||
 | 
					+		{
 | 
				
			||||||
 | 
					+		   printk( KERN_NOTICE "detected gzip initramfs\n");
 | 
				
			||||||
 | 
					+		   crc = (ulg)0xffffffffL; /* shift register contents */
 | 
				
			||||||
 | 
					+		   makecrc();
 | 
				
			||||||
 | 
					+		   gunzip();
 | 
				
			||||||
 | 
					+		   if (state != Reset)
 | 
				
			||||||
 | 
					 			error("junk in gzipped archive");
 | 
				
			||||||
 | 
					-		this_header = saved_offset + inptr;
 | 
				
			||||||
 | 
					+		}
 | 
				
			||||||
 | 
					+		else if(!memcmp(inbuf+1, "\x00\x00\x80\x00", 4)) /* FIXME: hardcoded dictionary size */
 | 
				
			||||||
 | 
					+		{
 | 
				
			||||||
 | 
					+		   printk( KERN_NOTICE "detected lzma initramfs\n");
 | 
				
			||||||
 | 
					+		   lzma_unzip();
 | 
				
			||||||
 | 
					+		}
 | 
				
			||||||
 | 
					+		else
 | 
				
			||||||
 | 
					+		{
 | 
				
			||||||
 | 
					+		   // skip forward ?
 | 
				
			||||||
 | 
					+		   crc = (ulg)0xffffffffL; /* shift register contents */
 | 
				
			||||||
 | 
					+		   makecrc();
 | 
				
			||||||
 | 
					+		   gunzip();
 | 
				
			||||||
 | 
					+		}
 | 
				
			||||||
 | 
					+	        this_header = saved_offset + inptr;
 | 
				
			||||||
 | 
					 		buf += inptr;
 | 
				
			||||||
 | 
					 		len -= inptr;
 | 
				
			||||||
 | 
					 	}
 | 
				
			||||||
 | 
					--- a/scripts/gen_initramfs_list.sh
 | 
				
			||||||
 | 
					+++ b/scripts/gen_initramfs_list.sh
 | 
				
			||||||
 | 
					@@ -287,7 +287,7 @@ if [ ! -z ${output_file} ]; then
 | 
				
			||||||
 | 
					 	if [ "${is_cpio_compressed}" = "compressed" ]; then
 | 
				
			||||||
 | 
					 		cat ${cpio_tfile} > ${output_file}
 | 
				
			||||||
 | 
					 	else
 | 
				
			||||||
 | 
					-		cat ${cpio_tfile} | gzip -f -9 - > ${output_file}
 | 
				
			||||||
 | 
					+		lzma e -lc1 -lp2 -pb2 ${cpio_tfile} ${output_file}
 | 
				
			||||||
 | 
					 	fi
 | 
				
			||||||
 | 
					 	[ -z ${cpio_file} ] && rm ${cpio_tfile}
 | 
				
			||||||
 | 
					 fi
 | 
				
			||||||
		Reference in New Issue
	
	Block a user