mirror of
git://projects.qi-hardware.com/openwrt-xburst.git
synced 2024-11-24 05:12:29 +02:00
[brcm63xx] add bcm47xx lzma initramfs patch which is useful to workaround some CFE limitations when ramdisk kernels are too big
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@16709 3c298f89-4303-0410-b956-a3cf2f4a3e73
This commit is contained in:
parent
351db39bc7
commit
aabb055a7c
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
|
Loading…
Reference in New Issue
Block a user