diff options
Diffstat (limited to 'target/linux/rdc/patches-2.6.28')
7 files changed, 0 insertions, 3621 deletions
diff --git a/target/linux/rdc/patches-2.6.28/001-rdc3210_flash_map.patch b/target/linux/rdc/patches-2.6.28/001-rdc3210_flash_map.patch deleted file mode 100644 index 2c35b841a3..0000000000 --- a/target/linux/rdc/patches-2.6.28/001-rdc3210_flash_map.patch +++ /dev/null @@ -1,63 +0,0 @@ ---- a/drivers/mtd/maps/Kconfig -+++ b/drivers/mtd/maps/Kconfig -@@ -112,6 +112,50 @@ config MTD_SUN_UFLASH - Sun Microsystems boardsets. This driver will require CFI support - in the kernel, so if you did not enable CFI previously, do that now. - -+config MTD_RDC3210 -+ tristate "CFI Flash device mapped on RDC3210" -+ depends on X86 && MTD_CFI && MTD_PARTITIONS -+ help -+ RDC-3210 is the flash device we find on Ralink reference board. -+ -+config MTD_RDC3210_STATIC_MAP -+ bool "Partitions on RDC3210 mapped statically" if MTD_RDC3210 -+ select MTD_RDC3210_FACTORY_PRESENT -+ help -+ The mapping driver will use the static partition map for the -+ RDC-3210 flash device. -+ -+config MTD_RDC3210_FACTORY_PRESENT -+ bool "Reserve a partition on RDC3210 for factory presets" -+ depends on MTD_RDC3210 -+ default y -+ help -+ The mapping driver will reserve a partition on the RDC-3210 flash -+ device for resetting flash contents to factory defaults. -+ -+config MTD_RDC3210_ALLOW_JFFS2 -+ bool "JFFS2 filesystem usable in a partition on RDC3210" -+ depends on MTD_RDC3210 && !MTD_RDC3210_STATIC_MAP -+ help -+ The mapping driver will align a partition on the RDC-3210 flash -+ device to an erase-block boundary so that a JFFS2 filesystem may -+ reside on it. -+ -+config MTD_RDC3210_SIZE -+ hex "Amount of flash memory on RDC3210" -+ depends on MTD_RDC3210 -+ default "0x400000" -+ help -+ Total size in bytes of the RDC-3210 flash device -+ -+config MTD_RDC3210_BUSWIDTH -+ int "Width of CFI Flash device mapped on RDC3210" -+ depends on MTD_RDC3210 -+ default "2" -+ help -+ Number of bytes addressed on the RDC-3210 flash device before -+ addressing the same chip again -+ - config MTD_SC520CDP - tristate "CFI Flash device mapped on AMD SC520 CDP" - depends on X86 && MTD_CFI && MTD_CONCAT ---- a/drivers/mtd/maps/Makefile -+++ b/drivers/mtd/maps/Makefile -@@ -27,6 +27,7 @@ obj-$(CONFIG_MTD_PHYSMAP_OF) += physmap_ - obj-$(CONFIG_MTD_PMC_MSP_EVM) += pmcmsp-flash.o - obj-$(CONFIG_MTD_PMC_MSP_RAMROOT)+= pmcmsp-ramroot.o - obj-$(CONFIG_MTD_PCMCIA) += pcmciamtd.o -+obj-$(CONFIG_MTD_RDC3210) += rdc3210.o - obj-$(CONFIG_MTD_RPXLITE) += rpxlite.o - obj-$(CONFIG_MTD_TQM8XXL) += tqm8xxl.o - obj-$(CONFIG_MTD_SA1100) += sa1100-flash.o diff --git a/target/linux/rdc/patches-2.6.28/002-platform_support.patch b/target/linux/rdc/patches-2.6.28/002-platform_support.patch deleted file mode 100644 index bb2c7cb3a8..0000000000 --- a/target/linux/rdc/patches-2.6.28/002-platform_support.patch +++ /dev/null @@ -1,334 +0,0 @@ -Index: linux-2.6.28.10/arch/x86/mach-rdc321x/gpio.c -=================================================================== ---- linux-2.6.28.10.orig/arch/x86/mach-rdc321x/gpio.c 2009-11-03 21:01:29.800401126 -0800 -+++ linux-2.6.28.10/arch/x86/mach-rdc321x/gpio.c 2009-11-03 21:01:32.164401226 -0800 -@@ -26,7 +26,7 @@ - #include <linux/types.h> - #include <linux/module.h> - --#include <asm/gpio.h> -+#include <asm/mach-rdc321x/gpio.h> - #include <asm/mach-rdc321x/rdc321x_defs.h> - - -@@ -74,8 +74,8 @@ - } - - /* initially setup the 2 copies of the gpio data registers. -- This function must be called by the platform setup code. */ --void __init rdc321x_gpio_setup() -+ This function is called before the platform setup code. */ -+static int __init rdc321x_gpio_setup(void) - { - /* this might not be, what others (BIOS, bootloader, etc.) - wrote to these registers before, but it's a good guess. Still -@@ -83,6 +83,8 @@ - - gpio_data_reg1 = rdc321x_conf_read(RDC321X_GPIO_DATA_REG1); - gpio_data_reg2 = rdc321x_conf_read(RDC321X_GPIO_DATA_REG2); -+ -+ return 0; - } - - /* determine, if gpio number is valid */ -@@ -192,3 +194,5 @@ - return 0; - } - EXPORT_SYMBOL(rdc_gpio_direction_output); -+ -+arch_initcall(rdc321x_gpio_setup); -Index: linux-2.6.28.10/arch/x86/mach-rdc321x/platform.c -=================================================================== ---- linux-2.6.28.10.orig/arch/x86/mach-rdc321x/platform.c 2009-11-03 21:01:29.836402559 -0800 -+++ linux-2.6.28.10/arch/x86/mach-rdc321x/platform.c 2009-11-03 21:13:27.212398945 -0800 -@@ -1,7 +1,9 @@ - /* - * Generic RDC321x platform devices - * -+ * Copyright (C) 2007-2008 OpenWrt.org - * Copyright (C) 2007 Florian Fainelli <florian@openwrt.org> -+ * Copyright (C) 2008 Daniel Gimpelevich <daniel@gimpelevich.san-francisco.ca.us> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License -@@ -25,13 +27,59 @@ - #include <linux/list.h> - #include <linux/device.h> - #include <linux/platform_device.h> -+#include <linux/version.h> - #include <linux/leds.h> -+#include <linux/gpio_keys.h> -+#include <linux/input.h> -+#include <linux/mtd/map.h> -+#include <linux/mtd/mtd.h> -+#include <linux/mtd/physmap.h> -+#include <linux/root_dev.h> - --#include <asm/gpio.h> -+#include <asm/mach-rdc321x/gpio.h> -+ -+/* Flash */ -+#ifdef CONFIG_MTD_R8610 -+#define CONFIG_MTD_RDC3210 1 -+#elif defined CONFIG_MTD_RDC3210 -+static struct resource rdc_flash_resource[] = { -+ [0] = { -+ .start = (u32)-CONFIG_MTD_RDC3210_SIZE, -+ .end = (u32)-1, -+ .flags = IORESOURCE_MEM, -+ }, -+}; -+ -+static struct platform_device rdc_flash_device = { -+ .name = "rdc321x-flash", -+ .id = -1, -+ .num_resources = ARRAY_SIZE(rdc_flash_resource), -+ .resource = rdc_flash_resource, -+}; -+#else -+static struct mtd_partition rdc_flash_parts[15]; -+ -+static struct resource rdc_flash_resource = { -+ .end = (u32)-1, -+ .flags = IORESOURCE_MEM, -+}; -+ -+static struct physmap_flash_data rdc_flash_data = { -+ .parts = rdc_flash_parts, -+}; -+ -+static struct platform_device rdc_flash_device = { -+ .name = "physmap-flash", -+ .id = -1, -+ .resource = &rdc_flash_resource, -+ .num_resources = 1, -+ .dev.platform_data = &rdc_flash_data, -+}; -+#endif - - /* LEDS */ - static struct gpio_led default_leds[] = { -- { .name = "rdc:dmz", .gpio = 1, }, -+ { .name = "rdc321x:dmz", .gpio = 1, }, - }; - - static struct gpio_led_platform_data rdc321x_led_data = { -@@ -54,16 +102,189 @@ - .num_resources = 0, - }; - -+/* Button */ -+static struct gpio_keys_button rdc321x_gpio_btn[] = { -+ { -+ .gpio = 0, -+ .code = BTN_0, -+ .desc = "Reset", -+ .active_low = 1, -+ } -+}; -+ -+static struct gpio_keys_platform_data rdc321x_gpio_btn_data = { -+ .buttons = rdc321x_gpio_btn, -+ .nbuttons = ARRAY_SIZE(rdc321x_gpio_btn), -+}; -+ -+static struct platform_device rdc321x_button = { -+ .name = "gpio-keys", -+ .id = -1, -+ .dev = { -+ .platform_data = &rdc321x_gpio_btn_data, -+ } -+}; -+ - static struct platform_device *rdc321x_devs[] = { -+ &rdc_flash_device, - &rdc321x_leds, -- &rdc321x_wdt -+ &rdc321x_wdt, -+ &rdc321x_button, - }; - -+static int probe_flash_start(struct map_info *the_map) -+{ -+ struct mtd_info *res; -+ -+ the_map->virt = ioremap(the_map->phys, the_map->size); -+ if (the_map->virt == NULL) -+ return 1; -+ for (the_map->bankwidth = 32; the_map->bankwidth; the_map->bankwidth -+ >>= 1) { -+ res = do_map_probe("cfi_probe", the_map); -+ if (res == NULL) -+ res = do_map_probe("jedec_probe", the_map); -+ if (res != NULL) -+ break; -+ } -+ iounmap(the_map->virt); -+ if (res != NULL) -+ the_map->phys = (u32)-(s32)(the_map->size = res->size); -+ return res == NULL; -+} -+ - static int __init rdc_board_setup(void) - { -- rdc321x_gpio_setup(); -+#ifndef CONFIG_MTD_RDC3210 -+ struct map_info rdc_map_info; -+ u32 the_header[8]; - -+ ROOT_DEV = 0; -+ rdc_map_info.name = rdc_flash_device.name; -+ rdc_map_info.phys = 0xff000000; -+ rdc_map_info.size = 0x1000000; -+ rdc_map_info.bankwidth = 2; -+ rdc_map_info.set_vpp = NULL; -+ simple_map_init(&rdc_map_info); -+ while (probe_flash_start(&rdc_map_info)) { -+ rdc_map_info.phys++; -+ if (--rdc_map_info.size) -+ panic("Could not find start of flash!"); -+ } -+ rdc_flash_resource.start = rdc_map_info.phys; -+ rdc_flash_data.width = rdc_map_info.bankwidth; -+ rdc_map_info.virt = ioremap_nocache(rdc_map_info.phys, 0x10); -+ if (rdc_map_info.virt == NULL) -+ panic("Could not ioremap to read device magic!"); -+ the_header[0] = ((u32 *)rdc_map_info.virt)[0]; -+ the_header[1] = ((u32 *)rdc_map_info.virt)[1]; -+ the_header[2] = ((u32 *)rdc_map_info.virt)[2]; -+ the_header[3] = ((u32 *)rdc_map_info.virt)[3]; -+ iounmap(rdc_map_info.virt); -+ rdc_map_info.virt = ioremap_nocache(rdc_map_info.phys + 0x8000, 0x10); -+ if (rdc_map_info.virt == NULL) -+ panic("Could not ioremap to read device magic!"); -+ the_header[4] = ((u32 *)rdc_map_info.virt)[0]; -+ the_header[5] = ((u32 *)rdc_map_info.virt)[1]; -+ the_header[6] = ((u32 *)rdc_map_info.virt)[2]; -+ the_header[7] = ((u32 *)rdc_map_info.virt)[3]; -+ iounmap(rdc_map_info.virt); -+ if (!memcmp(the_header, "GMTK", 4)) { /* Gemtek */ -+ /* TODO */ -+ } else if (!memcmp(the_header + 4, "CSYS", 4)) { /* Sitecom */ -+ rdc_flash_parts[0].name = "system"; -+ rdc_flash_parts[0].offset = 0; -+ rdc_flash_parts[0].size = rdc_map_info.size - 0x10000; -+ rdc_flash_parts[1].name = "config"; -+ rdc_flash_parts[1].offset = 0; -+ rdc_flash_parts[1].size = 0x8000; -+ rdc_flash_parts[2].name = "magic"; -+ rdc_flash_parts[2].offset = 0x8000; -+ rdc_flash_parts[2].size = 0x14; -+ rdc_flash_parts[3].name = "kernel"; -+ rdc_flash_parts[3].offset = 0x8014; -+ rdc_flash_parts[3].size = the_header[5]; -+ rdc_flash_parts[4].name = "rootfs"; -+ rdc_flash_parts[4].offset = 0x8014 + the_header[5]; -+ rdc_flash_parts[4].size = rdc_flash_parts[0].size - rdc_flash_parts[4].offset; -+ rdc_flash_parts[5].name = "bootloader"; -+ rdc_flash_parts[5].offset = rdc_flash_parts[0].size; -+ rdc_flash_parts[5].size = 0x10000; -+ rdc_flash_data.nr_parts = 6; -+ } else if (!memcmp(((u8 *)the_header) + 14, "Li", 2)) { /* AMIT */ -+ rdc_flash_parts[0].name = "kernel_parthdr"; -+ rdc_flash_parts[0].offset = 0; -+ rdc_flash_parts[0].size = 0x10; -+ rdc_flash_parts[1].name = "kernel"; -+ rdc_flash_parts[1].offset = 0x10; -+ rdc_flash_parts[1].size = 0xffff0; -+ rdc_flash_parts[2].name = "rootfs_parthdr"; -+ rdc_flash_parts[2].offset = 0x100000; -+ rdc_flash_parts[2].size = 0x10; -+ rdc_flash_parts[3].name = "rootfs"; -+ rdc_flash_parts[3].offset = 0x100010; -+ rdc_flash_parts[3].size = rdc_map_info.size - 0x160010; -+ rdc_flash_parts[4].name = "config_parthdr"; -+ rdc_flash_parts[4].offset = rdc_map_info.size - 0x60000; -+ rdc_flash_parts[4].size = 0x10; -+ rdc_flash_parts[5].name = "config"; -+ rdc_flash_parts[5].offset = rdc_map_info.size - 0x5fff0; -+ rdc_flash_parts[5].size = 0xfff0; -+ rdc_flash_parts[6].name = "recoveryfs_parthdr"; -+ rdc_flash_parts[6].offset = rdc_map_info.size - 0x50000; -+ rdc_flash_parts[6].size = 0x10; -+ rdc_flash_parts[7].name = "recoveryfs"; -+ rdc_flash_parts[7].offset = rdc_map_info.size - 0x4fff0; -+ rdc_flash_parts[7].size = 0x3fff0; -+ rdc_flash_parts[8].name = "recovery_parthdr"; -+ rdc_flash_parts[8].offset = rdc_map_info.size - 0x10000; -+ rdc_flash_parts[8].size = 0x10; -+ rdc_flash_parts[9].name = "recovery"; -+ rdc_flash_parts[9].offset = rdc_map_info.size - 0xfff0; -+ rdc_flash_parts[9].size = 0x7ff0; -+ rdc_flash_parts[10].name = "productinfo_parthdr"; -+ rdc_flash_parts[10].offset = rdc_map_info.size - 0x8000; -+ rdc_flash_parts[10].size = 0x10; -+ rdc_flash_parts[11].name = "productinfo"; -+ rdc_flash_parts[11].offset = rdc_map_info.size - 0x7ff0; -+ rdc_flash_parts[11].size = 0x1ff0; -+ rdc_flash_parts[12].name = "bootloader_parthdr"; -+ rdc_flash_parts[12].offset = rdc_map_info.size - 0x6000; -+ rdc_flash_parts[12].size = 0x10; -+ rdc_flash_parts[13].name = "bootloader"; -+ rdc_flash_parts[13].offset = rdc_map_info.size - 0x5ff0; -+ rdc_flash_parts[13].size = 0x5ff0; -+ rdc_flash_parts[14].name = "everything"; -+ rdc_flash_parts[14].offset = 0; -+ rdc_flash_parts[14].size = rdc_map_info.size; -+ rdc_flash_data.nr_parts = 15; -+ } else { /* ZyXEL */ -+ rdc_flash_parts[0].name = "kernel"; -+ rdc_flash_parts[0].offset = 0; -+ rdc_flash_parts[0].size = 0x100000; -+ rdc_flash_parts[1].name = "rootfs"; -+ rdc_flash_parts[1].offset = 0x100000; -+ rdc_flash_parts[1].size = rdc_map_info.size - 0x140000; -+ rdc_flash_parts[2].name = "linux"; -+ rdc_flash_parts[2].offset = 0; -+ rdc_flash_parts[2].size = rdc_map_info.size - 0x40000; -+ rdc_flash_parts[3].name = "config"; -+ rdc_flash_parts[3].offset = rdc_map_info.size - 0x40000; -+ rdc_flash_parts[3].size = 0x10000; -+ rdc_flash_parts[4].name = "productinfo"; -+ rdc_flash_parts[4].offset = rdc_map_info.size - 0x30000; -+ rdc_flash_parts[4].size = 0x10000; -+ rdc_flash_parts[5].name = "bootloader"; -+ rdc_flash_parts[5].offset = rdc_map_info.size - 0x20000; -+ rdc_flash_parts[5].size = 0x20000; -+ rdc_flash_data.nr_parts = 6; -+ } -+#endif - return platform_add_devices(rdc321x_devs, ARRAY_SIZE(rdc321x_devs)); - } - -+#ifdef CONFIG_MTD_RDC3210 - arch_initcall(rdc_board_setup); -+#else -+late_initcall(rdc_board_setup); -+#endif -Index: linux-2.6.28.10/arch/x86/Makefile -=================================================================== ---- linux-2.6.28.10.orig/arch/x86/Makefile 2009-11-03 21:01:29.756400281 -0800 -+++ linux-2.6.28.10/arch/x86/Makefile 2009-11-03 21:01:32.164401226 -0800 -@@ -113,6 +113,10 @@ - mflags-$(CONFIG_X86_VOYAGER) := -Iarch/x86/include/asm/mach-voyager - mcore-$(CONFIG_X86_VOYAGER) := arch/x86/mach-voyager/ - -+# RDC subarch support -+mflags-$(CONFIG_X86_RDC321X) := -Iarch/x86/include/asm/mach-rdc321x -+mcore-$(CONFIG_X86_RDC321X) += arch/x86/mach-rdc321x/ -+ - # generic subarchitecture - mflags-$(CONFIG_X86_GENERICARCH):= -Iarch/x86/include/asm/mach-generic - fcore-$(CONFIG_X86_GENERICARCH) += arch/x86/mach-generic/ -Index: linux-2.6.28.10/arch/x86/include/asm/mach-rdc321x/gpio.h -=================================================================== ---- linux-2.6.28.10.orig/arch/x86/include/asm/mach-rdc321x/gpio.h 2009-11-03 21:01:29.784401606 -0800 -+++ linux-2.6.28.10/arch/x86/include/asm/mach-rdc321x/gpio.h 2009-11-03 21:01:32.164401226 -0800 -@@ -9,7 +9,6 @@ - extern int rdc_gpio_direction_output(unsigned gpio, int value); - extern int rdc_gpio_request(unsigned gpio, const char *label); - extern void rdc_gpio_free(unsigned gpio); --extern void __init rdc321x_gpio_setup(void); - - /* Wrappers for the arch-neutral GPIO API */ - diff --git a/target/linux/rdc/patches-2.6.28/004-yenta_mystery.patch b/target/linux/rdc/patches-2.6.28/004-yenta_mystery.patch deleted file mode 100644 index 4c2e2face0..0000000000 --- a/target/linux/rdc/patches-2.6.28/004-yenta_mystery.patch +++ /dev/null @@ -1,20 +0,0 @@ ---- a/drivers/pcmcia/yenta_socket.c -+++ b/drivers/pcmcia/yenta_socket.c -@@ -1174,6 +1174,17 @@ static int __devinit yenta_probe (struct - - /* We must finish initialization here */ - -+#ifdef CONFIG_X86_RDC -+/* #define YO_TI1510_DATASHEET_GUY_EXPLAIN_THIS_JUNK 0x0044f044 */ -+#define YO_TI1510_DATASHEET_GUY_EXPLAIN_THIS_JUNK 0x0844b060 -+/* #define YO_TI1510_DATASHEET_GUY_EXPLAIN_THIS_JUNK 0x0044d044 */ -+ -+ config_writel(socket, 32*4, YO_TI1510_DATASHEET_GUY_EXPLAIN_THIS_JUNK); -+ config_writel(socket, 35*4, 0x00000022); -+ config_writel(socket, 36*4, 0x60200000); -+ config_writel(socket, 40*4, 0x7e020000); -+#endif -+ - if (!socket->cb_irq || request_irq(socket->cb_irq, yenta_interrupt, IRQF_SHARED, "yenta", socket)) { - /* No IRQ or request_irq failed. Poll */ - socket->cb_irq = 0; /* But zero is a valid IRQ number. */ diff --git a/target/linux/rdc/patches-2.6.28/005-fix_amit_breakage.patch b/target/linux/rdc/patches-2.6.28/005-fix_amit_breakage.patch deleted file mode 100644 index 8103e841d5..0000000000 --- a/target/linux/rdc/patches-2.6.28/005-fix_amit_breakage.patch +++ /dev/null @@ -1,40 +0,0 @@ ---- a/arch/x86/boot/boot.h -+++ b/arch/x86/boot/boot.h -@@ -62,7 +62,7 @@ static inline void outl(u32 v, u16 port) - { - asm volatile("outl %0,%1" : : "a" (v), "dN" (port)); - } --static inline u32 inl(u32 port) -+static inline u32 inl(u16 port) - { - u32 v; - asm volatile("inl %1,%0" : "=a" (v) : "dN" (port)); ---- a/arch/x86/boot/pm.c -+++ b/arch/x86/boot/pm.c -@@ -14,6 +14,9 @@ - - #include "boot.h" - #include <asm/segment.h> -+#ifdef CONFIG_X86_RDC -+#include <asm/mach-rdc/rdc321x_defs.h> -+#endif - - /* - * Invoke the realmode switch hook if present; otherwise -@@ -156,6 +159,16 @@ void go_to_protected_mode(void) - die(); - } - -+#ifdef CONFIG_X86_RDC -+ { -+ u32 bootctl; -+ -+ outl(0x80003840, RDC3210_CFGREG_ADDR); -+ bootctl = inl(RDC3210_CFGREG_DATA) | 0x07ff0000; -+ outl(bootctl, RDC3210_CFGREG_DATA); -+ } -+#endif -+ - /* Reset coprocessor (IGNNE#) */ - reset_coprocessor(); - diff --git a/target/linux/rdc/patches-2.6.28/006-bzip2_lzma_x86.patch b/target/linux/rdc/patches-2.6.28/006-bzip2_lzma_x86.patch deleted file mode 100644 index c1865a86b7..0000000000 --- a/target/linux/rdc/patches-2.6.28/006-bzip2_lzma_x86.patch +++ /dev/null @@ -1,2898 +0,0 @@ ---- a/arch/x86/boot/compressed/Makefile -+++ b/arch/x86/boot/compressed/Makefile -@@ -4,7 +4,7 @@ - # create a compressed vmlinux image from the original vmlinux - # - --targets := vmlinux vmlinux.bin vmlinux.bin.gz head_$(BITS).o misc.o piggy.o -+targets := vmlinux vmlinux.bin vmlinux.bin.gz vmlinux.bin.bz2 vmlinux.bin.lzma head_$(BITS).o misc.o piggy.o - - KBUILD_CFLAGS := -m$(BITS) -D__KERNEL__ $(LINUX_INCLUDE) -O2 - KBUILD_CFLAGS += -fno-strict-aliasing -fPIC -@@ -47,9 +47,17 @@ ifeq ($(CONFIG_X86_32),y) - ifdef CONFIG_RELOCATABLE - $(obj)/vmlinux.bin.gz: $(obj)/vmlinux.bin.all FORCE - $(call if_changed,gzip) -+$(obj)/vmlinux.bin.bz2: $(obj)/vmlinux.bin.all FORCE -+ $(call if_changed,bzip2) -+$(obj)/vmlinux.bin.lzma: $(obj)/vmlinux.bin.all FORCE -+ $(call if_changed,lzma) - else - $(obj)/vmlinux.bin.gz: $(obj)/vmlinux.bin FORCE - $(call if_changed,gzip) -+$(obj)/vmlinux.bin.bz2: $(obj)/vmlinux.bin FORCE -+ $(call if_changed,bzip2) -+$(obj)/vmlinux.bin.lzma: $(obj)/vmlinux.bin FORCE -+ $(call if_changed,lzma) - endif - LDFLAGS_piggy.o := -r --format binary --oformat elf32-i386 -T - -@@ -60,5 +68,9 @@ $(obj)/vmlinux.bin.gz: $(obj)/vmlinux.bi - LDFLAGS_piggy.o := -r --format binary --oformat elf64-x86-64 -T - endif - --$(obj)/piggy.o: $(obj)/vmlinux.scr $(obj)/vmlinux.bin.gz FORCE -+suffix_$(CONFIG_KERNEL_GZIP) = gz -+suffix_$(CONFIG_KERNEL_BZIP2) = bz2 -+suffix_$(CONFIG_KERNEL_LZMA) = lzma -+ -+$(obj)/piggy.o: $(obj)/vmlinux.scr $(obj)/vmlinux.bin.$(suffix_y) FORCE - $(call if_changed,ld) ---- a/arch/x86/boot/compressed/misc.c -+++ b/arch/x86/boot/compressed/misc.c -@@ -116,71 +116,13 @@ - /* - * gzip declarations - */ -- --#define OF(args) args - #define STATIC static - - #undef memset - #undef memcpy - #define memzero(s, n) memset((s), 0, (n)) - --typedef unsigned char uch; --typedef unsigned short ush; --typedef unsigned long ulg; -- --/* -- * Window size must be at least 32k, and a power of two. -- * We don't actually have a window just a huge output buffer, -- * so we report a 2G window size, as that should always be -- * larger than our output buffer: -- */ --#define WSIZE 0x80000000 - --/* Input buffer: */ --static unsigned char *inbuf; -- --/* Sliding window buffer (and final output buffer): */ --static unsigned char *window; -- --/* Valid bytes in inbuf: */ --static unsigned insize; -- --/* Index of next byte to be processed in inbuf: */ --static unsigned inptr; -- --/* Bytes in output buffer: */ --static unsigned outcnt; -- --/* gzip flag byte */ --#define ASCII_FLAG 0x01 /* bit 0 set: file probably ASCII text */ --#define CONTINUATION 0x02 /* bit 1 set: continuation of multi-part gz file */ --#define EXTRA_FIELD 0x04 /* bit 2 set: extra field present */ --#define ORIG_NAM 0x08 /* bit 3 set: original file name present */ --#define COMMENT 0x10 /* bit 4 set: file comment present */ --#define ENCRYPTED 0x20 /* bit 5 set: file is encrypted */ --#define RESERVED 0xC0 /* bit 6, 7: reserved */ -- --#define get_byte() (inptr < insize ? inbuf[inptr++] : fill_inbuf()) -- --/* Diagnostic functions */ --#ifdef DEBUG --# define Assert(cond, msg) do { if (!(cond)) error(msg); } while (0) --# define Trace(x) do { fprintf x; } while (0) --# define Tracev(x) do { if (verbose) fprintf x ; } while (0) --# define Tracevv(x) do { if (verbose > 1) fprintf x ; } while (0) --# define Tracec(c, x) do { if (verbose && (c)) fprintf x ; } while (0) --# define Tracecv(c, x) do { if (verbose > 1 && (c)) fprintf x ; } while (0) --#else --# define Assert(cond, msg) --# define Trace(x) --# define Tracev(x) --# define Tracevv(x) --# define Tracec(c, x) --# define Tracecv(c, x) --#endif -- --static int fill_inbuf(void); --static void flush_window(void); - static void error(char *m); - - /* -@@ -189,11 +131,6 @@ static void error(char *m); - static struct boot_params *real_mode; /* Pointer to real-mode data */ - static int quiet; - --extern unsigned char input_data[]; --extern int input_len; -- --static long bytes_out; -- - static void *memset(void *s, int c, unsigned n); - static void *memcpy(void *dest, const void *src, unsigned n); - -@@ -213,7 +150,19 @@ static char *vidmem; - static int vidport; - static int lines, cols; - -+#define NEW_CODE -+ -+#ifdef CONFIG_KERNEL_GZIP - #include "../../../../lib/inflate.c" -+#endif -+ -+#ifdef CONFIG_KERNEL_BZIP2 -+#include "../../../../lib/decompress_bunzip2.c" -+#endif -+ -+#ifdef CONFIG_KERNEL_LZMA -+#include "../../../../lib/decompress_unlzma.c" -+#endif - - static void scroll(void) - { -@@ -293,38 +242,6 @@ static void *memcpy(void *dest, const vo - return dest; - } - --/* =========================================================================== -- * Fill the input buffer. This is called only when the buffer is empty -- * and at least one byte is really needed. -- */ --static int fill_inbuf(void) --{ -- error("ran out of input data"); -- return 0; --} -- --/* =========================================================================== -- * Write the output window window[0..outcnt-1] and update crc and bytes_out. -- * (Used for the decompressed data only.) -- */ --static void flush_window(void) --{ -- /* With my window equal to my output buffer -- * I only need to compute the crc here. -- */ -- unsigned long c = crc; /* temporary variable */ -- unsigned n; -- unsigned char *in, ch; -- -- in = window; -- for (n = 0; n < outcnt; n++) { -- ch = *in++; -- c = crc_32_tab[((int)c ^ ch) & 0xff] ^ (c >> 8); -- } -- crc = c; -- bytes_out += (unsigned long)outcnt; -- outcnt = 0; --} - - static void error(char *x) - { -@@ -407,12 +324,8 @@ asmlinkage void decompress_kernel(void * - lines = real_mode->screen_info.orig_video_lines; - cols = real_mode->screen_info.orig_video_cols; - -- window = output; /* Output buffer (Normally at 1M) */ - free_mem_ptr = heap; /* Heap */ - free_mem_end_ptr = heap + BOOT_HEAP_SIZE; -- inbuf = input_data; /* Input buffer */ -- insize = input_len; -- inptr = 0; - - #ifdef CONFIG_X86_64 - if ((unsigned long)output & (__KERNEL_ALIGN - 1)) -@@ -430,10 +343,9 @@ asmlinkage void decompress_kernel(void * - #endif - #endif - -- makecrc(); - if (!quiet) - putstr("\nDecompressing Linux... "); -- gunzip(); -+ decompress(input_data, input_len, NULL, NULL, output, NULL, error); - parse_elf(output); - if (!quiet) - putstr("done.\nBooting the kernel.\n"); ---- a/arch/x86/include/asm/boot.h -+++ b/arch/x86/include/asm/boot.h -@@ -15,11 +15,21 @@ - + (CONFIG_PHYSICAL_ALIGN - 1)) \ - & ~(CONFIG_PHYSICAL_ALIGN - 1)) - -+#if (defined CONFIG_KERNEL_BZIP2) -+#define BOOT_HEAP_SIZE 0x400000 -+#else -+ - #ifdef CONFIG_X86_64 - #define BOOT_HEAP_SIZE 0x7000 --#define BOOT_STACK_SIZE 0x4000 - #else - #define BOOT_HEAP_SIZE 0x4000 -+#endif -+ -+#endif -+ -+#ifdef CONFIG_X86_64 -+#define BOOT_STACK_SIZE 0x4000 -+#else - #define BOOT_STACK_SIZE 0x1000 - #endif - ---- a/drivers/block/Kconfig -+++ b/drivers/block/Kconfig -@@ -358,6 +358,30 @@ config BLK_DEV_XIP - will prevent RAM block device backing store memory from being - allocated from highmem (only a problem for highmem systems). - -+config RD_BZIP2 -+ bool "Initial ramdisk compressed using bzip2" -+ default n -+ depends on BLK_DEV_INITRD=y -+ help -+ Support loading of a bzip2 encoded initial ramdisk or cpio buffer -+ If unsure, say N. -+ -+config RD_LZMA -+ bool "Initial ramdisk compressed using lzma" -+ default n -+ depends on BLK_DEV_INITRD=y -+ help -+ Support loading of a lzma encoded initial ramdisk or cpio buffer -+ If unsure, say N. -+ -+config RD_GZIP -+ bool "Initial ramdisk compressed using gzip" -+ default y -+ depends on BLK_DEV_INITRD=y -+ help -+ Support loading of a gzip encoded initial ramdisk or cpio buffer. -+ If unsure, say Y. -+ - config CDROM_PKTCDVD - tristate "Packet writing on CD/DVD media" - depends on !UML ---- /dev/null -+++ b/include/linux/decompress/bunzip2.h -@@ -0,0 +1,10 @@ -+#ifndef DECOMPRESS_BUNZIP2_H -+#define DECOMPRESS_BUNZIP2_H -+ -+int bunzip2(unsigned char *inbuf, int len, -+ int(*fill)(void*, unsigned int), -+ int(*flush)(void*, unsigned int), -+ unsigned char *output, -+ int *pos, -+ void(*error)(char *x)); -+#endif ---- /dev/null -+++ b/include/linux/decompress/generic.h -@@ -0,0 +1,30 @@ -+#ifndef DECOMPRESS_GENERIC_H -+#define DECOMPRESS_GENERIC_H -+ -+/* Minimal chunksize to be read. -+ *Bzip2 prefers at least 4096 -+ *Lzma prefers 0x10000 */ -+#define COMPR_IOBUF_SIZE 4096 -+ -+typedef int (*decompress_fn) (unsigned char *inbuf, int len, -+ int(*fill)(void*, unsigned int), -+ int(*writebb)(void*, unsigned int), -+ unsigned char *output, -+ int *posp, -+ void(*error)(char *x)); -+ -+/* inbuf - input buffer -+ *len - len of pre-read data in inbuf -+ *fill - function to fill inbuf if empty -+ *writebb - function to write out outbug -+ *posp - if non-null, input position (number of bytes read) will be -+ * returned here -+ * -+ *If len != 0, the inbuf is initialized (with as much data), and fill -+ *should not be called -+ *If len = 0, the inbuf is allocated, but empty. Its size is IOBUF_SIZE -+ *fill should be called (repeatedly...) to read data, at most IOBUF_SIZE -+ */ -+ -+ -+#endif ---- /dev/null -+++ b/include/linux/decompress/inflate.h -@@ -0,0 +1,13 @@ -+#ifndef INFLATE_H -+#define INFLATE_H -+ -+/* Other housekeeping constants */ -+#define INBUFSIZ 4096 -+ -+int gunzip(unsigned char *inbuf, int len, -+ int(*fill)(void*, unsigned int), -+ int(*flush)(void*, unsigned int), -+ unsigned char *output, -+ int *pos, -+ void(*error_fn)(char *x)); -+#endif ---- /dev/null -+++ b/include/linux/decompress/mm.h -@@ -0,0 +1,89 @@ -+/* -+ * linux/compr_mm.h -+ * -+ * Memory management for pre-boot and ramdisk uncompressors -+ * -+ * Authors: Alain Knaff <alain@knaff.lu> -+ * -+ */ -+ -+#ifndef DECOMPR_MM_H -+#define DECOMPR_MM_H -+ -+#ifdef STATIC -+ -+/* Code active when included from pre-boot environment: */ -+ -+/* A trivial malloc implementation, adapted from -+ * malloc by Hannu Savolainen 1993 and Matthias Urlichs 1994 -+ */ -+static unsigned long malloc_ptr; -+static int malloc_count; -+ -+static void *malloc(int size) -+{ -+ void *p; -+ -+ if (size < 0) -+ error("Malloc error"); -+ if (!malloc_ptr) -+ malloc_ptr = free_mem_ptr; -+ -+ malloc_ptr = (malloc_ptr + 3) & ~3; /* Align */ -+ -+ p = (void *)malloc_ptr; -+ malloc_ptr += size; -+ -+ if (free_mem_end_ptr && malloc_ptr >= free_mem_end_ptr) -+ error("Out of memory"); -+ -+ malloc_count++; -+ return p; -+} -+ -+static void free(void *where) -+{ -+ malloc_count--; -+ if (!malloc_count) -+ malloc_ptr = free_mem_ptr; -+} -+ -+#define large_malloc(a) malloc(a) -+#define large_free(a) free(a) -+ -+#define set_error_fn(x) -+#define panic error -+ -+#define INIT -+ -+#else /* STATIC */ -+ -+/* Code active when compiled standalone for use when loading ramdisk: */ -+ -+#include <linux/kernel.h> -+#include <linux/fs.h> -+#include <linux/string.h> -+#include <linux/vmalloc.h> -+ -+/* Use defines rather than static inline in order to avoid spurious -+ * warnings when not needed (indeed large_malloc / large_free are not -+ * needed by inflate */ -+ -+#define malloc(a) kmalloc(a, GFP_KERNEL) -+#define free(a) kfree(a) -+ -+#define large_malloc(a) vmalloc(a) -+#define large_free(a) vfree(a) -+ -+static void(*error)(char *m); -+#define set_error_fn(x) error = x; -+#define NEW_CODE -+ -+#define INIT __init -+#define STATIC -+ -+#include <linux/init.h> -+ -+#endif /* STATIC */ -+ -+#endif /* DECOMPR_MM_H */ ---- /dev/null -+++ b/include/linux/decompress/unlzma.h -@@ -0,0 +1,12 @@ -+#ifndef DECOMPRESS_UNLZMA_H -+#define DECOMPRESS_UNLZMA_H -+ -+int unlzma(unsigned char *, int, -+ int(*fill)(void*, unsigned int), -+ int(*flush)(void*, unsigned int), -+ unsigned char *output, -+ int *posp, -+ void(*error)(char *x) -+ ); -+ -+#endif ---- a/init/Kconfig -+++ b/init/Kconfig -@@ -101,6 +101,56 @@ config LOCALVERSION_AUTO - - which is done within the script "scripts/setlocalversion".) - -+choice -+ prompt "Kernel compression mode" -+ default KERNEL_GZIP -+ help -+ The linux kernel is a kind of self-extracting executable. -+ Several compression algorithms are available, which differ -+ in efficiency, compression and decompression speed. -+ Compression speed is only relevant when building a kernel. -+ Decompression speed is relevant at each boot. -+ -+ If you have any problems with bzip2 or lzma compressed -+ kernels, mail me (Alain Knaff) <alain@knaff.lu>. (An older -+ version of this functionality (bzip2 only), for 2.4, was -+ supplied by Christian Ludwig) -+ -+ High compression options are mostly useful for users, who -+ are low on disk space (embedded systems), but for whom ram -+ size matters less. -+ -+ If in doubt, select 'gzip' -+ -+config KERNEL_GZIP -+ bool "Gzip" -+ help -+ The old and tried gzip compression. Its compression ratio is -+ the poorest among the 3 choices; however its speed (both -+ compression and decompression) is the fastest. -+ -+config KERNEL_BZIP2 -+ bool "Bzip2" -+ help -+ Its compression ratio and speed is intermediate. -+ Decompression speed is slowest among the 3. -+ The kernel size is about 10 per cent smaller with bzip2, -+ in comparison to gzip. -+ Bzip2 uses a large amount of memory. For modern kernels -+ you will need at least 8MB RAM or more for booting. -+ -+config KERNEL_LZMA -+ bool "LZMA" -+ help -+ The most recent compression algorithm. -+ Its ratio is best, decompression speed is between the other -+ 2. Compression is slowest. -+ The kernel size is about 33 per cent smaller with lzma, -+ in comparison to gzip. -+ -+endchoice -+ -+ - config SWAP - bool "Support for paging of anonymous memory (swap)" - depends on MMU && BLOCK ---- a/init/do_mounts_rd.c -+++ b/init/do_mounts_rd.c -@@ -11,6 +11,12 @@ - - #include "do_mounts.h" - -+#include <linux/decompress/generic.h> -+ -+#include <linux/decompress/bunzip2.h> -+#include <linux/decompress/unlzma.h> -+#include <linux/decompress/inflate.h> -+ - int __initdata rd_prompt = 1;/* 1 = prompt for RAM disk, 0 = don't prompt */ - - static int __init prompt_ramdisk(char *str) -@@ -29,7 +35,7 @@ static int __init ramdisk_start_setup(ch - } - __setup("ramdisk_start=", ramdisk_start_setup); - --static int __init crd_load(int in_fd, int out_fd); -+static int __init crd_load(int in_fd, int out_fd, decompress_fn deco); - - /* - * This routine tries to find a RAM disk image to load, and returns the -@@ -46,7 +52,7 @@ static int __init crd_load(int in_fd, in - * gzip - */ - static int __init --identify_ramdisk_image(int fd, int start_block) -+identify_ramdisk_image(int fd, int start_block, decompress_fn *decompressor) - { - const int size = 512; - struct minix_super_block *minixsb; -@@ -74,6 +80,7 @@ identify_ramdisk_image(int fd, int start - sys_lseek(fd, start_block * BLOCK_SIZE, 0); - sys_read(fd, buf, size); - -+#ifdef CONFIG_RD_GZIP - /* - * If it matches the gzip magic numbers, return 0 - */ -@@ -81,9 +88,39 @@ identify_ramdisk_image(int fd, int start - printk(KERN_NOTICE - "RAMDISK: Compressed image found at block %d\n", - start_block); -+ *decompressor = gunzip; -+ nblocks = 0; -+ goto done; -+ } -+#endif -+ -+#ifdef CONFIG_RD_BZIP2 -+ /* -+ * If it matches the bzip2 magic numbers, return -1 -+ */ -+ if (buf[0] == 0x42 && (buf[1] == 0x5a)) { -+ printk(KERN_NOTICE -+ "RAMDISK: Bzipped image found at block %d\n", -+ start_block); -+ *decompressor = bunzip2; - nblocks = 0; - goto done; - } -+#endif -+ -+#ifdef CONFIG_RD_LZMA -+ /* -+ * If it matches the lzma magic numbers, return -1 -+ */ -+ if (buf[0] == 0x5d && (buf[1] == 0x00)) { -+ printk(KERN_NOTICE -+ "RAMDISK: Lzma image found at block %d\n", -+ start_block); -+ *decompressor = unlzma; -+ nblocks = 0; -+ goto done; -+ } -+#endif - - /* romfs is at block zero too */ - if (romfsb->word0 == ROMSB_WORD0 && -@@ -156,6 +193,7 @@ int __init rd_load_image(char *from) - int nblocks, i, disk; - char *buf = NULL; - unsigned short rotate = 0; -+ decompress_fn decompressor = NULL; - #if !defined(CONFIG_S390) && !defined(CONFIG_PPC_ISERIES) - char rotator[4] = { '|' , '/' , '-' , '\\' }; - #endif -@@ -168,12 +206,12 @@ int __init rd_load_image(char *from) - if (in_fd < 0) - goto noclose_input; - -- nblocks = identify_ramdisk_image(in_fd, rd_image_start); -+ nblocks = identify_ramdisk_image(in_fd, rd_image_start, &decompressor); - if (nblocks < 0) - goto done; - - if (nblocks == 0) { -- if (crd_load(in_fd, out_fd) == 0) -+ if (crd_load(in_fd, out_fd, decompressor) == 0) - goto successful_load; - goto done; - } -@@ -272,138 +310,48 @@ int __init rd_load_disk(int n) - return rd_load_image("/dev/root"); - } - --/* -- * gzip declarations -- */ -- --#define OF(args) args -- --#ifndef memzero --#define memzero(s, n) memset ((s), 0, (n)) --#endif -- --typedef unsigned char uch; --typedef unsigned short ush; --typedef unsigned long ulg; -- --#define INBUFSIZ 4096 --#define WSIZE 0x8000 /* window size--must be a power of two, and */ -- /* at least 32K for zip's deflate method */ -- --static uch *inbuf; --static uch *window; -- --static unsigned insize; /* valid bytes in inbuf */ --static unsigned inptr; /* index of next byte to be processed in inbuf */ --static unsigned outcnt; /* bytes in output buffer */ - static int exit_code; --static int unzip_error; --static long bytes_out; -+static int decompress_error; - static int crd_infd, crd_outfd; - --#define get_byte() (inptr < insize ? inbuf[inptr++] : fill_inbuf()) -- --/* Diagnostic functions (stubbed out) */ --#define Assert(cond,msg) --#define Trace(x) --#define Tracev(x) --#define Tracevv(x) --#define Tracec(c,x) --#define Tracecv(c,x) -- --#define STATIC static --#define INIT __init -- --static int __init fill_inbuf(void); --static void __init flush_window(void); --static void __init error(char *m); -- --#define NO_INFLATE_MALLOC -- --#include "../lib/inflate.c" -- --/* =========================================================================== -- * Fill the input buffer. This is called only when the buffer is empty -- * and at least one byte is really needed. -- * Returning -1 does not guarantee that gunzip() will ever return. -- */ --static int __init fill_inbuf(void) -+static int __init compr_fill(void *buf, unsigned int len) - { -- if (exit_code) return -1; -- -- insize = sys_read(crd_infd, inbuf, INBUFSIZ); -- if (insize == 0) { -- error("RAMDISK: ran out of compressed data"); -- return -1; -- } -- -- inptr = 1; -- -- return inbuf[0]; -+ int r = sys_read(crd_infd, buf, len); -+ if (r < 0) -+ printk(KERN_ERR "RAMDISK: error while reading compressed data"); -+ else if (r == 0) -+ printk(KERN_ERR "RAMDISK: EOF while reading compressed data"); -+ return r; - } - --/* =========================================================================== -- * Write the output window window[0..outcnt-1] and update crc and bytes_out. -- * (Used for the decompressed data only.) -- */ --static void __init flush_window(void) -+static int __init compr_flush(void *window, unsigned int outcnt) - { -- ulg c = crc; /* temporary variable */ -- unsigned n, written; -- uch *in, ch; -- -- written = sys_write(crd_outfd, window, outcnt); -- if (written != outcnt && unzip_error == 0) { -- printk(KERN_ERR "RAMDISK: incomplete write (%d != %d) %ld\n", -- written, outcnt, bytes_out); -- unzip_error = 1; -- } -- in = window; -- for (n = 0; n < outcnt; n++) { -- ch = *in++; -- c = crc_32_tab[((int)c ^ ch) & 0xff] ^ (c >> 8); -- } -- crc = c; -- bytes_out += (ulg)outcnt; -- outcnt = 0; -+ int written = sys_write(crd_outfd, window, outcnt); -+ if (written != outcnt) { -+ if (decompress_error == 0) -+ printk(KERN_ERR -+ "RAMDISK: incomplete write (%d != %d)\n", -+ written, outcnt); -+ decompress_error = 1; -+ return -1; -+ } -+ return outcnt; - } - - static void __init error(char *x) - { - printk(KERN_ERR "%s\n", x); - exit_code = 1; -- unzip_error = 1; -+ decompress_error = 1; - } - --static int __init crd_load(int in_fd, int out_fd) -+static int __init crd_load(int in_fd, int out_fd, decompress_fn deco) - { - int result; -- -- insize = 0; /* valid bytes in inbuf */ -- inptr = 0; /* index of next byte to be processed in inbuf */ -- outcnt = 0; /* bytes in output buffer */ -- exit_code = 0; -- bytes_out = 0; -- crc = (ulg)0xffffffffL; /* shift register contents */ -- - crd_infd = in_fd; - crd_outfd = out_fd; -- inbuf = kmalloc(INBUFSIZ, GFP_KERNEL); -- if (!inbuf) { -- printk(KERN_ERR "RAMDISK: Couldn't allocate gzip buffer\n"); -- return -1; -- } -- window = kmalloc(WSIZE, GFP_KERNEL); -- if (!window) { -- printk(KERN_ERR "RAMDISK: Couldn't allocate gzip window\n"); -- kfree(inbuf); -- return -1; -- } -- makecrc(); -- result = gunzip(); -- if (unzip_error) -+ result = deco(NULL, 0, compr_fill, compr_flush, NULL, NULL, error); -+ if (decompress_error) - result = 1; -- kfree(inbuf); -- kfree(window); - return result; - } ---- a/init/initramfs.c -+++ b/init/initramfs.c -@@ -389,11 +389,14 @@ static int __init write_buffer(char *buf - return len - count; - } - --static void __init flush_buffer(char *buf, unsigned len) -+ -+static int __init flush_buffer(void *bufv, unsigned len) - { -+ char *buf = (char *) bufv; - int written; -+ int origLen = len; - if (message) -- return; -+ return -1; - while ((written = write_buffer(buf, len)) < len && !message) { - char c = buf[written]; - if (c == '0') { -@@ -407,73 +410,14 @@ static void __init flush_buffer(char *bu - } else - error("junk in compressed archive"); - } -+ return origLen; - } - --/* -- * gzip declarations -- */ -- --#define OF(args) args -- --#ifndef memzero --#define memzero(s, n) memset ((s), 0, (n)) --#endif -+static unsigned my_inptr; /* index of next byte to be processed in inbuf */ - --typedef unsigned char uch; --typedef unsigned short ush; --typedef unsigned long ulg; -- --#define WSIZE 0x8000 /* window size--must be a power of two, and */ -- /* at least 32K for zip's deflate method */ -- --static uch *inbuf; --static uch *window; -- --static unsigned insize; /* valid bytes in inbuf */ --static unsigned inptr; /* index of next byte to be processed in inbuf */ --static unsigned outcnt; /* bytes in output buffer */ --static long bytes_out; -- --#define get_byte() (inptr < insize ? inbuf[inptr++] : -1) -- --/* Diagnostic functions (stubbed out) */ --#define Assert(cond,msg) --#define Trace(x) --#define Tracev(x) --#define Tracevv(x) --#define Tracec(c,x) --#define Tracecv(c,x) -- --#define STATIC static --#define INIT __init -- --static void __init flush_window(void); --static void __init error(char *m); -- --#define NO_INFLATE_MALLOC -- --#include "../lib/inflate.c" -- --/* =========================================================================== -- * Write the output window window[0..outcnt-1] and update crc and bytes_out. -- * (Used for the decompressed data only.) -- */ --static void __init flush_window(void) --{ -- ulg c = crc; /* temporary variable */ -- unsigned n; -- uch *in, ch; -- -- flush_buffer(window, outcnt); -- in = window; -- for (n = 0; n < outcnt; n++) { -- ch = *in++; -- c = crc_32_tab[((int)c ^ ch) & 0xff] ^ (c >> 8); -- } -- crc = c; -- bytes_out += (ulg)outcnt; -- outcnt = 0; --} -+#include <linux/decompress/bunzip2.h> -+#include <linux/decompress/unlzma.h> -+#include <linux/decompress/inflate.h> - - static char * __init unpack_to_rootfs(char *buf, unsigned len, int check_only) - { -@@ -482,9 +426,10 @@ static char * __init unpack_to_rootfs(ch - header_buf = kmalloc(110, GFP_KERNEL); - symlink_buf = kmalloc(PATH_MAX + N_ALIGN(PATH_MAX) + 1, GFP_KERNEL); - name_buf = kmalloc(N_ALIGN(PATH_MAX), GFP_KERNEL); -- window = kmalloc(WSIZE, GFP_KERNEL); -- if (!window || !header_buf || !symlink_buf || !name_buf) -+ -+ if (!header_buf || !symlink_buf || !name_buf) - panic("can't allocate buffers"); -+ - state = Start; - this_header = 0; - message = NULL; -@@ -504,22 +449,38 @@ static char * __init unpack_to_rootfs(ch - continue; - } - this_header = 0; -- insize = len; -- inbuf = buf; -- inptr = 0; -- outcnt = 0; /* bytes in output buffer */ -- bytes_out = 0; -- crc = (ulg)0xffffffffL; /* shift register contents */ -- makecrc(); -- gunzip(); -+ if (!gunzip(buf, len, NULL, flush_buffer, NULL, -+ &my_inptr, error) && -+ message == NULL) -+ goto ok; -+ -+#ifdef CONFIG_RD_BZIP2 -+ message = NULL; /* Zero out message, or else cpio will think an error has already occured */ -+ if (!bunzip2(buf, len, NULL, flush_buffer, NULL, -+ &my_inptr, error) < 0 -+ && -+ message == NULL) { -+ goto ok; -+ } -+#endif -+ -+#ifdef CONFIG_RD_LZMA -+ message = NULL; /* Zero out message, or else cpio will think an error has already occured */ -+ if (!unlzma(buf, len, NULL, flush_buffer, NULL, -+ &my_inptr, error) < 0 -+ && -+ message == NULL) { -+ goto ok; -+ } -+#endif -+ok: - if (state != Reset) -- error("junk in gzipped archive"); -- this_header = saved_offset + inptr; -- buf += inptr; -- len -= inptr; -+ error("junk in compressed archive"); -+ this_header = saved_offset + my_inptr; -+ buf += my_inptr; -+ len -= my_inptr; - } - dir_utime(); -- kfree(window); - kfree(name_buf); - kfree(symlink_buf); - kfree(header_buf); ---- a/lib/Makefile -+++ b/lib/Makefile -@@ -11,7 +11,8 @@ lib-y := ctype.o string.o vsprintf.o cmd - rbtree.o radix-tree.o dump_stack.o \ - idr.o int_sqrt.o extable.o prio_tree.o \ - sha1.o irq_regs.o reciprocal_div.o argv_split.o \ -- proportions.o prio_heap.o ratelimit.o show_mem.o -+ proportions.o prio_heap.o ratelimit.o show_mem.o \ -+ inflate.o decompress_bunzip2.o decompress_unlzma.o - - lib-$(CONFIG_MMU) += ioremap.o - lib-$(CONFIG_SMP) += cpumask.o ---- /dev/null -+++ b/lib/decompress_bunzip2.c -@@ -0,0 +1,735 @@ -+/* vi: set sw = 4 ts = 4: */ -+/* Small bzip2 deflate implementation, by Rob Landley (rob@landley.net). -+ -+ Based on bzip2 decompression code by Julian R Seward (jseward@acm.org), -+ which also acknowledges contributions by Mike Burrows, David Wheeler, -+ Peter Fenwick, Alistair Moffat, Radford Neal, Ian H. Witten, -+ Robert Sedgewick, and Jon L. Bentley. -+ -+ This code is licensed under the LGPLv2: -+ LGPL (http://www.gnu.org/copyleft/lgpl.html -+*/ -+ -+/* -+ Size and speed optimizations by Manuel Novoa III (mjn3@codepoet.org). -+ -+ More efficient reading of Huffman codes, a streamlined read_bunzip() -+ function, and various other tweaks. In (limited) tests, approximately -+ 20% faster than bzcat on x86 and about 10% faster on arm. -+ -+ Note that about 2/3 of the time is spent in read_unzip() reversing -+ the Burrows-Wheeler transformation. Much of that time is delay -+ resulting from cache misses. -+ -+ I would ask that anyone benefiting from this work, especially those -+ using it in commercial products, consider making a donation to my local -+ non-profit hospice organization in the name of the woman I loved, who -+ passed away Feb. 12, 2003. -+ -+ In memory of Toni W. Hagan -+ -+ Hospice of Acadiana, Inc. -+ 2600 Johnston St., Suite 200 -+ Lafayette, LA 70503-3240 -+ -+ Phone (337) 232-1234 or 1-800-738-2226 -+ Fax (337) 232-1297 -+ -+ http://www.hospiceacadiana.com/ -+ -+ Manuel -+ */ -+ -+/* -+ Made it fit for running in Linux Kernel by Alain Knaff (alain@knaff.lu) -+*/ -+ -+ -+#ifndef STATIC -+#include <linux/decompress/bunzip2.h> -+#endif /* !STATIC */ -+ -+#include <linux/decompress/mm.h> -+ -+#ifndef INT_MAX -+#define INT_MAX 0x7fffffff -+#endif -+ -+/* Constants for Huffman coding */ -+#define MAX_GROUPS 6 -+#define GROUP_SIZE 50 /* 64 would have been more efficient */ -+#define MAX_HUFCODE_BITS 20 /* Longest Huffman code allowed */ -+#define MAX_SYMBOLS 258 /* 256 literals + RUNA + RUNB */ -+#define SYMBOL_RUNA 0 -+#define SYMBOL_RUNB 1 -+ -+/* Status return values */ -+#define RETVAL_OK 0 -+#define RETVAL_LAST_BLOCK (-1) -+#define RETVAL_NOT_BZIP_DATA (-2) -+#define RETVAL_UNEXPECTED_INPUT_EOF (-3) -+#define RETVAL_UNEXPECTED_OUTPUT_EOF (-4) -+#define RETVAL_DATA_ERROR (-5) -+#define RETVAL_OUT_OF_MEMORY (-6) -+#define RETVAL_OBSOLETE_INPUT (-7) -+ -+/* Other housekeeping constants */ -+#define BZIP2_IOBUF_SIZE 4096 -+ -+/* This is what we know about each Huffman coding group */ -+struct group_data { -+ /* We have an extra slot at the end of limit[] for a sentinal value. */ -+ int limit[MAX_HUFCODE_BITS+1]; -+ int base[MAX_HUFCODE_BITS]; -+ int permute[MAX_SYMBOLS]; -+ int minLen, maxLen; -+}; -+ -+/* Structure holding all the housekeeping data, including IO buffers and -+ memory that persists between calls to bunzip */ -+struct bunzip_data { -+ /* State for interrupting output loop */ -+ int writeCopies, writePos, writeRunCountdown, writeCount, writeCurrent; -+ /* I/O tracking data (file handles, buffers, positions, etc.) */ -+ int (*fill)(void*, unsigned int); -+ int inbufCount, inbufPos /*, outbufPos*/; -+ unsigned char *inbuf /*,*outbuf*/; -+ unsigned int inbufBitCount, inbufBits; -+ /* The CRC values stored in the block header and calculated from the -+ data */ -+ unsigned int crc32Table[256], headerCRC, totalCRC, writeCRC; -+ /* Intermediate buffer and its size (in bytes) */ -+ unsigned int *dbuf, dbufSize; -+ /* These things are a bit too big to go on the stack */ -+ unsigned char selectors[32768]; /* nSelectors = 15 bits */ -+ struct group_data groups[MAX_GROUPS]; /* Huffman coding tables */ -+ int io_error; /* non-zero if we have IO error */ -+}; -+ -+ -+/* Return the next nnn bits of input. All reads from the compressed input -+ are done through this function. All reads are big endian */ -+static unsigned int INIT get_bits(struct bunzip_data *bd, char bits_wanted) -+{ -+ unsigned int bits = 0; -+ -+ /* If we need to get more data from the byte buffer, do so. -+ (Loop getting one byte at a time to enforce endianness and avoid -+ unaligned access.) */ -+ while (bd->inbufBitCount < bits_wanted) { -+ /* If we need to read more data from file into byte buffer, do -+ so */ -+ if (bd->inbufPos == bd->inbufCount) { -+ if (bd->io_error) -+ return 0; -+ bd->inbufCount = bd->fill(bd->inbuf, BZIP2_IOBUF_SIZE); -+ if (bd->inbufCount <= 0) { -+ bd->io_error = RETVAL_UNEXPECTED_INPUT_EOF; -+ return 0; -+ } -+ bd->inbufPos = 0; -+ } -+ /* Avoid 32-bit overflow (dump bit buffer to top of output) */ -+ if (bd->inbufBitCount >= 24) { -+ bits = bd->inbufBits&((1 << bd->inbufBitCount)-1); -+ bits_wanted -= bd->inbufBitCount; -+ bits <<= bits_wanted; -+ bd->inbufBitCount = 0; -+ } -+ /* Grab next 8 bits of input from buffer. */ -+ bd->inbufBits = (bd->inbufBits << 8)|bd->inbuf[bd->inbufPos++]; -+ bd->inbufBitCount += 8; -+ } -+ /* Calculate result */ -+ bd->inbufBitCount -= bits_wanted; -+ bits |= (bd->inbufBits >> bd->inbufBitCount)&((1 << bits_wanted)-1); -+ -+ return bits; -+} -+ -+/* Unpacks the next block and sets up for the inverse burrows-wheeler step. */ -+ -+static int INIT get_next_block(struct bunzip_data *bd) -+{ -+ struct group_data *hufGroup = NULL; -+ int *base = NULL; -+ int *limit = NULL; -+ int dbufCount, nextSym, dbufSize, groupCount, selector, -+ i, j, k, t, runPos, symCount, symTotal, nSelectors, -+ byteCount[256]; -+ unsigned char uc, symToByte[256], mtfSymbol[256], *selectors; -+ unsigned int *dbuf, origPtr; -+ -+ dbuf = bd->dbuf; -+ dbufSize = bd->dbufSize; -+ selectors = bd->selectors; -+ -+ /* Read in header signature and CRC, then validate signature. -+ (last block signature means CRC is for whole file, return now) */ -+ i = get_bits(bd, 24); -+ j = get_bits(bd, 24); -+ bd->headerCRC = get_bits(bd, 32); -+ if ((i == 0x177245) && (j == 0x385090)) -+ return RETVAL_LAST_BLOCK; -+ if ((i != 0x314159) || (j != 0x265359)) -+ return RETVAL_NOT_BZIP_DATA; -+ /* We can add support for blockRandomised if anybody complains. -+ There was some code for this in busybox 1.0.0-pre3, but nobody ever -+ noticed that it didn't actually work. */ -+ if (get_bits(bd, 1)) -+ return RETVAL_OBSOLETE_INPUT; -+ origPtr = get_bits(bd, 24); -+ if (origPtr > dbufSize) -+ return RETVAL_DATA_ERROR; -+ /* mapping table: if some byte values are never used (encoding things -+ like ascii text), the compression code removes the gaps to have fewer -+ symbols to deal with, and writes a sparse bitfield indicating which -+ values were present. We make a translation table to convert the -+ symbols back to the corresponding bytes. */ -+ t = get_bits(bd, 16); -+ symTotal = 0; -+ for (i = 0; i < 16; i++) { -+ if (t&(1 << (15-i))) { -+ k = get_bits(bd, 16); -+ for (j = 0; j < 16; j++) -+ if (k&(1 << (15-j))) -+ symToByte[symTotal++] = (16*i)+j; -+ } -+ } -+ /* How many different Huffman coding groups does this block use? */ -+ groupCount = get_bits(bd, 3); -+ if (groupCount < 2 || groupCount > MAX_GROUPS) -+ return RETVAL_DATA_ERROR; -+ /* nSelectors: Every GROUP_SIZE many symbols we select a new -+ Huffman coding group. Read in the group selector list, -+ which is stored as MTF encoded bit runs. (MTF = Move To -+ Front, as each value is used it's moved to the start of the -+ list.) */ -+ nSelectors = get_bits(bd, 15); -+ if (!nSelectors) -+ return RETVAL_DATA_ERROR; -+ for (i = 0; i < groupCount; i++) -+ mtfSymbol[i] = i; -+ for (i = 0; i < nSelectors; i++) { -+ /* Get next value */ -+ for (j = 0; get_bits(bd, 1); j++) -+ if (j >= groupCount) -+ return RETVAL_DATA_ERROR; -+ /* Decode MTF to get the next selector */ -+ uc = mtfSymbol[j]; -+ for (; j; j--) -+ mtfSymbol[j] = mtfSymbol[j-1]; -+ mtfSymbol[0] = selectors[i] = uc; -+ } -+ /* Read the Huffman coding tables for each group, which code -+ for symTotal literal symbols, plus two run symbols (RUNA, -+ RUNB) */ -+ symCount = symTotal+2; -+ for (j = 0; j < groupCount; j++) { -+ unsigned char length[MAX_SYMBOLS], temp[MAX_HUFCODE_BITS+1]; -+ int minLen, maxLen, pp; -+ /* Read Huffman code lengths for each symbol. They're -+ stored in a way similar to mtf; record a starting -+ value for the first symbol, and an offset from the -+ previous value for everys symbol after that. -+ (Subtracting 1 before the loop and then adding it -+ back at the end is an optimization that makes the -+ test inside the loop simpler: symbol length 0 -+ becomes negative, so an unsigned inequality catches -+ it.) */ -+ t = get_bits(bd, 5)-1; -+ for (i = 0; i < symCount; i++) { -+ for (;;) { -+ if (((unsigned)t) > (MAX_HUFCODE_BITS-1)) -+ return RETVAL_DATA_ERROR; -+ -+ /* If first bit is 0, stop. Else -+ second bit indicates whether to -+ increment or decrement the value. -+ Optimization: grab 2 bits and unget -+ the second if the first was 0. */ -+ -+ k = get_bits(bd, 2); -+ if (k < 2) { -+ bd->inbufBitCount++; -+ break; -+ } -+ /* Add one if second bit 1, else -+ * subtract 1. Avoids if/else */ -+ t += (((k+1)&2)-1); -+ } -+ /* Correct for the initial -1, to get the -+ * final symbol length */ -+ length[i] = t+1; -+ } -+ /* Find largest and smallest lengths in this group */ -+ minLen = maxLen = length[0]; -+ -+ for (i = 1; i < symCount; i++) { -+ if (length[i] > maxLen) -+ maxLen = length[i]; -+ else if (length[i] < minLen) -+ minLen = length[i]; -+ } -+ -+ /* Calculate permute[], base[], and limit[] tables from -+ * length[]. -+ * -+ * permute[] is the lookup table for converting -+ * Huffman coded symbols into decoded symbols. base[] -+ * is the amount to subtract from the value of a -+ * Huffman symbol of a given length when using -+ * permute[]. -+ * -+ * limit[] indicates the largest numerical value a -+ * symbol with a given number of bits can have. This -+ * is how the Huffman codes can vary in length: each -+ * code with a value > limit[length] needs another -+ * bit. -+ */ -+ hufGroup = bd->groups+j; -+ hufGroup->minLen = minLen; -+ hufGroup->maxLen = maxLen; -+ /* Note that minLen can't be smaller than 1, so we -+ adjust the base and limit array pointers so we're -+ not always wasting the first entry. We do this -+ again when using them (during symbol decoding).*/ -+ base = hufGroup->base-1; -+ limit = hufGroup->limit-1; -+ /* Calculate permute[]. Concurently, initialize -+ * temp[] and limit[]. */ -+ pp = 0; -+ for (i = minLen; i <= maxLen; i++) { -+ temp[i] = limit[i] = 0; -+ for (t = 0; t < symCount; t++) -+ if (length[t] == i) -+ hufGroup->permute[pp++] = t; -+ } -+ /* Count symbols coded for at each bit length */ -+ for (i = 0; i < symCount; i++) -+ temp[length[i]]++; -+ /* Calculate limit[] (the largest symbol-coding value -+ *at each bit length, which is (previous limit << -+ *1)+symbols at this level), and base[] (number of -+ *symbols to ignore at each bit length, which is limit -+ *minus the cumulative count of symbols coded for -+ *already). */ -+ pp = t = 0; -+ for (i = minLen; i < maxLen; i++) { -+ pp += temp[i]; -+ /* We read the largest possible symbol size -+ and then unget bits after determining how -+ many we need, and those extra bits could be -+ set to anything. (They're noise from -+ future symbols.) At each level we're -+ really only interested in the first few -+ bits, so here we set all the trailing -+ to-be-ignored bits to 1 so they don't -+ affect the value > limit[length] -+ comparison. */ -+ limit[i] = (pp << (maxLen - i)) - 1; -+ pp <<= 1; -+ base[i+1] = pp-(t += temp[i]); -+ } -+ limit[maxLen+1] = INT_MAX; /* Sentinal value for -+ * reading next sym. */ -+ limit[maxLen] = pp+temp[maxLen]-1; -+ base[minLen] = 0; -+ } -+ /* We've finished reading and digesting the block header. Now -+ read this block's Huffman coded symbols from the file and -+ undo the Huffman coding and run length encoding, saving the -+ result into dbuf[dbufCount++] = uc */ -+ -+ /* Initialize symbol occurrence counters and symbol Move To -+ * Front table */ -+ for (i = 0; i < 256; i++) { -+ byteCount[i] = 0; -+ mtfSymbol[i] = (unsigned char)i; -+ } -+ /* Loop through compressed symbols. */ -+ runPos = dbufCount = symCount = selector = 0; -+ for (;;) { -+ /* Determine which Huffman coding group to use. */ -+ if (!(symCount--)) { -+ symCount = GROUP_SIZE-1; -+ if (selector >= nSelectors) -+ return RETVAL_DATA_ERROR; -+ hufGroup = bd->groups+selectors[selector++]; -+ base = hufGroup->base-1; -+ limit = hufGroup->limit-1; -+ } -+ /* Read next Huffman-coded symbol. */ -+ /* Note: It is far cheaper to read maxLen bits and -+ back up than it is to read minLen bits and then an -+ additional bit at a time, testing as we go. -+ Because there is a trailing last block (with file -+ CRC), there is no danger of the overread causing an -+ unexpected EOF for a valid compressed file. As a -+ further optimization, we do the read inline -+ (falling back to a call to get_bits if the buffer -+ runs dry). The following (up to got_huff_bits:) is -+ equivalent to j = get_bits(bd, hufGroup->maxLen); -+ */ -+ while (bd->inbufBitCount < hufGroup->maxLen) { -+ if (bd->inbufPos == bd->inbufCount) { -+ j = get_bits(bd, hufGroup->maxLen); -+ goto got_huff_bits; -+ } -+ bd->inbufBits = -+ (bd->inbufBits << 8)|bd->inbuf[bd->inbufPos++]; -+ bd->inbufBitCount += 8; -+ }; -+ bd->inbufBitCount -= hufGroup->maxLen; -+ j = (bd->inbufBits >> bd->inbufBitCount)& -+ ((1 << hufGroup->maxLen)-1); -+got_huff_bits: -+ /* Figure how how many bits are in next symbol and -+ * unget extras */ -+ i = hufGroup->minLen; -+ while (j > limit[i]) -+ ++i; -+ bd->inbufBitCount += (hufGroup->maxLen - i); -+ /* Huffman decode value to get nextSym (with bounds checking) */ -+ if ((i > hufGroup->maxLen) -+ || (((unsigned)(j = (j>>(hufGroup->maxLen-i))-base[i])) -+ >= MAX_SYMBOLS)) -+ return RETVAL_DATA_ERROR; -+ nextSym = hufGroup->permute[j]; -+ /* We have now decoded the symbol, which indicates -+ either a new literal byte, or a repeated run of the -+ most recent literal byte. First, check if nextSym -+ indicates a repeated run, and if so loop collecting -+ how many times to repeat the last literal. */ -+ if (((unsigned)nextSym) <= SYMBOL_RUNB) { /* RUNA or RUNB */ -+ /* If this is the start of a new run, zero out -+ * counter */ -+ if (!runPos) { -+ runPos = 1; -+ t = 0; -+ } -+ /* Neat trick that saves 1 symbol: instead of -+ or-ing 0 or 1 at each bit position, add 1 -+ or 2 instead. For example, 1011 is 1 << 0 -+ + 1 << 1 + 2 << 2. 1010 is 2 << 0 + 2 << 1 -+ + 1 << 2. You can make any bit pattern -+ that way using 1 less symbol than the basic -+ or 0/1 method (except all bits 0, which -+ would use no symbols, but a run of length 0 -+ doesn't mean anything in this context). -+ Thus space is saved. */ -+ t += (runPos << nextSym); -+ /* +runPos if RUNA; +2*runPos if RUNB */ -+ -+ runPos <<= 1; -+ continue; -+ } -+ /* When we hit the first non-run symbol after a run, -+ we now know how many times to repeat the last -+ literal, so append that many copies to our buffer -+ of decoded symbols (dbuf) now. (The last literal -+ used is the one at the head of the mtfSymbol -+ array.) */ -+ if (runPos) { -+ runPos = 0; -+ if (dbufCount+t >= dbufSize) -+ return RETVAL_DATA_ERROR; -+ -+ uc = symToByte[mtfSymbol[0]]; -+ byteCount[uc] += t; -+ while (t--) -+ dbuf[dbufCount++] = uc; -+ } -+ /* Is this the terminating symbol? */ -+ if (nextSym > symTotal) -+ break; -+ /* At this point, nextSym indicates a new literal -+ character. Subtract one to get the position in the -+ MTF array at which this literal is currently to be -+ found. (Note that the result can't be -1 or 0, -+ because 0 and 1 are RUNA and RUNB. But another -+ instance of the first symbol in the mtf array, -+ position 0, would have been handled as part of a -+ run above. Therefore 1 unused mtf position minus 2 -+ non-literal nextSym values equals -1.) */ -+ if (dbufCount >= dbufSize) -+ return RETVAL_DATA_ERROR; -+ i = nextSym - 1; -+ uc = mtfSymbol[i]; -+ /* Adjust the MTF array. Since we typically expect to -+ *move only a small number of symbols, and are bound -+ *by 256 in any case, using memmove here would -+ *typically be bigger and slower due to function call -+ *overhead and other assorted setup costs. */ -+ do { -+ mtfSymbol[i] = mtfSymbol[i-1]; -+ } while (--i); -+ mtfSymbol[0] = uc; -+ uc = symToByte[uc]; -+ /* We have our literal byte. Save it into dbuf. */ -+ byteCount[uc]++; -+ dbuf[dbufCount++] = (unsigned int)uc; -+ } -+ /* At this point, we've read all the Huffman-coded symbols -+ (and repeated runs) for this block from the input stream, -+ and decoded them into the intermediate buffer. There are -+ dbufCount many decoded bytes in dbuf[]. Now undo the -+ Burrows-Wheeler transform on dbuf. See -+ http://dogma.net/markn/articles/bwt/bwt.htm -+ */ -+ /* Turn byteCount into cumulative occurrence counts of 0 to n-1. */ -+ j = 0; -+ for (i = 0; i < 256; i++) { -+ k = j+byteCount[i]; -+ byteCount[i] = j; -+ j = k; -+ } -+ /* Figure out what order dbuf would be in if we sorted it. */ -+ for (i = 0; i < dbufCount; i++) { -+ uc = (unsigned char)(dbuf[i] & 0xff); -+ dbuf[byteCount[uc]] |= (i << 8); -+ byteCount[uc]++; -+ } -+ /* Decode first byte by hand to initialize "previous" byte. -+ Note that it doesn't get output, and if the first three -+ characters are identical it doesn't qualify as a run (hence -+ writeRunCountdown = 5). */ -+ if (dbufCount) { -+ if (origPtr >= dbufCount) -+ return RETVAL_DATA_ERROR; -+ bd->writePos = dbuf[origPtr]; -+ bd->writeCurrent = (unsigned char)(bd->writePos&0xff); -+ bd->writePos >>= 8; -+ bd->writeRunCountdown = 5; -+ } -+ bd->writeCount = dbufCount; -+ -+ return RETVAL_OK; -+} -+ -+/* Undo burrows-wheeler transform on intermediate buffer to produce output. -+ If start_bunzip was initialized with out_fd =-1, then up to len bytes of -+ data are written to outbuf. Return value is number of bytes written or -+ error (all errors are negative numbers). If out_fd!=-1, outbuf and len -+ are ignored, data is written to out_fd and return is RETVAL_OK or error. -+*/ -+ -+static int INIT read_bunzip(struct bunzip_data *bd, char *outbuf, int len) -+{ -+ const unsigned int *dbuf; -+ int pos, xcurrent, previous, gotcount; -+ -+ /* If last read was short due to end of file, return last block now */ -+ if (bd->writeCount < 0) -+ return bd->writeCount; -+ -+ gotcount = 0; -+ dbuf = bd->dbuf; -+ pos = bd->writePos; -+ xcurrent = bd->writeCurrent; -+ -+ /* We will always have pending decoded data to write into the output -+ buffer unless this is the very first call (in which case we haven't -+ Huffman-decoded a block into the intermediate buffer yet). */ -+ -+ if (bd->writeCopies) { -+ /* Inside the loop, writeCopies means extra copies (beyond 1) */ -+ --bd->writeCopies; -+ /* Loop outputting bytes */ -+ for (;;) { -+ /* If the output buffer is full, snapshot -+ * state and return */ -+ if (gotcount >= len) { -+ bd->writePos = pos; -+ bd->writeCurrent = xcurrent; -+ bd->writeCopies++; -+ return len; -+ } -+ /* Write next byte into output buffer, updating CRC */ -+ outbuf[gotcount++] = xcurrent; -+ bd->writeCRC = (((bd->writeCRC) << 8) -+ ^bd->crc32Table[((bd->writeCRC) >> 24) -+ ^xcurrent]); -+ /* Loop now if we're outputting multiple -+ * copies of this byte */ -+ if (bd->writeCopies) { -+ --bd->writeCopies; -+ continue; -+ } -+decode_next_byte: -+ if (!bd->writeCount--) -+ break; -+ /* Follow sequence vector to undo -+ * Burrows-Wheeler transform */ -+ previous = xcurrent; -+ pos = dbuf[pos]; -+ xcurrent = pos&0xff; -+ pos >>= 8; -+ /* After 3 consecutive copies of the same -+ byte, the 4th is a repeat count. We count -+ down from 4 instead *of counting up because -+ testing for non-zero is faster */ -+ if (--bd->writeRunCountdown) { -+ if (xcurrent != previous) -+ bd->writeRunCountdown = 4; -+ } else { -+ /* We have a repeated run, this byte -+ * indicates the count */ -+ bd->writeCopies = xcurrent; -+ xcurrent = previous; -+ bd->writeRunCountdown = 5; -+ /* Sometimes there are just 3 bytes -+ * (run length 0) */ -+ if (!bd->writeCopies) -+ goto decode_next_byte; -+ /* Subtract the 1 copy we'd output -+ * anyway to get extras */ -+ --bd->writeCopies; -+ } -+ } -+ /* Decompression of this block completed successfully */ -+ bd->writeCRC = ~bd->writeCRC; -+ bd->totalCRC = ((bd->totalCRC << 1) | -+ (bd->totalCRC >> 31)) ^ bd->writeCRC; -+ /* If this block had a CRC error, force file level CRC error. */ -+ if (bd->writeCRC != bd->headerCRC) { -+ bd->totalCRC = bd->headerCRC+1; -+ return RETVAL_LAST_BLOCK; -+ } -+ } -+ -+ /* Refill the intermediate buffer by Huffman-decoding next -+ * block of input */ -+ /* (previous is just a convenient unused temp variable here) */ -+ previous = get_next_block(bd); -+ if (previous) { -+ bd->writeCount = previous; -+ return (previous != RETVAL_LAST_BLOCK) ? previous : gotcount; -+ } -+ bd->writeCRC = 0xffffffffUL; -+ pos = bd->writePos; -+ xcurrent = bd->writeCurrent; -+ goto decode_next_byte; -+} -+ -+static int INIT nofill(void *buf, unsigned int len) -+{ -+ return -1; -+} -+ -+/* Allocate the structure, read file header. If in_fd ==-1, inbuf must contain -+ a complete bunzip file (len bytes long). If in_fd!=-1, inbuf and len are -+ ignored, and data is read from file handle into temporary buffer. */ -+static int INIT start_bunzip(struct bunzip_data **bdp, void *inbuf, int len, -+ int (*fill)(void*, unsigned int)) -+{ -+ struct bunzip_data *bd; -+ unsigned int i, j, c; -+ const unsigned int BZh0 = -+ (((unsigned int)'B') << 24)+(((unsigned int)'Z') << 16) -+ +(((unsigned int)'h') << 8)+(unsigned int)'0'; -+ -+ /* Figure out how much data to allocate */ -+ i = sizeof(struct bunzip_data); -+ -+ /* Allocate bunzip_data. Most fields initialize to zero. */ -+ bd = *bdp = malloc(i); -+ memset(bd, 0, sizeof(struct bunzip_data)); -+ /* Setup input buffer */ -+ bd->inbuf = inbuf; -+ bd->inbufCount = len; -+ if (fill != NULL) -+ bd->fill = fill; -+ else -+ bd->fill = nofill; -+ -+ /* Init the CRC32 table (big endian) */ -+ for (i = 0; i < 256; i++) { -+ c = i << 24; -+ for (j = 8; j; j--) -+ c = c&0x80000000 ? (c << 1)^0x04c11db7 : (c << 1); -+ bd->crc32Table[i] = c; -+ } -+ -+ /* Ensure that file starts with "BZh['1'-'9']." */ -+ i = get_bits(bd, 32); -+ if (((unsigned int)(i-BZh0-1)) >= 9) -+ return RETVAL_NOT_BZIP_DATA; -+ -+ /* Fourth byte (ascii '1'-'9'), indicates block size in units of 100k of -+ uncompressed data. Allocate intermediate buffer for block. */ -+ bd->dbufSize = 100000*(i-BZh0); -+ -+ bd->dbuf = large_malloc(bd->dbufSize * sizeof(int)); -+ return RETVAL_OK; -+} -+ -+/* Example usage: decompress src_fd to dst_fd. (Stops at end of bzip2 data, -+ not end of file.) */ -+STATIC int INIT bunzip2(unsigned char *buf, int len, -+ int(*fill)(void*, unsigned int), -+ int(*flush)(void*, unsigned int), -+ unsigned char *outbuf, -+ int *pos, -+ void(*error_fn)(char *x)) -+{ -+ struct bunzip_data *bd; -+ int i = -1; -+ unsigned char *inbuf; -+ -+ set_error_fn(error_fn); -+ if (flush) -+ outbuf = malloc(BZIP2_IOBUF_SIZE); -+ else -+ len -= 4; /* Uncompressed size hack active in pre-boot -+ environment */ -+ if (!outbuf) { -+ error("Could not allocate output bufer"); -+ return -1; -+ } -+ if (buf) -+ inbuf = buf; -+ else -+ inbuf = malloc(BZIP2_IOBUF_SIZE); -+ if (!inbuf) { -+ error("Could not allocate input bufer"); -+ goto exit_0; -+ } -+ i = start_bunzip(&bd, inbuf, len, fill); -+ if (!i) { -+ for (;;) { -+ i = read_bunzip(bd, outbuf, BZIP2_IOBUF_SIZE); -+ if (i <= 0) -+ break; -+ if (!flush) -+ outbuf += i; -+ else -+ if (i != flush(outbuf, i)) { -+ i = RETVAL_UNEXPECTED_OUTPUT_EOF; -+ break; -+ } -+ } -+ } -+ /* Check CRC and release memory */ -+ if (i == RETVAL_LAST_BLOCK) { -+ if (bd->headerCRC != bd->totalCRC) -+ error("Data integrity error when decompressing."); -+ else -+ i = RETVAL_OK; -+ } else if (i == RETVAL_UNEXPECTED_OUTPUT_EOF) { -+ error("Compressed file ends unexpectedly"); -+ } -+ if (bd->dbuf) -+ large_free(bd->dbuf); -+ if (pos) -+ *pos = bd->inbufPos; -+ free(bd); -+ if (!buf) -+ free(inbuf); -+exit_0: -+ if (flush) -+ free(outbuf); -+ return i; -+} -+ -+#define decompress bunzip2 ---- /dev/null -+++ b/lib/decompress_unlzma.c -@@ -0,0 +1,647 @@ -+/* Lzma decompressor for Linux kernel. Shamelessly snarfed -+ *from busybox 1.1.1 -+ * -+ *Linux kernel adaptation -+ *Copyright (C) 2006 Alain < alain@knaff.lu > -+ * -+ *Based on small lzma deflate implementation/Small range coder -+ *implementation for lzma. -+ *Copyright (C) 2006 Aurelien Jacobs < aurel@gnuage.org > -+ * -+ *Based on LzmaDecode.c from the LZMA SDK 4.22 (http://www.7-zip.org/) -+ *Copyright (C) 1999-2005 Igor Pavlov -+ * -+ *Copyrights of the parts, see headers below. -+ * -+ * -+ *This program is free software; you can redistribute it and/or -+ *modify it under the terms of the GNU Lesser General Public -+ *License as published by the Free Software Foundation; either -+ *version 2.1 of the License, or (at your option) any later version. -+ * -+ *This program is distributed in the hope that it will be useful, -+ *but WITHOUT ANY WARRANTY; without even the implied warranty of -+ *MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ *Lesser General Public License for more details. -+ * -+ *You should have received a copy of the GNU Lesser General Public -+ *License along with this library; if not, write to the Free Software -+ *Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+#ifndef STATIC -+#include <linux/decompress/unlzma.h> -+#endif /* STATIC */ -+ -+#include <linux/decompress/mm.h> -+ -+#define MIN(a, b) (((a) < (b)) ? (a) : (b)) -+ -+static long long INIT read_int(unsigned char *ptr, int size) -+{ -+ int i; -+ long long ret = 0; -+ -+ for (i = 0; i < size; i++) -+ ret = (ret << 8) | ptr[size-i-1]; -+ return ret; -+} -+ -+#define ENDIAN_CONVERT(x) \ -+ x = (typeof(x))read_int((unsigned char *)&x, sizeof(x)) -+ -+ -+/* Small range coder implementation for lzma. -+ *Copyright (C) 2006 Aurelien Jacobs < aurel@gnuage.org > -+ * -+ *Based on LzmaDecode.c from the LZMA SDK 4.22 (http://www.7-zip.org/) -+ *Copyright (c) 1999-2005 Igor Pavlov -+ */ -+ -+#include <linux/compiler.h> -+ -+#define LZMA_IOBUF_SIZE 0x10000 -+ -+struct rc { -+ int (*fill)(void*, unsigned int); -+ uint8_t *ptr; -+ uint8_t *buffer; -+ uint8_t *buffer_end; -+ int buffer_size; -+ uint32_t code; -+ uint32_t range; -+ uint32_t bound; -+}; -+ -+ -+#define RC_TOP_BITS 24 -+#define RC_MOVE_BITS 5 -+#define RC_MODEL_TOTAL_BITS 11 -+ -+ -+/* Called twice: once at startup and once in rc_normalize() */ -+static void INIT rc_read(struct rc *rc) -+{ -+ rc->buffer_size = rc->fill((char *)rc->buffer, LZMA_IOBUF_SIZE); -+ if (rc->buffer_size <= 0) -+ error("unexpected EOF"); -+ rc->ptr = rc->buffer; -+ rc->buffer_end = rc->buffer + rc->buffer_size; -+} -+ -+/* Called once */ -+static inline void INIT rc_init(struct rc *rc, -+ int (*fill)(void*, unsigned int), -+ char *buffer, int buffer_size) -+{ -+ rc->fill = fill; -+ rc->buffer = (uint8_t *)buffer; -+ rc->buffer_size = buffer_size; -+ rc->buffer_end = rc->buffer + rc->buffer_size; -+ rc->ptr = rc->buffer; -+ -+ rc->code = 0; -+ rc->range = 0xFFFFFFFF; -+} -+ -+static inline void INIT rc_init_code(struct rc *rc) -+{ -+ int i; -+ -+ for (i = 0; i < 5; i++) { -+ if (rc->ptr >= rc->buffer_end) -+ rc_read(rc); -+ rc->code = (rc->code << 8) | *rc->ptr++; -+ } -+} -+ -+ -+/* Called once. TODO: bb_maybe_free() */ -+static inline void INIT rc_free(struct rc *rc) -+{ -+ free(rc->buffer); -+} -+ -+/* Called twice, but one callsite is in inline'd rc_is_bit_0_helper() */ -+static void INIT rc_do_normalize(struct rc *rc) -+{ -+ if (rc->ptr >= rc->buffer_end) -+ rc_read(rc); -+ rc->range <<= 8; -+ rc->code = (rc->code << 8) | *rc->ptr++; -+} -+static inline void INIT rc_normalize(struct rc *rc) -+{ -+ if (rc->range < (1 << RC_TOP_BITS)) -+ rc_do_normalize(rc); -+} -+ -+/* Called 9 times */ -+/* Why rc_is_bit_0_helper exists? -+ *Because we want to always expose (rc->code < rc->bound) to optimizer -+ */ -+static inline uint32_t INIT rc_is_bit_0_helper(struct rc *rc, uint16_t *p) -+{ -+ rc_normalize(rc); -+ rc->bound = *p * (rc->range >> RC_MODEL_TOTAL_BITS); -+ return rc->bound; -+} -+static inline int INIT rc_is_bit_0(struct rc *rc, uint16_t *p) -+{ -+ uint32_t t = rc_is_bit_0_helper(rc, p); -+ return rc->code < t; -+} -+ -+/* Called ~10 times, but very small, thus inlined */ -+static inline void INIT rc_update_bit_0(struct rc *rc, uint16_t *p) -+{ -+ rc->range = rc->bound; -+ *p += ((1 << RC_MODEL_TOTAL_BITS) - *p) >> RC_MOVE_BITS; -+} -+static inline void rc_update_bit_1(struct rc *rc, uint16_t *p) -+{ -+ rc->range -= rc->bound; -+ rc->code -= rc->bound; -+ *p -= *p >> RC_MOVE_BITS; -+} -+ -+/* Called 4 times in unlzma loop */ -+static int INIT rc_get_bit(struct rc *rc, uint16_t *p, int *symbol) -+{ -+ if (rc_is_bit_0(rc, p)) { -+ rc_update_bit_0(rc, p); -+ *symbol *= 2; -+ return 0; -+ } else { -+ rc_update_bit_1(rc, p); -+ *symbol = *symbol * 2 + 1; -+ return 1; -+ } -+} -+ -+/* Called once */ -+static inline int INIT rc_direct_bit(struct rc *rc) -+{ -+ rc_normalize(rc); -+ rc->range >>= 1; -+ if (rc->code >= rc->range) { -+ rc->code -= rc->range; -+ return 1; -+ } -+ return 0; -+} -+ -+/* Called twice */ -+static inline void INIT -+rc_bit_tree_decode(struct rc *rc, uint16_t *p, int num_levels, int *symbol) -+{ -+ int i = num_levels; -+ -+ *symbol = 1; -+ while (i--) -+ rc_get_bit(rc, p + *symbol, symbol); -+ *symbol -= 1 << num_levels; -+} -+ -+ -+/* -+ * Small lzma deflate implementation. -+ * Copyright (C) 2006 Aurelien Jacobs < aurel@gnuage.org > -+ * -+ * Based on LzmaDecode.c from the LZMA SDK 4.22 (http://www.7-zip.org/) -+ * Copyright (C) 1999-2005 Igor Pavlov -+ */ -+ -+ -+struct lzma_header { -+ uint8_t pos; -+ uint32_t dict_size; -+ uint64_t dst_size; -+} __attribute__ ((packed)) ; -+ -+ -+#define LZMA_BASE_SIZE 1846 -+#define LZMA_LIT_SIZE 768 -+ -+#define LZMA_NUM_POS_BITS_MAX 4 -+ -+#define LZMA_LEN_NUM_LOW_BITS 3 -+#define LZMA_LEN_NUM_MID_BITS 3 -+#define LZMA_LEN_NUM_HIGH_BITS 8 -+ -+#define LZMA_LEN_CHOICE 0 -+#define LZMA_LEN_CHOICE_2 (LZMA_LEN_CHOICE + 1) -+#define LZMA_LEN_LOW (LZMA_LEN_CHOICE_2 + 1) -+#define LZMA_LEN_MID (LZMA_LEN_LOW \ -+ + (1 << (LZMA_NUM_POS_BITS_MAX + LZMA_LEN_NUM_LOW_BITS))) -+#define LZMA_LEN_HIGH (LZMA_LEN_MID \ -+ +(1 << (LZMA_NUM_POS_BITS_MAX + LZMA_LEN_NUM_MID_BITS))) -+#define LZMA_NUM_LEN_PROBS (LZMA_LEN_HIGH + (1 << LZMA_LEN_NUM_HIGH_BITS)) -+ -+#define LZMA_NUM_STATES 12 -+#define LZMA_NUM_LIT_STATES 7 -+ -+#define LZMA_START_POS_MODEL_INDEX 4 -+#define LZMA_END_POS_MODEL_INDEX 14 -+#define LZMA_NUM_FULL_DISTANCES (1 << (LZMA_END_POS_MODEL_INDEX >> 1)) -+ -+#define LZMA_NUM_POS_SLOT_BITS 6 -+#define LZMA_NUM_LEN_TO_POS_STATES 4 -+ -+#define LZMA_NUM_ALIGN_BITS 4 -+ -+#define LZMA_MATCH_MIN_LEN 2 -+ -+#define LZMA_IS_MATCH 0 -+#define LZMA_IS_REP (LZMA_IS_MATCH + (LZMA_NUM_STATES << LZMA_NUM_POS_BITS_MAX)) -+#define LZMA_IS_REP_G0 (LZMA_IS_REP + LZMA_NUM_STATES) -+#define LZMA_IS_REP_G1 (LZMA_IS_REP_G0 + LZMA_NUM_STATES) -+#define LZMA_IS_REP_G2 (LZMA_IS_REP_G1 + LZMA_NUM_STATES) -+#define LZMA_IS_REP_0_LONG (LZMA_IS_REP_G2 + LZMA_NUM_STATES) -+#define LZMA_POS_SLOT (LZMA_IS_REP_0_LONG \ -+ + (LZMA_NUM_STATES << LZMA_NUM_POS_BITS_MAX)) -+#define LZMA_SPEC_POS (LZMA_POS_SLOT \ -+ +(LZMA_NUM_LEN_TO_POS_STATES << LZMA_NUM_POS_SLOT_BITS)) -+#define LZMA_ALIGN (LZMA_SPEC_POS \ -+ + LZMA_NUM_FULL_DISTANCES - LZMA_END_POS_MODEL_INDEX) -+#define LZMA_LEN_CODER (LZMA_ALIGN + (1 << LZMA_NUM_ALIGN_BITS)) -+#define LZMA_REP_LEN_CODER (LZMA_LEN_CODER + LZMA_NUM_LEN_PROBS) -+#define LZMA_LITERAL (LZMA_REP_LEN_CODER + LZMA_NUM_LEN_PROBS) -+ -+ -+struct writer { -+ uint8_t *buffer; -+ uint8_t previous_byte; -+ size_t buffer_pos; -+ int bufsize; -+ size_t global_pos; -+ int(*flush)(void*, unsigned int); -+ struct lzma_header *header; -+}; -+ -+struct cstate { -+ int state; -+ uint32_t rep0, rep1, rep2, rep3; -+}; -+ -+static inline size_t INIT get_pos(struct writer *wr) -+{ -+ return -+ wr->global_pos + wr->buffer_pos; -+} -+ -+static inline uint8_t INIT peek_old_byte(struct writer *wr, -+ uint32_t offs) -+{ -+ if (!wr->flush) { -+ int32_t pos; -+ while (offs > wr->header->dict_size) -+ offs -= wr->header->dict_size; -+ pos = wr->buffer_pos - offs; -+ return wr->buffer[pos]; -+ } else { -+ uint32_t pos = wr->buffer_pos - offs; -+ while (pos >= wr->header->dict_size) -+ pos += wr->header->dict_size; -+ return wr->buffer[pos]; -+ } -+ -+} -+ -+static inline void INIT write_byte(struct writer *wr, uint8_t byte) -+{ -+ wr->buffer[wr->buffer_pos++] = wr->previous_byte = byte; -+ if (wr->flush && wr->buffer_pos == wr->header->dict_size) { -+ wr->buffer_pos = 0; -+ wr->global_pos += wr->header->dict_size; -+ wr->flush((char *)wr->buffer, wr->header->dict_size); -+ } -+} -+ -+ -+static inline void INIT copy_byte(struct writer *wr, uint32_t offs) -+{ -+ write_byte(wr, peek_old_byte(wr, offs)); -+} -+ -+static inline void INIT copy_bytes(struct writer *wr, -+ uint32_t rep0, int len) -+{ -+ do { -+ copy_byte(wr, rep0); -+ len--; -+ } while (len != 0 && wr->buffer_pos < wr->header->dst_size); -+} -+ -+static inline void INIT process_bit0(struct writer *wr, struct rc *rc, -+ struct cstate *cst, uint16_t *p, -+ int pos_state, uint16_t *prob, -+ int lc, uint32_t literal_pos_mask) { -+ int mi = 1; -+ rc_update_bit_0(rc, prob); -+ prob = (p + LZMA_LITERAL + -+ (LZMA_LIT_SIZE -+ * (((get_pos(wr) & literal_pos_mask) << lc) -+ + (wr->previous_byte >> (8 - lc)))) -+ ); -+ -+ if (cst->state >= LZMA_NUM_LIT_STATES) { -+ int match_byte = peek_old_byte(wr, cst->rep0); -+ do { -+ int bit; -+ uint16_t *prob_lit; -+ -+ match_byte <<= 1; -+ bit = match_byte & 0x100; -+ prob_lit = prob + 0x100 + bit + mi; -+ if (rc_get_bit(rc, prob_lit, &mi)) { -+ if (!bit) -+ break; -+ } else { -+ if (bit) -+ break; -+ } -+ } while (mi < 0x100); -+ } -+ while (mi < 0x100) { -+ uint16_t *prob_lit = prob + mi; -+ rc_get_bit(rc, prob_lit, &mi); -+ } -+ write_byte(wr, mi); -+ if (cst->state < 4) -+ cst->state = 0; -+ else if (cst->state < 10) -+ cst->state -= 3; -+ else -+ cst->state -= 6; -+} -+ -+static inline void INIT process_bit1(struct writer *wr, struct rc *rc, -+ struct cstate *cst, uint16_t *p, -+ int pos_state, uint16_t *prob) { -+ int offset; -+ uint16_t *prob_len; -+ int num_bits; -+ int len; -+ -+ rc_update_bit_1(rc, prob); -+ prob = p + LZMA_IS_REP + cst->state; -+ if (rc_is_bit_0(rc, prob)) { -+ rc_update_bit_0(rc, prob); -+ cst->rep3 = cst->rep2; -+ cst->rep2 = cst->rep1; -+ cst->rep1 = cst->rep0; -+ cst->state = cst->state < LZMA_NUM_LIT_STATES ? 0 : 3; -+ prob = p + LZMA_LEN_CODER; -+ } else { -+ rc_update_bit_1(rc, prob); -+ prob = p + LZMA_IS_REP_G0 + cst->state; -+ if (rc_is_bit_0(rc, prob)) { -+ rc_update_bit_0(rc, prob); -+ prob = (p + LZMA_IS_REP_0_LONG -+ + (cst->state << -+ LZMA_NUM_POS_BITS_MAX) + -+ pos_state); -+ if (rc_is_bit_0(rc, prob)) { -+ rc_update_bit_0(rc, prob); -+ -+ cst->state = cst->state < LZMA_NUM_LIT_STATES ? -+ 9 : 11; -+ copy_byte(wr, cst->rep0); -+ return; -+ } else { -+ rc_update_bit_1(rc, prob); -+ } -+ } else { -+ uint32_t distance; -+ -+ rc_update_bit_1(rc, prob); -+ prob = p + LZMA_IS_REP_G1 + cst->state; -+ if (rc_is_bit_0(rc, prob)) { -+ rc_update_bit_0(rc, prob); -+ distance = cst->rep1; -+ } else { -+ rc_update_bit_1(rc, prob); -+ prob = p + LZMA_IS_REP_G2 + cst->state; -+ if (rc_is_bit_0(rc, prob)) { -+ rc_update_bit_0(rc, prob); -+ distance = cst->rep2; -+ } else { -+ rc_update_bit_1(rc, prob); -+ distance = cst->rep3; -+ cst->rep3 = cst->rep2; -+ } -+ cst->rep2 = cst->rep1; -+ } -+ cst->rep1 = cst->rep0; -+ cst->rep0 = distance; -+ } -+ cst->state = cst->state < LZMA_NUM_LIT_STATES ? 8 : 11; -+ prob = p + LZMA_REP_LEN_CODER; -+ } -+ -+ prob_len = prob + LZMA_LEN_CHOICE; -+ if (rc_is_bit_0(rc, prob_len)) { -+ rc_update_bit_0(rc, prob_len); -+ prob_len = (prob + LZMA_LEN_LOW -+ + (pos_state << -+ LZMA_LEN_NUM_LOW_BITS)); -+ offset = 0; -+ num_bits = LZMA_LEN_NUM_LOW_BITS; -+ } else { -+ rc_update_bit_1(rc, prob_len); -+ prob_len = prob + LZMA_LEN_CHOICE_2; -+ if (rc_is_bit_0(rc, prob_len)) { -+ rc_update_bit_0(rc, prob_len); -+ prob_len = (prob + LZMA_LEN_MID -+ + (pos_state << -+ LZMA_LEN_NUM_MID_BITS)); -+ offset = 1 << LZMA_LEN_NUM_LOW_BITS; -+ num_bits = LZMA_LEN_NUM_MID_BITS; -+ } else { -+ rc_update_bit_1(rc, prob_len); -+ prob_len = prob + LZMA_LEN_HIGH; -+ offset = ((1 << LZMA_LEN_NUM_LOW_BITS) -+ + (1 << LZMA_LEN_NUM_MID_BITS)); -+ num_bits = LZMA_LEN_NUM_HIGH_BITS; -+ } -+ } -+ -+ rc_bit_tree_decode(rc, prob_len, num_bits, &len); -+ len += offset; -+ -+ if (cst->state < 4) { -+ int pos_slot; -+ -+ cst->state += LZMA_NUM_LIT_STATES; -+ prob = -+ p + LZMA_POS_SLOT + -+ ((len < -+ LZMA_NUM_LEN_TO_POS_STATES ? len : -+ LZMA_NUM_LEN_TO_POS_STATES - 1) -+ << LZMA_NUM_POS_SLOT_BITS); -+ rc_bit_tree_decode(rc, prob, -+ LZMA_NUM_POS_SLOT_BITS, -+ &pos_slot); -+ if (pos_slot >= LZMA_START_POS_MODEL_INDEX) { -+ int i, mi; -+ num_bits = (pos_slot >> 1) - 1; -+ cst->rep0 = 2 | (pos_slot & 1); -+ if (pos_slot < LZMA_END_POS_MODEL_INDEX) { -+ cst->rep0 <<= num_bits; -+ prob = p + LZMA_SPEC_POS + -+ cst->rep0 - pos_slot - 1; -+ } else { -+ num_bits -= LZMA_NUM_ALIGN_BITS; -+ while (num_bits--) -+ cst->rep0 = (cst->rep0 << 1) | -+ rc_direct_bit(rc); -+ prob = p + LZMA_ALIGN; -+ cst->rep0 <<= LZMA_NUM_ALIGN_BITS; -+ num_bits = LZMA_NUM_ALIGN_BITS; -+ } -+ i = 1; -+ mi = 1; -+ while (num_bits--) { -+ if (rc_get_bit(rc, prob + mi, &mi)) -+ cst->rep0 |= i; -+ i <<= 1; -+ } -+ } else -+ cst->rep0 = pos_slot; -+ if (++(cst->rep0) == 0) -+ return; -+ } -+ -+ len += LZMA_MATCH_MIN_LEN; -+ -+ copy_bytes(wr, cst->rep0, len); -+} -+ -+ -+ -+STATIC inline int INIT unlzma(unsigned char *buf, int in_len, -+ int(*fill)(void*, unsigned int), -+ int(*flush)(void*, unsigned int), -+ unsigned char *output, -+ int *posp, -+ void(*error_fn)(char *x) -+ ) -+{ -+ struct lzma_header header; -+ int lc, pb, lp; -+ uint32_t pos_state_mask; -+ uint32_t literal_pos_mask; -+ uint16_t *p; -+ int num_probs; -+ struct rc rc; -+ int i, mi; -+ struct writer wr; -+ struct cstate cst; -+ unsigned char *inbuf; -+ int ret = -1; -+ -+ set_error_fn(error_fn); -+ if (!flush) -+ in_len -= 4; /* Uncompressed size hack active in pre-boot -+ environment */ -+ if (buf) -+ inbuf = buf; -+ else -+ inbuf = malloc(LZMA_IOBUF_SIZE); -+ if (!inbuf) { -+ error("Could not allocate input bufer"); -+ goto exit_0; -+ } -+ -+ cst.state = 0; -+ cst.rep0 = cst.rep1 = cst.rep2 = cst.rep3 = 1; -+ -+ wr.header = &header; -+ wr.flush = flush; -+ wr.global_pos = 0; -+ wr.previous_byte = 0; -+ wr.buffer_pos = 0; -+ -+ rc_init(&rc, fill, inbuf, in_len); -+ -+ for (i = 0; i < sizeof(header); i++) { -+ if (rc.ptr >= rc.buffer_end) -+ rc_read(&rc); -+ ((unsigned char *)&header)[i] = *rc.ptr++; -+ } -+ -+ if (header.pos >= (9 * 5 * 5)) -+ error("bad header"); -+ -+ mi = 0; -+ lc = header.pos; -+ while (lc >= 9) { -+ mi++; -+ lc -= 9; -+ } -+ pb = 0; -+ lp = mi; -+ while (lp >= 5) { -+ pb++; -+ lp -= 5; -+ } -+ pos_state_mask = (1 << pb) - 1; -+ literal_pos_mask = (1 << lp) - 1; -+ -+ ENDIAN_CONVERT(header.dict_size); -+ ENDIAN_CONVERT(header.dst_size); -+ -+ if (header.dict_size == 0) -+ header.dict_size = 1; -+ -+ if (output) -+ wr.buffer = output; -+ else { -+ wr.bufsize = MIN(header.dst_size, header.dict_size); -+ wr.buffer = large_malloc(wr.bufsize); -+ } -+ if (wr.buffer == NULL) -+ goto exit_1; -+ -+ num_probs = LZMA_BASE_SIZE + (LZMA_LIT_SIZE << (lc + lp)); -+ p = (uint16_t *) large_malloc(num_probs * sizeof(*p)); -+ if (p == 0) -+ goto exit_2; -+ num_probs = LZMA_LITERAL + (LZMA_LIT_SIZE << (lc + lp)); -+ for (i = 0; i < num_probs; i++) -+ p[i] = (1 << RC_MODEL_TOTAL_BITS) >> 1; -+ -+ rc_init_code(&rc); -+ -+ while (get_pos(&wr) < header.dst_size) { -+ int pos_state = get_pos(&wr) & pos_state_mask; -+ uint16_t *prob = p + LZMA_IS_MATCH + -+ (cst.state << LZMA_NUM_POS_BITS_MAX) + pos_state; -+ if (rc_is_bit_0(&rc, prob)) -+ process_bit0(&wr, &rc, &cst, p, pos_state, prob, -+ lc, literal_pos_mask); -+ else { -+ process_bit1(&wr, &rc, &cst, p, pos_state, prob); -+ if (cst.rep0 == 0) -+ break; -+ } -+ } -+ -+ if (posp) -+ *posp = rc.ptr-rc.buffer; -+ if (wr.flush) -+ wr.flush(wr.buffer, wr.buffer_pos); -+ ret = 0; -+ large_free(p); -+exit_2: -+ if (!output) -+ large_free(wr.buffer); -+exit_1: -+ if (!buf) -+ free(inbuf); -+exit_0: -+ return ret; -+} -+ -+#define decompress unlzma ---- a/lib/inflate.c -+++ b/lib/inflate.c -@@ -109,20 +109,78 @@ static char rcsid[] = "#Id: inflate.c,v - #endif - - #ifndef STATIC -+#include <linux/decompress/inflate.h> -+#endif /* ! STATIC */ - --#if defined(STDC_HEADERS) || defined(HAVE_STDLIB_H) --# include <sys/types.h> --# include <stdlib.h> -+#include <linux/decompress/mm.h> -+ -+#include <linux/string.h> -+ -+#ifdef NEW_CODE -+static int(*flush_cb)(void*, unsigned int); -+static int(*fill_cb)(void*, unsigned int); -+ -+/* Begin stuff copied from initramfs */ -+/* -+ * gzip declarations -+ */ -+ -+#define OF(args) args -+ -+#ifndef memzero -+#define memzero(s, n) memset((s), 0, (n)) - #endif - --#include "gzip.h" --#define STATIC --#endif /* !STATIC */ -+#define INBUFSIZ 4096 -+ -+#define WSIZE 0x8000 /* window size--must be a power of two, and */ -+ /* at least 32K for zip's deflate method */ -+ -+static uint8_t *inbuf; -+static uint8_t *window; -+ -+static unsigned insize; /* valid bytes in inbuf */ -+static unsigned outcnt; /* bytes in output buffer */ -+static long bytes_out; -+ -+/* --- */ -+ -+static unsigned inptr; /* index of next byte to be processed in inbuf */ -+ -+/* --- */ -+ -+/* =========================================================================== -+ * Fill the input buffer. This is called only when the buffer is empty -+ * and at least one byte is really needed. -+ * Returning -1 does not guarantee that gunzip() will ever return. -+ */ -+static int INIT fill_inbuf(void) -+{ -+ insize = fill_cb(inbuf, INBUFSIZ); -+ if (insize <= 0) { -+ error("RAMDISK: ran out of compressed data"); -+ return -1; -+ } -+ -+ inptr = 1; -+ -+ return inbuf[0]; -+} -+ -+#define get_byte() (inptr < insize ? inbuf[inptr++] : fill_inbuf()) -+ -+/* Diagnostic functions (stubbed out) */ -+#define Assert(cond, msg) -+#define Trace(x) -+#define Tracev(x) -+#define Tracevv(x) -+#define Tracec(c, x) -+#define Tracecv(c, x) - --#ifndef INIT --#define INIT -+static void flush_window(void); -+/* End stuff copied from initramfs */ - #endif -- -+ - #define slide window - - /* Huffman code lookup table entry--this entry is four bytes for machines -@@ -133,10 +191,10 @@ static char rcsid[] = "#Id: inflate.c,v - an unused code. If a code with e == 99 is looked up, this implies an - error in the data. */ - struct huft { -- uch e; /* number of extra bits or operation */ -- uch b; /* number of bits in this code or subcode */ -+ uint8_t e; /* number of extra bits or operation */ -+ uint8_t b; /* number of bits in this code or subcode */ - union { -- ush n; /* literal, length base, or distance base */ -+ uint16_t n; /* literal, length base, or distance base */ - struct huft *t; /* pointer to next level of table */ - } v; - }; -@@ -144,7 +202,7 @@ struct huft { - - /* Function prototypes */ - STATIC int INIT huft_build OF((unsigned *, unsigned, unsigned, -- const ush *, const ush *, struct huft **, int *)); -+ const uint16_t *, const uint16_t *, struct huft **, int *)); - STATIC int INIT huft_free OF((struct huft *)); - STATIC int INIT inflate_codes OF((struct huft *, struct huft *, int, int)); - STATIC int INIT inflate_stored OF((void)); -@@ -159,28 +217,28 @@ STATIC int INIT inflate OF((void)); - circular buffer. The index is updated simply by incrementing and then - ANDing with 0x7fff (32K-1). */ - /* It is left to other modules to supply the 32 K area. It is assumed -- to be usable as if it were declared "uch slide[32768];" or as just -- "uch *slide;" and then malloc'ed in the latter case. The definition -+ to be usable as if it were declared "uint8_t slide[32768];" or as just -+ "uint8_t *slide;" and then malloc'ed in the latter case. The definition - must be in unzip.h, included above. */ - /* unsigned wp; current position in slide */ - #define wp outcnt - #define flush_output(w) (wp=(w),flush_window()) - - /* Tables for deflate from PKZIP's appnote.txt. */ --static const unsigned border[] = { /* Order of the bit length code lengths */ -+static const unsigned border[] = { /* Order of the bit length code lengths */ - 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; --static const ush cplens[] = { /* Copy lengths for literal codes 257..285 */ -+static const uint16_t cplens[] = { /* Copy lengths for literal codes 257..285 */ - 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, - 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; - /* note: see note #13 above about the 258 in this list. */ --static const ush cplext[] = { /* Extra bits for literal codes 257..285 */ -+static const uint16_t cplext[] = { /* Extra bits for literal codes 257..285 */ - 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, 99, 99}; /* 99==invalid */ --static const ush cpdist[] = { /* Copy offsets for distance codes 0..29 */ -+static const uint16_t cpdist[] = { /* Copy offsets for distance codes 0..29 */ - 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, - 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, - 8193, 12289, 16385, 24577}; --static const ush cpdext[] = { /* Extra bits for distance codes */ -+static const uint16_t cpdext[] = { /* Extra bits for distance codes */ - 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}; -@@ -217,59 +275,21 @@ static const ush cpdext[] = { /* - the stream. - */ - --STATIC ulg bb; /* bit buffer */ -+STATIC uint32_t bb; /* bit buffer */ - STATIC unsigned bk; /* bits in bit buffer */ - --STATIC const ush mask_bits[] = { -+STATIC const uint16_t mask_bits[] = { - 0x0000, - 0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff, - 0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff - }; - --#define NEXTBYTE() ({ int v = get_byte(); if (v < 0) goto underrun; (uch)v; }) --#define NEEDBITS(n) {while(k<(n)){b|=((ulg)NEXTBYTE())<<k;k+=8;}} -+#define NEXTBYTE() ({ int v = get_byte(); if (v < 0) goto underrun; \ -+ (uint8_t)v; }) -+#define NEEDBITS(n) {while (k < (n)) \ -+ {b |= ((uint32_t)NEXTBYTE())<<k; k += 8; } } - #define DUMPBITS(n) {b>>=(n);k-=(n);} - --#ifndef NO_INFLATE_MALLOC --/* A trivial malloc implementation, adapted from -- * malloc by Hannu Savolainen 1993 and Matthias Urlichs 1994 -- */ -- --static unsigned long malloc_ptr; --static int malloc_count; -- --static void *malloc(int size) --{ -- void *p; -- -- if (size < 0) -- error("Malloc error"); -- if (!malloc_ptr) -- malloc_ptr = free_mem_ptr; -- -- malloc_ptr = (malloc_ptr + 3) & ~3; /* Align */ -- -- p = (void *)malloc_ptr; -- malloc_ptr += size; -- -- if (free_mem_end_ptr && malloc_ptr >= free_mem_end_ptr) -- error("Out of memory"); -- -- malloc_count++; -- return p; --} -- --static void free(void *where) --{ -- malloc_count--; -- if (!malloc_count) -- malloc_ptr = free_mem_ptr; --} --#else --#define malloc(a) kmalloc(a, GFP_KERNEL) --#define free(a) kfree(a) --#endif -- - /* - Huffman code decoding is performed using a multi-level table lookup. - The fastest way to decode is to simply build a lookup table whose -@@ -307,7 +327,7 @@ STATIC const int lbits = 9; /* - STATIC const int dbits = 6; /* bits in base distance lookup table */ - - --/* If BMAX needs to be larger than 16, then h and x[] should be ulg. */ -+/* If BMAX needs to be larger than 16, then h and x[] should be uint32_t. */ - #define BMAX 16 /* maximum bit length of any code (16 for explode) */ - #define N_MAX 288 /* maximum number of codes in any set */ - -@@ -319,8 +339,8 @@ STATIC int INIT huft_build( - unsigned *b, /* code lengths in bits (all assumed <= BMAX) */ - unsigned n, /* number of codes (assumed <= N_MAX) */ - unsigned s, /* number of simple-valued codes (0..s-1) */ -- const ush *d, /* list of base values for non-simple codes */ -- const ush *e, /* list of extra bits for non-simple codes */ -+ const uint16_t *d, /* list of base values for non-simple codes */ -+ const uint16_t *e, /* list of extra bits for non-simple codes */ - struct huft **t, /* result: starting table */ - int *m /* maximum lookup bits, returns actual */ - ) -@@ -500,8 +520,8 @@ DEBG1("5 "); - if (h) - { - x[h] = i; /* save pattern for backing up */ -- r.b = (uch)l; /* bits to dump before this table */ -- r.e = (uch)(16 + j); /* bits in this table */ -+ r.b = (uint8_t)l; /* bits to dump before this table */ -+ r.e = (uint8_t)(16 + j); /* bits in this table */ - r.v.t = q; /* pointer to this table */ - j = i >> (w - l); /* (get around Turbo C bug) */ - u[h-1][j] = r; /* connect to last table */ -@@ -511,18 +531,18 @@ DEBG1("6 "); - DEBG("h6c "); - - /* set up table entry in r */ -- r.b = (uch)(k - w); -+ r.b = (uint8_t)(k - w); - if (p >= v + n) - r.e = 99; /* out of values--invalid code */ - else if (*p < s) - { -- r.e = (uch)(*p < 256 ? 16 : 15); /* 256 is end-of-block code */ -- r.v.n = (ush)(*p); /* simple code is just the value */ -+ r.e = (uint8_t)(*p < 256 ? 16 : 15); /* 256 is end-of-block code */ -+ r.v.n = (uint16_t)(*p); /* simple code is just the value */ - p++; /* one compiler does not like *p++ */ - } - else - { -- r.e = (uch)e[*p - s]; /* non-simple--look up in lists */ -+ r.e = (uint8_t)e[*p - s]; /* non-simple--look up in lists */ - r.v.n = d[*p++ - s]; - } - DEBG("h6d "); -@@ -592,11 +612,12 @@ STATIC int INIT inflate_codes( - Return an error code or zero if it all goes ok. */ - { - register unsigned e; /* table entry flag/number of extra bits */ -- unsigned n, d; /* length and index for copy */ -+ unsigned n; -+ int d; /* source index for copy */ - unsigned w; /* current window position */ - struct huft *t; /* pointer to table entry */ - unsigned ml, md; /* masks for bl and bd bits */ -- register ulg b; /* bit buffer */ -+ register uint32_t b; /* bit buffer */ - register unsigned k; /* number of bits in bit buffer */ - - -@@ -622,7 +643,7 @@ STATIC int INIT inflate_codes( - DUMPBITS(t->b) - if (e == 16) /* then it's a literal */ - { -- slide[w++] = (uch)t->v.n; -+ slide[w++] = (uint8_t)t->v.n; - Tracevv((stderr, "%c", slide[w-1])); - if (w == WSIZE) - { -@@ -659,11 +680,25 @@ STATIC int INIT inflate_codes( - - /* do the copy */ - do { -- n -= (e = (e = WSIZE - ((d &= WSIZE-1) > w ? d : w)) > n ? n : e); -+#ifdef NEW_CODE -+ if (flush_cb) { -+#endif -+ /* Sliding window emulated using circular buffer: -+ * manage wrap-around */ -+ e = WSIZE - ((d &= WSIZE-1) > w ? d : w); -+ if (e > n) -+ e = n; -+#ifdef NEW_CODE -+ } else { -+ e = n; -+ } -+#endif -+ n -= e; -+ - #if !defined(NOMEMCPY) && !defined(DEBUG) - if (w - d >= e) /* (this test assumes unsigned comparison) */ - { -- memcpy(slide + w, slide + d, e); -+ memcpy(slide + w, slide + d, e); - w += e; - d += e; - } -@@ -673,9 +708,8 @@ STATIC int INIT inflate_codes( - slide[w++] = slide[d++]; - Tracevv((stderr, "%c", slide[w-1])); - } while (--e); -- if (w == WSIZE) -- { -- flush_output(w); -+ if (w == WSIZE) { -+ flush_output(w); - w = 0; - } - } while (n); -@@ -702,7 +736,7 @@ STATIC int INIT inflate_stored(void) - { - unsigned n; /* number of bytes in block */ - unsigned w; /* current window position */ -- register ulg b; /* bit buffer */ -+ register uint32_t b; /* bit buffer */ - register unsigned k; /* number of bits in bit buffer */ - - DEBG("<stor"); -@@ -732,7 +766,7 @@ DEBG("<stor"); - while (n--) - { - NEEDBITS(8) -- slide[w++] = (uch)b; -+ slide[w++] = (uint8_t)b; - if (w == WSIZE) - { - flush_output(w); -@@ -838,7 +872,7 @@ STATIC int noinline INIT inflate_dynamic - unsigned nl; /* number of literal/length codes */ - unsigned nd; /* number of distance codes */ - unsigned *ll; /* literal/length and distance code lengths */ -- register ulg b; /* bit buffer */ -+ register uint32_t b; /* bit buffer */ - register unsigned k; /* number of bits in bit buffer */ - int ret; - -@@ -1033,7 +1067,7 @@ STATIC int INIT inflate_block( - /* decompress an inflated block */ - { - unsigned t; /* block type */ -- register ulg b; /* bit buffer */ -+ register uint32_t b; /* bit buffer */ - register unsigned k; /* number of bits in bit buffer */ - - DEBG("<blk"); -@@ -1130,8 +1164,8 @@ STATIC int INIT inflate(void) - * - **********************************************************************/ - --static ulg crc_32_tab[256]; --static ulg crc; /* initialized in makecrc() so it'll reside in bss */ -+static uint32_t crc_32_tab[256]; -+static uint32_t crc; /* initialized in makecrc() so it'll reside in bss */ - #define CRC_VALUE (crc ^ 0xffffffffUL) - - /* -@@ -1172,7 +1206,7 @@ makecrc(void) - } - - /* this is initialized here so this code could reside in ROM */ -- crc = (ulg)0xffffffffUL; /* shift register contents */ -+ crc = (uint32_t)0xffffffffUL; /* shift register contents */ - } - - /* gzip flag byte */ -@@ -1184,18 +1218,89 @@ makecrc(void) - #define ENCRYPTED 0x20 /* bit 5 set: file is encrypted */ - #define RESERVED 0xC0 /* bit 6,7: reserved */ - -+#ifdef NEW_CODE -+/* =========================================================================== -+ * Write the output window window[0..outcnt-1] and update crc and bytes_out. -+ * (Used for the decompressed data only.) -+ */ -+static void INIT flush_window(void) -+{ -+ uint32_t c = crc; /* temporary variable */ -+ unsigned n; -+ uint8_t *in, ch; -+ -+ in = window; -+ for (n = 0; n < outcnt; n++) { -+ ch = *in++; -+ c = crc_32_tab[((int)c ^ ch) & 0xff] ^ (c >> 8); -+ } -+ crc = c; -+ bytes_out += (uint32_t)outcnt; -+ if (flush_cb != NULL) -+ flush_cb(window, outcnt); /* TODO: handle unzip_error */ -+ else -+ window += outcnt; -+ outcnt = 0; -+} -+ -+static int empty_fill(void *buf, unsigned int len) -+{ -+ return 0; -+} -+#endif -+ -+ - /* - * Do the uncompression! - */ --static int INIT gunzip(void) -+STATIC int INIT gunzip( -+#ifdef NEW_CODE -+ unsigned char *buf, int len, -+ int(*fill)(void*, unsigned int), -+ int(*flush)(void*, unsigned int), -+ unsigned char *output, -+ int *posp, -+ void(*error_fn)(char *x) -+#else -+ void -+#endif -+ ) - { -- uch flags; -+ uint8_t flags; - unsigned char magic[2]; /* magic header */ - char method; -- ulg orig_crc = 0; /* original crc */ -- ulg orig_len = 0; /* original uncompressed length */ -+ uint32_t orig_crc = 0; /* original crc */ -+ uint32_t orig_len = 0; /* original uncompressed length */ - int res; - -+#ifdef NEW_CODE -+ set_error_fn(error_fn); -+ if (fill == NULL) -+ fill_cb = empty_fill; -+ else -+ fill_cb = fill; -+ if (output) -+ window = output; -+ else { -+ window = malloc(0x8000); -+ if (!window) -+ panic("can't allocate buffers"); -+ flush_cb = flush; -+ } -+ -+ insize = len; -+ if (buf) -+ inbuf = buf; -+ else -+ inbuf = malloc(INBUFSIZ); -+#endif -+ -+ inptr = 0; -+ outcnt = 0; /* bytes in output buffer */ -+ bytes_out = 0; -+ crc = (uint32_t)0xffffffffL; /* shift register contents */ -+ makecrc(); -+ - magic[0] = NEXTBYTE(); - magic[1] = NEXTBYTE(); - method = NEXTBYTE(); -@@ -1212,7 +1317,7 @@ static int INIT gunzip(void) - return -1; - } - -- flags = (uch)get_byte(); -+ flags = (uint8_t)get_byte(); - if ((flags & ENCRYPTED) != 0) { - error("Input is encrypted"); - return -1; -@@ -1277,15 +1382,15 @@ static int INIT gunzip(void) - /* crc32 (see algorithm.doc) - * uncompressed input size modulo 2^32 - */ -- orig_crc = (ulg) NEXTBYTE(); -- orig_crc |= (ulg) NEXTBYTE() << 8; -- orig_crc |= (ulg) NEXTBYTE() << 16; -- orig_crc |= (ulg) NEXTBYTE() << 24; -+ orig_crc = (uint32_t) NEXTBYTE(); -+ orig_crc |= (uint32_t) NEXTBYTE() << 8; -+ orig_crc |= (uint32_t) NEXTBYTE() << 16; -+ orig_crc |= (uint32_t) NEXTBYTE() << 24; - -- orig_len = (ulg) NEXTBYTE(); -- orig_len |= (ulg) NEXTBYTE() << 8; -- orig_len |= (ulg) NEXTBYTE() << 16; -- orig_len |= (ulg) NEXTBYTE() << 24; -+ orig_len = (uint32_t) NEXTBYTE(); -+ orig_len |= (uint32_t) NEXTBYTE() << 8; -+ orig_len |= (uint32_t) NEXTBYTE() << 16; -+ orig_len |= (uint32_t) NEXTBYTE() << 24; - - /* Validate decompression */ - if (orig_crc != CRC_VALUE) { -@@ -1296,11 +1401,22 @@ static int INIT gunzip(void) - error("length error"); - return -1; - } -+#ifdef NEW_CODE -+ if (!output) -+ free(window); -+ if (posp) -+ *posp = inptr; -+#endif - return 0; - - underrun: /* NEXTBYTE() goto's here if needed */ -+ free(window); -+#ifdef NEW_CODE -+ if (!buf) -+ free(inbuf); -+#endif - error("out of input data"); - return -1; - } - -- -+#define decompress gunzip ---- a/scripts/Makefile.lib -+++ b/scripts/Makefile.lib -@@ -183,3 +183,17 @@ quiet_cmd_gzip = GZIP $@ - cmd_gzip = gzip -f -9 < $< > $@ - - -+# Bzip2 -+# --------------------------------------------------------------------------- -+ -+# Bzip2 does not include size in file... so we have to fake that -+size_append=$(CONFIG_SHELL) $(srctree)/scripts/bin_size -+ -+quiet_cmd_bzip2 = BZIP2 $@ -+cmd_bzip2 = (bzip2 -9 < $< ; $(size_append) $<) > $@ || (rm -f $@ ; false) -+ -+# Lzma -+# --------------------------------------------------------------------------- -+ -+quiet_cmd_lzma = LZMA $@ -+cmd_lzma = (/usr/bin/lzma -9 -c $< ; $(size_append) $<) >$@ || (rm -f $@ ; false) ---- /dev/null -+++ b/scripts/bin_size -@@ -0,0 +1,10 @@ -+#!/bin/sh -+ -+if [ $# = 0 ] ; then -+ echo Usage: $0 file -+fi -+ -+size_dec=`stat -c "%s" $1` -+size_hex_echo_string=`printf "%08x" $size_dec | -+ sed 's/\(..\)\(..\)\(..\)\(..\)/\\\\x\4\\\\x\3\\\\x\2\\\\x\1/g'` -+/bin/echo -ne $size_hex_echo_string diff --git a/target/linux/rdc/patches-2.6.28/007-r6040_git_updates.patch b/target/linux/rdc/patches-2.6.28/007-r6040_git_updates.patch deleted file mode 100644 index 704786ae76..0000000000 --- a/target/linux/rdc/patches-2.6.28/007-r6040_git_updates.patch +++ /dev/null @@ -1,241 +0,0 @@ ---- a/drivers/net/r6040.c -+++ b/drivers/net/r6040.c -@@ -49,12 +49,12 @@ - #include <asm/processor.h> - - #define DRV_NAME "r6040" --#define DRV_VERSION "0.19" --#define DRV_RELDATE "18Dec2008" -+#define DRV_VERSION "0.22" -+#define DRV_RELDATE "25Mar2009" - - /* PHY CHIP Address */ - #define PHY1_ADDR 1 /* For MAC1 */ --#define PHY2_ADDR 2 /* For MAC2 */ -+#define PHY2_ADDR 3 /* For MAC2 */ - #define PHY_MODE 0x3100 /* PHY CHIP Register 0 */ - #define PHY_CAP 0x01E1 /* PHY CHIP Register 4 */ - -@@ -160,6 +160,7 @@ MODULE_AUTHOR("Sten Wang <sten.wang@rdc. - "Florian Fainelli <florian@openwrt.org>"); - MODULE_LICENSE("GPL"); - MODULE_DESCRIPTION("RDC R6040 NAPI PCI FastEthernet driver"); -+MODULE_VERSION(DRV_VERSION " " DRV_RELDATE); - - /* RX and TX interrupts that we handle */ - #define RX_INTS (RX_FIFO_FULL | RX_NO_DESC | RX_FINISH) -@@ -200,7 +201,7 @@ struct r6040_private { - - static char version[] __devinitdata = KERN_INFO DRV_NAME - ": RDC R6040 NAPI net driver," -- "version "DRV_VERSION " (" DRV_RELDATE ")\n"; -+ "version "DRV_VERSION " (" DRV_RELDATE ")"; - - static int phy_table[] = { PHY1_ADDR, PHY2_ADDR }; - -@@ -330,7 +331,7 @@ static int r6040_alloc_rxbufs(struct net - do { - skb = netdev_alloc_skb(dev, MAX_BUF_SIZE); - if (!skb) { -- printk(KERN_ERR "%s: failed to alloc skb for rx\n", dev->name); -+ printk(KERN_ERR DRV_NAME "%s: failed to alloc skb for rx\n", dev->name); - rc = -ENOMEM; - goto err_exit; - } -@@ -438,7 +439,6 @@ static void r6040_down(struct net_device - { - struct r6040_private *lp = netdev_priv(dev); - void __iomem *ioaddr = lp->base; -- struct pci_dev *pdev = lp->pdev; - int limit = 2048; - u16 *adrp; - u16 cmd; -@@ -457,22 +457,12 @@ static void r6040_down(struct net_device - iowrite16(adrp[0], ioaddr + MID_0L); - iowrite16(adrp[1], ioaddr + MID_0M); - iowrite16(adrp[2], ioaddr + MID_0H); -- free_irq(dev->irq, dev); -- -- /* Free RX buffer */ -- r6040_free_rxbufs(dev); -- -- /* Free TX buffer */ -- r6040_free_txbufs(dev); -- -- /* Free Descriptor memory */ -- pci_free_consistent(pdev, RX_DESC_SIZE, lp->rx_ring, lp->rx_ring_dma); -- pci_free_consistent(pdev, TX_DESC_SIZE, lp->tx_ring, lp->tx_ring_dma); - } - - static int r6040_close(struct net_device *dev) - { - struct r6040_private *lp = netdev_priv(dev); -+ struct pci_dev *pdev = lp->pdev; - - /* deleted timer */ - del_timer_sync(&lp->timer); -@@ -481,8 +471,28 @@ static int r6040_close(struct net_device - napi_disable(&lp->napi); - netif_stop_queue(dev); - r6040_down(dev); -+ -+ free_irq(dev->irq, dev); -+ -+ /* Free RX buffer */ -+ r6040_free_rxbufs(dev); -+ -+ /* Free TX buffer */ -+ r6040_free_txbufs(dev); -+ - spin_unlock_irq(&lp->lock); - -+ /* Free Descriptor memory */ -+ if (lp->rx_ring) { -+ pci_free_consistent(pdev, RX_DESC_SIZE, lp->rx_ring, lp->rx_ring_dma); -+ lp->rx_ring = NULL; -+ } -+ -+ if (lp->tx_ring) { -+ pci_free_consistent(pdev, TX_DESC_SIZE, lp->tx_ring, lp->tx_ring_dma); -+ lp->tx_ring = NULL; -+ } -+ - return 0; - } - -@@ -598,7 +608,6 @@ static int r6040_rx(struct net_device *d - - /* Send to upper layer */ - netif_receive_skb(skb_ptr); -- dev->last_rx = jiffies; - dev->stats.rx_packets++; - dev->stats.rx_bytes += descptr->len - 4; - -@@ -668,7 +677,7 @@ static int r6040_poll(struct napi_struct - work_done = r6040_rx(dev, budget); - - if (work_done < budget) { -- netif_rx_complete(dev, napi); -+ napi_complete(napi); - /* Enable RX interrupt */ - iowrite16(ioread16(ioaddr + MIER) | RX_INTS, ioaddr + MIER); - } -@@ -705,7 +714,7 @@ static irqreturn_t r6040_interrupt(int i - - /* Mask off RX interrupt */ - misr &= ~RX_INTS; -- netif_rx_schedule(dev, &lp->napi); -+ napi_schedule(&lp->napi); - } - - /* TX interrupt request */ -@@ -1063,20 +1072,20 @@ static int __devinit r6040_init_one(stru - /* this should always be supported */ - err = pci_set_dma_mask(pdev, DMA_32BIT_MASK); - if (err) { -- printk(KERN_ERR DRV_NAME "32-bit PCI DMA addresses" -+ printk(KERN_ERR DRV_NAME ": 32-bit PCI DMA addresses" - "not supported by the card\n"); - goto err_out; - } - err = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK); - if (err) { -- printk(KERN_ERR DRV_NAME "32-bit PCI DMA addresses" -+ printk(KERN_ERR DRV_NAME ": 32-bit PCI DMA addresses" - "not supported by the card\n"); - goto err_out; - } - - /* IO Size check */ - if (pci_resource_len(pdev, 0) < io_size) { -- printk(KERN_ERR DRV_NAME "Insufficient PCI resources, aborting\n"); -+ printk(KERN_ERR DRV_NAME ": Insufficient PCI resources, aborting\n"); - err = -EIO; - goto err_out; - } -@@ -1086,7 +1095,7 @@ static int __devinit r6040_init_one(stru - - dev = alloc_etherdev(sizeof(struct r6040_private)); - if (!dev) { -- printk(KERN_ERR DRV_NAME "Failed to allocate etherdev\n"); -+ printk(KERN_ERR DRV_NAME ": Failed to allocate etherdev\n"); - err = -ENOMEM; - goto err_out; - } -@@ -1102,11 +1111,15 @@ static int __devinit r6040_init_one(stru - - ioaddr = pci_iomap(pdev, bar, io_size); - if (!ioaddr) { -- printk(KERN_ERR "ioremap failed for device %s\n", -+ printk(KERN_ERR DRV_NAME ": ioremap failed for device %s\n", - pci_name(pdev)); - err = -EIO; - goto err_out_free_res; - } -+ /* If PHY status change register is still set to zero it means the -+ * bootloader didn't initialize it */ -+ if (ioread16(ioaddr + PHY_CC) == 0) -+ iowrite16(0x9f07, ioaddr + PHY_CC); - - /* Init system & device */ - lp->base = ioaddr; -@@ -1123,6 +1136,13 @@ static int __devinit r6040_init_one(stru - adrp[1] = ioread16(ioaddr + MID_0M); - adrp[2] = ioread16(ioaddr + MID_0H); - -+ /* Some bootloader/BIOSes do not initialize -+ * MAC address, warn about that */ -+ if (!(adrp[0] || adrp[1] || adrp[2])) { -+ printk(KERN_WARNING DRV_NAME ": MAC address not initialized, generating random\n"); -+ random_ether_addr(dev->dev_addr); -+ } -+ - /* Link new device into r6040_root_dev */ - lp->pdev = pdev; - lp->dev = dev; ---- a/drivers/net/r6040.c -+++ b/drivers/net/r6040.c -@@ -742,6 +742,14 @@ static int r6040_up(struct net_device *d - struct r6040_private *lp = netdev_priv(dev); - void __iomem *ioaddr = lp->base; - int ret; -+ u16 val; -+ -+ /* Check presence of a second PHY */ -+ val = r6040_phy_read(ioaddr, lp->phy_addr, 2); -+ if (val == 0xFFFF) { -+ printk(KERN_ERR DRV_NAME " no second PHY attached\n"); -+ return -EIO; -+ } - - /* Initialise and alloc RX/TX buffers */ - r6040_init_txbufs(dev); ---- a/drivers/net/r6040.c -+++ b/drivers/net/r6040.c -@@ -401,6 +401,9 @@ static void r6040_init_mac_regs(struct n - * we may got called by r6040_tx_timeout which has left - * some unsent tx buffers */ - iowrite16(0x01, ioaddr + MTPR); -+ -+ /* Check media */ -+ mii_check_media(&lp->mii_if, 1, 1); - } - - static void r6040_tx_timeout(struct net_device *dev) -@@ -528,6 +531,8 @@ static int r6040_phy_mode_chk(struct net - phy_dat = 0x0000; - } - -+ mii_check_media(&lp->mii_if, 0, 1); -+ - return phy_dat; - }; - -@@ -810,7 +815,6 @@ static void r6040_timer(unsigned long da - lp->phy_mode = phy_mode; - lp->mcr0 = (lp->mcr0 & 0x7fff) | phy_mode; - iowrite16(lp->mcr0, ioaddr); -- printk(KERN_INFO "Link Change %x \n", ioread16(ioaddr)); - } - - /* Timer active again */ diff --git a/target/linux/rdc/patches-2.6.28/008-r8610_flash_map.patch b/target/linux/rdc/patches-2.6.28/008-r8610_flash_map.patch deleted file mode 100644 index 755522cbc6..0000000000 --- a/target/linux/rdc/patches-2.6.28/008-r8610_flash_map.patch +++ /dev/null @@ -1,25 +0,0 @@ ---- a/drivers/mtd/maps/Kconfig -+++ b/drivers/mtd/maps/Kconfig -@@ -156,6 +156,12 @@ config MTD_RDC3210_BUSWIDTH - Number of bytes addressed on the RDC-3210 flash device before - addressing the same chip again - -+config MTD_R8610 -+ tristate "CFI flash device mapped on R8610" -+ depends on X86 && MTD_CFI && MTD_PARTITIONS -+ help -+ Flash support for the RDC R8610 evaluation board. -+ - config MTD_SC520CDP - tristate "CFI Flash device mapped on AMD SC520 CDP" - depends on X86 && MTD_CFI && MTD_CONCAT ---- a/drivers/mtd/maps/Makefile -+++ b/drivers/mtd/maps/Makefile -@@ -28,6 +28,7 @@ obj-$(CONFIG_MTD_PMC_MSP_EVM) += pmcms - obj-$(CONFIG_MTD_PMC_MSP_RAMROOT)+= pmcmsp-ramroot.o - obj-$(CONFIG_MTD_PCMCIA) += pcmciamtd.o - obj-$(CONFIG_MTD_RDC3210) += rdc3210.o -+obj-$(CONFIG_MTD_R8610) += r8610.o - obj-$(CONFIG_MTD_RPXLITE) += rpxlite.o - obj-$(CONFIG_MTD_TQM8XXL) += tqm8xxl.o - obj-$(CONFIG_MTD_SA1100) += sa1100-flash.o |