kernel: reorganize 2.6.37 patches
authorFelix Fietkau <nbd@openwrt.org>
Sat, 16 Apr 2011 18:31:21 +0000 (18:31 +0000)
committerFelix Fietkau <nbd@openwrt.org>
Sat, 16 Apr 2011 18:31:21 +0000 (18:31 +0000)
SVN-Revision: 26692

241 files changed:
target/linux/generic/patches-2.6.37/001-fix_localversion.patch [deleted file]
target/linux/generic/patches-2.6.37/005-squashfs_revert_to_2.6.35.patch [deleted file]
target/linux/generic/patches-2.6.37/006-squashfs_add_lzma.patch [deleted file]
target/linux/generic/patches-2.6.37/007-squashfs_make_lzma_available.patch [deleted file]
target/linux/generic/patches-2.6.37/008-jffs2_make_lzma_available.patch [deleted file]
target/linux/generic/patches-2.6.37/009-decompress_unlzo_fix.patch [deleted file]
target/linux/generic/patches-2.6.37/010-debloat_lzma.patch [deleted file]
target/linux/generic/patches-2.6.37/010-gcc4_inline_fix.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/011-mips_boot.patch [deleted file]
target/linux/generic/patches-2.6.37/012-extra_optimization.patch [deleted file]
target/linux/generic/patches-2.6.37/013-gcc4_inline_fix.patch [deleted file]
target/linux/generic/patches-2.6.37/014-cfi_show_amd_extended_table_version.patch [deleted file]
target/linux/generic/patches-2.6.37/020-mips_multi_machine_support.patch [deleted file]
target/linux/generic/patches-2.6.37/020-ssb_update.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/021-mips_image_cmdline_hack.patch [deleted file]
target/linux/generic/patches-2.6.37/022-mips_use_generic_thread_info_allocator.patch [deleted file]
target/linux/generic/patches-2.6.37/023-mips-fix-kexec.patch [deleted file]
target/linux/generic/patches-2.6.37/025-mips_disable_fpu.patch [deleted file]
target/linux/generic/patches-2.6.37/027-mips_module_reloc.patch [deleted file]
target/linux/generic/patches-2.6.37/028-module_exports.patch [deleted file]
target/linux/generic/patches-2.6.37/029-arm_module_unresolved_weak_sym.patch [deleted file]
target/linux/generic/patches-2.6.37/030-mips_multi_machine_support.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/030-pci_disable_common_quirks.patch [deleted file]
target/linux/generic/patches-2.6.37/031-pci_disable_usb_common_quirks.patch [deleted file]
target/linux/generic/patches-2.6.37/040-arm-update-mach-types.patch [deleted file]
target/linux/generic/patches-2.6.37/040-jhash3.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/050-solos_dont_null_deref.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/051-solos_uniform_vpi_vci.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/052-solos-debug_skbuff.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/053-solos-vccs_release.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/060-backport_tos2prio_ecn_fix.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/060-block2mtd_init.patch [deleted file]
target/linux/generic/patches-2.6.37/065-rootfs_split.patch [deleted file]
target/linux/generic/patches-2.6.37/066-block2mtd_probe.patch [deleted file]
target/linux/generic/patches-2.6.37/070-redboot_space.patch [deleted file]
target/linux/generic/patches-2.6.37/071-redboot_boardconfig.patch [deleted file]
target/linux/generic/patches-2.6.37/080-mtd_plat_nand_chip_fixup.patch [deleted file]
target/linux/generic/patches-2.6.37/081-mtd_myloader_partition_parser.patch [deleted file]
target/linux/generic/patches-2.6.37/082-mtd_info_move_forward_decl.patch [deleted file]
target/linux/generic/patches-2.6.37/083-mtd_fix_nand_correct_data_return_code.patch [deleted file]
target/linux/generic/patches-2.6.37/084-mtd_m25p80_add_pm25lv_flash_support.patch [deleted file]
target/linux/generic/patches-2.6.37/089-mtd-samsung-flash.patch [deleted file]
target/linux/generic/patches-2.6.37/090-mtd-m25p80-add-en25f32-chip-support.patch [deleted file]
target/linux/generic/patches-2.6.37/091-mtd-m25p80-add-MX25L1606E-support.patch [deleted file]
target/linux/generic/patches-2.6.37/100-netfilter_layer7_2.22.patch [deleted file]
target/linux/generic/patches-2.6.37/100-overlayfs.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/101-netfilter_layer7_pktmatch.patch [deleted file]
target/linux/generic/patches-2.6.37/101-overlayfs_2.6.37_backport.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/102-netfilter_layer7_match.patch [deleted file]
target/linux/generic/patches-2.6.37/102-overlayfs_fix_readdir_deadlock.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/103-netfilter_layer7_2.6.36_fix.patch [deleted file]
target/linux/generic/patches-2.6.37/103-overlayfs_fix_readdir_unlink_deadlock.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/160-netfilter_cisco_794x_iphone.patch [deleted file]
target/linux/generic/patches-2.6.37/180-netfilter_depends.patch [deleted file]
target/linux/generic/patches-2.6.37/190-netfilter_rtsp.patch [deleted file]
target/linux/generic/patches-2.6.37/200-fix_localversion.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/200-sched_esfq.patch [deleted file]
target/linux/generic/patches-2.6.37/201-extra_optimization.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/201-jhash3.patch [deleted file]
target/linux/generic/patches-2.6.37/202-mips_mem_functions_performance.patch [deleted file]
target/linux/generic/patches-2.6.37/203-slab_maxsize.patch [deleted file]
target/linux/generic/patches-2.6.37/204-jffs2_eofdetect.patch [deleted file]
target/linux/generic/patches-2.6.37/207-powerpc_asm_segment_h.patch [deleted file]
target/linux/generic/patches-2.6.37/208-mips_oprofile_fix.patch [deleted file]
target/linux/generic/patches-2.6.37/209-overlayfs.patch [deleted file]
target/linux/generic/patches-2.6.37/210-darwin_scripts_include.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/210-overlayfs_2.6.37_backport.patch [deleted file]
target/linux/generic/patches-2.6.37/211-overlayfs_fix_readdir_deadlock.patch [deleted file]
target/linux/generic/patches-2.6.37/211-stddef_include.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/212-overlayfs_fix_readdir_unlink_deadlock.patch [deleted file]
target/linux/generic/patches-2.6.37/219-kobject_uevent.patch [deleted file]
target/linux/generic/patches-2.6.37/220-module_exports.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/220-sound_kconfig.patch [deleted file]
target/linux/generic/patches-2.6.37/222-partial_eraseblock_write.patch [deleted file]
target/linux/generic/patches-2.6.37/223-kobject-add-broadcast_uevent.patch [deleted file]
target/linux/generic/patches-2.6.37/230-openwrt_lzma_options.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/240-atm_header_changes.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/240-packet_socket_type.patch [deleted file]
target/linux/generic/patches-2.6.37/250-netfilter_depends.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/250-pppoe_header_pad.patch [deleted file]
target/linux/generic/patches-2.6.37/251-atm.patch [deleted file]
target/linux/generic/patches-2.6.37/251-sound_kconfig.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/252-mv_cesa_depends.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/253-ssb_b43_default_on.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/254-textsearch_kconfig_hacks.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/255-lib80211_kconfig_hacks.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/256-crypto_add_kconfig_prompts.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/257-wireless_ext_kconfig_hack.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/258-lzo_decompressor_kconfig_dep.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/270-bridge_no_eap_forward.patch [deleted file]
target/linux/generic/patches-2.6.37/271-bridge_always_accept_eap.patch [deleted file]
target/linux/generic/patches-2.6.37/280-solos_dont_null_deref.patch [deleted file]
target/linux/generic/patches-2.6.37/281-solos_uniform_vpi_vci.patch [deleted file]
target/linux/generic/patches-2.6.37/282-solos-debug_skbuff.patch [deleted file]
target/linux/generic/patches-2.6.37/283-solos-vccs_release.patch [deleted file]
target/linux/generic/patches-2.6.37/290-sched_act_connmark.patch [deleted file]
target/linux/generic/patches-2.6.37/300-bridge_port_isolate.patch [deleted file]
target/linux/generic/patches-2.6.37/301-mips_image_cmdline_hack.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/302-mips_use_generic_thread_info_allocator.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/303-mips_fix_kexec.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/304-mips_disable_fpu.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/305-mips_module_reloc.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/306-mips_mem_functions_performance.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/307-mips_oprofile_fix.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/308-mips_boot.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/310-arm_module_unresolved_weak_sym.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/310-usb-add-usb_find_device_by_name.patch [deleted file]
target/linux/generic/patches-2.6.37/311-arm_update_mach_types.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/320-ppc4xx_optimization.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/321-powerpc_crtsavres_prereq.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/322-powerpc_asm_segment_h.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/400-ledtrig_morse.patch [deleted file]
target/linux/generic/patches-2.6.37/400-rootfs_split.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/401-partial_eraseblock_write.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/402-ledtrig_netdev.patch [deleted file]
target/linux/generic/patches-2.6.37/403-ledtrig-usbdev.patch [deleted file]
target/linux/generic/patches-2.6.37/410-gpio_buttons.patch [deleted file]
target/linux/generic/patches-2.6.37/410-mtd_info_move_forward_decl.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/411-gpio_ioctl.patch [deleted file]
target/linux/generic/patches-2.6.37/420-gpiodev.patch [deleted file]
target/linux/generic/patches-2.6.37/420-redboot_space.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/421-redboot_boardconfig.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/430-mtd_myloader_partition_parser.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/440-block2mtd_init.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/441-block2mtd_refresh.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/442-block2mtd_probe.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/450-mtd_plat_nand_chip_fixup.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/451-mtd_fix_nand_correct_data_return_code.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/460-cfi_show_amd_extended_table_version.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/470-mtd_m25p80_add_pm25lv_flash_support.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/471-mtd_m25p80_add_en25f32_chip_support.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/472-mtd_m25p80_add_MX25L1606E_support.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/473-mtd_samsung_flash.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/500-yaffs_support.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/501-yaffs_cvs_2009_04_24.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/502-yaffs_git_2010_10_20.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/503-yaffs_symlink_bug.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/504-yaffs_mutex_fix.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/510-jffs2_make_lzma_available.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/510-yaffs_support.patch [deleted file]
target/linux/generic/patches-2.6.37/511-debloat_lzma.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/511-yaffs-cvs-2009-04-24.patch [deleted file]
target/linux/generic/patches-2.6.37/511-yaffs-git-2010-10-20.patch [deleted file]
target/linux/generic/patches-2.6.37/512-jffs2_eofdetect.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/512-yaffs_symlink_bug.patch [deleted file]
target/linux/generic/patches-2.6.37/513-yaffs_mutex_fix.patch [deleted file]
target/linux/generic/patches-2.6.37/520-squashfs_revert_to_2.6.35.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/521-squashfs_add_lzma.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/522-squashfs_make_lzma_available.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/600-netfilter_layer7_2.22.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/600-phy_extension.patch [deleted file]
target/linux/generic/patches-2.6.37/601-netfilter_layer7_pktmatch.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/601-phy-add-aneg-done-function.patch [deleted file]
target/linux/generic/patches-2.6.37/602-netfilter_layer7_match.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/603-netfilter_layer7_2.6.36_fix.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/604-netfilter_cisco_794x_iphone.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/605-netfilter_rtsp.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/620-phy_adm6996.patch [deleted file]
target/linux/generic/patches-2.6.37/620-sched_esfq.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/621-sched_act_connmark.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/630-packet_socket_type.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/630-phy_packets.patch [deleted file]
target/linux/generic/patches-2.6.37/640-bridge_no_eap_forward.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/641-bridge_always_accept_eap.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/642-bridge_port_isolate.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/650-pppoe_header_pad.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/650-swconfig.patch [deleted file]
target/linux/generic/patches-2.6.37/651-wireless_mesh_header.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/660-phy_mvswitch.patch [deleted file]
target/linux/generic/patches-2.6.37/670-phy_ip175c.patch [deleted file]
target/linux/generic/patches-2.6.37/680-phy_ar8216.patch [deleted file]
target/linux/generic/patches-2.6.37/690-phy_rtl8306.patch [deleted file]
target/linux/generic/patches-2.6.37/691-phy_rtl8366.patch [deleted file]
target/linux/generic/patches-2.6.37/700-rtc7301.patch [deleted file]
target/linux/generic/patches-2.6.37/700-swconfig.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/701-phy_extension.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/702-phy_add_aneg_done_function.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/720-phy_adm6996.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/721-phy_packets.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/722-phy_mvswitch.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/723-phy_ip175c.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/724-phy_ar8216.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/725-phy_rtl8306.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/726-phy_rtl8366.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/750-glamo-headers.patch [deleted file]
target/linux/generic/patches-2.6.37/750-hostap_txpower.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/801-usb_serial_endpoint_size.patch [deleted file]
target/linux/generic/patches-2.6.37/810-pci_disable_common_quirks.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/811-pci_disable_usb_common_quirks.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/820-usb_add_usb_find_device_by_name.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/821-usb_serial_endpoint_size.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/830-ledtrig_morse.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/831-ledtrig_netdev.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/832-ledtrig_usbdev.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/833-gpio_buttons.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/834-gpio_ioctl.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/835-gpiodev.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/840-rtc7301.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/840-unable_to_open_console.patch [deleted file]
target/linux/generic/patches-2.6.37/850-glamo_headers.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/860-01_hotpluggable_spi_gpio.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/861-04_spi_gpio_implement_spi_delay.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/862-gpio_spi_driver.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/863-gpiommc.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/864-gpiommc_configfs_locking.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/870-hifn795x_byteswap.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/900-slab_maxsize.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/902-darwin_scripts_include.patch [deleted file]
target/linux/generic/patches-2.6.37/903-hostap_txpower.patch [deleted file]
target/linux/generic/patches-2.6.37/903-stddef_include.patch [deleted file]
target/linux/generic/patches-2.6.37/910-kobject_uevent.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/911-kobject_add_broadcast_uevent.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/920-01-hotpluggable-spi-gpio.patch [deleted file]
target/linux/generic/patches-2.6.37/920-04-spi-gpio-implement-spi-delay.patch [deleted file]
target/linux/generic/patches-2.6.37/920-unable_to_open_console.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/921-gpio_spi_driver.patch [deleted file]
target/linux/generic/patches-2.6.37/921-use_preinit_as_init.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/922-gpiommc.patch [deleted file]
target/linux/generic/patches-2.6.37/923-gpiommc-configfs-locking.patch [deleted file]
target/linux/generic/patches-2.6.37/940-ocf_kbuild_integration.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/940-wireless_mesh_header.patch [deleted file]
target/linux/generic/patches-2.6.37/941-ocf_20100325.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/941-ssb_update.patch [deleted file]
target/linux/generic/patches-2.6.37/950-powerpc_crtsavres_prereq.patch [deleted file]
target/linux/generic/patches-2.6.37/950-vm_exports.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/960-backport_tos2prio_ecn_fix.patch [deleted file]
target/linux/generic/patches-2.6.37/960-decompress_unlzo_fix.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.37/970-ocf_kbuild_integration.patch [deleted file]
target/linux/generic/patches-2.6.37/971-ocf_20100325.patch [deleted file]
target/linux/generic/patches-2.6.37/972-mv_cesa_depends.patch [deleted file]
target/linux/generic/patches-2.6.37/974-ssb_b43_default_on.patch [deleted file]
target/linux/generic/patches-2.6.37/975-hifn795x-byteswap.patch [deleted file]
target/linux/generic/patches-2.6.37/977-textsearch_kconfig_hacks.patch [deleted file]
target/linux/generic/patches-2.6.37/978-lib80211_kconfig_hacks.patch [deleted file]
target/linux/generic/patches-2.6.37/979-crypto_add_kconfig_prompts.patch [deleted file]
target/linux/generic/patches-2.6.37/980-vm_exports.patch [deleted file]
target/linux/generic/patches-2.6.37/981-wireless_ext_kconfig_hack.patch [deleted file]
target/linux/generic/patches-2.6.37/991-ppc4xx_optimization.patch [deleted file]
target/linux/generic/patches-2.6.37/997-lzo_decompressor_fix.patch [deleted file]
target/linux/generic/patches-2.6.37/998-openwrt_lzma_options.patch [deleted file]
target/linux/generic/patches-2.6.37/999-use_preinit_as_init.patch [deleted file]

diff --git a/target/linux/generic/patches-2.6.37/001-fix_localversion.patch b/target/linux/generic/patches-2.6.37/001-fix_localversion.patch
deleted file mode 100644 (file)
index 70ed0ff..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
---- a/scripts/setlocalversion
-+++ b/scripts/setlocalversion
-@@ -164,7 +164,7 @@ else
-       # annotated or signed tagged state (as git describe only
-       # looks at signed or annotated tags - git tag -a/-s) and
-       # LOCALVERSION= is not specified
--      if test "${LOCALVERSION+set}" != "set"; then
-+      if test "${CONFIG_LOCALVERSION+set}" != "set"; then
-               scm=$(scm_version --short)
-               res="$res${scm:++}"
-       fi
diff --git a/target/linux/generic/patches-2.6.37/005-squashfs_revert_to_2.6.35.patch b/target/linux/generic/patches-2.6.37/005-squashfs_revert_to_2.6.35.patch
deleted file mode 100644 (file)
index 7bf2f10..0000000
+++ /dev/null
@@ -1,249 +0,0 @@
---- a/fs/squashfs/decompressor.c
-+++ b/fs/squashfs/decompressor.c
-@@ -40,11 +40,9 @@ static const struct squashfs_decompresso
-       NULL, NULL, NULL, LZMA_COMPRESSION, "lzma", 0
- };
--#ifndef CONFIG_SQUASHFS_LZO
- static const struct squashfs_decompressor squashfs_lzo_unsupported_comp_ops = {
-       NULL, NULL, NULL, LZO_COMPRESSION, "lzo", 0
- };
--#endif
- static const struct squashfs_decompressor squashfs_unknown_comp_ops = {
-       NULL, NULL, NULL, 0, "unknown", 0
-@@ -53,11 +51,7 @@ static const struct squashfs_decompresso
- static const struct squashfs_decompressor *decompressor[] = {
-       &squashfs_zlib_comp_ops,
-       &squashfs_lzma_unsupported_comp_ops,
--#ifdef CONFIG_SQUASHFS_LZO
--      &squashfs_lzo_comp_ops,
--#else
-       &squashfs_lzo_unsupported_comp_ops,
--#endif
-       &squashfs_unknown_comp_ops
- };
---- a/fs/squashfs/Kconfig
-+++ b/fs/squashfs/Kconfig
-@@ -5,13 +5,13 @@ config SQUASHFS
-       help
-         Saying Y here includes support for SquashFS 4.0 (a Compressed
-         Read-Only File System).  Squashfs is a highly compressed read-only
--        filesystem for Linux.  It uses zlib/lzo compression to compress both
-+        filesystem for Linux.  It uses zlib compression to compress both
-         files, inodes and directories.  Inodes in the system are very small
-         and all blocks are packed to minimise data overhead. Block sizes
-         greater than 4K are supported up to a maximum of 1 Mbytes (default
-         block size 128K).  SquashFS 4.0 supports 64 bit filesystems and files
-         (larger than 4GB), full uid/gid information, hard links and
--        timestamps.
-+        timestamps.  
-         Squashfs is intended for general read-only filesystem use, for
-         archival use (i.e. in cases where a .tar.gz file may be used), and in
-@@ -26,7 +26,7 @@ config SQUASHFS
-         If unsure, say N.
--config SQUASHFS_XATTR
-+config SQUASHFS_XATTRS
-       bool "Squashfs XATTR support"
-       depends on SQUASHFS
-       default n
-@@ -37,24 +37,9 @@ config SQUASHFS_XATTR
-         If unsure, say N.
--config SQUASHFS_LZO
--      bool "Include support for LZO compressed file systems"
--      depends on SQUASHFS
--      default n
--      select LZO_DECOMPRESS
--      help
--        Saying Y here includes support for reading Squashfs file systems
--        compressed with LZO compresssion.  LZO compression is mainly
--        aimed at embedded systems with slower CPUs where the overheads
--        of zlib are too high.
--
--        LZO is not the standard compression used in Squashfs and so most
--        file systems will be readable without selecting this option.
--
--        If unsure, say N.
--
- config SQUASHFS_EMBEDDED
--      bool "Additional option for memory-constrained systems"
-+
-+      bool "Additional option for memory-constrained systems" 
-       depends on SQUASHFS
-       default n
-       help
---- a/fs/squashfs/lzo_wrapper.c
-+++ /dev/null
-@@ -1,136 +0,0 @@
--/*
-- * Squashfs - a compressed read only filesystem for Linux
-- *
-- * Copyright (c) 2010 LG Electronics
-- * Chan Jeong <chan.jeong@lge.com>
-- *
-- * This program is free software; you can redistribute it and/or
-- * modify it under the terms of the GNU General Public License
-- * as published by the Free Software Foundation; either version 2,
-- * 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 General Public License for more details.
-- *
-- * You should have received a copy of the GNU General Public License
-- * along with this program; if not, write to the Free Software
-- * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-- *
-- * lzo_wrapper.c
-- */
--
--#include <linux/mutex.h>
--#include <linux/buffer_head.h>
--#include <linux/slab.h>
--#include <linux/vmalloc.h>
--#include <linux/lzo.h>
--
--#include "squashfs_fs.h"
--#include "squashfs_fs_sb.h"
--#include "squashfs_fs_i.h"
--#include "squashfs.h"
--#include "decompressor.h"
--
--struct squashfs_lzo {
--      void    *input;
--      void    *output;
--};
--
--static void *lzo_init(struct squashfs_sb_info *msblk)
--{
--      int block_size = max_t(int, msblk->block_size, SQUASHFS_METADATA_SIZE);
--
--      struct squashfs_lzo *stream = kzalloc(sizeof(*stream), GFP_KERNEL);
--      if (stream == NULL)
--              goto failed;
--      stream->input = vmalloc(block_size);
--      if (stream->input == NULL)
--              goto failed;
--      stream->output = vmalloc(block_size);
--      if (stream->output == NULL)
--              goto failed2;
--
--      return stream;
--
--failed2:
--      vfree(stream->input);
--failed:
--      ERROR("Failed to allocate lzo workspace\n");
--      kfree(stream);
--      return NULL;
--}
--
--
--static void lzo_free(void *strm)
--{
--      struct squashfs_lzo *stream = strm;
--
--      if (stream) {
--              vfree(stream->input);
--              vfree(stream->output);
--      }
--      kfree(stream);
--}
--
--
--static int lzo_uncompress(struct squashfs_sb_info *msblk, void **buffer,
--      struct buffer_head **bh, int b, int offset, int length, int srclength,
--      int pages)
--{
--      struct squashfs_lzo *stream = msblk->stream;
--      void *buff = stream->input;
--      int avail, i, bytes = length, res;
--      size_t out_len = srclength;
--
--      mutex_lock(&msblk->read_data_mutex);
--
--      for (i = 0; i < b; i++) {
--              wait_on_buffer(bh[i]);
--              if (!buffer_uptodate(bh[i]))
--                      goto block_release;
--
--              avail = min(bytes, msblk->devblksize - offset);
--              memcpy(buff, bh[i]->b_data + offset, avail);
--              buff += avail;
--              bytes -= avail;
--              offset = 0;
--              put_bh(bh[i]);
--      }
--
--      res = lzo1x_decompress_safe(stream->input, (size_t)length,
--                                      stream->output, &out_len);
--      if (res != LZO_E_OK)
--              goto failed;
--
--      res = bytes = (int)out_len;
--      for (i = 0, buff = stream->output; bytes && i < pages; i++) {
--              avail = min_t(int, bytes, PAGE_CACHE_SIZE);
--              memcpy(buffer[i], buff, avail);
--              buff += avail;
--              bytes -= avail;
--      }
--
--      mutex_unlock(&msblk->read_data_mutex);
--      return res;
--
--block_release:
--      for (; i < b; i++)
--              put_bh(bh[i]);
--
--failed:
--      mutex_unlock(&msblk->read_data_mutex);
--
--      ERROR("lzo decompression failed, data probably corrupt\n");
--      return -EIO;
--}
--
--const struct squashfs_decompressor squashfs_lzo_comp_ops = {
--      .init = lzo_init,
--      .free = lzo_free,
--      .decompress = lzo_uncompress,
--      .id = LZO_COMPRESSION,
--      .name = "lzo",
--      .supported = 1
--};
---- a/fs/squashfs/Makefile
-+++ b/fs/squashfs/Makefile
-@@ -5,5 +5,5 @@
- obj-$(CONFIG_SQUASHFS) += squashfs.o
- squashfs-y += block.o cache.o dir.o export.o file.o fragment.o id.o inode.o
- squashfs-y += namei.o super.o symlink.o zlib_wrapper.o decompressor.o
--squashfs-$(CONFIG_SQUASHFS_XATTR) += xattr.o xattr_id.o
--squashfs-$(CONFIG_SQUASHFS_LZO) += lzo_wrapper.o
-+squashfs-$(CONFIG_SQUASHFS_XATTRS) += xattr.o xattr_id.o
-+
---- a/fs/squashfs/squashfs.h
-+++ b/fs/squashfs/squashfs.h
-@@ -104,6 +104,3 @@ extern const struct xattr_handler *squas
- /* zlib_wrapper.c */
- extern const struct squashfs_decompressor squashfs_zlib_comp_ops;
--
--/* lzo_wrapper.c */
--extern const struct squashfs_decompressor squashfs_lzo_comp_ops;
---- a/fs/squashfs/xattr.h
-+++ b/fs/squashfs/xattr.h
-@@ -21,7 +21,7 @@
-  * xattr.h
-  */
--#ifdef CONFIG_SQUASHFS_XATTR
-+#ifdef CONFIG_SQUASHFS_XATTRS
- extern __le64 *squashfs_read_xattr_id_table(struct super_block *, u64,
-               u64 *, int *);
- extern int squashfs_xattr_lookup(struct super_block *, unsigned int, int *,
diff --git a/target/linux/generic/patches-2.6.37/006-squashfs_add_lzma.patch b/target/linux/generic/patches-2.6.37/006-squashfs_add_lzma.patch
deleted file mode 100644 (file)
index ff71578..0000000
+++ /dev/null
@@ -1,219 +0,0 @@
-From f49e1efdd179d54e814ff2a8e8f469496583062c Mon Sep 17 00:00:00 2001
-From: Phillip Lougher <phillip@lougher.demon.co.uk>
-Date: Tue, 20 Oct 2009 10:54:36 +0100
-Subject: [PATCH] Squashfs: add LZMA compression
-
-Add support for LZMA compressed filesystems.  This is an initial
-implementation.
-
-Signed-off-by: Phillip Lougher <phillip@lougher.demon.co.uk>
----
- fs/squashfs/Kconfig        |    5 ++
- fs/squashfs/Makefile       |    1 +
- fs/squashfs/decompressor.c |    4 +
- fs/squashfs/lzma_wrapper.c |  151 ++++++++++++++++++++++++++++++++++++++++++++
- fs/squashfs/squashfs.h     |    3 +
- 5 files changed, 164 insertions(+), 0 deletions(-)
- create mode 100644 fs/squashfs/lzma_wrapper.c
-
---- a/fs/squashfs/Kconfig
-+++ b/fs/squashfs/Kconfig
-@@ -37,6 +37,11 @@ config SQUASHFS_XATTRS
-         If unsure, say N.
-+config SQUASHFS_LZMA
-+      bool "Include support for LZMA compressed file systems"
-+      depends on SQUASHFS
-+      select DECOMPRESS_LZMA
-+
- config SQUASHFS_EMBEDDED
-       bool "Additional option for memory-constrained systems" 
---- a/fs/squashfs/Makefile
-+++ b/fs/squashfs/Makefile
-@@ -5,5 +5,5 @@
- obj-$(CONFIG_SQUASHFS) += squashfs.o
- squashfs-y += block.o cache.o dir.o export.o file.o fragment.o id.o inode.o
- squashfs-y += namei.o super.o symlink.o zlib_wrapper.o decompressor.o
--squashfs-$(CONFIG_SQUASHFS_XATTRS) += xattr.o xattr_id.o
-+squashfs-$(CONFIG_SQUASHFS_LZMA) += lzma_wrapper.o
---- a/fs/squashfs/decompressor.c
-+++ b/fs/squashfs/decompressor.c
-@@ -50,7 +50,11 @@ static const struct squashfs_decompresso
- static const struct squashfs_decompressor *decompressor[] = {
-       &squashfs_zlib_comp_ops,
-+#ifdef CONFIG_SQUASHFS_LZMA
-+      &squashfs_lzma_comp_ops,
-+#else
-       &squashfs_lzma_unsupported_comp_ops,
-+#endif
-       &squashfs_lzo_unsupported_comp_ops,
-       &squashfs_unknown_comp_ops
- };
---- /dev/null
-+++ b/fs/squashfs/lzma_wrapper.c
-@@ -0,0 +1,152 @@
-+/*
-+ * Squashfs - a compressed read only filesystem for Linux
-+ *
-+ * Copyright (c) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
-+ * Phillip Lougher <phillip@lougher.demon.co.uk>
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License
-+ * as published by the Free Software Foundation; either version 2,
-+ * 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 General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-+ *
-+ * lzma_wrapper.c
-+ */
-+
-+#include <asm/unaligned.h>
-+#include <linux/buffer_head.h>
-+#include <linux/mutex.h>
-+#include <linux/vmalloc.h>
-+#include <linux/decompress/unlzma.h>
-+#include <linux/slab.h>
-+
-+#include "squashfs_fs.h"
-+#include "squashfs_fs_sb.h"
-+#include "squashfs_fs_i.h"
-+#include "squashfs.h"
-+#include "decompressor.h"
-+
-+struct squashfs_lzma {
-+      void    *input;
-+      void    *output;
-+};
-+
-+/* decompress_unlzma.c is currently non re-entrant... */
-+DEFINE_MUTEX(lzma_mutex);
-+
-+/* decompress_unlzma.c doesn't provide any context in its callbacks... */
-+static int lzma_error;
-+
-+static void error(char *m)
-+{
-+      ERROR("unlzma error: %s\n", m);
-+      lzma_error = 1;
-+}
-+
-+      
-+static void *lzma_init(struct squashfs_sb_info *msblk)
-+{
-+      struct squashfs_lzma *stream = kzalloc(sizeof(*stream), GFP_KERNEL);
-+      if (stream == NULL)
-+              goto failed;
-+      stream->input = vmalloc(msblk->block_size);
-+      if (stream->input == NULL)
-+              goto failed;
-+      stream->output = vmalloc(msblk->block_size);
-+      if (stream->output == NULL)
-+              goto failed2;
-+
-+      return stream;
-+
-+failed2:
-+      vfree(stream->input);
-+failed:
-+      ERROR("failed to allocate lzma workspace\n");
-+      kfree(stream);
-+      return NULL;
-+}
-+
-+
-+static void lzma_free(void *strm)
-+{
-+      struct squashfs_lzma *stream = strm;
-+
-+      if (stream) {
-+              vfree(stream->input);
-+              vfree(stream->output);
-+      }
-+      kfree(stream);
-+}
-+
-+
-+static int lzma_uncompress(struct squashfs_sb_info *msblk, void **buffer,
-+      struct buffer_head **bh, int b, int offset, int length, int srclength,
-+      int pages)
-+{
-+      struct squashfs_lzma *stream = msblk->stream;
-+      void *buff = stream->input;
-+      int avail, i, bytes = length, res;
-+
-+      mutex_lock(&lzma_mutex);
-+
-+      for (i = 0; i < b; i++) {
-+              wait_on_buffer(bh[i]);
-+              if (!buffer_uptodate(bh[i]))
-+                      goto block_release;
-+
-+              avail = min(bytes, msblk->devblksize - offset);
-+              memcpy(buff, bh[i]->b_data + offset, avail);
-+              buff += avail;
-+              bytes -= avail;
-+              offset = 0;
-+              put_bh(bh[i]);
-+      }
-+
-+      lzma_error = 0;
-+      res = unlzma(stream->input, length, NULL, NULL, stream->output, NULL,
-+                                                      error);
-+      if (res || lzma_error)
-+              goto failed;
-+
-+      /* uncompressed size is stored in the LZMA header (5 byte offset) */
-+      res = bytes = get_unaligned_le32(stream->input + 5);
-+      for (i = 0, buff = stream->output; bytes && i < pages; i++) {
-+              avail = min_t(int, bytes, PAGE_CACHE_SIZE);
-+              memcpy(buffer[i], buff, avail);
-+              buff += avail;
-+              bytes -= avail;
-+      }
-+      if (bytes)
-+              goto failed;
-+
-+      mutex_unlock(&lzma_mutex);
-+      return res;
-+
-+block_release:
-+      for (; i < b; i++)
-+              put_bh(bh[i]);
-+
-+failed:
-+      mutex_unlock(&lzma_mutex);
-+
-+      ERROR("lzma decompression failed, data probably corrupt\n");
-+      return -EIO;
-+}
-+
-+const struct squashfs_decompressor squashfs_lzma_comp_ops = {
-+      .init = lzma_init,
-+      .free = lzma_free,
-+      .decompress = lzma_uncompress,
-+      .id = LZMA_COMPRESSION,
-+      .name = "lzma",
-+      .supported = 1
-+};
-+
---- a/fs/squashfs/squashfs.h
-+++ b/fs/squashfs/squashfs.h
-@@ -104,3 +104,6 @@ extern const struct xattr_handler *squas
- /* zlib_wrapper.c */
- extern const struct squashfs_decompressor squashfs_zlib_comp_ops;
-+
-+/* lzma wrapper.c */
-+extern const struct squashfs_decompressor squashfs_lzma_comp_ops;
diff --git a/target/linux/generic/patches-2.6.37/007-squashfs_make_lzma_available.patch b/target/linux/generic/patches-2.6.37/007-squashfs_make_lzma_available.patch
deleted file mode 100644 (file)
index dc9a4f5..0000000
+++ /dev/null
@@ -1,165 +0,0 @@
-From fdf23ed283bc6ef5c25076ce2065f892120ff556 Mon Sep 17 00:00:00 2001
-From: Phillip Lougher <phillip@lougher.demon.co.uk>
-Date: Thu, 22 Oct 2009 04:57:38 +0100
-Subject: [PATCH] Squashfs: Make unlzma available to non initramfs/initrd code
-
-Add a config option DECOMPRESS_LZMA_NEEDED which allows subsystems to
-specify they need the unlzma code.  Normally decompress_unlzma.c is
-compiled with __init and unlzma is not exported to modules.
-
-Signed-off-by: Phillip Lougher <phillip@lougher.demon.co.uk>
----
- fs/squashfs/Kconfig                   |    1 +
- include/linux/decompress/bunzip2_mm.h |   12 ++++++++++++
- include/linux/decompress/inflate_mm.h |   12 ++++++++++++
- include/linux/decompress/mm.h         |    3 ---
- include/linux/decompress/unlzma_mm.h  |   20 ++++++++++++++++++++
- lib/Kconfig                           |    3 +++
- lib/decompress_bunzip2.c              |    1 +
- lib/decompress_inflate.c              |    1 +
- lib/decompress_unlzma.c               |    5 ++++-
- 9 files changed, 54 insertions(+), 4 deletions(-)
- create mode 100644 include/linux/decompress/bunzip2_mm.h
- create mode 100644 include/linux/decompress/inflate_mm.h
- create mode 100644 include/linux/decompress/unlzma_mm.h
-
---- a/fs/squashfs/Kconfig
-+++ b/fs/squashfs/Kconfig
-@@ -41,6 +41,7 @@ config SQUASHFS_LZMA
-       bool "Include support for LZMA compressed file systems"
-       depends on SQUASHFS
-       select DECOMPRESS_LZMA
-+      select DECOMPRESS_LZMA_NEEDED
- config SQUASHFS_EMBEDDED
---- /dev/null
-+++ b/include/linux/decompress/bunzip2_mm.h
-@@ -0,0 +1,12 @@
-+#ifndef BUNZIP2_MM_H
-+#define BUNZIP2_MM_H
-+
-+#ifdef STATIC
-+/* Code active when included from pre-boot environment: */
-+#define INIT
-+#else
-+/* Compile for initramfs/initrd code only */
-+#define INIT __init
-+#endif
-+
-+#endif
---- /dev/null
-+++ b/include/linux/decompress/inflate_mm.h
-@@ -0,0 +1,12 @@
-+#ifndef INFLATE_MM_H
-+#define INFLATE_MM_H
-+
-+#ifdef STATIC
-+/* Code active when included from pre-boot environment: */
-+#define INIT
-+#else
-+/* Compile for initramfs/initrd code only */
-+#define INIT __init
-+#endif
-+
-+#endif
---- a/include/linux/decompress/mm.h
-+++ b/include/linux/decompress/mm.h
-@@ -63,8 +63,6 @@ static void free(void *where)
- #define set_error_fn(x)
--#define INIT
--
- #else /* STATIC */
- /* Code active when compiled standalone for use when loading ramdisk: */
-@@ -87,7 +85,6 @@ static void free(void *where)
- static void(*error)(char *m);
- #define set_error_fn(x) error = x;
--#define INIT __init
- #define STATIC
- #include <linux/init.h>
---- /dev/null
-+++ b/include/linux/decompress/unlzma_mm.h
-@@ -0,0 +1,20 @@
-+#ifndef UNLZMA_MM_H
-+#define UNLZMA_MM_H
-+
-+#ifdef STATIC
-+
-+/* Code active when included from pre-boot environment: */
-+#define INIT
-+
-+#elif defined(CONFIG_DECOMPRESS_LZMA_NEEDED)
-+
-+/* Make it available to non initramfs/initrd code */
-+#define INIT
-+#include <linux/module.h>
-+#else
-+
-+/* Compile for initramfs/initrd code only */
-+#define INIT __init
-+#endif
-+
-+#endif
---- a/lib/Kconfig
-+++ b/lib/Kconfig
-@@ -124,6 +124,9 @@ config DECOMPRESS_LZO
-       select LZO_DECOMPRESS
-       tristate
-+config DECOMPRESS_LZMA_NEEDED
-+       boolean
-+
- #
- # Generic allocator support is selected if needed
- #
---- a/lib/decompress_bunzip2.c
-+++ b/lib/decompress_bunzip2.c
-@@ -52,6 +52,7 @@
- #include <linux/slab.h>
- #endif /* STATIC */
-+#include <linux/decompress/bunzip2_mm.h>
- #include <linux/decompress/mm.h>
- #ifndef INT_MAX
---- a/lib/decompress_inflate.c
-+++ b/lib/decompress_inflate.c
-@@ -23,6 +23,7 @@
- #endif /* STATIC */
-+#include <linux/decompress/inflate_mm.h>
- #include <linux/decompress/mm.h>
- #define GZIP_IOBUF_SIZE (16*1024)
---- a/lib/decompress_unlzma.c
-+++ b/lib/decompress_unlzma.c
-@@ -36,6 +36,7 @@
- #include <linux/slab.h>
- #endif /* STATIC */
-+#include <linux/decompress/unlzma_mm.h>
- #include <linux/decompress/mm.h>
- #define       MIN(a, b) (((a) < (b)) ? (a) : (b))
-@@ -531,7 +532,7 @@ static inline void INIT process_bit1(str
--STATIC inline int INIT unlzma(unsigned char *buf, int in_len,
-+STATIC int INIT unlzma(unsigned char *buf, int in_len,
-                             int(*fill)(void*, unsigned int),
-                             int(*flush)(void*, unsigned int),
-                             unsigned char *output,
-@@ -664,4 +665,6 @@ STATIC int INIT decompress(unsigned char
- {
-       return unlzma(buf, in_len - 4, fill, flush, output, posp, error_fn);
- }
-+#elif defined(CONFIG_DECOMPRESS_LZMA_NEEDED)
-+EXPORT_SYMBOL(unlzma);
- #endif
diff --git a/target/linux/generic/patches-2.6.37/008-jffs2_make_lzma_available.patch b/target/linux/generic/patches-2.6.37/008-jffs2_make_lzma_available.patch
deleted file mode 100644 (file)
index d8e6ab7..0000000
+++ /dev/null
@@ -1,5142 +0,0 @@
---- a/fs/jffs2/Kconfig
-+++ b/fs/jffs2/Kconfig
-@@ -139,6 +139,15 @@ config JFFS2_LZO
-         This feature was added in July, 2007. Say 'N' if you need
-         compatibility with older bootloaders or kernels.
-+config JFFS2_LZMA
-+      bool "JFFS2 LZMA compression support" if JFFS2_COMPRESSION_OPTIONS
-+      select LZMA_COMPRESS
-+      select LZMA_DECOMPRESS
-+      depends on JFFS2_FS
-+      default n
-+      help
-+        JFFS2 wrapper to the LZMA C SDK
-+
- config JFFS2_RTIME
-       bool "JFFS2 RTIME compression support" if JFFS2_COMPRESSION_OPTIONS
-       depends on JFFS2_FS
---- a/fs/jffs2/Makefile
-+++ b/fs/jffs2/Makefile
-@@ -18,4 +18,7 @@ jffs2-$(CONFIG_JFFS2_RUBIN)  += compr_rub
- jffs2-$(CONFIG_JFFS2_RTIME)   += compr_rtime.o
- jffs2-$(CONFIG_JFFS2_ZLIB)    += compr_zlib.o
- jffs2-$(CONFIG_JFFS2_LZO)     += compr_lzo.o
-+jffs2-$(CONFIG_JFFS2_LZMA)      += compr_lzma.o
- jffs2-$(CONFIG_JFFS2_SUMMARY)   += summary.o
-+
-+CFLAGS_compr_lzma.o += -Iinclude/linux -Ilib/lzma
---- a/fs/jffs2/compr.c
-+++ b/fs/jffs2/compr.c
-@@ -320,6 +320,9 @@ int __init jffs2_compressors_init(void)
- #ifdef CONFIG_JFFS2_LZO
-       jffs2_lzo_init();
- #endif
-+#ifdef CONFIG_JFFS2_LZMA
-+        jffs2_lzma_init();
-+#endif
- /* Setting default compression mode */
- #ifdef CONFIG_JFFS2_CMODE_NONE
-       jffs2_compression_mode = JFFS2_COMPR_MODE_NONE;
-@@ -343,6 +346,9 @@ int __init jffs2_compressors_init(void)
- int jffs2_compressors_exit(void)
- {
- /* Unregistering compressors */
-+#ifdef CONFIG_JFFS2_LZMA
-+        jffs2_lzma_exit();
-+#endif
- #ifdef CONFIG_JFFS2_LZO
-       jffs2_lzo_exit();
- #endif
---- a/fs/jffs2/compr.h
-+++ b/fs/jffs2/compr.h
-@@ -29,9 +29,9 @@
- #define JFFS2_DYNRUBIN_PRIORITY  20
- #define JFFS2_LZARI_PRIORITY     30
- #define JFFS2_RTIME_PRIORITY     50
--#define JFFS2_ZLIB_PRIORITY      60
--#define JFFS2_LZO_PRIORITY       80
--
-+#define JFFS2_LZMA_PRIORITY      70
-+#define JFFS2_ZLIB_PRIORITY      80
-+#define JFFS2_LZO_PRIORITY       90
- #define JFFS2_RUBINMIPS_DISABLED /* RUBINs will be used only */
- #define JFFS2_DYNRUBIN_DISABLED  /*      for decompression */
-@@ -99,5 +99,9 @@ void jffs2_zlib_exit(void);
- int jffs2_lzo_init(void);
- void jffs2_lzo_exit(void);
- #endif
-+#ifdef CONFIG_JFFS2_LZMA
-+int jffs2_lzma_init(void);
-+void jffs2_lzma_exit(void);
-+#endif
- #endif /* __JFFS2_COMPR_H__ */
---- /dev/null
-+++ b/fs/jffs2/compr_lzma.c
-@@ -0,0 +1,128 @@
-+/*
-+ * JFFS2 -- Journalling Flash File System, Version 2.
-+ *
-+ * For licensing information, see the file 'LICENCE' in this directory.
-+ *
-+ * JFFS2 wrapper to the LZMA C SDK
-+ *
-+ */
-+
-+#include <linux/lzma.h>
-+#include "compr.h"
-+
-+#ifdef __KERNEL__
-+      static DEFINE_MUTEX(deflate_mutex);
-+#endif
-+
-+CLzmaEncHandle *p;
-+Byte propsEncoded[LZMA_PROPS_SIZE];
-+SizeT propsSize = sizeof(propsEncoded);
-+
-+STATIC void lzma_free_workspace(void)
-+{
-+      LzmaEnc_Destroy(p, &lzma_alloc, &lzma_alloc);
-+}
-+
-+STATIC int INIT lzma_alloc_workspace(CLzmaEncProps *props)
-+{
-+      if ((p = (CLzmaEncHandle *)LzmaEnc_Create(&lzma_alloc)) == NULL)
-+      {
-+              PRINT_ERROR("Failed to allocate lzma deflate workspace\n");
-+              return -ENOMEM;
-+      }
-+
-+      if (LzmaEnc_SetProps(p, props) != SZ_OK)
-+      {
-+              lzma_free_workspace();
-+              return -1;
-+      }
-+      
-+      if (LzmaEnc_WriteProperties(p, propsEncoded, &propsSize) != SZ_OK)
-+      {
-+              lzma_free_workspace();
-+              return -1;
-+      }
-+
-+        return 0;
-+}
-+
-+STATIC int jffs2_lzma_compress(unsigned char *data_in, unsigned char *cpage_out,
-+                            uint32_t *sourcelen, uint32_t *dstlen, void *model)
-+{
-+      SizeT compress_size = (SizeT)(*dstlen);
-+      int ret;
-+
-+      #ifdef __KERNEL__
-+              mutex_lock(&deflate_mutex);
-+      #endif
-+
-+      ret = LzmaEnc_MemEncode(p, cpage_out, &compress_size, data_in, *sourcelen,
-+              0, NULL, &lzma_alloc, &lzma_alloc);
-+
-+      #ifdef __KERNEL__
-+              mutex_unlock(&deflate_mutex);
-+      #endif
-+
-+      if (ret != SZ_OK)
-+              return -1;
-+
-+      *dstlen = (uint32_t)compress_size;
-+
-+      return 0;
-+}
-+
-+STATIC int jffs2_lzma_decompress(unsigned char *data_in, unsigned char *cpage_out,
-+                               uint32_t srclen, uint32_t destlen, void *model)
-+{
-+      int ret;
-+      SizeT dl = (SizeT)destlen;
-+      SizeT sl = (SizeT)srclen;
-+      ELzmaStatus status;
-+      
-+      ret = LzmaDecode(cpage_out, &dl, data_in, &sl, propsEncoded,
-+              propsSize, LZMA_FINISH_ANY, &status, &lzma_alloc);
-+
-+      if (ret != SZ_OK || status == LZMA_STATUS_NOT_FINISHED || dl != (SizeT)destlen)
-+              return -1;
-+
-+      return 0;
-+}
-+
-+static struct jffs2_compressor jffs2_lzma_comp = {
-+      .priority = JFFS2_LZMA_PRIORITY,
-+      .name = "lzma",
-+      .compr = JFFS2_COMPR_LZMA,
-+      .compress = &jffs2_lzma_compress,
-+      .decompress = &jffs2_lzma_decompress,
-+      .disabled = 0,
-+};
-+
-+int INIT jffs2_lzma_init(void)
-+{
-+        int ret;
-+      CLzmaEncProps props;
-+      LzmaEncProps_Init(&props);
-+
-+        props.dictSize = LZMA_BEST_DICT(0x2000);
-+        props.level = LZMA_BEST_LEVEL;
-+        props.lc = LZMA_BEST_LC;
-+        props.lp = LZMA_BEST_LP;
-+        props.pb = LZMA_BEST_PB;
-+        props.fb = LZMA_BEST_FB;
-+
-+      ret = lzma_alloc_workspace(&props);
-+        if (ret < 0)
-+                return ret;
-+
-+      ret = jffs2_register_compressor(&jffs2_lzma_comp);
-+      if (ret)
-+              lzma_free_workspace();
-+      
-+        return ret;
-+}
-+
-+void jffs2_lzma_exit(void)
-+{
-+      jffs2_unregister_compressor(&jffs2_lzma_comp);
-+      lzma_free_workspace();
-+}
---- a/fs/jffs2/super.c
-+++ b/fs/jffs2/super.c
-@@ -248,14 +248,41 @@ static int __init init_jffs2_fs(void)
-       BUILD_BUG_ON(sizeof(struct jffs2_raw_inode) != 68);
-       BUILD_BUG_ON(sizeof(struct jffs2_raw_summary) != 32);
--      printk(KERN_INFO "JFFS2 version 2.2."
-+      printk(KERN_INFO "JFFS2 version 2.2"
- #ifdef CONFIG_JFFS2_FS_WRITEBUFFER
-              " (NAND)"
- #endif
- #ifdef CONFIG_JFFS2_SUMMARY
--             " (SUMMARY) "
-+             " (SUMMARY)"
- #endif
--             " © 2001-2006 Red Hat, Inc.\n");
-+#ifdef CONFIG_JFFS2_ZLIB
-+             " (ZLIB)"
-+#endif
-+#ifdef CONFIG_JFFS2_LZO
-+             " (LZO)"
-+#endif
-+#ifdef CONFIG_JFFS2_LZMA
-+             " (LZMA)"
-+#endif
-+#ifdef CONFIG_JFFS2_RTIME
-+             " (RTIME)"
-+#endif
-+#ifdef CONFIG_JFFS2_RUBIN
-+             " (RUBIN)"
-+#endif
-+#ifdef  CONFIG_JFFS2_CMODE_NONE
-+             " (CMODE_NONE)"
-+#endif
-+#ifdef CONFIG_JFFS2_CMODE_PRIORITY
-+             " (CMODE_PRIORITY)"
-+#endif
-+#ifdef CONFIG_JFFS2_CMODE_SIZE
-+             " (CMODE_SIZE)"
-+#endif
-+#ifdef CONFIG_JFFS2_CMODE_FAVOURLZO
-+             " (CMODE_FAVOURLZO)"
-+#endif
-+             " (c) 2001-2006 Red Hat, Inc.\n");
-       jffs2_inode_cachep = kmem_cache_create("jffs2_i",
-                                            sizeof(struct jffs2_inode_info),
---- a/include/linux/jffs2.h
-+++ b/include/linux/jffs2.h
-@@ -46,6 +46,7 @@
- #define JFFS2_COMPR_DYNRUBIN  0x05
- #define JFFS2_COMPR_ZLIB      0x06
- #define JFFS2_COMPR_LZO               0x07
-+#define JFFS2_COMPR_LZMA      0x08
- /* Compatibility flags. */
- #define JFFS2_COMPAT_MASK 0xc000      /* What do to if an unknown nodetype is found */
- #define JFFS2_NODE_ACCURATE 0x2000
---- /dev/null
-+++ b/include/linux/lzma.h
-@@ -0,0 +1,62 @@
-+#ifndef __LZMA_H__
-+#define __LZMA_H__
-+
-+#ifdef __KERNEL__
-+      #include <linux/kernel.h>
-+      #include <linux/sched.h>
-+      #include <linux/slab.h>
-+      #include <linux/vmalloc.h>
-+      #include <linux/init.h>
-+      #define LZMA_MALLOC vmalloc
-+      #define LZMA_FREE vfree
-+      #define PRINT_ERROR(msg) printk(KERN_WARNING #msg)
-+      #define INIT __init
-+      #define STATIC static
-+#else
-+      #include <stdint.h>
-+      #include <stdlib.h>
-+      #include <stdio.h>
-+      #include <unistd.h>
-+      #include <string.h>
-+      #include <asm/types.h>
-+      #include <errno.h>
-+      #include <linux/jffs2.h>
-+      #ifndef PAGE_SIZE
-+              extern int page_size;
-+              #define PAGE_SIZE page_size
-+      #endif
-+      #define LZMA_MALLOC malloc
-+      #define LZMA_FREE free
-+      #define PRINT_ERROR(msg) fprintf(stderr, msg)
-+      #define INIT
-+      #define STATIC
-+#endif
-+
-+#include "lzma/LzmaDec.h"
-+#include "lzma/LzmaEnc.h"
-+
-+#define LZMA_BEST_LEVEL (9)
-+#define LZMA_BEST_LC    (0)
-+#define LZMA_BEST_LP    (0)
-+#define LZMA_BEST_PB    (0)
-+#define LZMA_BEST_FB  (273)
-+
-+#define LZMA_BEST_DICT(n) (((int)((n) / 2)) * 2)
-+
-+static void *p_lzma_malloc(void *p, size_t size)
-+{
-+        if (size == 0)
-+                return NULL;
-+
-+        return LZMA_MALLOC(size);
-+}
-+
-+static void p_lzma_free(void *p, void *address)
-+{
-+        if (address != NULL)
-+                LZMA_FREE(address);
-+}
-+
-+static ISzAlloc lzma_alloc = {p_lzma_malloc, p_lzma_free};
-+
-+#endif
---- /dev/null
-+++ b/include/linux/lzma/LzFind.h
-@@ -0,0 +1,115 @@
-+/* LzFind.h -- Match finder for LZ algorithms
-+2009-04-22 : Igor Pavlov : Public domain */
-+
-+#ifndef __LZ_FIND_H
-+#define __LZ_FIND_H
-+
-+#include "Types.h"
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+typedef UInt32 CLzRef;
-+
-+typedef struct _CMatchFinder
-+{
-+  Byte *buffer;
-+  UInt32 pos;
-+  UInt32 posLimit;
-+  UInt32 streamPos;
-+  UInt32 lenLimit;
-+
-+  UInt32 cyclicBufferPos;
-+  UInt32 cyclicBufferSize; /* it must be = (historySize + 1) */
-+
-+  UInt32 matchMaxLen;
-+  CLzRef *hash;
-+  CLzRef *son;
-+  UInt32 hashMask;
-+  UInt32 cutValue;
-+
-+  Byte *bufferBase;
-+  ISeqInStream *stream;
-+  int streamEndWasReached;
-+
-+  UInt32 blockSize;
-+  UInt32 keepSizeBefore;
-+  UInt32 keepSizeAfter;
-+
-+  UInt32 numHashBytes;
-+  int directInput;
-+  size_t directInputRem;
-+  int btMode;
-+  int bigHash;
-+  UInt32 historySize;
-+  UInt32 fixedHashSize;
-+  UInt32 hashSizeSum;
-+  UInt32 numSons;
-+  SRes result;
-+  UInt32 crc[256];
-+} CMatchFinder;
-+
-+#define Inline_MatchFinder_GetPointerToCurrentPos(p) ((p)->buffer)
-+#define Inline_MatchFinder_GetIndexByte(p, index) ((p)->buffer[(Int32)(index)])
-+
-+#define Inline_MatchFinder_GetNumAvailableBytes(p) ((p)->streamPos - (p)->pos)
-+
-+int MatchFinder_NeedMove(CMatchFinder *p);
-+Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p);
-+void MatchFinder_MoveBlock(CMatchFinder *p);
-+void MatchFinder_ReadIfRequired(CMatchFinder *p);
-+
-+void MatchFinder_Construct(CMatchFinder *p);
-+
-+/* Conditions:
-+     historySize <= 3 GB
-+     keepAddBufferBefore + matchMaxLen + keepAddBufferAfter < 511MB
-+*/
-+int MatchFinder_Create(CMatchFinder *p, UInt32 historySize,
-+    UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter,
-+    ISzAlloc *alloc);
-+void MatchFinder_Free(CMatchFinder *p, ISzAlloc *alloc);
-+void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, UInt32 numItems);
-+void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue);
-+
-+UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *buffer, CLzRef *son,
-+    UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 _cutValue,
-+    UInt32 *distances, UInt32 maxLen);
-+
-+/*
-+Conditions:
-+  Mf_GetNumAvailableBytes_Func must be called before each Mf_GetMatchLen_Func.
-+  Mf_GetPointerToCurrentPos_Func's result must be used only before any other function
-+*/
-+
-+typedef void (*Mf_Init_Func)(void *object);
-+typedef Byte (*Mf_GetIndexByte_Func)(void *object, Int32 index);
-+typedef UInt32 (*Mf_GetNumAvailableBytes_Func)(void *object);
-+typedef const Byte * (*Mf_GetPointerToCurrentPos_Func)(void *object);
-+typedef UInt32 (*Mf_GetMatches_Func)(void *object, UInt32 *distances);
-+typedef void (*Mf_Skip_Func)(void *object, UInt32);
-+
-+typedef struct _IMatchFinder
-+{
-+  Mf_Init_Func Init;
-+  Mf_GetIndexByte_Func GetIndexByte;
-+  Mf_GetNumAvailableBytes_Func GetNumAvailableBytes;
-+  Mf_GetPointerToCurrentPos_Func GetPointerToCurrentPos;
-+  Mf_GetMatches_Func GetMatches;
-+  Mf_Skip_Func Skip;
-+} IMatchFinder;
-+
-+void MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder *vTable);
-+
-+void MatchFinder_Init(CMatchFinder *p);
-+UInt32 Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances);
-+UInt32 Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances);
-+void Bt3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num);
-+void Hc3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num);
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif
---- /dev/null
-+++ b/include/linux/lzma/LzHash.h
-@@ -0,0 +1,54 @@
-+/* LzHash.h -- HASH functions for LZ algorithms
-+2009-02-07 : Igor Pavlov : Public domain */
-+
-+#ifndef __LZ_HASH_H
-+#define __LZ_HASH_H
-+
-+#define kHash2Size (1 << 10)
-+#define kHash3Size (1 << 16)
-+#define kHash4Size (1 << 20)
-+
-+#define kFix3HashSize (kHash2Size)
-+#define kFix4HashSize (kHash2Size + kHash3Size)
-+#define kFix5HashSize (kHash2Size + kHash3Size + kHash4Size)
-+
-+#define HASH2_CALC hashValue = cur[0] | ((UInt32)cur[1] << 8);
-+
-+#define HASH3_CALC { \
-+  UInt32 temp = p->crc[cur[0]] ^ cur[1]; \
-+  hash2Value = temp & (kHash2Size - 1); \
-+  hashValue = (temp ^ ((UInt32)cur[2] << 8)) & p->hashMask; }
-+
-+#define HASH4_CALC { \
-+  UInt32 temp = p->crc[cur[0]] ^ cur[1]; \
-+  hash2Value = temp & (kHash2Size - 1); \
-+  hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); \
-+  hashValue = (temp ^ ((UInt32)cur[2] << 8) ^ (p->crc[cur[3]] << 5)) & p->hashMask; }
-+
-+#define HASH5_CALC { \
-+  UInt32 temp = p->crc[cur[0]] ^ cur[1]; \
-+  hash2Value = temp & (kHash2Size - 1); \
-+  hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); \
-+  hash4Value = (temp ^ ((UInt32)cur[2] << 8) ^ (p->crc[cur[3]] << 5)); \
-+  hashValue = (hash4Value ^ (p->crc[cur[4]] << 3)) & p->hashMask; \
-+  hash4Value &= (kHash4Size - 1); }
-+
-+/* #define HASH_ZIP_CALC hashValue = ((cur[0] | ((UInt32)cur[1] << 8)) ^ p->crc[cur[2]]) & 0xFFFF; */
-+#define HASH_ZIP_CALC hashValue = ((cur[2] | ((UInt32)cur[0] << 8)) ^ p->crc[cur[1]]) & 0xFFFF;
-+
-+
-+#define MT_HASH2_CALC \
-+  hash2Value = (p->crc[cur[0]] ^ cur[1]) & (kHash2Size - 1);
-+
-+#define MT_HASH3_CALC { \
-+  UInt32 temp = p->crc[cur[0]] ^ cur[1]; \
-+  hash2Value = temp & (kHash2Size - 1); \
-+  hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); }
-+
-+#define MT_HASH4_CALC { \
-+  UInt32 temp = p->crc[cur[0]] ^ cur[1]; \
-+  hash2Value = temp & (kHash2Size - 1); \
-+  hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); \
-+  hash4Value = (temp ^ ((UInt32)cur[2] << 8) ^ (p->crc[cur[3]] << 5)) & (kHash4Size - 1); }
-+
-+#endif
---- /dev/null
-+++ b/include/linux/lzma/LzmaDec.h
-@@ -0,0 +1,231 @@
-+/* LzmaDec.h -- LZMA Decoder
-+2009-02-07 : Igor Pavlov : Public domain */
-+
-+#ifndef __LZMA_DEC_H
-+#define __LZMA_DEC_H
-+
-+#include "Types.h"
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+/* #define _LZMA_PROB32 */
-+/* _LZMA_PROB32 can increase the speed on some CPUs,
-+   but memory usage for CLzmaDec::probs will be doubled in that case */
-+
-+#ifdef _LZMA_PROB32
-+#define CLzmaProb UInt32
-+#else
-+#define CLzmaProb UInt16
-+#endif
-+
-+
-+/* ---------- LZMA Properties ---------- */
-+
-+#define LZMA_PROPS_SIZE 5
-+
-+typedef struct _CLzmaProps
-+{
-+  unsigned lc, lp, pb;
-+  UInt32 dicSize;
-+} CLzmaProps;
-+
-+/* LzmaProps_Decode - decodes properties
-+Returns:
-+  SZ_OK
-+  SZ_ERROR_UNSUPPORTED - Unsupported properties
-+*/
-+
-+SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size);
-+
-+
-+/* ---------- LZMA Decoder state ---------- */
-+
-+/* LZMA_REQUIRED_INPUT_MAX = number of required input bytes for worst case.
-+   Num bits = log2((2^11 / 31) ^ 22) + 26 < 134 + 26 = 160; */
-+
-+#define LZMA_REQUIRED_INPUT_MAX 20
-+
-+typedef struct
-+{
-+  CLzmaProps prop;
-+  CLzmaProb *probs;
-+  Byte *dic;
-+  const Byte *buf;
-+  UInt32 range, code;
-+  SizeT dicPos;
-+  SizeT dicBufSize;
-+  UInt32 processedPos;
-+  UInt32 checkDicSize;
-+  unsigned state;
-+  UInt32 reps[4];
-+  unsigned remainLen;
-+  int needFlush;
-+  int needInitState;
-+  UInt32 numProbs;
-+  unsigned tempBufSize;
-+  Byte tempBuf[LZMA_REQUIRED_INPUT_MAX];
-+} CLzmaDec;
-+
-+#define LzmaDec_Construct(p) { (p)->dic = 0; (p)->probs = 0; }
-+
-+void LzmaDec_Init(CLzmaDec *p);
-+
-+/* There are two types of LZMA streams:
-+     0) Stream with end mark. That end mark adds about 6 bytes to compressed size.
-+     1) Stream without end mark. You must know exact uncompressed size to decompress such stream. */
-+
-+typedef enum
-+{
-+  LZMA_FINISH_ANY,   /* finish at any point */
-+  LZMA_FINISH_END    /* block must be finished at the end */
-+} ELzmaFinishMode;
-+
-+/* ELzmaFinishMode has meaning only if the decoding reaches output limit !!!
-+
-+   You must use LZMA_FINISH_END, when you know that current output buffer
-+   covers last bytes of block. In other cases you must use LZMA_FINISH_ANY.
-+
-+   If LZMA decoder sees end marker before reaching output limit, it returns SZ_OK,
-+   and output value of destLen will be less than output buffer size limit.
-+   You can check status result also.
-+
-+   You can use multiple checks to test data integrity after full decompression:
-+     1) Check Result and "status" variable.
-+     2) Check that output(destLen) = uncompressedSize, if you know real uncompressedSize.
-+     3) Check that output(srcLen) = compressedSize, if you know real compressedSize.
-+        You must use correct finish mode in that case. */
-+
-+typedef enum
-+{
-+  LZMA_STATUS_NOT_SPECIFIED,               /* use main error code instead */
-+  LZMA_STATUS_FINISHED_WITH_MARK,          /* stream was finished with end mark. */
-+  LZMA_STATUS_NOT_FINISHED,                /* stream was not finished */
-+  LZMA_STATUS_NEEDS_MORE_INPUT,            /* you must provide more input bytes */
-+  LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK  /* there is probability that stream was finished without end mark */
-+} ELzmaStatus;
-+
-+/* ELzmaStatus is used only as output value for function call */
-+
-+
-+/* ---------- Interfaces ---------- */
-+
-+/* There are 3 levels of interfaces:
-+     1) Dictionary Interface
-+     2) Buffer Interface
-+     3) One Call Interface
-+   You can select any of these interfaces, but don't mix functions from different
-+   groups for same object. */
-+
-+
-+/* There are two variants to allocate state for Dictionary Interface:
-+     1) LzmaDec_Allocate / LzmaDec_Free
-+     2) LzmaDec_AllocateProbs / LzmaDec_FreeProbs
-+   You can use variant 2, if you set dictionary buffer manually.
-+   For Buffer Interface you must always use variant 1.
-+
-+LzmaDec_Allocate* can return:
-+  SZ_OK
-+  SZ_ERROR_MEM         - Memory allocation error
-+  SZ_ERROR_UNSUPPORTED - Unsupported properties
-+*/
-+   
-+SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc);
-+void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc);
-+
-+SRes LzmaDec_Allocate(CLzmaDec *state, const Byte *prop, unsigned propsSize, ISzAlloc *alloc);
-+void LzmaDec_Free(CLzmaDec *state, ISzAlloc *alloc);
-+
-+/* ---------- Dictionary Interface ---------- */
-+
-+/* You can use it, if you want to eliminate the overhead for data copying from
-+   dictionary to some other external buffer.
-+   You must work with CLzmaDec variables directly in this interface.
-+
-+   STEPS:
-+     LzmaDec_Constr()
-+     LzmaDec_Allocate()
-+     for (each new stream)
-+     {
-+       LzmaDec_Init()
-+       while (it needs more decompression)
-+       {
-+         LzmaDec_DecodeToDic()
-+         use data from CLzmaDec::dic and update CLzmaDec::dicPos
-+       }
-+     }
-+     LzmaDec_Free()
-+*/
-+
-+/* LzmaDec_DecodeToDic
-+   
-+   The decoding to internal dictionary buffer (CLzmaDec::dic).
-+   You must manually update CLzmaDec::dicPos, if it reaches CLzmaDec::dicBufSize !!!
-+
-+finishMode:
-+  It has meaning only if the decoding reaches output limit (dicLimit).
-+  LZMA_FINISH_ANY - Decode just dicLimit bytes.
-+  LZMA_FINISH_END - Stream must be finished after dicLimit.
-+
-+Returns:
-+  SZ_OK
-+    status:
-+      LZMA_STATUS_FINISHED_WITH_MARK
-+      LZMA_STATUS_NOT_FINISHED
-+      LZMA_STATUS_NEEDS_MORE_INPUT
-+      LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK
-+  SZ_ERROR_DATA - Data error
-+*/
-+
-+SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit,
-+    const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status);
-+
-+
-+/* ---------- Buffer Interface ---------- */
-+
-+/* It's zlib-like interface.
-+   See LzmaDec_DecodeToDic description for information about STEPS and return results,
-+   but you must use LzmaDec_DecodeToBuf instead of LzmaDec_DecodeToDic and you don't need
-+   to work with CLzmaDec variables manually.
-+
-+finishMode:
-+  It has meaning only if the decoding reaches output limit (*destLen).
-+  LZMA_FINISH_ANY - Decode just destLen bytes.
-+  LZMA_FINISH_END - Stream must be finished after (*destLen).
-+*/
-+
-+SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen,
-+    const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status);
-+
-+
-+/* ---------- One Call Interface ---------- */
-+
-+/* LzmaDecode
-+
-+finishMode:
-+  It has meaning only if the decoding reaches output limit (*destLen).
-+  LZMA_FINISH_ANY - Decode just destLen bytes.
-+  LZMA_FINISH_END - Stream must be finished after (*destLen).
-+
-+Returns:
-+  SZ_OK
-+    status:
-+      LZMA_STATUS_FINISHED_WITH_MARK
-+      LZMA_STATUS_NOT_FINISHED
-+      LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK
-+  SZ_ERROR_DATA - Data error
-+  SZ_ERROR_MEM  - Memory allocation error
-+  SZ_ERROR_UNSUPPORTED - Unsupported properties
-+  SZ_ERROR_INPUT_EOF - It needs more bytes in input buffer (src).
-+*/
-+
-+SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen,
-+    const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode,
-+    ELzmaStatus *status, ISzAlloc *alloc);
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif
---- /dev/null
-+++ b/include/linux/lzma/LzmaEnc.h
-@@ -0,0 +1,80 @@
-+/*  LzmaEnc.h -- LZMA Encoder
-+2009-02-07 : Igor Pavlov : Public domain */
-+
-+#ifndef __LZMA_ENC_H
-+#define __LZMA_ENC_H
-+
-+#include "Types.h"
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+#define LZMA_PROPS_SIZE 5
-+
-+typedef struct _CLzmaEncProps
-+{
-+  int level;       /*  0 <= level <= 9 */
-+  UInt32 dictSize; /* (1 << 12) <= dictSize <= (1 << 27) for 32-bit version
-+                      (1 << 12) <= dictSize <= (1 << 30) for 64-bit version
-+                       default = (1 << 24) */
-+  int lc;          /* 0 <= lc <= 8, default = 3 */
-+  int lp;          /* 0 <= lp <= 4, default = 0 */
-+  int pb;          /* 0 <= pb <= 4, default = 2 */
-+  int algo;        /* 0 - fast, 1 - normal, default = 1 */
-+  int fb;          /* 5 <= fb <= 273, default = 32 */
-+  int btMode;      /* 0 - hashChain Mode, 1 - binTree mode - normal, default = 1 */
-+  int numHashBytes; /* 2, 3 or 4, default = 4 */
-+  UInt32 mc;        /* 1 <= mc <= (1 << 30), default = 32 */
-+  unsigned writeEndMark;  /* 0 - do not write EOPM, 1 - write EOPM, default = 0 */
-+  int numThreads;  /* 1 or 2, default = 2 */
-+} CLzmaEncProps;
-+
-+void LzmaEncProps_Init(CLzmaEncProps *p);
-+void LzmaEncProps_Normalize(CLzmaEncProps *p);
-+UInt32 LzmaEncProps_GetDictSize(const CLzmaEncProps *props2);
-+
-+
-+/* ---------- CLzmaEncHandle Interface ---------- */
-+
-+/* LzmaEnc_* functions can return the following exit codes:
-+Returns:
-+  SZ_OK           - OK
-+  SZ_ERROR_MEM    - Memory allocation error
-+  SZ_ERROR_PARAM  - Incorrect paramater in props
-+  SZ_ERROR_WRITE  - Write callback error.
-+  SZ_ERROR_PROGRESS - some break from progress callback
-+  SZ_ERROR_THREAD - errors in multithreading functions (only for Mt version)
-+*/
-+
-+typedef void * CLzmaEncHandle;
-+
-+CLzmaEncHandle LzmaEnc_Create(ISzAlloc *alloc);
-+void LzmaEnc_Destroy(CLzmaEncHandle p, ISzAlloc *alloc, ISzAlloc *allocBig);
-+SRes LzmaEnc_SetProps(CLzmaEncHandle p, const CLzmaEncProps *props);
-+SRes LzmaEnc_WriteProperties(CLzmaEncHandle p, Byte *properties, SizeT *size);
-+SRes LzmaEnc_Encode(CLzmaEncHandle p, ISeqOutStream *outStream, ISeqInStream *inStream,
-+    ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig);
-+SRes LzmaEnc_MemEncode(CLzmaEncHandle p, Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen,
-+    int writeEndMark, ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig);
-+
-+/* ---------- One Call Interface ---------- */
-+
-+/* LzmaEncode
-+Return code:
-+  SZ_OK               - OK
-+  SZ_ERROR_MEM        - Memory allocation error
-+  SZ_ERROR_PARAM      - Incorrect paramater
-+  SZ_ERROR_OUTPUT_EOF - output buffer overflow
-+  SZ_ERROR_THREAD     - errors in multithreading functions (only for Mt version)
-+*/
-+
-+SRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen,
-+    const CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark,
-+    ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig);
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif
---- /dev/null
-+++ b/include/linux/lzma/Types.h
-@@ -0,0 +1,226 @@
-+/* Types.h -- Basic types
-+2009-11-23 : Igor Pavlov : Public domain */
-+
-+#ifndef __7Z_TYPES_H
-+#define __7Z_TYPES_H
-+
-+#include <stddef.h>
-+
-+#ifdef _WIN32
-+#include <windows.h>
-+#endif
-+
-+#ifndef EXTERN_C_BEGIN
-+#ifdef __cplusplus
-+#define EXTERN_C_BEGIN extern "C" {
-+#define EXTERN_C_END }
-+#else
-+#define EXTERN_C_BEGIN
-+#define EXTERN_C_END
-+#endif
-+#endif
-+
-+EXTERN_C_BEGIN
-+
-+#define SZ_OK 0
-+
-+#define SZ_ERROR_DATA 1
-+#define SZ_ERROR_MEM 2
-+#define SZ_ERROR_CRC 3
-+#define SZ_ERROR_UNSUPPORTED 4
-+#define SZ_ERROR_PARAM 5
-+#define SZ_ERROR_INPUT_EOF 6
-+#define SZ_ERROR_OUTPUT_EOF 7
-+#define SZ_ERROR_READ 8
-+#define SZ_ERROR_WRITE 9
-+#define SZ_ERROR_PROGRESS 10
-+#define SZ_ERROR_FAIL 11
-+#define SZ_ERROR_THREAD 12
-+
-+#define SZ_ERROR_ARCHIVE 16
-+#define SZ_ERROR_NO_ARCHIVE 17
-+
-+typedef int SRes;
-+
-+#ifdef _WIN32
-+typedef DWORD WRes;
-+#else
-+typedef int WRes;
-+#endif
-+
-+#ifndef RINOK
-+#define RINOK(x) { int __result__ = (x); if (__result__ != 0) return __result__; }
-+#endif
-+
-+typedef unsigned char Byte;
-+typedef short Int16;
-+typedef unsigned short UInt16;
-+
-+#ifdef _LZMA_UINT32_IS_ULONG
-+typedef long Int32;
-+typedef unsigned long UInt32;
-+#else
-+typedef int Int32;
-+typedef unsigned int UInt32;
-+#endif
-+
-+#ifdef _SZ_NO_INT_64
-+
-+/* define _SZ_NO_INT_64, if your compiler doesn't support 64-bit integers.
-+   NOTES: Some code will work incorrectly in that case! */
-+
-+typedef long Int64;
-+typedef unsigned long UInt64;
-+
-+#else
-+
-+#if defined(_MSC_VER) || defined(__BORLANDC__)
-+typedef __int64 Int64;
-+typedef unsigned __int64 UInt64;
-+#else
-+typedef long long int Int64;
-+typedef unsigned long long int UInt64;
-+#endif
-+
-+#endif
-+
-+#ifdef _LZMA_NO_SYSTEM_SIZE_T
-+typedef UInt32 SizeT;
-+#else
-+typedef size_t SizeT;
-+#endif
-+
-+typedef int Bool;
-+#define True 1
-+#define False 0
-+
-+
-+#ifdef _WIN32
-+#define MY_STD_CALL __stdcall
-+#else
-+#define MY_STD_CALL
-+#endif
-+
-+#ifdef _MSC_VER
-+
-+#if _MSC_VER >= 1300
-+#define MY_NO_INLINE __declspec(noinline)
-+#else
-+#define MY_NO_INLINE
-+#endif
-+
-+#define MY_CDECL __cdecl
-+#define MY_FAST_CALL __fastcall
-+
-+#else
-+
-+#define MY_CDECL
-+#define MY_FAST_CALL
-+
-+#endif
-+
-+
-+/* The following interfaces use first parameter as pointer to structure */
-+
-+typedef struct
-+{
-+  SRes (*Read)(void *p, void *buf, size_t *size);
-+    /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream.
-+       (output(*size) < input(*size)) is allowed */
-+} ISeqInStream;
-+
-+/* it can return SZ_ERROR_INPUT_EOF */
-+SRes SeqInStream_Read(ISeqInStream *stream, void *buf, size_t size);
-+SRes SeqInStream_Read2(ISeqInStream *stream, void *buf, size_t size, SRes errorType);
-+SRes SeqInStream_ReadByte(ISeqInStream *stream, Byte *buf);
-+
-+typedef struct
-+{
-+  size_t (*Write)(void *p, const void *buf, size_t size);
-+    /* Returns: result - the number of actually written bytes.
-+       (result < size) means error */
-+} ISeqOutStream;
-+
-+typedef enum
-+{
-+  SZ_SEEK_SET = 0,
-+  SZ_SEEK_CUR = 1,
-+  SZ_SEEK_END = 2
-+} ESzSeek;
-+
-+typedef struct
-+{
-+  SRes (*Read)(void *p, void *buf, size_t *size);  /* same as ISeqInStream::Read */
-+  SRes (*Seek)(void *p, Int64 *pos, ESzSeek origin);
-+} ISeekInStream;
-+
-+typedef struct
-+{
-+  SRes (*Look)(void *p, void **buf, size_t *size);
-+    /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream.
-+       (output(*size) > input(*size)) is not allowed
-+       (output(*size) < input(*size)) is allowed */
-+  SRes (*Skip)(void *p, size_t offset);
-+    /* offset must be <= output(*size) of Look */
-+
-+  SRes (*Read)(void *p, void *buf, size_t *size);
-+    /* reads directly (without buffer). It's same as ISeqInStream::Read */
-+  SRes (*Seek)(void *p, Int64 *pos, ESzSeek origin);
-+} ILookInStream;
-+
-+SRes LookInStream_LookRead(ILookInStream *stream, void *buf, size_t *size);
-+SRes LookInStream_SeekTo(ILookInStream *stream, UInt64 offset);
-+
-+/* reads via ILookInStream::Read */
-+SRes LookInStream_Read2(ILookInStream *stream, void *buf, size_t size, SRes errorType);
-+SRes LookInStream_Read(ILookInStream *stream, void *buf, size_t size);
-+
-+#define LookToRead_BUF_SIZE (1 << 14)
-+
-+typedef struct
-+{
-+  ILookInStream s;
-+  ISeekInStream *realStream;
-+  size_t pos;
-+  size_t size;
-+  Byte buf[LookToRead_BUF_SIZE];
-+} CLookToRead;
-+
-+void LookToRead_CreateVTable(CLookToRead *p, int lookahead);
-+void LookToRead_Init(CLookToRead *p);
-+
-+typedef struct
-+{
-+  ISeqInStream s;
-+  ILookInStream *realStream;
-+} CSecToLook;
-+
-+void SecToLook_CreateVTable(CSecToLook *p);
-+
-+typedef struct
-+{
-+  ISeqInStream s;
-+  ILookInStream *realStream;
-+} CSecToRead;
-+
-+void SecToRead_CreateVTable(CSecToRead *p);
-+
-+typedef struct
-+{
-+  SRes (*Progress)(void *p, UInt64 inSize, UInt64 outSize);
-+    /* Returns: result. (result != SZ_OK) means break.
-+       Value (UInt64)(Int64)-1 for size means unknown value. */
-+} ICompressProgress;
-+
-+typedef struct
-+{
-+  void *(*Alloc)(void *p, size_t size);
-+  void (*Free)(void *p, void *address); /* address can be 0 */
-+} ISzAlloc;
-+
-+#define IAlloc_Alloc(p, size) (p)->Alloc((p), size)
-+#define IAlloc_Free(p, a) (p)->Free((p), a)
-+
-+EXTERN_C_END
-+
-+#endif
---- a/lib/Kconfig
-+++ b/lib/Kconfig
-@@ -106,6 +106,12 @@ config LZO_COMPRESS
- config LZO_DECOMPRESS
-       tristate
-+config LZMA_COMPRESS
-+    tristate
-+
-+config LZMA_DECOMPRESS
-+    tristate
-+
- #
- # These all provide a common interface (hence the apparent duplication with
- # ZLIB_INFLATE; DECOMPRESS_GZIP is just a wrapper.)
---- a/lib/Makefile
-+++ b/lib/Makefile
-@@ -2,6 +2,16 @@
- # Makefile for some libs needed in the kernel.
- #
-+ifdef CONFIG_JFFS2_ZLIB
-+      CONFIG_ZLIB_INFLATE:=y
-+      CONFIG_ZLIB_DEFLATE:=y
-+endif
-+
-+ifdef CONFIG_JFFS2_LZMA
-+      CONFIG_LZMA_DECOMPRESS:=y
-+      CONFIG_LZMA_COMPRESS:=y
-+endif
-+
- ifdef CONFIG_FUNCTION_TRACER
- ORIG_CFLAGS := $(KBUILD_CFLAGS)
- KBUILD_CFLAGS = $(subst -pg,,$(ORIG_CFLAGS))
-@@ -70,6 +80,8 @@ obj-$(CONFIG_REED_SOLOMON) += reed_solom
- obj-$(CONFIG_LZO_COMPRESS) += lzo/
- obj-$(CONFIG_LZO_DECOMPRESS) += lzo/
- obj-$(CONFIG_RAID6_PQ) += raid6/
-+obj-$(CONFIG_LZMA_COMPRESS) += lzma/
-+obj-$(CONFIG_LZMA_DECOMPRESS) += lzma/
- lib-$(CONFIG_DECOMPRESS_GZIP) += decompress_inflate.o
- lib-$(CONFIG_DECOMPRESS_BZIP2) += decompress_bunzip2.o
---- /dev/null
-+++ b/lib/lzma/LzFind.c
-@@ -0,0 +1,761 @@
-+/* LzFind.c -- Match finder for LZ algorithms
-+2009-04-22 : Igor Pavlov : Public domain */
-+
-+#include <string.h>
-+
-+#include "LzFind.h"
-+#include "LzHash.h"
-+
-+#define kEmptyHashValue 0
-+#define kMaxValForNormalize ((UInt32)0xFFFFFFFF)
-+#define kNormalizeStepMin (1 << 10) /* it must be power of 2 */
-+#define kNormalizeMask (~(kNormalizeStepMin - 1))
-+#define kMaxHistorySize ((UInt32)3 << 30)
-+
-+#define kStartMaxLen 3
-+
-+static void LzInWindow_Free(CMatchFinder *p, ISzAlloc *alloc)
-+{
-+  if (!p->directInput)
-+  {
-+    alloc->Free(alloc, p->bufferBase);
-+    p->bufferBase = 0;
-+  }
-+}
-+
-+/* keepSizeBefore + keepSizeAfter + keepSizeReserv must be < 4G) */
-+
-+static int LzInWindow_Create(CMatchFinder *p, UInt32 keepSizeReserv, ISzAlloc *alloc)
-+{
-+  UInt32 blockSize = p->keepSizeBefore + p->keepSizeAfter + keepSizeReserv;
-+  if (p->directInput)
-+  {
-+    p->blockSize = blockSize;
-+    return 1;
-+  }
-+  if (p->bufferBase == 0 || p->blockSize != blockSize)
-+  {
-+    LzInWindow_Free(p, alloc);
-+    p->blockSize = blockSize;
-+    p->bufferBase = (Byte *)alloc->Alloc(alloc, (size_t)blockSize);
-+  }
-+  return (p->bufferBase != 0);
-+}
-+
-+Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p) { return p->buffer; }
-+Byte MatchFinder_GetIndexByte(CMatchFinder *p, Int32 index) { return p->buffer[index]; }
-+
-+UInt32 MatchFinder_GetNumAvailableBytes(CMatchFinder *p) { return p->streamPos - p->pos; }
-+
-+void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue)
-+{
-+  p->posLimit -= subValue;
-+  p->pos -= subValue;
-+  p->streamPos -= subValue;
-+}
-+
-+static void MatchFinder_ReadBlock(CMatchFinder *p)
-+{
-+  if (p->streamEndWasReached || p->result != SZ_OK)
-+    return;
-+  if (p->directInput)
-+  {
-+    UInt32 curSize = 0xFFFFFFFF - p->streamPos;
-+    if (curSize > p->directInputRem)
-+      curSize = (UInt32)p->directInputRem;
-+    p->directInputRem -= curSize;
-+    p->streamPos += curSize;
-+    if (p->directInputRem == 0)
-+      p->streamEndWasReached = 1;
-+    return;
-+  }
-+  for (;;)
-+  {
-+    Byte *dest = p->buffer + (p->streamPos - p->pos);
-+    size_t size = (p->bufferBase + p->blockSize - dest);
-+    if (size == 0)
-+      return;
-+    p->result = p->stream->Read(p->stream, dest, &size);
-+    if (p->result != SZ_OK)
-+      return;
-+    if (size == 0)
-+    {
-+      p->streamEndWasReached = 1;
-+      return;
-+    }
-+    p->streamPos += (UInt32)size;
-+    if (p->streamPos - p->pos > p->keepSizeAfter)
-+      return;
-+  }
-+}
-+
-+void MatchFinder_MoveBlock(CMatchFinder *p)
-+{
-+  memmove(p->bufferBase,
-+    p->buffer - p->keepSizeBefore,
-+    (size_t)(p->streamPos - p->pos + p->keepSizeBefore));
-+  p->buffer = p->bufferBase + p->keepSizeBefore;
-+}
-+
-+int MatchFinder_NeedMove(CMatchFinder *p)
-+{
-+  if (p->directInput)
-+    return 0;
-+  /* if (p->streamEndWasReached) return 0; */
-+  return ((size_t)(p->bufferBase + p->blockSize - p->buffer) <= p->keepSizeAfter);
-+}
-+
-+void MatchFinder_ReadIfRequired(CMatchFinder *p)
-+{
-+  if (p->streamEndWasReached)
-+    return;
-+  if (p->keepSizeAfter >= p->streamPos - p->pos)
-+    MatchFinder_ReadBlock(p);
-+}
-+
-+static void MatchFinder_CheckAndMoveAndRead(CMatchFinder *p)
-+{
-+  if (MatchFinder_NeedMove(p))
-+    MatchFinder_MoveBlock(p);
-+  MatchFinder_ReadBlock(p);
-+}
-+
-+static void MatchFinder_SetDefaultSettings(CMatchFinder *p)
-+{
-+  p->cutValue = 32;
-+  p->btMode = 1;
-+  p->numHashBytes = 4;
-+  p->bigHash = 0;
-+}
-+
-+#define kCrcPoly 0xEDB88320
-+
-+void MatchFinder_Construct(CMatchFinder *p)
-+{
-+  UInt32 i;
-+  p->bufferBase = 0;
-+  p->directInput = 0;
-+  p->hash = 0;
-+  MatchFinder_SetDefaultSettings(p);
-+
-+  for (i = 0; i < 256; i++)
-+  {
-+    UInt32 r = i;
-+    int j;
-+    for (j = 0; j < 8; j++)
-+      r = (r >> 1) ^ (kCrcPoly & ~((r & 1) - 1));
-+    p->crc[i] = r;
-+  }
-+}
-+
-+static void MatchFinder_FreeThisClassMemory(CMatchFinder *p, ISzAlloc *alloc)
-+{
-+  alloc->Free(alloc, p->hash);
-+  p->hash = 0;
-+}
-+
-+void MatchFinder_Free(CMatchFinder *p, ISzAlloc *alloc)
-+{
-+  MatchFinder_FreeThisClassMemory(p, alloc);
-+  LzInWindow_Free(p, alloc);
-+}
-+
-+static CLzRef* AllocRefs(UInt32 num, ISzAlloc *alloc)
-+{
-+  size_t sizeInBytes = (size_t)num * sizeof(CLzRef);
-+  if (sizeInBytes / sizeof(CLzRef) != num)
-+    return 0;
-+  return (CLzRef *)alloc->Alloc(alloc, sizeInBytes);
-+}
-+
-+int MatchFinder_Create(CMatchFinder *p, UInt32 historySize,
-+    UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter,
-+    ISzAlloc *alloc)
-+{
-+  UInt32 sizeReserv;
-+  if (historySize > kMaxHistorySize)
-+  {
-+    MatchFinder_Free(p, alloc);
-+    return 0;
-+  }
-+  sizeReserv = historySize >> 1;
-+  if (historySize > ((UInt32)2 << 30))
-+    sizeReserv = historySize >> 2;
-+  sizeReserv += (keepAddBufferBefore + matchMaxLen + keepAddBufferAfter) / 2 + (1 << 19);
-+
-+  p->keepSizeBefore = historySize + keepAddBufferBefore + 1;
-+  p->keepSizeAfter = matchMaxLen + keepAddBufferAfter;
-+  /* we need one additional byte, since we use MoveBlock after pos++ and before dictionary using */
-+  if (LzInWindow_Create(p, sizeReserv, alloc))
-+  {
-+    UInt32 newCyclicBufferSize = historySize + 1;
-+    UInt32 hs;
-+    p->matchMaxLen = matchMaxLen;
-+    {
-+      p->fixedHashSize = 0;
-+      if (p->numHashBytes == 2)
-+        hs = (1 << 16) - 1;
-+      else
-+      {
-+        hs = historySize - 1;
-+        hs |= (hs >> 1);
-+        hs |= (hs >> 2);
-+        hs |= (hs >> 4);
-+        hs |= (hs >> 8);
-+        hs >>= 1;
-+        hs |= 0xFFFF; /* don't change it! It's required for Deflate */
-+        if (hs > (1 << 24))
-+        {
-+          if (p->numHashBytes == 3)
-+            hs = (1 << 24) - 1;
-+          else
-+            hs >>= 1;
-+        }
-+      }
-+      p->hashMask = hs;
-+      hs++;
-+      if (p->numHashBytes > 2) p->fixedHashSize += kHash2Size;
-+      if (p->numHashBytes > 3) p->fixedHashSize += kHash3Size;
-+      if (p->numHashBytes > 4) p->fixedHashSize += kHash4Size;
-+      hs += p->fixedHashSize;
-+    }
-+
-+    {
-+      UInt32 prevSize = p->hashSizeSum + p->numSons;
-+      UInt32 newSize;
-+      p->historySize = historySize;
-+      p->hashSizeSum = hs;
-+      p->cyclicBufferSize = newCyclicBufferSize;
-+      p->numSons = (p->btMode ? newCyclicBufferSize * 2 : newCyclicBufferSize);
-+      newSize = p->hashSizeSum + p->numSons;
-+      if (p->hash != 0 && prevSize == newSize)
-+        return 1;
-+      MatchFinder_FreeThisClassMemory(p, alloc);
-+      p->hash = AllocRefs(newSize, alloc);
-+      if (p->hash != 0)
-+      {
-+        p->son = p->hash + p->hashSizeSum;
-+        return 1;
-+      }
-+    }
-+  }
-+  MatchFinder_Free(p, alloc);
-+  return 0;
-+}
-+
-+static void MatchFinder_SetLimits(CMatchFinder *p)
-+{
-+  UInt32 limit = kMaxValForNormalize - p->pos;
-+  UInt32 limit2 = p->cyclicBufferSize - p->cyclicBufferPos;
-+  if (limit2 < limit)
-+    limit = limit2;
-+  limit2 = p->streamPos - p->pos;
-+  if (limit2 <= p->keepSizeAfter)
-+  {
-+    if (limit2 > 0)
-+      limit2 = 1;
-+  }
-+  else
-+    limit2 -= p->keepSizeAfter;
-+  if (limit2 < limit)
-+    limit = limit2;
-+  {
-+    UInt32 lenLimit = p->streamPos - p->pos;
-+    if (lenLimit > p->matchMaxLen)
-+      lenLimit = p->matchMaxLen;
-+    p->lenLimit = lenLimit;
-+  }
-+  p->posLimit = p->pos + limit;
-+}
-+
-+void MatchFinder_Init(CMatchFinder *p)
-+{
-+  UInt32 i;
-+  for (i = 0; i < p->hashSizeSum; i++)
-+    p->hash[i] = kEmptyHashValue;
-+  p->cyclicBufferPos = 0;
-+  p->buffer = p->bufferBase;
-+  p->pos = p->streamPos = p->cyclicBufferSize;
-+  p->result = SZ_OK;
-+  p->streamEndWasReached = 0;
-+  MatchFinder_ReadBlock(p);
-+  MatchFinder_SetLimits(p);
-+}
-+
-+static UInt32 MatchFinder_GetSubValue(CMatchFinder *p)
-+{
-+  return (p->pos - p->historySize - 1) & kNormalizeMask;
-+}
-+
-+void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, UInt32 numItems)
-+{
-+  UInt32 i;
-+  for (i = 0; i < numItems; i++)
-+  {
-+    UInt32 value = items[i];
-+    if (value <= subValue)
-+      value = kEmptyHashValue;
-+    else
-+      value -= subValue;
-+    items[i] = value;
-+  }
-+}
-+
-+static void MatchFinder_Normalize(CMatchFinder *p)
-+{
-+  UInt32 subValue = MatchFinder_GetSubValue(p);
-+  MatchFinder_Normalize3(subValue, p->hash, p->hashSizeSum + p->numSons);
-+  MatchFinder_ReduceOffsets(p, subValue);
-+}
-+
-+static void MatchFinder_CheckLimits(CMatchFinder *p)
-+{
-+  if (p->pos == kMaxValForNormalize)
-+    MatchFinder_Normalize(p);
-+  if (!p->streamEndWasReached && p->keepSizeAfter == p->streamPos - p->pos)
-+    MatchFinder_CheckAndMoveAndRead(p);
-+  if (p->cyclicBufferPos == p->cyclicBufferSize)
-+    p->cyclicBufferPos = 0;
-+  MatchFinder_SetLimits(p);
-+}
-+
-+static UInt32 * Hc_GetMatchesSpec(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son,
-+    UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue,
-+    UInt32 *distances, UInt32 maxLen)
-+{
-+  son[_cyclicBufferPos] = curMatch;
-+  for (;;)
-+  {
-+    UInt32 delta = pos - curMatch;
-+    if (cutValue-- == 0 || delta >= _cyclicBufferSize)
-+      return distances;
-+    {
-+      const Byte *pb = cur - delta;
-+      curMatch = son[_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)];
-+      if (pb[maxLen] == cur[maxLen] && *pb == *cur)
-+      {
-+        UInt32 len = 0;
-+        while (++len != lenLimit)
-+          if (pb[len] != cur[len])
-+            break;
-+        if (maxLen < len)
-+        {
-+          *distances++ = maxLen = len;
-+          *distances++ = delta - 1;
-+          if (len == lenLimit)
-+            return distances;
-+        }
-+      }
-+    }
-+  }
-+}
-+
-+UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son,
-+    UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue,
-+    UInt32 *distances, UInt32 maxLen)
-+{
-+  CLzRef *ptr0 = son + (_cyclicBufferPos << 1) + 1;
-+  CLzRef *ptr1 = son + (_cyclicBufferPos << 1);
-+  UInt32 len0 = 0, len1 = 0;
-+  for (;;)
-+  {
-+    UInt32 delta = pos - curMatch;
-+    if (cutValue-- == 0 || delta >= _cyclicBufferSize)
-+    {
-+      *ptr0 = *ptr1 = kEmptyHashValue;
-+      return distances;
-+    }
-+    {
-+      CLzRef *pair = son + ((_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)) << 1);
-+      const Byte *pb = cur - delta;
-+      UInt32 len = (len0 < len1 ? len0 : len1);
-+      if (pb[len] == cur[len])
-+      {
-+        if (++len != lenLimit && pb[len] == cur[len])
-+          while (++len != lenLimit)
-+            if (pb[len] != cur[len])
-+              break;
-+        if (maxLen < len)
-+        {
-+          *distances++ = maxLen = len;
-+          *distances++ = delta - 1;
-+          if (len == lenLimit)
-+          {
-+            *ptr1 = pair[0];
-+            *ptr0 = pair[1];
-+            return distances;
-+          }
-+        }
-+      }
-+      if (pb[len] < cur[len])
-+      {
-+        *ptr1 = curMatch;
-+        ptr1 = pair + 1;
-+        curMatch = *ptr1;
-+        len1 = len;
-+      }
-+      else
-+      {
-+        *ptr0 = curMatch;
-+        ptr0 = pair;
-+        curMatch = *ptr0;
-+        len0 = len;
-+      }
-+    }
-+  }
-+}
-+
-+static void SkipMatchesSpec(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son,
-+    UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue)
-+{
-+  CLzRef *ptr0 = son + (_cyclicBufferPos << 1) + 1;
-+  CLzRef *ptr1 = son + (_cyclicBufferPos << 1);
-+  UInt32 len0 = 0, len1 = 0;
-+  for (;;)
-+  {
-+    UInt32 delta = pos - curMatch;
-+    if (cutValue-- == 0 || delta >= _cyclicBufferSize)
-+    {
-+      *ptr0 = *ptr1 = kEmptyHashValue;
-+      return;
-+    }
-+    {
-+      CLzRef *pair = son + ((_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)) << 1);
-+      const Byte *pb = cur - delta;
-+      UInt32 len = (len0 < len1 ? len0 : len1);
-+      if (pb[len] == cur[len])
-+      {
-+        while (++len != lenLimit)
-+          if (pb[len] != cur[len])
-+            break;
-+        {
-+          if (len == lenLimit)
-+          {
-+            *ptr1 = pair[0];
-+            *ptr0 = pair[1];
-+            return;
-+          }
-+        }
-+      }
-+      if (pb[len] < cur[len])
-+      {
-+        *ptr1 = curMatch;
-+        ptr1 = pair + 1;
-+        curMatch = *ptr1;
-+        len1 = len;
-+      }
-+      else
-+      {
-+        *ptr0 = curMatch;
-+        ptr0 = pair;
-+        curMatch = *ptr0;
-+        len0 = len;
-+      }
-+    }
-+  }
-+}
-+
-+#define MOVE_POS \
-+  ++p->cyclicBufferPos; \
-+  p->buffer++; \
-+  if (++p->pos == p->posLimit) MatchFinder_CheckLimits(p);
-+
-+#define MOVE_POS_RET MOVE_POS return offset;
-+
-+static void MatchFinder_MovePos(CMatchFinder *p) { MOVE_POS; }
-+
-+#define GET_MATCHES_HEADER2(minLen, ret_op) \
-+  UInt32 lenLimit; UInt32 hashValue; const Byte *cur; UInt32 curMatch; \
-+  lenLimit = p->lenLimit; { if (lenLimit < minLen) { MatchFinder_MovePos(p); ret_op; }} \
-+  cur = p->buffer;
-+
-+#define GET_MATCHES_HEADER(minLen) GET_MATCHES_HEADER2(minLen, return 0)
-+#define SKIP_HEADER(minLen)        GET_MATCHES_HEADER2(minLen, continue)
-+
-+#define MF_PARAMS(p) p->pos, p->buffer, p->son, p->cyclicBufferPos, p->cyclicBufferSize, p->cutValue
-+
-+#define GET_MATCHES_FOOTER(offset, maxLen) \
-+  offset = (UInt32)(GetMatchesSpec1(lenLimit, curMatch, MF_PARAMS(p), \
-+  distances + offset, maxLen) - distances); MOVE_POS_RET;
-+
-+#define SKIP_FOOTER \
-+  SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p)); MOVE_POS;
-+
-+static UInt32 Bt2_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
-+{
-+  UInt32 offset;
-+  GET_MATCHES_HEADER(2)
-+  HASH2_CALC;
-+  curMatch = p->hash[hashValue];
-+  p->hash[hashValue] = p->pos;
-+  offset = 0;
-+  GET_MATCHES_FOOTER(offset, 1)
-+}
-+
-+UInt32 Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
-+{
-+  UInt32 offset;
-+  GET_MATCHES_HEADER(3)
-+  HASH_ZIP_CALC;
-+  curMatch = p->hash[hashValue];
-+  p->hash[hashValue] = p->pos;
-+  offset = 0;
-+  GET_MATCHES_FOOTER(offset, 2)
-+}
-+
-+static UInt32 Bt3_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
-+{
-+  UInt32 hash2Value, delta2, maxLen, offset;
-+  GET_MATCHES_HEADER(3)
-+
-+  HASH3_CALC;
-+
-+  delta2 = p->pos - p->hash[hash2Value];
-+  curMatch = p->hash[kFix3HashSize + hashValue];
-+  
-+  p->hash[hash2Value] =
-+  p->hash[kFix3HashSize + hashValue] = p->pos;
-+
-+
-+  maxLen = 2;
-+  offset = 0;
-+  if (delta2 < p->cyclicBufferSize && *(cur - delta2) == *cur)
-+  {
-+    for (; maxLen != lenLimit; maxLen++)
-+      if (cur[(ptrdiff_t)maxLen - delta2] != cur[maxLen])
-+        break;
-+    distances[0] = maxLen;
-+    distances[1] = delta2 - 1;
-+    offset = 2;
-+    if (maxLen == lenLimit)
-+    {
-+      SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p));
-+      MOVE_POS_RET;
-+    }
-+  }
-+  GET_MATCHES_FOOTER(offset, maxLen)
-+}
-+
-+static UInt32 Bt4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
-+{
-+  UInt32 hash2Value, hash3Value, delta2, delta3, maxLen, offset;
-+  GET_MATCHES_HEADER(4)
-+
-+  HASH4_CALC;
-+
-+  delta2 = p->pos - p->hash[                hash2Value];
-+  delta3 = p->pos - p->hash[kFix3HashSize + hash3Value];
-+  curMatch = p->hash[kFix4HashSize + hashValue];
-+  
-+  p->hash[                hash2Value] =
-+  p->hash[kFix3HashSize + hash3Value] =
-+  p->hash[kFix4HashSize + hashValue] = p->pos;
-+
-+  maxLen = 1;
-+  offset = 0;
-+  if (delta2 < p->cyclicBufferSize && *(cur - delta2) == *cur)
-+  {
-+    distances[0] = maxLen = 2;
-+    distances[1] = delta2 - 1;
-+    offset = 2;
-+  }
-+  if (delta2 != delta3 && delta3 < p->cyclicBufferSize && *(cur - delta3) == *cur)
-+  {
-+    maxLen = 3;
-+    distances[offset + 1] = delta3 - 1;
-+    offset += 2;
-+    delta2 = delta3;
-+  }
-+  if (offset != 0)
-+  {
-+    for (; maxLen != lenLimit; maxLen++)
-+      if (cur[(ptrdiff_t)maxLen - delta2] != cur[maxLen])
-+        break;
-+    distances[offset - 2] = maxLen;
-+    if (maxLen == lenLimit)
-+    {
-+      SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p));
-+      MOVE_POS_RET;
-+    }
-+  }
-+  if (maxLen < 3)
-+    maxLen = 3;
-+  GET_MATCHES_FOOTER(offset, maxLen)
-+}
-+
-+static UInt32 Hc4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
-+{
-+  UInt32 hash2Value, hash3Value, delta2, delta3, maxLen, offset;
-+  GET_MATCHES_HEADER(4)
-+
-+  HASH4_CALC;
-+
-+  delta2 = p->pos - p->hash[                hash2Value];
-+  delta3 = p->pos - p->hash[kFix3HashSize + hash3Value];
-+  curMatch = p->hash[kFix4HashSize + hashValue];
-+
-+  p->hash[                hash2Value] =
-+  p->hash[kFix3HashSize + hash3Value] =
-+  p->hash[kFix4HashSize + hashValue] = p->pos;
-+
-+  maxLen = 1;
-+  offset = 0;
-+  if (delta2 < p->cyclicBufferSize && *(cur - delta2) == *cur)
-+  {
-+    distances[0] = maxLen = 2;
-+    distances[1] = delta2 - 1;
-+    offset = 2;
-+  }
-+  if (delta2 != delta3 && delta3 < p->cyclicBufferSize && *(cur - delta3) == *cur)
-+  {
-+    maxLen = 3;
-+    distances[offset + 1] = delta3 - 1;
-+    offset += 2;
-+    delta2 = delta3;
-+  }
-+  if (offset != 0)
-+  {
-+    for (; maxLen != lenLimit; maxLen++)
-+      if (cur[(ptrdiff_t)maxLen - delta2] != cur[maxLen])
-+        break;
-+    distances[offset - 2] = maxLen;
-+    if (maxLen == lenLimit)
-+    {
-+      p->son[p->cyclicBufferPos] = curMatch;
-+      MOVE_POS_RET;
-+    }
-+  }
-+  if (maxLen < 3)
-+    maxLen = 3;
-+  offset = (UInt32)(Hc_GetMatchesSpec(lenLimit, curMatch, MF_PARAMS(p),
-+    distances + offset, maxLen) - (distances));
-+  MOVE_POS_RET
-+}
-+
-+UInt32 Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
-+{
-+  UInt32 offset;
-+  GET_MATCHES_HEADER(3)
-+  HASH_ZIP_CALC;
-+  curMatch = p->hash[hashValue];
-+  p->hash[hashValue] = p->pos;
-+  offset = (UInt32)(Hc_GetMatchesSpec(lenLimit, curMatch, MF_PARAMS(p),
-+    distances, 2) - (distances));
-+  MOVE_POS_RET
-+}
-+
-+static void Bt2_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
-+{
-+  do
-+  {
-+    SKIP_HEADER(2)
-+    HASH2_CALC;
-+    curMatch = p->hash[hashValue];
-+    p->hash[hashValue] = p->pos;
-+    SKIP_FOOTER
-+  }
-+  while (--num != 0);
-+}
-+
-+void Bt3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
-+{
-+  do
-+  {
-+    SKIP_HEADER(3)
-+    HASH_ZIP_CALC;
-+    curMatch = p->hash[hashValue];
-+    p->hash[hashValue] = p->pos;
-+    SKIP_FOOTER
-+  }
-+  while (--num != 0);
-+}
-+
-+static void Bt3_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
-+{
-+  do
-+  {
-+    UInt32 hash2Value;
-+    SKIP_HEADER(3)
-+    HASH3_CALC;
-+    curMatch = p->hash[kFix3HashSize + hashValue];
-+    p->hash[hash2Value] =
-+    p->hash[kFix3HashSize + hashValue] = p->pos;
-+    SKIP_FOOTER
-+  }
-+  while (--num != 0);
-+}
-+
-+static void Bt4_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
-+{
-+  do
-+  {
-+    UInt32 hash2Value, hash3Value;
-+    SKIP_HEADER(4)
-+    HASH4_CALC;
-+    curMatch = p->hash[kFix4HashSize + hashValue];
-+    p->hash[                hash2Value] =
-+    p->hash[kFix3HashSize + hash3Value] = p->pos;
-+    p->hash[kFix4HashSize + hashValue] = p->pos;
-+    SKIP_FOOTER
-+  }
-+  while (--num != 0);
-+}
-+
-+static void Hc4_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
-+{
-+  do
-+  {
-+    UInt32 hash2Value, hash3Value;
-+    SKIP_HEADER(4)
-+    HASH4_CALC;
-+    curMatch = p->hash[kFix4HashSize + hashValue];
-+    p->hash[                hash2Value] =
-+    p->hash[kFix3HashSize + hash3Value] =
-+    p->hash[kFix4HashSize + hashValue] = p->pos;
-+    p->son[p->cyclicBufferPos] = curMatch;
-+    MOVE_POS
-+  }
-+  while (--num != 0);
-+}
-+
-+void Hc3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
-+{
-+  do
-+  {
-+    SKIP_HEADER(3)
-+    HASH_ZIP_CALC;
-+    curMatch = p->hash[hashValue];
-+    p->hash[hashValue] = p->pos;
-+    p->son[p->cyclicBufferPos] = curMatch;
-+    MOVE_POS
-+  }
-+  while (--num != 0);
-+}
-+
-+void MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder *vTable)
-+{
-+  vTable->Init = (Mf_Init_Func)MatchFinder_Init;
-+  vTable->GetIndexByte = (Mf_GetIndexByte_Func)MatchFinder_GetIndexByte;
-+  vTable->GetNumAvailableBytes = (Mf_GetNumAvailableBytes_Func)MatchFinder_GetNumAvailableBytes;
-+  vTable->GetPointerToCurrentPos = (Mf_GetPointerToCurrentPos_Func)MatchFinder_GetPointerToCurrentPos;
-+  if (!p->btMode)
-+  {
-+    vTable->GetMatches = (Mf_GetMatches_Func)Hc4_MatchFinder_GetMatches;
-+    vTable->Skip = (Mf_Skip_Func)Hc4_MatchFinder_Skip;
-+  }
-+  else if (p->numHashBytes == 2)
-+  {
-+    vTable->GetMatches = (Mf_GetMatches_Func)Bt2_MatchFinder_GetMatches;
-+    vTable->Skip = (Mf_Skip_Func)Bt2_MatchFinder_Skip;
-+  }
-+  else if (p->numHashBytes == 3)
-+  {
-+    vTable->GetMatches = (Mf_GetMatches_Func)Bt3_MatchFinder_GetMatches;
-+    vTable->Skip = (Mf_Skip_Func)Bt3_MatchFinder_Skip;
-+  }
-+  else
-+  {
-+    vTable->GetMatches = (Mf_GetMatches_Func)Bt4_MatchFinder_GetMatches;
-+    vTable->Skip = (Mf_Skip_Func)Bt4_MatchFinder_Skip;
-+  }
-+}
---- /dev/null
-+++ b/lib/lzma/LzmaDec.c
-@@ -0,0 +1,999 @@
-+/* LzmaDec.c -- LZMA Decoder
-+2009-09-20 : Igor Pavlov : Public domain */
-+
-+#include "LzmaDec.h"
-+
-+#include <string.h>
-+
-+#define kNumTopBits 24
-+#define kTopValue ((UInt32)1 << kNumTopBits)
-+
-+#define kNumBitModelTotalBits 11
-+#define kBitModelTotal (1 << kNumBitModelTotalBits)
-+#define kNumMoveBits 5
-+
-+#define RC_INIT_SIZE 5
-+
-+#define NORMALIZE if (range < kTopValue) { range <<= 8; code = (code << 8) | (*buf++); }
-+
-+#define IF_BIT_0(p) ttt = *(p); NORMALIZE; bound = (range >> kNumBitModelTotalBits) * ttt; if (code < bound)
-+#define UPDATE_0(p) range = bound; *(p) = (CLzmaProb)(ttt + ((kBitModelTotal - ttt) >> kNumMoveBits));
-+#define UPDATE_1(p) range -= bound; code -= bound; *(p) = (CLzmaProb)(ttt - (ttt >> kNumMoveBits));
-+#define GET_BIT2(p, i, A0, A1) IF_BIT_0(p) \
-+  { UPDATE_0(p); i = (i + i); A0; } else \
-+  { UPDATE_1(p); i = (i + i) + 1; A1; }
-+#define GET_BIT(p, i) GET_BIT2(p, i, ; , ;)
-+
-+#define TREE_GET_BIT(probs, i) { GET_BIT((probs + i), i); }
-+#define TREE_DECODE(probs, limit, i) \
-+  { i = 1; do { TREE_GET_BIT(probs, i); } while (i < limit); i -= limit; }
-+
-+/* #define _LZMA_SIZE_OPT */
-+
-+#ifdef _LZMA_SIZE_OPT
-+#define TREE_6_DECODE(probs, i) TREE_DECODE(probs, (1 << 6), i)
-+#else
-+#define TREE_6_DECODE(probs, i) \
-+  { i = 1; \
-+  TREE_GET_BIT(probs, i); \
-+  TREE_GET_BIT(probs, i); \
-+  TREE_GET_BIT(probs, i); \
-+  TREE_GET_BIT(probs, i); \
-+  TREE_GET_BIT(probs, i); \
-+  TREE_GET_BIT(probs, i); \
-+  i -= 0x40; }
-+#endif
-+
-+#define NORMALIZE_CHECK if (range < kTopValue) { if (buf >= bufLimit) return DUMMY_ERROR; range <<= 8; code = (code << 8) | (*buf++); }
-+
-+#define IF_BIT_0_CHECK(p) ttt = *(p); NORMALIZE_CHECK; bound = (range >> kNumBitModelTotalBits) * ttt; if (code < bound)
-+#define UPDATE_0_CHECK range = bound;
-+#define UPDATE_1_CHECK range -= bound; code -= bound;
-+#define GET_BIT2_CHECK(p, i, A0, A1) IF_BIT_0_CHECK(p) \
-+  { UPDATE_0_CHECK; i = (i + i); A0; } else \
-+  { UPDATE_1_CHECK; i = (i + i) + 1; A1; }
-+#define GET_BIT_CHECK(p, i) GET_BIT2_CHECK(p, i, ; , ;)
-+#define TREE_DECODE_CHECK(probs, limit, i) \
-+  { i = 1; do { GET_BIT_CHECK(probs + i, i) } while (i < limit); i -= limit; }
-+
-+
-+#define kNumPosBitsMax 4
-+#define kNumPosStatesMax (1 << kNumPosBitsMax)
-+
-+#define kLenNumLowBits 3
-+#define kLenNumLowSymbols (1 << kLenNumLowBits)
-+#define kLenNumMidBits 3
-+#define kLenNumMidSymbols (1 << kLenNumMidBits)
-+#define kLenNumHighBits 8
-+#define kLenNumHighSymbols (1 << kLenNumHighBits)
-+
-+#define LenChoice 0
-+#define LenChoice2 (LenChoice + 1)
-+#define LenLow (LenChoice2 + 1)
-+#define LenMid (LenLow + (kNumPosStatesMax << kLenNumLowBits))
-+#define LenHigh (LenMid + (kNumPosStatesMax << kLenNumMidBits))
-+#define kNumLenProbs (LenHigh + kLenNumHighSymbols)
-+
-+
-+#define kNumStates 12
-+#define kNumLitStates 7
-+
-+#define kStartPosModelIndex 4
-+#define kEndPosModelIndex 14
-+#define kNumFullDistances (1 << (kEndPosModelIndex >> 1))
-+
-+#define kNumPosSlotBits 6
-+#define kNumLenToPosStates 4
-+
-+#define kNumAlignBits 4
-+#define kAlignTableSize (1 << kNumAlignBits)
-+
-+#define kMatchMinLen 2
-+#define kMatchSpecLenStart (kMatchMinLen + kLenNumLowSymbols + kLenNumMidSymbols + kLenNumHighSymbols)
-+
-+#define IsMatch 0
-+#define IsRep (IsMatch + (kNumStates << kNumPosBitsMax))
-+#define IsRepG0 (IsRep + kNumStates)
-+#define IsRepG1 (IsRepG0 + kNumStates)
-+#define IsRepG2 (IsRepG1 + kNumStates)
-+#define IsRep0Long (IsRepG2 + kNumStates)
-+#define PosSlot (IsRep0Long + (kNumStates << kNumPosBitsMax))
-+#define SpecPos (PosSlot + (kNumLenToPosStates << kNumPosSlotBits))
-+#define Align (SpecPos + kNumFullDistances - kEndPosModelIndex)
-+#define LenCoder (Align + kAlignTableSize)
-+#define RepLenCoder (LenCoder + kNumLenProbs)
-+#define Literal (RepLenCoder + kNumLenProbs)
-+
-+#define LZMA_BASE_SIZE 1846
-+#define LZMA_LIT_SIZE 768
-+
-+#define LzmaProps_GetNumProbs(p) ((UInt32)LZMA_BASE_SIZE + (LZMA_LIT_SIZE << ((p)->lc + (p)->lp)))
-+
-+#if Literal != LZMA_BASE_SIZE
-+StopCompilingDueBUG
-+#endif
-+
-+#define LZMA_DIC_MIN (1 << 12)
-+
-+/* First LZMA-symbol is always decoded.
-+And it decodes new LZMA-symbols while (buf < bufLimit), but "buf" is without last normalization
-+Out:
-+  Result:
-+    SZ_OK - OK
-+    SZ_ERROR_DATA - Error
-+  p->remainLen:
-+    < kMatchSpecLenStart : normal remain
-+    = kMatchSpecLenStart : finished
-+    = kMatchSpecLenStart + 1 : Flush marker
-+    = kMatchSpecLenStart + 2 : State Init Marker
-+*/
-+
-+static int MY_FAST_CALL LzmaDec_DecodeReal(CLzmaDec *p, SizeT limit, const Byte *bufLimit)
-+{
-+  CLzmaProb *probs = p->probs;
-+
-+  unsigned state = p->state;
-+  UInt32 rep0 = p->reps[0], rep1 = p->reps[1], rep2 = p->reps[2], rep3 = p->reps[3];
-+  unsigned pbMask = ((unsigned)1 << (p->prop.pb)) - 1;
-+  unsigned lpMask = ((unsigned)1 << (p->prop.lp)) - 1;
-+  unsigned lc = p->prop.lc;
-+
-+  Byte *dic = p->dic;
-+  SizeT dicBufSize = p->dicBufSize;
-+  SizeT dicPos = p->dicPos;
-+  
-+  UInt32 processedPos = p->processedPos;
-+  UInt32 checkDicSize = p->checkDicSize;
-+  unsigned len = 0;
-+
-+  const Byte *buf = p->buf;
-+  UInt32 range = p->range;
-+  UInt32 code = p->code;
-+
-+  do
-+  {
-+    CLzmaProb *prob;
-+    UInt32 bound;
-+    unsigned ttt;
-+    unsigned posState = processedPos & pbMask;
-+
-+    prob = probs + IsMatch + (state << kNumPosBitsMax) + posState;
-+    IF_BIT_0(prob)
-+    {
-+      unsigned symbol;
-+      UPDATE_0(prob);
-+      prob = probs + Literal;
-+      if (checkDicSize != 0 || processedPos != 0)
-+        prob += (LZMA_LIT_SIZE * (((processedPos & lpMask) << lc) +
-+        (dic[(dicPos == 0 ? dicBufSize : dicPos) - 1] >> (8 - lc))));
-+
-+      if (state < kNumLitStates)
-+      {
-+        state -= (state < 4) ? state : 3;
-+        symbol = 1;
-+        do { GET_BIT(prob + symbol, symbol) } while (symbol < 0x100);
-+      }
-+      else
-+      {
-+        unsigned matchByte = p->dic[(dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0)];
-+        unsigned offs = 0x100;
-+        state -= (state < 10) ? 3 : 6;
-+        symbol = 1;
-+        do
-+        {
-+          unsigned bit;
-+          CLzmaProb *probLit;
-+          matchByte <<= 1;
-+          bit = (matchByte & offs);
-+          probLit = prob + offs + bit + symbol;
-+          GET_BIT2(probLit, symbol, offs &= ~bit, offs &= bit)
-+        }
-+        while (symbol < 0x100);
-+      }
-+      dic[dicPos++] = (Byte)symbol;
-+      processedPos++;
-+      continue;
-+    }
-+    else
-+    {
-+      UPDATE_1(prob);
-+      prob = probs + IsRep + state;
-+      IF_BIT_0(prob)
-+      {
-+        UPDATE_0(prob);
-+        state += kNumStates;
-+        prob = probs + LenCoder;
-+      }
-+      else
-+      {
-+        UPDATE_1(prob);
-+        if (checkDicSize == 0 && processedPos == 0)
-+          return SZ_ERROR_DATA;
-+        prob = probs + IsRepG0 + state;
-+        IF_BIT_0(prob)
-+        {
-+          UPDATE_0(prob);
-+          prob = probs + IsRep0Long + (state << kNumPosBitsMax) + posState;
-+          IF_BIT_0(prob)
-+          {
-+            UPDATE_0(prob);
-+            dic[dicPos] = dic[(dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0)];
-+            dicPos++;
-+            processedPos++;
-+            state = state < kNumLitStates ? 9 : 11;
-+            continue;
-+          }
-+          UPDATE_1(prob);
-+        }
-+        else
-+        {
-+          UInt32 distance;
-+          UPDATE_1(prob);
-+          prob = probs + IsRepG1 + state;
-+          IF_BIT_0(prob)
-+          {
-+            UPDATE_0(prob);
-+            distance = rep1;
-+          }
-+          else
-+          {
-+            UPDATE_1(prob);
-+            prob = probs + IsRepG2 + state;
-+            IF_BIT_0(prob)
-+            {
-+              UPDATE_0(prob);
-+              distance = rep2;
-+            }
-+            else
-+            {
-+              UPDATE_1(prob);
-+              distance = rep3;
-+              rep3 = rep2;
-+            }
-+            rep2 = rep1;
-+          }
-+          rep1 = rep0;
-+          rep0 = distance;
-+        }
-+        state = state < kNumLitStates ? 8 : 11;
-+        prob = probs + RepLenCoder;
-+      }
-+      {
-+        unsigned limit, offset;
-+        CLzmaProb *probLen = prob + LenChoice;
-+        IF_BIT_0(probLen)
-+        {
-+          UPDATE_0(probLen);
-+          probLen = prob + LenLow + (posState << kLenNumLowBits);
-+          offset = 0;
-+          limit = (1 << kLenNumLowBits);
-+        }
-+        else
-+        {
-+          UPDATE_1(probLen);
-+          probLen = prob + LenChoice2;
-+          IF_BIT_0(probLen)
-+          {
-+            UPDATE_0(probLen);
-+            probLen = prob + LenMid + (posState << kLenNumMidBits);
-+            offset = kLenNumLowSymbols;
-+            limit = (1 << kLenNumMidBits);
-+          }
-+          else
-+          {
-+            UPDATE_1(probLen);
-+            probLen = prob + LenHigh;
-+            offset = kLenNumLowSymbols + kLenNumMidSymbols;
-+            limit = (1 << kLenNumHighBits);
-+          }
-+        }
-+        TREE_DECODE(probLen, limit, len);
-+        len += offset;
-+      }
-+
-+      if (state >= kNumStates)
-+      {
-+        UInt32 distance;
-+        prob = probs + PosSlot +
-+            ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) << kNumPosSlotBits);
-+        TREE_6_DECODE(prob, distance);
-+        if (distance >= kStartPosModelIndex)
-+        {
-+          unsigned posSlot = (unsigned)distance;
-+          int numDirectBits = (int)(((distance >> 1) - 1));
-+          distance = (2 | (distance & 1));
-+          if (posSlot < kEndPosModelIndex)
-+          {
-+            distance <<= numDirectBits;
-+            prob = probs + SpecPos + distance - posSlot - 1;
-+            {
-+              UInt32 mask = 1;
-+              unsigned i = 1;
-+              do
-+              {
-+                GET_BIT2(prob + i, i, ; , distance |= mask);
-+                mask <<= 1;
-+              }
-+              while (--numDirectBits != 0);
-+            }
-+          }
-+          else
-+          {
-+            numDirectBits -= kNumAlignBits;
-+            do
-+            {
-+              NORMALIZE
-+              range >>= 1;
-+              
-+              {
-+                UInt32 t;
-+                code -= range;
-+                t = (0 - ((UInt32)code >> 31)); /* (UInt32)((Int32)code >> 31) */
-+                distance = (distance << 1) + (t + 1);
-+                code += range & t;
-+              }
-+              /*
-+              distance <<= 1;
-+              if (code >= range)
-+              {
-+                code -= range;
-+                distance |= 1;
-+              }
-+              */
-+            }
-+            while (--numDirectBits != 0);
-+            prob = probs + Align;
-+            distance <<= kNumAlignBits;
-+            {
-+              unsigned i = 1;
-+              GET_BIT2(prob + i, i, ; , distance |= 1);
-+              GET_BIT2(prob + i, i, ; , distance |= 2);
-+              GET_BIT2(prob + i, i, ; , distance |= 4);
-+              GET_BIT2(prob + i, i, ; , distance |= 8);
-+            }
-+            if (distance == (UInt32)0xFFFFFFFF)
-+            {
-+              len += kMatchSpecLenStart;
-+              state -= kNumStates;
-+              break;
-+            }
-+          }
-+        }
-+        rep3 = rep2;
-+        rep2 = rep1;
-+        rep1 = rep0;
-+        rep0 = distance + 1;
-+        if (checkDicSize == 0)
-+        {
-+          if (distance >= processedPos)
-+            return SZ_ERROR_DATA;
-+        }
-+        else if (distance >= checkDicSize)
-+          return SZ_ERROR_DATA;
-+        state = (state < kNumStates + kNumLitStates) ? kNumLitStates : kNumLitStates + 3;
-+      }
-+
-+      len += kMatchMinLen;
-+
-+      if (limit == dicPos)
-+        return SZ_ERROR_DATA;
-+      {
-+        SizeT rem = limit - dicPos;
-+        unsigned curLen = ((rem < len) ? (unsigned)rem : len);
-+        SizeT pos = (dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0);
-+
-+        processedPos += curLen;
-+
-+        len -= curLen;
-+        if (pos + curLen <= dicBufSize)
-+        {
-+          Byte *dest = dic + dicPos;
-+          ptrdiff_t src = (ptrdiff_t)pos - (ptrdiff_t)dicPos;
-+          const Byte *lim = dest + curLen;
-+          dicPos += curLen;
-+          do
-+            *(dest) = (Byte)*(dest + src);
-+          while (++dest != lim);
-+        }
-+        else
-+        {
-+          do
-+          {
-+            dic[dicPos++] = dic[pos];
-+            if (++pos == dicBufSize)
-+              pos = 0;
-+          }
-+          while (--curLen != 0);
-+        }
-+      }
-+    }
-+  }
-+  while (dicPos < limit && buf < bufLimit);
-+  NORMALIZE;
-+  p->buf = buf;
-+  p->range = range;
-+  p->code = code;
-+  p->remainLen = len;
-+  p->dicPos = dicPos;
-+  p->processedPos = processedPos;
-+  p->reps[0] = rep0;
-+  p->reps[1] = rep1;
-+  p->reps[2] = rep2;
-+  p->reps[3] = rep3;
-+  p->state = state;
-+
-+  return SZ_OK;
-+}
-+
-+static void MY_FAST_CALL LzmaDec_WriteRem(CLzmaDec *p, SizeT limit)
-+{
-+  if (p->remainLen != 0 && p->remainLen < kMatchSpecLenStart)
-+  {
-+    Byte *dic = p->dic;
-+    SizeT dicPos = p->dicPos;
-+    SizeT dicBufSize = p->dicBufSize;
-+    unsigned len = p->remainLen;
-+    UInt32 rep0 = p->reps[0];
-+    if (limit - dicPos < len)
-+      len = (unsigned)(limit - dicPos);
-+
-+    if (p->checkDicSize == 0 && p->prop.dicSize - p->processedPos <= len)
-+      p->checkDicSize = p->prop.dicSize;
-+
-+    p->processedPos += len;
-+    p->remainLen -= len;
-+    while (len-- != 0)
-+    {
-+      dic[dicPos] = dic[(dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0)];
-+      dicPos++;
-+    }
-+    p->dicPos = dicPos;
-+  }
-+}
-+
-+static int MY_FAST_CALL LzmaDec_DecodeReal2(CLzmaDec *p, SizeT limit, const Byte *bufLimit)
-+{
-+  do
-+  {
-+    SizeT limit2 = limit;
-+    if (p->checkDicSize == 0)
-+    {
-+      UInt32 rem = p->prop.dicSize - p->processedPos;
-+      if (limit - p->dicPos > rem)
-+        limit2 = p->dicPos + rem;
-+    }
-+    RINOK(LzmaDec_DecodeReal(p, limit2, bufLimit));
-+    if (p->processedPos >= p->prop.dicSize)
-+      p->checkDicSize = p->prop.dicSize;
-+    LzmaDec_WriteRem(p, limit);
-+  }
-+  while (p->dicPos < limit && p->buf < bufLimit && p->remainLen < kMatchSpecLenStart);
-+
-+  if (p->remainLen > kMatchSpecLenStart)
-+  {
-+    p->remainLen = kMatchSpecLenStart;
-+  }
-+  return 0;
-+}
-+
-+typedef enum
-+{
-+  DUMMY_ERROR, /* unexpected end of input stream */
-+  DUMMY_LIT,
-+  DUMMY_MATCH,
-+  DUMMY_REP
-+} ELzmaDummy;
-+
-+static ELzmaDummy LzmaDec_TryDummy(const CLzmaDec *p, const Byte *buf, SizeT inSize)
-+{
-+  UInt32 range = p->range;
-+  UInt32 code = p->code;
-+  const Byte *bufLimit = buf + inSize;
-+  CLzmaProb *probs = p->probs;
-+  unsigned state = p->state;
-+  ELzmaDummy res;
-+
-+  {
-+    CLzmaProb *prob;
-+    UInt32 bound;
-+    unsigned ttt;
-+    unsigned posState = (p->processedPos) & ((1 << p->prop.pb) - 1);
-+
-+    prob = probs + IsMatch + (state << kNumPosBitsMax) + posState;
-+    IF_BIT_0_CHECK(prob)
-+    {
-+      UPDATE_0_CHECK
-+
-+      /* if (bufLimit - buf >= 7) return DUMMY_LIT; */
-+
-+      prob = probs + Literal;
-+      if (p->checkDicSize != 0 || p->processedPos != 0)
-+        prob += (LZMA_LIT_SIZE *
-+          ((((p->processedPos) & ((1 << (p->prop.lp)) - 1)) << p->prop.lc) +
-+          (p->dic[(p->dicPos == 0 ? p->dicBufSize : p->dicPos) - 1] >> (8 - p->prop.lc))));
-+
-+      if (state < kNumLitStates)
-+      {
-+        unsigned symbol = 1;
-+        do { GET_BIT_CHECK(prob + symbol, symbol) } while (symbol < 0x100);
-+      }
-+      else
-+      {
-+        unsigned matchByte = p->dic[p->dicPos - p->reps[0] +
-+            ((p->dicPos < p->reps[0]) ? p->dicBufSize : 0)];
-+        unsigned offs = 0x100;
-+        unsigned symbol = 1;
-+        do
-+        {
-+          unsigned bit;
-+          CLzmaProb *probLit;
-+          matchByte <<= 1;
-+          bit = (matchByte & offs);
-+          probLit = prob + offs + bit + symbol;
-+          GET_BIT2_CHECK(probLit, symbol, offs &= ~bit, offs &= bit)
-+        }
-+        while (symbol < 0x100);
-+      }
-+      res = DUMMY_LIT;
-+    }
-+    else
-+    {
-+      unsigned len;
-+      UPDATE_1_CHECK;
-+
-+      prob = probs + IsRep + state;
-+      IF_BIT_0_CHECK(prob)
-+      {
-+        UPDATE_0_CHECK;
-+        state = 0;
-+        prob = probs + LenCoder;
-+        res = DUMMY_MATCH;
-+      }
-+      else
-+      {
-+        UPDATE_1_CHECK;
-+        res = DUMMY_REP;
-+        prob = probs + IsRepG0 + state;
-+        IF_BIT_0_CHECK(prob)
-+        {
-+          UPDATE_0_CHECK;
-+          prob = probs + IsRep0Long + (state << kNumPosBitsMax) + posState;
-+          IF_BIT_0_CHECK(prob)
-+          {
-+            UPDATE_0_CHECK;
-+            NORMALIZE_CHECK;
-+            return DUMMY_REP;
-+          }
-+          else
-+          {
-+            UPDATE_1_CHECK;
-+          }
-+        }
-+        else
-+        {
-+          UPDATE_1_CHECK;
-+          prob = probs + IsRepG1 + state;
-+          IF_BIT_0_CHECK(prob)
-+          {
-+            UPDATE_0_CHECK;
-+          }
-+          else
-+          {
-+            UPDATE_1_CHECK;
-+            prob = probs + IsRepG2 + state;
-+            IF_BIT_0_CHECK(prob)
-+            {
-+              UPDATE_0_CHECK;
-+            }
-+            else
-+            {
-+              UPDATE_1_CHECK;
-+            }
-+          }
-+        }
-+        state = kNumStates;
-+        prob = probs + RepLenCoder;
-+      }
-+      {
-+        unsigned limit, offset;
-+        CLzmaProb *probLen = prob + LenChoice;
-+        IF_BIT_0_CHECK(probLen)
-+        {
-+          UPDATE_0_CHECK;
-+          probLen = prob + LenLow + (posState << kLenNumLowBits);
-+          offset = 0;
-+          limit = 1 << kLenNumLowBits;
-+        }
-+        else
-+        {
-+          UPDATE_1_CHECK;
-+          probLen = prob + LenChoice2;
-+          IF_BIT_0_CHECK(probLen)
-+          {
-+            UPDATE_0_CHECK;
-+            probLen = prob + LenMid + (posState << kLenNumMidBits);
-+            offset = kLenNumLowSymbols;
-+            limit = 1 << kLenNumMidBits;
-+          }
-+          else
-+          {
-+            UPDATE_1_CHECK;
-+            probLen = prob + LenHigh;
-+            offset = kLenNumLowSymbols + kLenNumMidSymbols;
-+            limit = 1 << kLenNumHighBits;
-+          }
-+        }
-+        TREE_DECODE_CHECK(probLen, limit, len);
-+        len += offset;
-+      }
-+
-+      if (state < 4)
-+      {
-+        unsigned posSlot;
-+        prob = probs + PosSlot +
-+            ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) <<
-+            kNumPosSlotBits);
-+        TREE_DECODE_CHECK(prob, 1 << kNumPosSlotBits, posSlot);
-+        if (posSlot >= kStartPosModelIndex)
-+        {
-+          int numDirectBits = ((posSlot >> 1) - 1);
-+
-+          /* if (bufLimit - buf >= 8) return DUMMY_MATCH; */
-+
-+          if (posSlot < kEndPosModelIndex)
-+          {
-+            prob = probs + SpecPos + ((2 | (posSlot & 1)) << numDirectBits) - posSlot - 1;
-+          }
-+          else
-+          {
-+            numDirectBits -= kNumAlignBits;
-+            do
-+            {
-+              NORMALIZE_CHECK
-+              range >>= 1;
-+              code -= range & (((code - range) >> 31) - 1);
-+              /* if (code >= range) code -= range; */
-+            }
-+            while (--numDirectBits != 0);
-+            prob = probs + Align;
-+            numDirectBits = kNumAlignBits;
-+          }
-+          {
-+            unsigned i = 1;
-+            do
-+            {
-+              GET_BIT_CHECK(prob + i, i);
-+            }
-+            while (--numDirectBits != 0);
-+          }
-+        }
-+      }
-+    }
-+  }
-+  NORMALIZE_CHECK;
-+  return res;
-+}
-+
-+
-+static void LzmaDec_InitRc(CLzmaDec *p, const Byte *data)
-+{
-+  p->code = ((UInt32)data[1] << 24) | ((UInt32)data[2] << 16) | ((UInt32)data[3] << 8) | ((UInt32)data[4]);
-+  p->range = 0xFFFFFFFF;
-+  p->needFlush = 0;
-+}
-+
-+void LzmaDec_InitDicAndState(CLzmaDec *p, Bool initDic, Bool initState)
-+{
-+  p->needFlush = 1;
-+  p->remainLen = 0;
-+  p->tempBufSize = 0;
-+
-+  if (initDic)
-+  {
-+    p->processedPos = 0;
-+    p->checkDicSize = 0;
-+    p->needInitState = 1;
-+  }
-+  if (initState)
-+    p->needInitState = 1;
-+}
-+
-+void LzmaDec_Init(CLzmaDec *p)
-+{
-+  p->dicPos = 0;
-+  LzmaDec_InitDicAndState(p, True, True);
-+}
-+
-+static void LzmaDec_InitStateReal(CLzmaDec *p)
-+{
-+  UInt32 numProbs = Literal + ((UInt32)LZMA_LIT_SIZE << (p->prop.lc + p->prop.lp));
-+  UInt32 i;
-+  CLzmaProb *probs = p->probs;
-+  for (i = 0; i < numProbs; i++)
-+    probs[i] = kBitModelTotal >> 1;
-+  p->reps[0] = p->reps[1] = p->reps[2] = p->reps[3] = 1;
-+  p->state = 0;
-+  p->needInitState = 0;
-+}
-+
-+SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, const Byte *src, SizeT *srcLen,
-+    ELzmaFinishMode finishMode, ELzmaStatus *status)
-+{
-+  SizeT inSize = *srcLen;
-+  (*srcLen) = 0;
-+  LzmaDec_WriteRem(p, dicLimit);
-+  
-+  *status = LZMA_STATUS_NOT_SPECIFIED;
-+
-+  while (p->remainLen != kMatchSpecLenStart)
-+  {
-+      int checkEndMarkNow;
-+
-+      if (p->needFlush != 0)
-+      {
-+        for (; inSize > 0 && p->tempBufSize < RC_INIT_SIZE; (*srcLen)++, inSize--)
-+          p->tempBuf[p->tempBufSize++] = *src++;
-+        if (p->tempBufSize < RC_INIT_SIZE)
-+        {
-+          *status = LZMA_STATUS_NEEDS_MORE_INPUT;
-+          return SZ_OK;
-+        }
-+        if (p->tempBuf[0] != 0)
-+          return SZ_ERROR_DATA;
-+
-+        LzmaDec_InitRc(p, p->tempBuf);
-+        p->tempBufSize = 0;
-+      }
-+
-+      checkEndMarkNow = 0;
-+      if (p->dicPos >= dicLimit)
-+      {
-+        if (p->remainLen == 0 && p->code == 0)
-+        {
-+          *status = LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK;
-+          return SZ_OK;
-+        }
-+        if (finishMode == LZMA_FINISH_ANY)
-+        {
-+          *status = LZMA_STATUS_NOT_FINISHED;
-+          return SZ_OK;
-+        }
-+        if (p->remainLen != 0)
-+        {
-+          *status = LZMA_STATUS_NOT_FINISHED;
-+          return SZ_ERROR_DATA;
-+        }
-+        checkEndMarkNow = 1;
-+      }
-+
-+      if (p->needInitState)
-+        LzmaDec_InitStateReal(p);
-+  
-+      if (p->tempBufSize == 0)
-+      {
-+        SizeT processed;
-+        const Byte *bufLimit;
-+        if (inSize < LZMA_REQUIRED_INPUT_MAX || checkEndMarkNow)
-+        {
-+          int dummyRes = LzmaDec_TryDummy(p, src, inSize);
-+          if (dummyRes == DUMMY_ERROR)
-+          {
-+            memcpy(p->tempBuf, src, inSize);
-+            p->tempBufSize = (unsigned)inSize;
-+            (*srcLen) += inSize;
-+            *status = LZMA_STATUS_NEEDS_MORE_INPUT;
-+            return SZ_OK;
-+          }
-+          if (checkEndMarkNow && dummyRes != DUMMY_MATCH)
-+          {
-+            *status = LZMA_STATUS_NOT_FINISHED;
-+            return SZ_ERROR_DATA;
-+          }
-+          bufLimit = src;
-+        }
-+        else
-+          bufLimit = src + inSize - LZMA_REQUIRED_INPUT_MAX;
-+        p->buf = src;
-+        if (LzmaDec_DecodeReal2(p, dicLimit, bufLimit) != 0)
-+          return SZ_ERROR_DATA;
-+        processed = (SizeT)(p->buf - src);
-+        (*srcLen) += processed;
-+        src += processed;
-+        inSize -= processed;
-+      }
-+      else
-+      {
-+        unsigned rem = p->tempBufSize, lookAhead = 0;
-+        while (rem < LZMA_REQUIRED_INPUT_MAX && lookAhead < inSize)
-+          p->tempBuf[rem++] = src[lookAhead++];
-+        p->tempBufSize = rem;
-+        if (rem < LZMA_REQUIRED_INPUT_MAX || checkEndMarkNow)
-+        {
-+          int dummyRes = LzmaDec_TryDummy(p, p->tempBuf, rem);
-+          if (dummyRes == DUMMY_ERROR)
-+          {
-+            (*srcLen) += lookAhead;
-+            *status = LZMA_STATUS_NEEDS_MORE_INPUT;
-+            return SZ_OK;
-+          }
-+          if (checkEndMarkNow && dummyRes != DUMMY_MATCH)
-+          {
-+            *status = LZMA_STATUS_NOT_FINISHED;
-+            return SZ_ERROR_DATA;
-+          }
-+        }
-+        p->buf = p->tempBuf;
-+        if (LzmaDec_DecodeReal2(p, dicLimit, p->buf) != 0)
-+          return SZ_ERROR_DATA;
-+        lookAhead -= (rem - (unsigned)(p->buf - p->tempBuf));
-+        (*srcLen) += lookAhead;
-+        src += lookAhead;
-+        inSize -= lookAhead;
-+        p->tempBufSize = 0;
-+      }
-+  }
-+  if (p->code == 0)
-+    *status = LZMA_STATUS_FINISHED_WITH_MARK;
-+  return (p->code == 0) ? SZ_OK : SZ_ERROR_DATA;
-+}
-+
-+SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status)
-+{
-+  SizeT outSize = *destLen;
-+  SizeT inSize = *srcLen;
-+  *srcLen = *destLen = 0;
-+  for (;;)
-+  {
-+    SizeT inSizeCur = inSize, outSizeCur, dicPos;
-+    ELzmaFinishMode curFinishMode;
-+    SRes res;
-+    if (p->dicPos == p->dicBufSize)
-+      p->dicPos = 0;
-+    dicPos = p->dicPos;
-+    if (outSize > p->dicBufSize - dicPos)
-+    {
-+      outSizeCur = p->dicBufSize;
-+      curFinishMode = LZMA_FINISH_ANY;
-+    }
-+    else
-+    {
-+      outSizeCur = dicPos + outSize;
-+      curFinishMode = finishMode;
-+    }
-+
-+    res = LzmaDec_DecodeToDic(p, outSizeCur, src, &inSizeCur, curFinishMode, status);
-+    src += inSizeCur;
-+    inSize -= inSizeCur;
-+    *srcLen += inSizeCur;
-+    outSizeCur = p->dicPos - dicPos;
-+    memcpy(dest, p->dic + dicPos, outSizeCur);
-+    dest += outSizeCur;
-+    outSize -= outSizeCur;
-+    *destLen += outSizeCur;
-+    if (res != 0)
-+      return res;
-+    if (outSizeCur == 0 || outSize == 0)
-+      return SZ_OK;
-+  }
-+}
-+
-+void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc)
-+{
-+  alloc->Free(alloc, p->probs);
-+  p->probs = 0;
-+}
-+
-+static void LzmaDec_FreeDict(CLzmaDec *p, ISzAlloc *alloc)
-+{
-+  alloc->Free(alloc, p->dic);
-+  p->dic = 0;
-+}
-+
-+void LzmaDec_Free(CLzmaDec *p, ISzAlloc *alloc)
-+{
-+  LzmaDec_FreeProbs(p, alloc);
-+  LzmaDec_FreeDict(p, alloc);
-+}
-+
-+SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size)
-+{
-+  UInt32 dicSize;
-+  Byte d;
-+  
-+  if (size < LZMA_PROPS_SIZE)
-+    return SZ_ERROR_UNSUPPORTED;
-+  else
-+    dicSize = data[1] | ((UInt32)data[2] << 8) | ((UInt32)data[3] << 16) | ((UInt32)data[4] << 24);
-+ 
-+  if (dicSize < LZMA_DIC_MIN)
-+    dicSize = LZMA_DIC_MIN;
-+  p->dicSize = dicSize;
-+
-+  d = data[0];
-+  if (d >= (9 * 5 * 5))
-+    return SZ_ERROR_UNSUPPORTED;
-+
-+  p->lc = d % 9;
-+  d /= 9;
-+  p->pb = d / 5;
-+  p->lp = d % 5;
-+
-+  return SZ_OK;
-+}
-+
-+static SRes LzmaDec_AllocateProbs2(CLzmaDec *p, const CLzmaProps *propNew, ISzAlloc *alloc)
-+{
-+  UInt32 numProbs = LzmaProps_GetNumProbs(propNew);
-+  if (p->probs == 0 || numProbs != p->numProbs)
-+  {
-+    LzmaDec_FreeProbs(p, alloc);
-+    p->probs = (CLzmaProb *)alloc->Alloc(alloc, numProbs * sizeof(CLzmaProb));
-+    p->numProbs = numProbs;
-+    if (p->probs == 0)
-+      return SZ_ERROR_MEM;
-+  }
-+  return SZ_OK;
-+}
-+
-+SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc)
-+{
-+  CLzmaProps propNew;
-+  RINOK(LzmaProps_Decode(&propNew, props, propsSize));
-+  RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc));
-+  p->prop = propNew;
-+  return SZ_OK;
-+}
-+
-+SRes LzmaDec_Allocate(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc)
-+{
-+  CLzmaProps propNew;
-+  SizeT dicBufSize;
-+  RINOK(LzmaProps_Decode(&propNew, props, propsSize));
-+  RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc));
-+  dicBufSize = propNew.dicSize;
-+  if (p->dic == 0 || dicBufSize != p->dicBufSize)
-+  {
-+    LzmaDec_FreeDict(p, alloc);
-+    p->dic = (Byte *)alloc->Alloc(alloc, dicBufSize);
-+    if (p->dic == 0)
-+    {
-+      LzmaDec_FreeProbs(p, alloc);
-+      return SZ_ERROR_MEM;
-+    }
-+  }
-+  p->dicBufSize = dicBufSize;
-+  p->prop = propNew;
-+  return SZ_OK;
-+}
-+
-+SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen,
-+    const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode,
-+    ELzmaStatus *status, ISzAlloc *alloc)
-+{
-+  CLzmaDec p;
-+  SRes res;
-+  SizeT inSize = *srcLen;
-+  SizeT outSize = *destLen;
-+  *srcLen = *destLen = 0;
-+  if (inSize < RC_INIT_SIZE)
-+    return SZ_ERROR_INPUT_EOF;
-+
-+  LzmaDec_Construct(&p);
-+  res = LzmaDec_AllocateProbs(&p, propData, propSize, alloc);
-+  if (res != 0)
-+    return res;
-+  p.dic = dest;
-+  p.dicBufSize = outSize;
-+
-+  LzmaDec_Init(&p);
-+  
-+  *srcLen = inSize;
-+  res = LzmaDec_DecodeToDic(&p, outSize, src, srcLen, finishMode, status);
-+
-+  if (res == SZ_OK && *status == LZMA_STATUS_NEEDS_MORE_INPUT)
-+    res = SZ_ERROR_INPUT_EOF;
-+
-+  (*destLen) = p.dicPos;
-+  LzmaDec_FreeProbs(&p, alloc);
-+  return res;
-+}
---- /dev/null
-+++ b/lib/lzma/LzmaEnc.c
-@@ -0,0 +1,2271 @@
-+/* LzmaEnc.c -- LZMA Encoder
-+2009-11-24 : Igor Pavlov : Public domain */
-+
-+#include <string.h>
-+
-+/* #define SHOW_STAT */
-+/* #define SHOW_STAT2 */
-+
-+#if defined(SHOW_STAT) || defined(SHOW_STAT2)
-+#include <stdio.h>
-+#endif
-+
-+#include "LzmaEnc.h"
-+
-+/* disable MT */
-+#define _7ZIP_ST
-+
-+#include "LzFind.h"
-+#ifndef _7ZIP_ST
-+#include "LzFindMt.h"
-+#endif
-+
-+#ifdef SHOW_STAT
-+static int ttt = 0;
-+#endif
-+
-+#define kBlockSizeMax ((1 << LZMA_NUM_BLOCK_SIZE_BITS) - 1)
-+
-+#define kBlockSize (9 << 10)
-+#define kUnpackBlockSize (1 << 18)
-+#define kMatchArraySize (1 << 21)
-+#define kMatchRecordMaxSize ((LZMA_MATCH_LEN_MAX * 2 + 3) * LZMA_MATCH_LEN_MAX)
-+
-+#define kNumMaxDirectBits (31)
-+
-+#define kNumTopBits 24
-+#define kTopValue ((UInt32)1 << kNumTopBits)
-+
-+#define kNumBitModelTotalBits 11
-+#define kBitModelTotal (1 << kNumBitModelTotalBits)
-+#define kNumMoveBits 5
-+#define kProbInitValue (kBitModelTotal >> 1)
-+
-+#define kNumMoveReducingBits 4
-+#define kNumBitPriceShiftBits 4
-+#define kBitPrice (1 << kNumBitPriceShiftBits)
-+
-+void LzmaEncProps_Init(CLzmaEncProps *p)
-+{
-+  p->level = 5;
-+  p->dictSize = p->mc = 0;
-+  p->lc = p->lp = p->pb = p->algo = p->fb = p->btMode = p->numHashBytes = p->numThreads = -1;
-+  p->writeEndMark = 0;
-+}
-+
-+void LzmaEncProps_Normalize(CLzmaEncProps *p)
-+{
-+  int level = p->level;
-+  if (level < 0) level = 5;
-+  p->level = level;
-+  if (p->dictSize == 0) p->dictSize = (level <= 5 ? (1 << (level * 2 + 14)) : (level == 6 ? (1 << 25) : (1 << 26)));
-+  if (p->lc < 0) p->lc = 3;
-+  if (p->lp < 0) p->lp = 0;
-+  if (p->pb < 0) p->pb = 2;
-+  if (p->algo < 0) p->algo = (level < 5 ? 0 : 1);
-+  if (p->fb < 0) p->fb = (level < 7 ? 32 : 64);
-+  if (p->btMode < 0) p->btMode = (p->algo == 0 ? 0 : 1);
-+  if (p->numHashBytes < 0) p->numHashBytes = 4;
-+  if (p->mc == 0)  p->mc = (16 + (p->fb >> 1)) >> (p->btMode ? 0 : 1);
-+  if (p->numThreads < 0)
-+    p->numThreads =
-+      #ifndef _7ZIP_ST
-+      ((p->btMode && p->algo) ? 2 : 1);
-+      #else
-+      1;
-+      #endif
-+}
-+
-+UInt32 LzmaEncProps_GetDictSize(const CLzmaEncProps *props2)
-+{
-+  CLzmaEncProps props = *props2;
-+  LzmaEncProps_Normalize(&props);
-+  return props.dictSize;
-+}
-+
-+/* #define LZMA_LOG_BSR */
-+/* Define it for Intel's CPU */
-+
-+
-+#ifdef LZMA_LOG_BSR
-+
-+#define kDicLogSizeMaxCompress 30
-+
-+#define BSR2_RET(pos, res) { unsigned long i; _BitScanReverse(&i, (pos)); res = (i + i) + ((pos >> (i - 1)) & 1); }
-+
-+UInt32 GetPosSlot1(UInt32 pos)
-+{
-+  UInt32 res;
-+  BSR2_RET(pos, res);
-+  return res;
-+}
-+#define GetPosSlot2(pos, res) { BSR2_RET(pos, res); }
-+#define GetPosSlot(pos, res) { if (pos < 2) res = pos; else BSR2_RET(pos, res); }
-+
-+#else
-+
-+#define kNumLogBits (9 + (int)sizeof(size_t) / 2)
-+#define kDicLogSizeMaxCompress ((kNumLogBits - 1) * 2 + 7)
-+
-+void LzmaEnc_FastPosInit(Byte *g_FastPos)
-+{
-+  int c = 2, slotFast;
-+  g_FastPos[0] = 0;
-+  g_FastPos[1] = 1;
-+  
-+  for (slotFast = 2; slotFast < kNumLogBits * 2; slotFast++)
-+  {
-+    UInt32 k = (1 << ((slotFast >> 1) - 1));
-+    UInt32 j;
-+    for (j = 0; j < k; j++, c++)
-+      g_FastPos[c] = (Byte)slotFast;
-+  }
-+}
-+
-+#define BSR2_RET(pos, res) { UInt32 i = 6 + ((kNumLogBits - 1) & \
-+  (0 - (((((UInt32)1 << (kNumLogBits + 6)) - 1) - pos) >> 31))); \
-+  res = p->g_FastPos[pos >> i] + (i * 2); }
-+/*
-+#define BSR2_RET(pos, res) { res = (pos < (1 << (kNumLogBits + 6))) ? \
-+  p->g_FastPos[pos >> 6] + 12 : \
-+  p->g_FastPos[pos >> (6 + kNumLogBits - 1)] + (6 + (kNumLogBits - 1)) * 2; }
-+*/
-+
-+#define GetPosSlot1(pos) p->g_FastPos[pos]
-+#define GetPosSlot2(pos, res) { BSR2_RET(pos, res); }
-+#define GetPosSlot(pos, res) { if (pos < kNumFullDistances) res = p->g_FastPos[pos]; else BSR2_RET(pos, res); }
-+
-+#endif
-+
-+
-+#define LZMA_NUM_REPS 4
-+
-+typedef unsigned CState;
-+
-+typedef struct
-+{
-+  UInt32 price;
-+
-+  CState state;
-+  int prev1IsChar;
-+  int prev2;
-+
-+  UInt32 posPrev2;
-+  UInt32 backPrev2;
-+
-+  UInt32 posPrev;
-+  UInt32 backPrev;
-+  UInt32 backs[LZMA_NUM_REPS];
-+} COptimal;
-+
-+#define kNumOpts (1 << 12)
-+
-+#define kNumLenToPosStates 4
-+#define kNumPosSlotBits 6
-+#define kDicLogSizeMin 0
-+#define kDicLogSizeMax 32
-+#define kDistTableSizeMax (kDicLogSizeMax * 2)
-+
-+
-+#define kNumAlignBits 4
-+#define kAlignTableSize (1 << kNumAlignBits)
-+#define kAlignMask (kAlignTableSize - 1)
-+
-+#define kStartPosModelIndex 4
-+#define kEndPosModelIndex 14
-+#define kNumPosModels (kEndPosModelIndex - kStartPosModelIndex)
-+
-+#define kNumFullDistances (1 << (kEndPosModelIndex >> 1))
-+
-+#ifdef _LZMA_PROB32
-+#define CLzmaProb UInt32
-+#else
-+#define CLzmaProb UInt16
-+#endif
-+
-+#define LZMA_PB_MAX 4
-+#define LZMA_LC_MAX 8
-+#define LZMA_LP_MAX 4
-+
-+#define LZMA_NUM_PB_STATES_MAX (1 << LZMA_PB_MAX)
-+
-+
-+#define kLenNumLowBits 3
-+#define kLenNumLowSymbols (1 << kLenNumLowBits)
-+#define kLenNumMidBits 3
-+#define kLenNumMidSymbols (1 << kLenNumMidBits)
-+#define kLenNumHighBits 8
-+#define kLenNumHighSymbols (1 << kLenNumHighBits)
-+
-+#define kLenNumSymbolsTotal (kLenNumLowSymbols + kLenNumMidSymbols + kLenNumHighSymbols)
-+
-+#define LZMA_MATCH_LEN_MIN 2
-+#define LZMA_MATCH_LEN_MAX (LZMA_MATCH_LEN_MIN + kLenNumSymbolsTotal - 1)
-+
-+#define kNumStates 12
-+
-+typedef struct
-+{
-+  CLzmaProb choice;
-+  CLzmaProb choice2;
-+  CLzmaProb low[LZMA_NUM_PB_STATES_MAX << kLenNumLowBits];
-+  CLzmaProb mid[LZMA_NUM_PB_STATES_MAX << kLenNumMidBits];
-+  CLzmaProb high[kLenNumHighSymbols];
-+} CLenEnc;
-+
-+typedef struct
-+{
-+  CLenEnc p;
-+  UInt32 prices[LZMA_NUM_PB_STATES_MAX][kLenNumSymbolsTotal];
-+  UInt32 tableSize;
-+  UInt32 counters[LZMA_NUM_PB_STATES_MAX];
-+} CLenPriceEnc;
-+
-+typedef struct
-+{
-+  UInt32 range;
-+  Byte cache;
-+  UInt64 low;
-+  UInt64 cacheSize;
-+  Byte *buf;
-+  Byte *bufLim;
-+  Byte *bufBase;
-+  ISeqOutStream *outStream;
-+  UInt64 processed;
-+  SRes res;
-+} CRangeEnc;
-+
-+typedef struct
-+{
-+  CLzmaProb *litProbs;
-+
-+  CLzmaProb isMatch[kNumStates][LZMA_NUM_PB_STATES_MAX];
-+  CLzmaProb isRep[kNumStates];
-+  CLzmaProb isRepG0[kNumStates];
-+  CLzmaProb isRepG1[kNumStates];
-+  CLzmaProb isRepG2[kNumStates];
-+  CLzmaProb isRep0Long[kNumStates][LZMA_NUM_PB_STATES_MAX];
-+
-+  CLzmaProb posSlotEncoder[kNumLenToPosStates][1 << kNumPosSlotBits];
-+  CLzmaProb posEncoders[kNumFullDistances - kEndPosModelIndex];
-+  CLzmaProb posAlignEncoder[1 << kNumAlignBits];
-+  
-+  CLenPriceEnc lenEnc;
-+  CLenPriceEnc repLenEnc;
-+
-+  UInt32 reps[LZMA_NUM_REPS];
-+  UInt32 state;
-+} CSaveState;
-+
-+typedef struct
-+{
-+  IMatchFinder matchFinder;
-+  void *matchFinderObj;
-+
-+  #ifndef _7ZIP_ST
-+  Bool mtMode;
-+  CMatchFinderMt matchFinderMt;
-+  #endif
-+
-+  CMatchFinder matchFinderBase;
-+
-+  #ifndef _7ZIP_ST
-+  Byte pad[128];
-+  #endif
-+  
-+  UInt32 optimumEndIndex;
-+  UInt32 optimumCurrentIndex;
-+
-+  UInt32 longestMatchLength;
-+  UInt32 numPairs;
-+  UInt32 numAvail;
-+  COptimal opt[kNumOpts];
-+  
-+  #ifndef LZMA_LOG_BSR
-+  Byte g_FastPos[1 << kNumLogBits];
-+  #endif
-+
-+  UInt32 ProbPrices[kBitModelTotal >> kNumMoveReducingBits];
-+  UInt32 matches[LZMA_MATCH_LEN_MAX * 2 + 2 + 1];
-+  UInt32 numFastBytes;
-+  UInt32 additionalOffset;
-+  UInt32 reps[LZMA_NUM_REPS];
-+  UInt32 state;
-+
-+  UInt32 posSlotPrices[kNumLenToPosStates][kDistTableSizeMax];
-+  UInt32 distancesPrices[kNumLenToPosStates][kNumFullDistances];
-+  UInt32 alignPrices[kAlignTableSize];
-+  UInt32 alignPriceCount;
-+
-+  UInt32 distTableSize;
-+
-+  unsigned lc, lp, pb;
-+  unsigned lpMask, pbMask;
-+
-+  CLzmaProb *litProbs;
-+
-+  CLzmaProb isMatch[kNumStates][LZMA_NUM_PB_STATES_MAX];
-+  CLzmaProb isRep[kNumStates];
-+  CLzmaProb isRepG0[kNumStates];
-+  CLzmaProb isRepG1[kNumStates];
-+  CLzmaProb isRepG2[kNumStates];
-+  CLzmaProb isRep0Long[kNumStates][LZMA_NUM_PB_STATES_MAX];
-+
-+  CLzmaProb posSlotEncoder[kNumLenToPosStates][1 << kNumPosSlotBits];
-+  CLzmaProb posEncoders[kNumFullDistances - kEndPosModelIndex];
-+  CLzmaProb posAlignEncoder[1 << kNumAlignBits];
-+  
-+  CLenPriceEnc lenEnc;
-+  CLenPriceEnc repLenEnc;
-+
-+  unsigned lclp;
-+
-+  Bool fastMode;
-+  
-+  CRangeEnc rc;
-+
-+  Bool writeEndMark;
-+  UInt64 nowPos64;
-+  UInt32 matchPriceCount;
-+  Bool finished;
-+  Bool multiThread;
-+
-+  SRes result;
-+  UInt32 dictSize;
-+  UInt32 matchFinderCycles;
-+
-+  int needInit;
-+
-+  CSaveState saveState;
-+} CLzmaEnc;
-+
-+void LzmaEnc_SaveState(CLzmaEncHandle pp)
-+{
-+  CLzmaEnc *p = (CLzmaEnc *)pp;
-+  CSaveState *dest = &p->saveState;
-+  int i;
-+  dest->lenEnc = p->lenEnc;
-+  dest->repLenEnc = p->repLenEnc;
-+  dest->state = p->state;
-+
-+  for (i = 0; i < kNumStates; i++)
-+  {
-+    memcpy(dest->isMatch[i], p->isMatch[i], sizeof(p->isMatch[i]));
-+    memcpy(dest->isRep0Long[i], p->isRep0Long[i], sizeof(p->isRep0Long[i]));
-+  }
-+  for (i = 0; i < kNumLenToPosStates; i++)
-+    memcpy(dest->posSlotEncoder[i], p->posSlotEncoder[i], sizeof(p->posSlotEncoder[i]));
-+  memcpy(dest->isRep, p->isRep, sizeof(p->isRep));
-+  memcpy(dest->isRepG0, p->isRepG0, sizeof(p->isRepG0));
-+  memcpy(dest->isRepG1, p->isRepG1, sizeof(p->isRepG1));
-+  memcpy(dest->isRepG2, p->isRepG2, sizeof(p->isRepG2));
-+  memcpy(dest->posEncoders, p->posEncoders, sizeof(p->posEncoders));
-+  memcpy(dest->posAlignEncoder, p->posAlignEncoder, sizeof(p->posAlignEncoder));
-+  memcpy(dest->reps, p->reps, sizeof(p->reps));
-+  memcpy(dest->litProbs, p->litProbs, (0x300 << p->lclp) * sizeof(CLzmaProb));
-+}
-+
-+void LzmaEnc_RestoreState(CLzmaEncHandle pp)
-+{
-+  CLzmaEnc *dest = (CLzmaEnc *)pp;
-+  const CSaveState *p = &dest->saveState;
-+  int i;
-+  dest->lenEnc = p->lenEnc;
-+  dest->repLenEnc = p->repLenEnc;
-+  dest->state = p->state;
-+
-+  for (i = 0; i < kNumStates; i++)
-+  {
-+    memcpy(dest->isMatch[i], p->isMatch[i], sizeof(p->isMatch[i]));
-+    memcpy(dest->isRep0Long[i], p->isRep0Long[i], sizeof(p->isRep0Long[i]));
-+  }
-+  for (i = 0; i < kNumLenToPosStates; i++)
-+    memcpy(dest->posSlotEncoder[i], p->posSlotEncoder[i], sizeof(p->posSlotEncoder[i]));
-+  memcpy(dest->isRep, p->isRep, sizeof(p->isRep));
-+  memcpy(dest->isRepG0, p->isRepG0, sizeof(p->isRepG0));
-+  memcpy(dest->isRepG1, p->isRepG1, sizeof(p->isRepG1));
-+  memcpy(dest->isRepG2, p->isRepG2, sizeof(p->isRepG2));
-+  memcpy(dest->posEncoders, p->posEncoders, sizeof(p->posEncoders));
-+  memcpy(dest->posAlignEncoder, p->posAlignEncoder, sizeof(p->posAlignEncoder));
-+  memcpy(dest->reps, p->reps, sizeof(p->reps));
-+  memcpy(dest->litProbs, p->litProbs, (0x300 << dest->lclp) * sizeof(CLzmaProb));
-+}
-+
-+SRes LzmaEnc_SetProps(CLzmaEncHandle pp, const CLzmaEncProps *props2)
-+{
-+  CLzmaEnc *p = (CLzmaEnc *)pp;
-+  CLzmaEncProps props = *props2;
-+  LzmaEncProps_Normalize(&props);
-+
-+  if (props.lc > LZMA_LC_MAX || props.lp > LZMA_LP_MAX || props.pb > LZMA_PB_MAX ||
-+      props.dictSize > (1 << kDicLogSizeMaxCompress) || props.dictSize > (1 << 30))
-+    return SZ_ERROR_PARAM;
-+  p->dictSize = props.dictSize;
-+  p->matchFinderCycles = props.mc;
-+  {
-+    unsigned fb = props.fb;
-+    if (fb < 5)
-+      fb = 5;
-+    if (fb > LZMA_MATCH_LEN_MAX)
-+      fb = LZMA_MATCH_LEN_MAX;
-+    p->numFastBytes = fb;
-+  }
-+  p->lc = props.lc;
-+  p->lp = props.lp;
-+  p->pb = props.pb;
-+  p->fastMode = (props.algo == 0);
-+  p->matchFinderBase.btMode = props.btMode;
-+  {
-+    UInt32 numHashBytes = 4;
-+    if (props.btMode)
-+    {
-+      if (props.numHashBytes < 2)
-+        numHashBytes = 2;
-+      else if (props.numHashBytes < 4)
-+        numHashBytes = props.numHashBytes;
-+    }
-+    p->matchFinderBase.numHashBytes = numHashBytes;
-+  }
-+
-+  p->matchFinderBase.cutValue = props.mc;
-+
-+  p->writeEndMark = props.writeEndMark;
-+
-+  #ifndef _7ZIP_ST
-+  /*
-+  if (newMultiThread != _multiThread)
-+  {
-+    ReleaseMatchFinder();
-+    _multiThread = newMultiThread;
-+  }
-+  */
-+  p->multiThread = (props.numThreads > 1);
-+  #endif
-+
-+  return SZ_OK;
-+}
-+
-+static const int kLiteralNextStates[kNumStates] = {0, 0, 0, 0, 1, 2, 3, 4,  5,  6,   4, 5};
-+static const int kMatchNextStates[kNumStates]   = {7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10};
-+static const int kRepNextStates[kNumStates]     = {8, 8, 8, 8, 8, 8, 8, 11, 11, 11, 11, 11};
-+static const int kShortRepNextStates[kNumStates]= {9, 9, 9, 9, 9, 9, 9, 11, 11, 11, 11, 11};
-+
-+#define IsCharState(s) ((s) < 7)
-+
-+#define GetLenToPosState(len) (((len) < kNumLenToPosStates + 1) ? (len) - 2 : kNumLenToPosStates - 1)
-+
-+#define kInfinityPrice (1 << 30)
-+
-+static void RangeEnc_Construct(CRangeEnc *p)
-+{
-+  p->outStream = 0;
-+  p->bufBase = 0;
-+}
-+
-+#define RangeEnc_GetProcessed(p) ((p)->processed + ((p)->buf - (p)->bufBase) + (p)->cacheSize)
-+
-+#define RC_BUF_SIZE (1 << 16)
-+static int RangeEnc_Alloc(CRangeEnc *p, ISzAlloc *alloc)
-+{
-+  if (p->bufBase == 0)
-+  {
-+    p->bufBase = (Byte *)alloc->Alloc(alloc, RC_BUF_SIZE);
-+    if (p->bufBase == 0)
-+      return 0;
-+    p->bufLim = p->bufBase + RC_BUF_SIZE;
-+  }
-+  return 1;
-+}
-+
-+static void RangeEnc_Free(CRangeEnc *p, ISzAlloc *alloc)
-+{
-+  alloc->Free(alloc, p->bufBase);
-+  p->bufBase = 0;
-+}
-+
-+static void RangeEnc_Init(CRangeEnc *p)
-+{
-+  /* Stream.Init(); */
-+  p->low = 0;
-+  p->range = 0xFFFFFFFF;
-+  p->cacheSize = 1;
-+  p->cache = 0;
-+
-+  p->buf = p->bufBase;
-+
-+  p->processed = 0;
-+  p->res = SZ_OK;
-+}
-+
-+static void RangeEnc_FlushStream(CRangeEnc *p)
-+{
-+  size_t num;
-+  if (p->res != SZ_OK)
-+    return;
-+  num = p->buf - p->bufBase;
-+  if (num != p->outStream->Write(p->outStream, p->bufBase, num))
-+    p->res = SZ_ERROR_WRITE;
-+  p->processed += num;
-+  p->buf = p->bufBase;
-+}
-+
-+static void MY_FAST_CALL RangeEnc_ShiftLow(CRangeEnc *p)
-+{
-+  if ((UInt32)p->low < (UInt32)0xFF000000 || (int)(p->low >> 32) != 0)
-+  {
-+    Byte temp = p->cache;
-+    do
-+    {
-+      Byte *buf = p->buf;
-+      *buf++ = (Byte)(temp + (Byte)(p->low >> 32));
-+      p->buf = buf;
-+      if (buf == p->bufLim)
-+        RangeEnc_FlushStream(p);
-+      temp = 0xFF;
-+    }
-+    while (--p->cacheSize != 0);
-+    p->cache = (Byte)((UInt32)p->low >> 24);
-+  }
-+  p->cacheSize++;
-+  p->low = (UInt32)p->low << 8;
-+}
-+
-+static void RangeEnc_FlushData(CRangeEnc *p)
-+{
-+  int i;
-+  for (i = 0; i < 5; i++)
-+    RangeEnc_ShiftLow(p);
-+}
-+
-+static void RangeEnc_EncodeDirectBits(CRangeEnc *p, UInt32 value, int numBits)
-+{
-+  do
-+  {
-+    p->range >>= 1;
-+    p->low += p->range & (0 - ((value >> --numBits) & 1));
-+    if (p->range < kTopValue)
-+    {
-+      p->range <<= 8;
-+      RangeEnc_ShiftLow(p);
-+    }
-+  }
-+  while (numBits != 0);
-+}
-+
-+static void RangeEnc_EncodeBit(CRangeEnc *p, CLzmaProb *prob, UInt32 symbol)
-+{
-+  UInt32 ttt = *prob;
-+  UInt32 newBound = (p->range >> kNumBitModelTotalBits) * ttt;
-+  if (symbol == 0)
-+  {
-+    p->range = newBound;
-+    ttt += (kBitModelTotal - ttt) >> kNumMoveBits;
-+  }
-+  else
-+  {
-+    p->low += newBound;
-+    p->range -= newBound;
-+    ttt -= ttt >> kNumMoveBits;
-+  }
-+  *prob = (CLzmaProb)ttt;
-+  if (p->range < kTopValue)
-+  {
-+    p->range <<= 8;
-+    RangeEnc_ShiftLow(p);
-+  }
-+}
-+
-+static void LitEnc_Encode(CRangeEnc *p, CLzmaProb *probs, UInt32 symbol)
-+{
-+  symbol |= 0x100;
-+  do
-+  {
-+    RangeEnc_EncodeBit(p, probs + (symbol >> 8), (symbol >> 7) & 1);
-+    symbol <<= 1;
-+  }
-+  while (symbol < 0x10000);
-+}
-+
-+static void LitEnc_EncodeMatched(CRangeEnc *p, CLzmaProb *probs, UInt32 symbol, UInt32 matchByte)
-+{
-+  UInt32 offs = 0x100;
-+  symbol |= 0x100;
-+  do
-+  {
-+    matchByte <<= 1;
-+    RangeEnc_EncodeBit(p, probs + (offs + (matchByte & offs) + (symbol >> 8)), (symbol >> 7) & 1);
-+    symbol <<= 1;
-+    offs &= ~(matchByte ^ symbol);
-+  }
-+  while (symbol < 0x10000);
-+}
-+
-+void LzmaEnc_InitPriceTables(UInt32 *ProbPrices)
-+{
-+  UInt32 i;
-+  for (i = (1 << kNumMoveReducingBits) / 2; i < kBitModelTotal; i += (1 << kNumMoveReducingBits))
-+  {
-+    const int kCyclesBits = kNumBitPriceShiftBits;
-+    UInt32 w = i;
-+    UInt32 bitCount = 0;
-+    int j;
-+    for (j = 0; j < kCyclesBits; j++)
-+    {
-+      w = w * w;
-+      bitCount <<= 1;
-+      while (w >= ((UInt32)1 << 16))
-+      {
-+        w >>= 1;
-+        bitCount++;
-+      }
-+    }
-+    ProbPrices[i >> kNumMoveReducingBits] = ((kNumBitModelTotalBits << kCyclesBits) - 15 - bitCount);
-+  }
-+}
-+
-+
-+#define GET_PRICE(prob, symbol) \
-+  p->ProbPrices[((prob) ^ (((-(int)(symbol))) & (kBitModelTotal - 1))) >> kNumMoveReducingBits];
-+
-+#define GET_PRICEa(prob, symbol) \
-+  ProbPrices[((prob) ^ ((-((int)(symbol))) & (kBitModelTotal - 1))) >> kNumMoveReducingBits];
-+
-+#define GET_PRICE_0(prob) p->ProbPrices[(prob) >> kNumMoveReducingBits]
-+#define GET_PRICE_1(prob) p->ProbPrices[((prob) ^ (kBitModelTotal - 1)) >> kNumMoveReducingBits]
-+
-+#define GET_PRICE_0a(prob) ProbPrices[(prob) >> kNumMoveReducingBits]
-+#define GET_PRICE_1a(prob) ProbPrices[((prob) ^ (kBitModelTotal - 1)) >> kNumMoveReducingBits]
-+
-+static UInt32 LitEnc_GetPrice(const CLzmaProb *probs, UInt32 symbol, UInt32 *ProbPrices)
-+{
-+  UInt32 price = 0;
-+  symbol |= 0x100;
-+  do
-+  {
-+    price += GET_PRICEa(probs[symbol >> 8], (symbol >> 7) & 1);
-+    symbol <<= 1;
-+  }
-+  while (symbol < 0x10000);
-+  return price;
-+}
-+
-+static UInt32 LitEnc_GetPriceMatched(const CLzmaProb *probs, UInt32 symbol, UInt32 matchByte, UInt32 *ProbPrices)
-+{
-+  UInt32 price = 0;
-+  UInt32 offs = 0x100;
-+  symbol |= 0x100;
-+  do
-+  {
-+    matchByte <<= 1;
-+    price += GET_PRICEa(probs[offs + (matchByte & offs) + (symbol >> 8)], (symbol >> 7) & 1);
-+    symbol <<= 1;
-+    offs &= ~(matchByte ^ symbol);
-+  }
-+  while (symbol < 0x10000);
-+  return price;
-+}
-+
-+
-+static void RcTree_Encode(CRangeEnc *rc, CLzmaProb *probs, int numBitLevels, UInt32 symbol)
-+{
-+  UInt32 m = 1;
-+  int i;
-+  for (i = numBitLevels; i != 0;)
-+  {
-+    UInt32 bit;
-+    i--;
-+    bit = (symbol >> i) & 1;
-+    RangeEnc_EncodeBit(rc, probs + m, bit);
-+    m = (m << 1) | bit;
-+  }
-+}
-+
-+static void RcTree_ReverseEncode(CRangeEnc *rc, CLzmaProb *probs, int numBitLevels, UInt32 symbol)
-+{
-+  UInt32 m = 1;
-+  int i;
-+  for (i = 0; i < numBitLevels; i++)
-+  {
-+    UInt32 bit = symbol & 1;
-+    RangeEnc_EncodeBit(rc, probs + m, bit);
-+    m = (m << 1) | bit;
-+    symbol >>= 1;
-+  }
-+}
-+
-+static UInt32 RcTree_GetPrice(const CLzmaProb *probs, int numBitLevels, UInt32 symbol, UInt32 *ProbPrices)
-+{
-+  UInt32 price = 0;
-+  symbol |= (1 << numBitLevels);
-+  while (symbol != 1)
-+  {
-+    price += GET_PRICEa(probs[symbol >> 1], symbol & 1);
-+    symbol >>= 1;
-+  }
-+  return price;
-+}
-+
-+static UInt32 RcTree_ReverseGetPrice(const CLzmaProb *probs, int numBitLevels, UInt32 symbol, UInt32 *ProbPrices)
-+{
-+  UInt32 price = 0;
-+  UInt32 m = 1;
-+  int i;
-+  for (i = numBitLevels; i != 0; i--)
-+  {
-+    UInt32 bit = symbol & 1;
-+    symbol >>= 1;
-+    price += GET_PRICEa(probs[m], bit);
-+    m = (m << 1) | bit;
-+  }
-+  return price;
-+}
-+
-+
-+static void LenEnc_Init(CLenEnc *p)
-+{
-+  unsigned i;
-+  p->choice = p->choice2 = kProbInitValue;
-+  for (i = 0; i < (LZMA_NUM_PB_STATES_MAX << kLenNumLowBits); i++)
-+    p->low[i] = kProbInitValue;
-+  for (i = 0; i < (LZMA_NUM_PB_STATES_MAX << kLenNumMidBits); i++)
-+    p->mid[i] = kProbInitValue;
-+  for (i = 0; i < kLenNumHighSymbols; i++)
-+    p->high[i] = kProbInitValue;
-+}
-+
-+static void LenEnc_Encode(CLenEnc *p, CRangeEnc *rc, UInt32 symbol, UInt32 posState)
-+{
-+  if (symbol < kLenNumLowSymbols)
-+  {
-+    RangeEnc_EncodeBit(rc, &p->choice, 0);
-+    RcTree_Encode(rc, p->low + (posState << kLenNumLowBits), kLenNumLowBits, symbol);
-+  }
-+  else
-+  {
-+    RangeEnc_EncodeBit(rc, &p->choice, 1);
-+    if (symbol < kLenNumLowSymbols + kLenNumMidSymbols)
-+    {
-+      RangeEnc_EncodeBit(rc, &p->choice2, 0);
-+      RcTree_Encode(rc, p->mid + (posState << kLenNumMidBits), kLenNumMidBits, symbol - kLenNumLowSymbols);
-+    }
-+    else
-+    {
-+      RangeEnc_EncodeBit(rc, &p->choice2, 1);
-+      RcTree_Encode(rc, p->high, kLenNumHighBits, symbol - kLenNumLowSymbols - kLenNumMidSymbols);
-+    }
-+  }
-+}
-+
-+static void LenEnc_SetPrices(CLenEnc *p, UInt32 posState, UInt32 numSymbols, UInt32 *prices, UInt32 *ProbPrices)
-+{
-+  UInt32 a0 = GET_PRICE_0a(p->choice);
-+  UInt32 a1 = GET_PRICE_1a(p->choice);
-+  UInt32 b0 = a1 + GET_PRICE_0a(p->choice2);
-+  UInt32 b1 = a1 + GET_PRICE_1a(p->choice2);
-+  UInt32 i = 0;
-+  for (i = 0; i < kLenNumLowSymbols; i++)
-+  {
-+    if (i >= numSymbols)
-+      return;
-+    prices[i] = a0 + RcTree_GetPrice(p->low + (posState << kLenNumLowBits), kLenNumLowBits, i, ProbPrices);
-+  }
-+  for (; i < kLenNumLowSymbols + kLenNumMidSymbols; i++)
-+  {
-+    if (i >= numSymbols)
-+      return;
-+    prices[i] = b0 + RcTree_GetPrice(p->mid + (posState << kLenNumMidBits), kLenNumMidBits, i - kLenNumLowSymbols, ProbPrices);
-+  }
-+  for (; i < numSymbols; i++)
-+    prices[i] = b1 + RcTree_GetPrice(p->high, kLenNumHighBits, i - kLenNumLowSymbols - kLenNumMidSymbols, ProbPrices);
-+}
-+
-+static void MY_FAST_CALL LenPriceEnc_UpdateTable(CLenPriceEnc *p, UInt32 posState, UInt32 *ProbPrices)
-+{
-+  LenEnc_SetPrices(&p->p, posState, p->tableSize, p->prices[posState], ProbPrices);
-+  p->counters[posState] = p->tableSize;
-+}
-+
-+static void LenPriceEnc_UpdateTables(CLenPriceEnc *p, UInt32 numPosStates, UInt32 *ProbPrices)
-+{
-+  UInt32 posState;
-+  for (posState = 0; posState < numPosStates; posState++)
-+    LenPriceEnc_UpdateTable(p, posState, ProbPrices);
-+}
-+
-+static void LenEnc_Encode2(CLenPriceEnc *p, CRangeEnc *rc, UInt32 symbol, UInt32 posState, Bool updatePrice, UInt32 *ProbPrices)
-+{
-+  LenEnc_Encode(&p->p, rc, symbol, posState);
-+  if (updatePrice)
-+    if (--p->counters[posState] == 0)
-+      LenPriceEnc_UpdateTable(p, posState, ProbPrices);
-+}
-+
-+
-+
-+
-+static void MovePos(CLzmaEnc *p, UInt32 num)
-+{
-+  #ifdef SHOW_STAT
-+  ttt += num;
-+  printf("\n MovePos %d", num);
-+  #endif
-+  if (num != 0)
-+  {
-+    p->additionalOffset += num;
-+    p->matchFinder.Skip(p->matchFinderObj, num);
-+  }
-+}
-+
-+static UInt32 ReadMatchDistances(CLzmaEnc *p, UInt32 *numDistancePairsRes)
-+{
-+  UInt32 lenRes = 0, numPairs;
-+  p->numAvail = p->matchFinder.GetNumAvailableBytes(p->matchFinderObj);
-+  numPairs = p->matchFinder.GetMatches(p->matchFinderObj, p->matches);
-+  #ifdef SHOW_STAT
-+  printf("\n i = %d numPairs = %d    ", ttt, numPairs / 2);
-+  ttt++;
-+  {
-+    UInt32 i;
-+    for (i = 0; i < numPairs; i += 2)
-+      printf("%2d %6d   | ", p->matches[i], p->matches[i + 1]);
-+  }
-+  #endif
-+  if (numPairs > 0)
-+  {
-+    lenRes = p->matches[numPairs - 2];
-+    if (lenRes == p->numFastBytes)
-+    {
-+      const Byte *pby = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1;
-+      UInt32 distance = p->matches[numPairs - 1] + 1;
-+      UInt32 numAvail = p->numAvail;
-+      if (numAvail > LZMA_MATCH_LEN_MAX)
-+        numAvail = LZMA_MATCH_LEN_MAX;
-+      {
-+        const Byte *pby2 = pby - distance;
-+        for (; lenRes < numAvail && pby[lenRes] == pby2[lenRes]; lenRes++);
-+      }
-+    }
-+  }
-+  p->additionalOffset++;
-+  *numDistancePairsRes = numPairs;
-+  return lenRes;
-+}
-+
-+
-+#define MakeAsChar(p) (p)->backPrev = (UInt32)(-1); (p)->prev1IsChar = False;
-+#define MakeAsShortRep(p) (p)->backPrev = 0; (p)->prev1IsChar = False;
-+#define IsShortRep(p) ((p)->backPrev == 0)
-+
-+static UInt32 GetRepLen1Price(CLzmaEnc *p, UInt32 state, UInt32 posState)
-+{
-+  return
-+    GET_PRICE_0(p->isRepG0[state]) +
-+    GET_PRICE_0(p->isRep0Long[state][posState]);
-+}
-+
-+static UInt32 GetPureRepPrice(CLzmaEnc *p, UInt32 repIndex, UInt32 state, UInt32 posState)
-+{
-+  UInt32 price;
-+  if (repIndex == 0)
-+  {
-+    price = GET_PRICE_0(p->isRepG0[state]);
-+    price += GET_PRICE_1(p->isRep0Long[state][posState]);
-+  }
-+  else
-+  {
-+    price = GET_PRICE_1(p->isRepG0[state]);
-+    if (repIndex == 1)
-+      price += GET_PRICE_0(p->isRepG1[state]);
-+    else
-+    {
-+      price += GET_PRICE_1(p->isRepG1[state]);
-+      price += GET_PRICE(p->isRepG2[state], repIndex - 2);
-+    }
-+  }
-+  return price;
-+}
-+
-+static UInt32 GetRepPrice(CLzmaEnc *p, UInt32 repIndex, UInt32 len, UInt32 state, UInt32 posState)
-+{
-+  return p->repLenEnc.prices[posState][len - LZMA_MATCH_LEN_MIN] +
-+    GetPureRepPrice(p, repIndex, state, posState);
-+}
-+
-+static UInt32 Backward(CLzmaEnc *p, UInt32 *backRes, UInt32 cur)
-+{
-+  UInt32 posMem = p->opt[cur].posPrev;
-+  UInt32 backMem = p->opt[cur].backPrev;
-+  p->optimumEndIndex = cur;
-+  do
-+  {
-+    if (p->opt[cur].prev1IsChar)
-+    {
-+      MakeAsChar(&p->opt[posMem])
-+      p->opt[posMem].posPrev = posMem - 1;
-+      if (p->opt[cur].prev2)
-+      {
-+        p->opt[posMem - 1].prev1IsChar = False;
-+        p->opt[posMem - 1].posPrev = p->opt[cur].posPrev2;
-+        p->opt[posMem - 1].backPrev = p->opt[cur].backPrev2;
-+      }
-+    }
-+    {
-+      UInt32 posPrev = posMem;
-+      UInt32 backCur = backMem;
-+      
-+      backMem = p->opt[posPrev].backPrev;
-+      posMem = p->opt[posPrev].posPrev;
-+      
-+      p->opt[posPrev].backPrev = backCur;
-+      p->opt[posPrev].posPrev = cur;
-+      cur = posPrev;
-+    }
-+  }
-+  while (cur != 0);
-+  *backRes = p->opt[0].backPrev;
-+  p->optimumCurrentIndex  = p->opt[0].posPrev;
-+  return p->optimumCurrentIndex;
-+}
-+
-+#define LIT_PROBS(pos, prevByte) (p->litProbs + ((((pos) & p->lpMask) << p->lc) + ((prevByte) >> (8 - p->lc))) * 0x300)
-+
-+static UInt32 GetOptimum(CLzmaEnc *p, UInt32 position, UInt32 *backRes)
-+{
-+  UInt32 numAvail, mainLen, numPairs, repMaxIndex, i, posState, lenEnd, len, cur;
-+  UInt32 matchPrice, repMatchPrice, normalMatchPrice;
-+  UInt32 reps[LZMA_NUM_REPS], repLens[LZMA_NUM_REPS];
-+  UInt32 *matches;
-+  const Byte *data;
-+  Byte curByte, matchByte;
-+  if (p->optimumEndIndex != p->optimumCurrentIndex)
-+  {
-+    const COptimal *opt = &p->opt[p->optimumCurrentIndex];
-+    UInt32 lenRes = opt->posPrev - p->optimumCurrentIndex;
-+    *backRes = opt->backPrev;
-+    p->optimumCurrentIndex = opt->posPrev;
-+    return lenRes;
-+  }
-+  p->optimumCurrentIndex = p->optimumEndIndex = 0;
-+  
-+  if (p->additionalOffset == 0)
-+    mainLen = ReadMatchDistances(p, &numPairs);
-+  else
-+  {
-+    mainLen = p->longestMatchLength;
-+    numPairs = p->numPairs;
-+  }
-+
-+  numAvail = p->numAvail;
-+  if (numAvail < 2)
-+  {
-+    *backRes = (UInt32)(-1);
-+    return 1;
-+  }
-+  if (numAvail > LZMA_MATCH_LEN_MAX)
-+    numAvail = LZMA_MATCH_LEN_MAX;
-+
-+  data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1;
-+  repMaxIndex = 0;
-+  for (i = 0; i < LZMA_NUM_REPS; i++)
-+  {
-+    UInt32 lenTest;
-+    const Byte *data2;
-+    reps[i] = p->reps[i];
-+    data2 = data - (reps[i] + 1);
-+    if (data[0] != data2[0] || data[1] != data2[1])
-+    {
-+      repLens[i] = 0;
-+      continue;
-+    }
-+    for (lenTest = 2; lenTest < numAvail && data[lenTest] == data2[lenTest]; lenTest++);
-+    repLens[i] = lenTest;
-+    if (lenTest > repLens[repMaxIndex])
-+      repMaxIndex = i;
-+  }
-+  if (repLens[repMaxIndex] >= p->numFastBytes)
-+  {
-+    UInt32 lenRes;
-+    *backRes = repMaxIndex;
-+    lenRes = repLens[repMaxIndex];
-+    MovePos(p, lenRes - 1);
-+    return lenRes;
-+  }
-+
-+  matches = p->matches;
-+  if (mainLen >= p->numFastBytes)
-+  {
-+    *backRes = matches[numPairs - 1] + LZMA_NUM_REPS;
-+    MovePos(p, mainLen - 1);
-+    return mainLen;
-+  }
-+  curByte = *data;
-+  matchByte = *(data - (reps[0] + 1));
-+
-+  if (mainLen < 2 && curByte != matchByte && repLens[repMaxIndex] < 2)
-+  {
-+    *backRes = (UInt32)-1;
-+    return 1;
-+  }
-+
-+  p->opt[0].state = (CState)p->state;
-+
-+  posState = (position & p->pbMask);
-+
-+  {
-+    const CLzmaProb *probs = LIT_PROBS(position, *(data - 1));
-+    p->opt[1].price = GET_PRICE_0(p->isMatch[p->state][posState]) +
-+        (!IsCharState(p->state) ?
-+          LitEnc_GetPriceMatched(probs, curByte, matchByte, p->ProbPrices) :
-+          LitEnc_GetPrice(probs, curByte, p->ProbPrices));
-+  }
-+
-+  MakeAsChar(&p->opt[1]);
-+
-+  matchPrice = GET_PRICE_1(p->isMatch[p->state][posState]);
-+  repMatchPrice = matchPrice + GET_PRICE_1(p->isRep[p->state]);
-+
-+  if (matchByte == curByte)
-+  {
-+    UInt32 shortRepPrice = repMatchPrice + GetRepLen1Price(p, p->state, posState);
-+    if (shortRepPrice < p->opt[1].price)
-+    {
-+      p->opt[1].price = shortRepPrice;
-+      MakeAsShortRep(&p->opt[1]);
-+    }
-+  }
-+  lenEnd = ((mainLen >= repLens[repMaxIndex]) ? mainLen : repLens[repMaxIndex]);
-+
-+  if (lenEnd < 2)
-+  {
-+    *backRes = p->opt[1].backPrev;
-+    return 1;
-+  }
-+
-+  p->opt[1].posPrev = 0;
-+  for (i = 0; i < LZMA_NUM_REPS; i++)
-+    p->opt[0].backs[i] = reps[i];
-+
-+  len = lenEnd;
-+  do
-+    p->opt[len--].price = kInfinityPrice;
-+  while (len >= 2);
-+
-+  for (i = 0; i < LZMA_NUM_REPS; i++)
-+  {
-+    UInt32 repLen = repLens[i];
-+    UInt32 price;
-+    if (repLen < 2)
-+      continue;
-+    price = repMatchPrice + GetPureRepPrice(p, i, p->state, posState);
-+    do
-+    {
-+      UInt32 curAndLenPrice = price + p->repLenEnc.prices[posState][repLen - 2];
-+      COptimal *opt = &p->opt[repLen];
-+      if (curAndLenPrice < opt->price)
-+      {
-+        opt->price = curAndLenPrice;
-+        opt->posPrev = 0;
-+        opt->backPrev = i;
-+        opt->prev1IsChar = False;
-+      }
-+    }
-+    while (--repLen >= 2);
-+  }
-+
-+  normalMatchPrice = matchPrice + GET_PRICE_0(p->isRep[p->state]);
-+
-+  len = ((repLens[0] >= 2) ? repLens[0] + 1 : 2);
-+  if (len <= mainLen)
-+  {
-+    UInt32 offs = 0;
-+    while (len > matches[offs])
-+      offs += 2;
-+    for (; ; len++)
-+    {
-+      COptimal *opt;
-+      UInt32 distance = matches[offs + 1];
-+
-+      UInt32 curAndLenPrice = normalMatchPrice + p->lenEnc.prices[posState][len - LZMA_MATCH_LEN_MIN];
-+      UInt32 lenToPosState = GetLenToPosState(len);
-+      if (distance < kNumFullDistances)
-+        curAndLenPrice += p->distancesPrices[lenToPosState][distance];
-+      else
-+      {
-+        UInt32 slot;
-+        GetPosSlot2(distance, slot);
-+        curAndLenPrice += p->alignPrices[distance & kAlignMask] + p->posSlotPrices[lenToPosState][slot];
-+      }
-+      opt = &p->opt[len];
-+      if (curAndLenPrice < opt->price)
-+      {
-+        opt->price = curAndLenPrice;
-+        opt->posPrev = 0;
-+        opt->backPrev = distance + LZMA_NUM_REPS;
-+        opt->prev1IsChar = False;
-+      }
-+      if (len == matches[offs])
-+      {
-+        offs += 2;
-+        if (offs == numPairs)
-+          break;
-+      }
-+    }
-+  }
-+
-+  cur = 0;
-+
-+    #ifdef SHOW_STAT2
-+    if (position >= 0)
-+    {
-+      unsigned i;
-+      printf("\n pos = %4X", position);
-+      for (i = cur; i <= lenEnd; i++)
-+      printf("\nprice[%4X] = %d", position - cur + i, p->opt[i].price);
-+    }
-+    #endif
-+
-+  for (;;)
-+  {
-+    UInt32 numAvailFull, newLen, numPairs, posPrev, state, posState, startLen;
-+    UInt32 curPrice, curAnd1Price, matchPrice, repMatchPrice;
-+    Bool nextIsChar;
-+    Byte curByte, matchByte;
-+    const Byte *data;
-+    COptimal *curOpt;
-+    COptimal *nextOpt;
-+
-+    cur++;
-+    if (cur == lenEnd)
-+      return Backward(p, backRes, cur);
-+
-+    newLen = ReadMatchDistances(p, &numPairs);
-+    if (newLen >= p->numFastBytes)
-+    {
-+      p->numPairs = numPairs;
-+      p->longestMatchLength = newLen;
-+      return Backward(p, backRes, cur);
-+    }
-+    position++;
-+    curOpt = &p->opt[cur];
-+    posPrev = curOpt->posPrev;
-+    if (curOpt->prev1IsChar)
-+    {
-+      posPrev--;
-+      if (curOpt->prev2)
-+      {
-+        state = p->opt[curOpt->posPrev2].state;
-+        if (curOpt->backPrev2 < LZMA_NUM_REPS)
-+          state = kRepNextStates[state];
-+        else
-+          state = kMatchNextStates[state];
-+      }
-+      else
-+        state = p->opt[posPrev].state;
-+      state = kLiteralNextStates[state];
-+    }
-+    else
-+      state = p->opt[posPrev].state;
-+    if (posPrev == cur - 1)
-+    {
-+      if (IsShortRep(curOpt))
-+        state = kShortRepNextStates[state];
-+      else
-+        state = kLiteralNextStates[state];
-+    }
-+    else
-+    {
-+      UInt32 pos;
-+      const COptimal *prevOpt;
-+      if (curOpt->prev1IsChar && curOpt->prev2)
-+      {
-+        posPrev = curOpt->posPrev2;
-+        pos = curOpt->backPrev2;
-+        state = kRepNextStates[state];
-+      }
-+      else
-+      {
-+        pos = curOpt->backPrev;
-+        if (pos < LZMA_NUM_REPS)
-+          state = kRepNextStates[state];
-+        else
-+          state = kMatchNextStates[state];
-+      }
-+      prevOpt = &p->opt[posPrev];
-+      if (pos < LZMA_NUM_REPS)
-+      {
-+        UInt32 i;
-+        reps[0] = prevOpt->backs[pos];
-+        for (i = 1; i <= pos; i++)
-+          reps[i] = prevOpt->backs[i - 1];
-+        for (; i < LZMA_NUM_REPS; i++)
-+          reps[i] = prevOpt->backs[i];
-+      }
-+      else
-+      {
-+        UInt32 i;
-+        reps[0] = (pos - LZMA_NUM_REPS);
-+        for (i = 1; i < LZMA_NUM_REPS; i++)
-+          reps[i] = prevOpt->backs[i - 1];
-+      }
-+    }
-+    curOpt->state = (CState)state;
-+
-+    curOpt->backs[0] = reps[0];
-+    curOpt->backs[1] = reps[1];
-+    curOpt->backs[2] = reps[2];
-+    curOpt->backs[3] = reps[3];
-+
-+    curPrice = curOpt->price;
-+    nextIsChar = False;
-+    data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1;
-+    curByte = *data;
-+    matchByte = *(data - (reps[0] + 1));
-+
-+    posState = (position & p->pbMask);
-+
-+    curAnd1Price = curPrice + GET_PRICE_0(p->isMatch[state][posState]);
-+    {
-+      const CLzmaProb *probs = LIT_PROBS(position, *(data - 1));
-+      curAnd1Price +=
-+        (!IsCharState(state) ?
-+          LitEnc_GetPriceMatched(probs, curByte, matchByte, p->ProbPrices) :
-+          LitEnc_GetPrice(probs, curByte, p->ProbPrices));
-+    }
-+
-+    nextOpt = &p->opt[cur + 1];
-+
-+    if (curAnd1Price < nextOpt->price)
-+    {
-+      nextOpt->price = curAnd1Price;
-+      nextOpt->posPrev = cur;
-+      MakeAsChar(nextOpt);
-+      nextIsChar = True;
-+    }
-+
-+    matchPrice = curPrice + GET_PRICE_1(p->isMatch[state][posState]);
-+    repMatchPrice = matchPrice + GET_PRICE_1(p->isRep[state]);
-+    
-+    if (matchByte == curByte && !(nextOpt->posPrev < cur && nextOpt->backPrev == 0))
-+    {
-+      UInt32 shortRepPrice = repMatchPrice + GetRepLen1Price(p, state, posState);
-+      if (shortRepPrice <= nextOpt->price)
-+      {
-+        nextOpt->price = shortRepPrice;
-+        nextOpt->posPrev = cur;
-+        MakeAsShortRep(nextOpt);
-+        nextIsChar = True;
-+      }
-+    }
-+    numAvailFull = p->numAvail;
-+    {
-+      UInt32 temp = kNumOpts - 1 - cur;
-+      if (temp < numAvailFull)
-+        numAvailFull = temp;
-+    }
-+
-+    if (numAvailFull < 2)
-+      continue;
-+    numAvail = (numAvailFull <= p->numFastBytes ? numAvailFull : p->numFastBytes);
-+
-+    if (!nextIsChar && matchByte != curByte) /* speed optimization */
-+    {
-+      /* try Literal + rep0 */
-+      UInt32 temp;
-+      UInt32 lenTest2;
-+      const Byte *data2 = data - (reps[0] + 1);
-+      UInt32 limit = p->numFastBytes + 1;
-+      if (limit > numAvailFull)
-+        limit = numAvailFull;
-+
-+      for (temp = 1; temp < limit && data[temp] == data2[temp]; temp++);
-+      lenTest2 = temp - 1;
-+      if (lenTest2 >= 2)
-+      {
-+        UInt32 state2 = kLiteralNextStates[state];
-+        UInt32 posStateNext = (position + 1) & p->pbMask;
-+        UInt32 nextRepMatchPrice = curAnd1Price +
-+            GET_PRICE_1(p->isMatch[state2][posStateNext]) +
-+            GET_PRICE_1(p->isRep[state2]);
-+        /* for (; lenTest2 >= 2; lenTest2--) */
-+        {
-+          UInt32 curAndLenPrice;
-+          COptimal *opt;
-+          UInt32 offset = cur + 1 + lenTest2;
-+          while (lenEnd < offset)
-+            p->opt[++lenEnd].price = kInfinityPrice;
-+          curAndLenPrice = nextRepMatchPrice + GetRepPrice(p, 0, lenTest2, state2, posStateNext);
-+          opt = &p->opt[offset];
-+          if (curAndLenPrice < opt->price)
-+          {
-+            opt->price = curAndLenPrice;
-+            opt->posPrev = cur + 1;
-+            opt->backPrev = 0;
-+            opt->prev1IsChar = True;
-+            opt->prev2 = False;
-+          }
-+        }
-+      }
-+    }
-+    
-+    startLen = 2; /* speed optimization */
-+    {
-+    UInt32 repIndex;
-+    for (repIndex = 0; repIndex < LZMA_NUM_REPS; repIndex++)
-+    {
-+      UInt32 lenTest;
-+      UInt32 lenTestTemp;
-+      UInt32 price;
-+      const Byte *data2 = data - (reps[repIndex] + 1);
-+      if (data[0] != data2[0] || data[1] != data2[1])
-+        continue;
-+      for (lenTest = 2; lenTest < numAvail && data[lenTest] == data2[lenTest]; lenTest++);
-+      while (lenEnd < cur + lenTest)
-+        p->opt[++lenEnd].price = kInfinityPrice;
-+      lenTestTemp = lenTest;
-+      price = repMatchPrice + GetPureRepPrice(p, repIndex, state, posState);
-+      do
-+      {
-+        UInt32 curAndLenPrice = price + p->repLenEnc.prices[posState][lenTest - 2];
-+        COptimal *opt = &p->opt[cur + lenTest];
-+        if (curAndLenPrice < opt->price)
-+        {
-+          opt->price = curAndLenPrice;
-+          opt->posPrev = cur;
-+          opt->backPrev = repIndex;
-+          opt->prev1IsChar = False;
-+        }
-+      }
-+      while (--lenTest >= 2);
-+      lenTest = lenTestTemp;
-+      
-+      if (repIndex == 0)
-+        startLen = lenTest + 1;
-+        
-+      /* if (_maxMode) */
-+        {
-+          UInt32 lenTest2 = lenTest + 1;
-+          UInt32 limit = lenTest2 + p->numFastBytes;
-+          UInt32 nextRepMatchPrice;
-+          if (limit > numAvailFull)
-+            limit = numAvailFull;
-+          for (; lenTest2 < limit && data[lenTest2] == data2[lenTest2]; lenTest2++);
-+          lenTest2 -= lenTest + 1;
-+          if (lenTest2 >= 2)
-+          {
-+            UInt32 state2 = kRepNextStates[state];
-+            UInt32 posStateNext = (position + lenTest) & p->pbMask;
-+            UInt32 curAndLenCharPrice =
-+                price + p->repLenEnc.prices[posState][lenTest - 2] +
-+                GET_PRICE_0(p->isMatch[state2][posStateNext]) +
-+                LitEnc_GetPriceMatched(LIT_PROBS(position + lenTest, data[lenTest - 1]),
-+                    data[lenTest], data2[lenTest], p->ProbPrices);
-+            state2 = kLiteralNextStates[state2];
-+            posStateNext = (position + lenTest + 1) & p->pbMask;
-+            nextRepMatchPrice = curAndLenCharPrice +
-+                GET_PRICE_1(p->isMatch[state2][posStateNext]) +
-+                GET_PRICE_1(p->isRep[state2]);
-+            
-+            /* for (; lenTest2 >= 2; lenTest2--) */
-+            {
-+              UInt32 curAndLenPrice;
-+              COptimal *opt;
-+              UInt32 offset = cur + lenTest + 1 + lenTest2;
-+              while (lenEnd < offset)
-+                p->opt[++lenEnd].price = kInfinityPrice;
-+              curAndLenPrice = nextRepMatchPrice + GetRepPrice(p, 0, lenTest2, state2, posStateNext);
-+              opt = &p->opt[offset];
-+              if (curAndLenPrice < opt->price)
-+              {
-+                opt->price = curAndLenPrice;
-+                opt->posPrev = cur + lenTest + 1;
-+                opt->backPrev = 0;
-+                opt->prev1IsChar = True;
-+                opt->prev2 = True;
-+                opt->posPrev2 = cur;
-+                opt->backPrev2 = repIndex;
-+              }
-+            }
-+          }
-+        }
-+    }
-+    }
-+    /* for (UInt32 lenTest = 2; lenTest <= newLen; lenTest++) */
-+    if (newLen > numAvail)
-+    {
-+      newLen = numAvail;
-+      for (numPairs = 0; newLen > matches[numPairs]; numPairs += 2);
-+      matches[numPairs] = newLen;
-+      numPairs += 2;
-+    }
-+    if (newLen >= startLen)
-+    {
-+      UInt32 normalMatchPrice = matchPrice + GET_PRICE_0(p->isRep[state]);
-+      UInt32 offs, curBack, posSlot;
-+      UInt32 lenTest;
-+      while (lenEnd < cur + newLen)
-+        p->opt[++lenEnd].price = kInfinityPrice;
-+
-+      offs = 0;
-+      while (startLen > matches[offs])
-+        offs += 2;
-+      curBack = matches[offs + 1];
-+      GetPosSlot2(curBack, posSlot);
-+      for (lenTest = /*2*/ startLen; ; lenTest++)
-+      {
-+        UInt32 curAndLenPrice = normalMatchPrice + p->lenEnc.prices[posState][lenTest - LZMA_MATCH_LEN_MIN];
-+        UInt32 lenToPosState = GetLenToPosState(lenTest);
-+        COptimal *opt;
-+        if (curBack < kNumFullDistances)
-+          curAndLenPrice += p->distancesPrices[lenToPosState][curBack];
-+        else
-+          curAndLenPrice += p->posSlotPrices[lenToPosState][posSlot] + p->alignPrices[curBack & kAlignMask];
-+        
-+        opt = &p->opt[cur + lenTest];
-+        if (curAndLenPrice < opt->price)
-+        {
-+          opt->price = curAndLenPrice;
-+          opt->posPrev = cur;
-+          opt->backPrev = curBack + LZMA_NUM_REPS;
-+          opt->prev1IsChar = False;
-+        }
-+
-+        if (/*_maxMode && */lenTest == matches[offs])
-+        {
-+          /* Try Match + Literal + Rep0 */
-+          const Byte *data2 = data - (curBack + 1);
-+          UInt32 lenTest2 = lenTest + 1;
-+          UInt32 limit = lenTest2 + p->numFastBytes;
-+          UInt32 nextRepMatchPrice;
-+          if (limit > numAvailFull)
-+            limit = numAvailFull;
-+          for (; lenTest2 < limit && data[lenTest2] == data2[lenTest2]; lenTest2++);
-+          lenTest2 -= lenTest + 1;
-+          if (lenTest2 >= 2)
-+          {
-+            UInt32 state2 = kMatchNextStates[state];
-+            UInt32 posStateNext = (position + lenTest) & p->pbMask;
-+            UInt32 curAndLenCharPrice = curAndLenPrice +
-+                GET_PRICE_0(p->isMatch[state2][posStateNext]) +
-+                LitEnc_GetPriceMatched(LIT_PROBS(position + lenTest, data[lenTest - 1]),
-+                    data[lenTest], data2[lenTest], p->ProbPrices);
-+            state2 = kLiteralNextStates[state2];
-+            posStateNext = (posStateNext + 1) & p->pbMask;
-+            nextRepMatchPrice = curAndLenCharPrice +
-+                GET_PRICE_1(p->isMatch[state2][posStateNext]) +
-+                GET_PRICE_1(p->isRep[state2]);
-+            
-+            /* for (; lenTest2 >= 2; lenTest2--) */
-+            {
-+              UInt32 offset = cur + lenTest + 1 + lenTest2;
-+              UInt32 curAndLenPrice;
-+              COptimal *opt;
-+              while (lenEnd < offset)
-+                p->opt[++lenEnd].price = kInfinityPrice;
-+              curAndLenPrice = nextRepMatchPrice + GetRepPrice(p, 0, lenTest2, state2, posStateNext);
-+              opt = &p->opt[offset];
-+              if (curAndLenPrice < opt->price)
-+              {
-+                opt->price = curAndLenPrice;
-+                opt->posPrev = cur + lenTest + 1;
-+                opt->backPrev = 0;
-+                opt->prev1IsChar = True;
-+                opt->prev2 = True;
-+                opt->posPrev2 = cur;
-+                opt->backPrev2 = curBack + LZMA_NUM_REPS;
-+              }
-+            }
-+          }
-+          offs += 2;
-+          if (offs == numPairs)
-+            break;
-+          curBack = matches[offs + 1];
-+          if (curBack >= kNumFullDistances)
-+            GetPosSlot2(curBack, posSlot);
-+        }
-+      }
-+    }
-+  }
-+}
-+
-+#define ChangePair(smallDist, bigDist) (((bigDist) >> 7) > (smallDist))
-+
-+static UInt32 GetOptimumFast(CLzmaEnc *p, UInt32 *backRes)
-+{
-+  UInt32 numAvail, mainLen, mainDist, numPairs, repIndex, repLen, i;
-+  const Byte *data;
-+  const UInt32 *matches;
-+
-+  if (p->additionalOffset == 0)
-+    mainLen = ReadMatchDistances(p, &numPairs);
-+  else
-+  {
-+    mainLen = p->longestMatchLength;
-+    numPairs = p->numPairs;
-+  }
-+
-+  numAvail = p->numAvail;
-+  *backRes = (UInt32)-1;
-+  if (numAvail < 2)
-+    return 1;
-+  if (numAvail > LZMA_MATCH_LEN_MAX)
-+    numAvail = LZMA_MATCH_LEN_MAX;
-+  data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1;
-+
-+  repLen = repIndex = 0;
-+  for (i = 0; i < LZMA_NUM_REPS; i++)
-+  {
-+    UInt32 len;
-+    const Byte *data2 = data - (p->reps[i] + 1);
-+    if (data[0] != data2[0] || data[1] != data2[1])
-+      continue;
-+    for (len = 2; len < numAvail && data[len] == data2[len]; len++);
-+    if (len >= p->numFastBytes)
-+    {
-+      *backRes = i;
-+      MovePos(p, len - 1);
-+      return len;
-+    }
-+    if (len > repLen)
-+    {
-+      repIndex = i;
-+      repLen = len;
-+    }
-+  }
-+
-+  matches = p->matches;
-+  if (mainLen >= p->numFastBytes)
-+  {
-+    *backRes = matches[numPairs - 1] + LZMA_NUM_REPS;
-+    MovePos(p, mainLen - 1);
-+    return mainLen;
-+  }
-+
-+  mainDist = 0; /* for GCC */
-+  if (mainLen >= 2)
-+  {
-+    mainDist = matches[numPairs - 1];
-+    while (numPairs > 2 && mainLen == matches[numPairs - 4] + 1)
-+    {
-+      if (!ChangePair(matches[numPairs - 3], mainDist))
-+        break;
-+      numPairs -= 2;
-+      mainLen = matches[numPairs - 2];
-+      mainDist = matches[numPairs - 1];
-+    }
-+    if (mainLen == 2 && mainDist >= 0x80)
-+      mainLen = 1;
-+  }
-+
-+  if (repLen >= 2 && (
-+        (repLen + 1 >= mainLen) ||
-+        (repLen + 2 >= mainLen && mainDist >= (1 << 9)) ||
-+        (repLen + 3 >= mainLen && mainDist >= (1 << 15))))
-+  {
-+    *backRes = repIndex;
-+    MovePos(p, repLen - 1);
-+    return repLen;
-+  }
-+  
-+  if (mainLen < 2 || numAvail <= 2)
-+    return 1;
-+
-+  p->longestMatchLength = ReadMatchDistances(p, &p->numPairs);
-+  if (p->longestMatchLength >= 2)
-+  {
-+    UInt32 newDistance = matches[p->numPairs - 1];
-+    if ((p->longestMatchLength >= mainLen && newDistance < mainDist) ||
-+        (p->longestMatchLength == mainLen + 1 && !ChangePair(mainDist, newDistance)) ||
-+        (p->longestMatchLength > mainLen + 1) ||
-+        (p->longestMatchLength + 1 >= mainLen && mainLen >= 3 && ChangePair(newDistance, mainDist)))
-+      return 1;
-+  }
-+  
-+  data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1;
-+  for (i = 0; i < LZMA_NUM_REPS; i++)
-+  {
-+    UInt32 len, limit;
-+    const Byte *data2 = data - (p->reps[i] + 1);
-+    if (data[0] != data2[0] || data[1] != data2[1])
-+      continue;
-+    limit = mainLen - 1;
-+    for (len = 2; len < limit && data[len] == data2[len]; len++);
-+    if (len >= limit)
-+      return 1;
-+  }
-+  *backRes = mainDist + LZMA_NUM_REPS;
-+  MovePos(p, mainLen - 2);
-+  return mainLen;
-+}
-+
-+static void WriteEndMarker(CLzmaEnc *p, UInt32 posState)
-+{
-+  UInt32 len;
-+  RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][posState], 1);
-+  RangeEnc_EncodeBit(&p->rc, &p->isRep[p->state], 0);
-+  p->state = kMatchNextStates[p->state];
-+  len = LZMA_MATCH_LEN_MIN;
-+  LenEnc_Encode2(&p->lenEnc, &p->rc, len - LZMA_MATCH_LEN_MIN, posState, !p->fastMode, p->ProbPrices);
-+  RcTree_Encode(&p->rc, p->posSlotEncoder[GetLenToPosState(len)], kNumPosSlotBits, (1 << kNumPosSlotBits) - 1);
-+  RangeEnc_EncodeDirectBits(&p->rc, (((UInt32)1 << 30) - 1) >> kNumAlignBits, 30 - kNumAlignBits);
-+  RcTree_ReverseEncode(&p->rc, p->posAlignEncoder, kNumAlignBits, kAlignMask);
-+}
-+
-+static SRes CheckErrors(CLzmaEnc *p)
-+{
-+  if (p->result != SZ_OK)
-+    return p->result;
-+  if (p->rc.res != SZ_OK)
-+    p->result = SZ_ERROR_WRITE;
-+  if (p->matchFinderBase.result != SZ_OK)
-+    p->result = SZ_ERROR_READ;
-+  if (p->result != SZ_OK)
-+    p->finished = True;
-+  return p->result;
-+}
-+
-+static SRes Flush(CLzmaEnc *p, UInt32 nowPos)
-+{
-+  /* ReleaseMFStream(); */
-+  p->finished = True;
-+  if (p->writeEndMark)
-+    WriteEndMarker(p, nowPos & p->pbMask);
-+  RangeEnc_FlushData(&p->rc);
-+  RangeEnc_FlushStream(&p->rc);
-+  return CheckErrors(p);
-+}
-+
-+static void FillAlignPrices(CLzmaEnc *p)
-+{
-+  UInt32 i;
-+  for (i = 0; i < kAlignTableSize; i++)
-+    p->alignPrices[i] = RcTree_ReverseGetPrice(p->posAlignEncoder, kNumAlignBits, i, p->ProbPrices);
-+  p->alignPriceCount = 0;
-+}
-+
-+static void FillDistancesPrices(CLzmaEnc *p)
-+{
-+  UInt32 tempPrices[kNumFullDistances];
-+  UInt32 i, lenToPosState;
-+  for (i = kStartPosModelIndex; i < kNumFullDistances; i++)
-+  {
-+    UInt32 posSlot = GetPosSlot1(i);
-+    UInt32 footerBits = ((posSlot >> 1) - 1);
-+    UInt32 base = ((2 | (posSlot & 1)) << footerBits);
-+    tempPrices[i] = RcTree_ReverseGetPrice(p->posEncoders + base - posSlot - 1, footerBits, i - base, p->ProbPrices);
-+  }
-+
-+  for (lenToPosState = 0; lenToPosState < kNumLenToPosStates; lenToPosState++)
-+  {
-+    UInt32 posSlot;
-+    const CLzmaProb *encoder = p->posSlotEncoder[lenToPosState];
-+    UInt32 *posSlotPrices = p->posSlotPrices[lenToPosState];
-+    for (posSlot = 0; posSlot < p->distTableSize; posSlot++)
-+      posSlotPrices[posSlot] = RcTree_GetPrice(encoder, kNumPosSlotBits, posSlot, p->ProbPrices);
-+    for (posSlot = kEndPosModelIndex; posSlot < p->distTableSize; posSlot++)
-+      posSlotPrices[posSlot] += ((((posSlot >> 1) - 1) - kNumAlignBits) << kNumBitPriceShiftBits);
-+
-+    {
-+      UInt32 *distancesPrices = p->distancesPrices[lenToPosState];
-+      UInt32 i;
-+      for (i = 0; i < kStartPosModelIndex; i++)
-+        distancesPrices[i] = posSlotPrices[i];
-+      for (; i < kNumFullDistances; i++)
-+        distancesPrices[i] = posSlotPrices[GetPosSlot1(i)] + tempPrices[i];
-+    }
-+  }
-+  p->matchPriceCount = 0;
-+}
-+
-+void LzmaEnc_Construct(CLzmaEnc *p)
-+{
-+  RangeEnc_Construct(&p->rc);
-+  MatchFinder_Construct(&p->matchFinderBase);
-+  #ifndef _7ZIP_ST
-+  MatchFinderMt_Construct(&p->matchFinderMt);
-+  p->matchFinderMt.MatchFinder = &p->matchFinderBase;
-+  #endif
-+
-+  {
-+    CLzmaEncProps props;
-+    LzmaEncProps_Init(&props);
-+    LzmaEnc_SetProps(p, &props);
-+  }
-+
-+  #ifndef LZMA_LOG_BSR
-+  LzmaEnc_FastPosInit(p->g_FastPos);
-+  #endif
-+
-+  LzmaEnc_InitPriceTables(p->ProbPrices);
-+  p->litProbs = 0;
-+  p->saveState.litProbs = 0;
-+}
-+
-+CLzmaEncHandle LzmaEnc_Create(ISzAlloc *alloc)
-+{
-+  void *p;
-+  p = alloc->Alloc(alloc, sizeof(CLzmaEnc));
-+  if (p != 0)
-+    LzmaEnc_Construct((CLzmaEnc *)p);
-+  return p;
-+}
-+
-+void LzmaEnc_FreeLits(CLzmaEnc *p, ISzAlloc *alloc)
-+{
-+  alloc->Free(alloc, p->litProbs);
-+  alloc->Free(alloc, p->saveState.litProbs);
-+  p->litProbs = 0;
-+  p->saveState.litProbs = 0;
-+}
-+
-+void LzmaEnc_Destruct(CLzmaEnc *p, ISzAlloc *alloc, ISzAlloc *allocBig)
-+{
-+  #ifndef _7ZIP_ST
-+  MatchFinderMt_Destruct(&p->matchFinderMt, allocBig);
-+  #endif
-+  MatchFinder_Free(&p->matchFinderBase, allocBig);
-+  LzmaEnc_FreeLits(p, alloc);
-+  RangeEnc_Free(&p->rc, alloc);
-+}
-+
-+void LzmaEnc_Destroy(CLzmaEncHandle p, ISzAlloc *alloc, ISzAlloc *allocBig)
-+{
-+  LzmaEnc_Destruct((CLzmaEnc *)p, alloc, allocBig);
-+  alloc->Free(alloc, p);
-+}
-+
-+static SRes LzmaEnc_CodeOneBlock(CLzmaEnc *p, Bool useLimits, UInt32 maxPackSize, UInt32 maxUnpackSize)
-+{
-+  UInt32 nowPos32, startPos32;
-+  if (p->needInit)
-+  {
-+    p->matchFinder.Init(p->matchFinderObj);
-+    p->needInit = 0;
-+  }
-+
-+  if (p->finished)
-+    return p->result;
-+  RINOK(CheckErrors(p));
-+
-+  nowPos32 = (UInt32)p->nowPos64;
-+  startPos32 = nowPos32;
-+
-+  if (p->nowPos64 == 0)
-+  {
-+    UInt32 numPairs;
-+    Byte curByte;
-+    if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) == 0)
-+      return Flush(p, nowPos32);
-+    ReadMatchDistances(p, &numPairs);
-+    RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][0], 0);
-+    p->state = kLiteralNextStates[p->state];
-+    curByte = p->matchFinder.GetIndexByte(p->matchFinderObj, 0 - p->additionalOffset);
-+    LitEnc_Encode(&p->rc, p->litProbs, curByte);
-+    p->additionalOffset--;
-+    nowPos32++;
-+  }
-+
-+  if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) != 0)
-+  for (;;)
-+  {
-+    UInt32 pos, len, posState;
-+
-+    if (p->fastMode)
-+      len = GetOptimumFast(p, &pos);
-+    else
-+      len = GetOptimum(p, nowPos32, &pos);
-+
-+    #ifdef SHOW_STAT2
-+    printf("\n pos = %4X,   len = %d   pos = %d", nowPos32, len, pos);
-+    #endif
-+
-+    posState = nowPos32 & p->pbMask;
-+    if (len == 1 && pos == (UInt32)-1)
-+    {
-+      Byte curByte;
-+      CLzmaProb *probs;
-+      const Byte *data;
-+
-+      RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][posState], 0);
-+      data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - p->additionalOffset;
-+      curByte = *data;
-+      probs = LIT_PROBS(nowPos32, *(data - 1));
-+      if (IsCharState(p->state))
-+        LitEnc_Encode(&p->rc, probs, curByte);
-+      else
-+        LitEnc_EncodeMatched(&p->rc, probs, curByte, *(data - p->reps[0] - 1));
-+      p->state = kLiteralNextStates[p->state];
-+    }
-+    else
-+    {
-+      RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][posState], 1);
-+      if (pos < LZMA_NUM_REPS)
-+      {
-+        RangeEnc_EncodeBit(&p->rc, &p->isRep[p->state], 1);
-+        if (pos == 0)
-+        {
-+          RangeEnc_EncodeBit(&p->rc, &p->isRepG0[p->state], 0);
-+          RangeEnc_EncodeBit(&p->rc, &p->isRep0Long[p->state][posState], ((len == 1) ? 0 : 1));
-+        }
-+        else
-+        {
-+          UInt32 distance = p->reps[pos];
-+          RangeEnc_EncodeBit(&p->rc, &p->isRepG0[p->state], 1);
-+          if (pos == 1)
-+            RangeEnc_EncodeBit(&p->rc, &p->isRepG1[p->state], 0);
-+          else
-+          {
-+            RangeEnc_EncodeBit(&p->rc, &p->isRepG1[p->state], 1);
-+            RangeEnc_EncodeBit(&p->rc, &p->isRepG2[p->state], pos - 2);
-+            if (pos == 3)
-+              p->reps[3] = p->reps[2];
-+            p->reps[2] = p->reps[1];
-+          }
-+          p->reps[1] = p->reps[0];
-+          p->reps[0] = distance;
-+        }
-+        if (len == 1)
-+          p->state = kShortRepNextStates[p->state];
-+        else
-+        {
-+          LenEnc_Encode2(&p->repLenEnc, &p->rc, len - LZMA_MATCH_LEN_MIN, posState, !p->fastMode, p->ProbPrices);
-+          p->state = kRepNextStates[p->state];
-+        }
-+      }
-+      else
-+      {
-+        UInt32 posSlot;
-+        RangeEnc_EncodeBit(&p->rc, &p->isRep[p->state], 0);
-+        p->state = kMatchNextStates[p->state];
-+        LenEnc_Encode2(&p->lenEnc, &p->rc, len - LZMA_MATCH_LEN_MIN, posState, !p->fastMode, p->ProbPrices);
-+        pos -= LZMA_NUM_REPS;
-+        GetPosSlot(pos, posSlot);
-+        RcTree_Encode(&p->rc, p->posSlotEncoder[GetLenToPosState(len)], kNumPosSlotBits, posSlot);
-+        
-+        if (posSlot >= kStartPosModelIndex)
-+        {
-+          UInt32 footerBits = ((posSlot >> 1) - 1);
-+          UInt32 base = ((2 | (posSlot & 1)) << footerBits);
-+          UInt32 posReduced = pos - base;
-+
-+          if (posSlot < kEndPosModelIndex)
-+            RcTree_ReverseEncode(&p->rc, p->posEncoders + base - posSlot - 1, footerBits, posReduced);
-+          else
-+          {
-+            RangeEnc_EncodeDirectBits(&p->rc, posReduced >> kNumAlignBits, footerBits - kNumAlignBits);
-+            RcTree_ReverseEncode(&p->rc, p->posAlignEncoder, kNumAlignBits, posReduced & kAlignMask);
-+            p->alignPriceCount++;
-+          }
-+        }
-+        p->reps[3] = p->reps[2];
-+        p->reps[2] = p->reps[1];
-+        p->reps[1] = p->reps[0];
-+        p->reps[0] = pos;
-+        p->matchPriceCount++;
-+      }
-+    }
-+    p->additionalOffset -= len;
-+    nowPos32 += len;
-+    if (p->additionalOffset == 0)
-+    {
-+      UInt32 processed;
-+      if (!p->fastMode)
-+      {
-+        if (p->matchPriceCount >= (1 << 7))
-+          FillDistancesPrices(p);
-+        if (p->alignPriceCount >= kAlignTableSize)
-+          FillAlignPrices(p);
-+      }
-+      if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) == 0)
-+        break;
-+      processed = nowPos32 - startPos32;
-+      if (useLimits)
-+      {
-+        if (processed + kNumOpts + 300 >= maxUnpackSize ||
-+            RangeEnc_GetProcessed(&p->rc) + kNumOpts * 2 >= maxPackSize)
-+          break;
-+      }
-+      else if (processed >= (1 << 15))
-+      {
-+        p->nowPos64 += nowPos32 - startPos32;
-+        return CheckErrors(p);
-+      }
-+    }
-+  }
-+  p->nowPos64 += nowPos32 - startPos32;
-+  return Flush(p, nowPos32);
-+}
-+
-+#define kBigHashDicLimit ((UInt32)1 << 24)
-+
-+static SRes LzmaEnc_Alloc(CLzmaEnc *p, UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig)
-+{
-+  UInt32 beforeSize = kNumOpts;
-+  Bool btMode;
-+  if (!RangeEnc_Alloc(&p->rc, alloc))
-+    return SZ_ERROR_MEM;
-+  btMode = (p->matchFinderBase.btMode != 0);
-+  #ifndef _7ZIP_ST
-+  p->mtMode = (p->multiThread && !p->fastMode && btMode);
-+  #endif
-+
-+  {
-+    unsigned lclp = p->lc + p->lp;
-+    if (p->litProbs == 0 || p->saveState.litProbs == 0 || p->lclp != lclp)
-+    {
-+      LzmaEnc_FreeLits(p, alloc);
-+      p->litProbs = (CLzmaProb *)alloc->Alloc(alloc, (0x300 << lclp) * sizeof(CLzmaProb));
-+      p->saveState.litProbs = (CLzmaProb *)alloc->Alloc(alloc, (0x300 << lclp) * sizeof(CLzmaProb));
-+      if (p->litProbs == 0 || p->saveState.litProbs == 0)
-+      {
-+        LzmaEnc_FreeLits(p, alloc);
-+        return SZ_ERROR_MEM;
-+      }
-+      p->lclp = lclp;
-+    }
-+  }
-+
-+  p->matchFinderBase.bigHash = (p->dictSize > kBigHashDicLimit);
-+
-+  if (beforeSize + p->dictSize < keepWindowSize)
-+    beforeSize = keepWindowSize - p->dictSize;
-+
-+  #ifndef _7ZIP_ST
-+  if (p->mtMode)
-+  {
-+    RINOK(MatchFinderMt_Create(&p->matchFinderMt, p->dictSize, beforeSize, p->numFastBytes, LZMA_MATCH_LEN_MAX, allocBig));
-+    p->matchFinderObj = &p->matchFinderMt;
-+    MatchFinderMt_CreateVTable(&p->matchFinderMt, &p->matchFinder);
-+  }
-+  else
-+  #endif
-+  {
-+    if (!MatchFinder_Create(&p->matchFinderBase, p->dictSize, beforeSize, p->numFastBytes, LZMA_MATCH_LEN_MAX, allocBig))
-+      return SZ_ERROR_MEM;
-+    p->matchFinderObj = &p->matchFinderBase;
-+    MatchFinder_CreateVTable(&p->matchFinderBase, &p->matchFinder);
-+  }
-+  return SZ_OK;
-+}
-+
-+void LzmaEnc_Init(CLzmaEnc *p)
-+{
-+  UInt32 i;
-+  p->state = 0;
-+  for (i = 0 ; i < LZMA_NUM_REPS; i++)
-+    p->reps[i] = 0;
-+
-+  RangeEnc_Init(&p->rc);
-+
-+
-+  for (i = 0; i < kNumStates; i++)
-+  {
-+    UInt32 j;
-+    for (j = 0; j < LZMA_NUM_PB_STATES_MAX; j++)
-+    {
-+      p->isMatch[i][j] = kProbInitValue;
-+      p->isRep0Long[i][j] = kProbInitValue;
-+    }
-+    p->isRep[i] = kProbInitValue;
-+    p->isRepG0[i] = kProbInitValue;
-+    p->isRepG1[i] = kProbInitValue;
-+    p->isRepG2[i] = kProbInitValue;
-+  }
-+
-+  {
-+    UInt32 num = 0x300 << (p->lp + p->lc);
-+    for (i = 0; i < num; i++)
-+      p->litProbs[i] = kProbInitValue;
-+  }
-+
-+  {
-+    for (i = 0; i < kNumLenToPosStates; i++)
-+    {
-+      CLzmaProb *probs = p->posSlotEncoder[i];
-+      UInt32 j;
-+      for (j = 0; j < (1 << kNumPosSlotBits); j++)
-+        probs[j] = kProbInitValue;
-+    }
-+  }
-+  {
-+    for (i = 0; i < kNumFullDistances - kEndPosModelIndex; i++)
-+      p->posEncoders[i] = kProbInitValue;
-+  }
-+
-+  LenEnc_Init(&p->lenEnc.p);
-+  LenEnc_Init(&p->repLenEnc.p);
-+
-+  for (i = 0; i < (1 << kNumAlignBits); i++)
-+    p->posAlignEncoder[i] = kProbInitValue;
-+
-+  p->optimumEndIndex = 0;
-+  p->optimumCurrentIndex = 0;
-+  p->additionalOffset = 0;
-+
-+  p->pbMask = (1 << p->pb) - 1;
-+  p->lpMask = (1 << p->lp) - 1;
-+}
-+
-+void LzmaEnc_InitPrices(CLzmaEnc *p)
-+{
-+  if (!p->fastMode)
-+  {
-+    FillDistancesPrices(p);
-+    FillAlignPrices(p);
-+  }
-+
-+  p->lenEnc.tableSize =
-+  p->repLenEnc.tableSize =
-+      p->numFastBytes + 1 - LZMA_MATCH_LEN_MIN;
-+  LenPriceEnc_UpdateTables(&p->lenEnc, 1 << p->pb, p->ProbPrices);
-+  LenPriceEnc_UpdateTables(&p->repLenEnc, 1 << p->pb, p->ProbPrices);
-+}
-+
-+static SRes LzmaEnc_AllocAndInit(CLzmaEnc *p, UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig)
-+{
-+  UInt32 i;
-+  for (i = 0; i < (UInt32)kDicLogSizeMaxCompress; i++)
-+    if (p->dictSize <= ((UInt32)1 << i))
-+      break;
-+  p->distTableSize = i * 2;
-+
-+  p->finished = False;
-+  p->result = SZ_OK;
-+  RINOK(LzmaEnc_Alloc(p, keepWindowSize, alloc, allocBig));
-+  LzmaEnc_Init(p);
-+  LzmaEnc_InitPrices(p);
-+  p->nowPos64 = 0;
-+  return SZ_OK;
-+}
-+
-+static SRes LzmaEnc_Prepare(CLzmaEncHandle pp, ISeqOutStream *outStream, ISeqInStream *inStream,
-+    ISzAlloc *alloc, ISzAlloc *allocBig)
-+{
-+  CLzmaEnc *p = (CLzmaEnc *)pp;
-+  p->matchFinderBase.stream = inStream;
-+  p->needInit = 1;
-+  p->rc.outStream = outStream;
-+  return LzmaEnc_AllocAndInit(p, 0, alloc, allocBig);
-+}
-+
-+SRes LzmaEnc_PrepareForLzma2(CLzmaEncHandle pp,
-+    ISeqInStream *inStream, UInt32 keepWindowSize,
-+    ISzAlloc *alloc, ISzAlloc *allocBig)
-+{
-+  CLzmaEnc *p = (CLzmaEnc *)pp;
-+  p->matchFinderBase.stream = inStream;
-+  p->needInit = 1;
-+  return LzmaEnc_AllocAndInit(p, keepWindowSize, alloc, allocBig);
-+}
-+
-+static void LzmaEnc_SetInputBuf(CLzmaEnc *p, const Byte *src, SizeT srcLen)
-+{
-+  p->matchFinderBase.directInput = 1;
-+  p->matchFinderBase.bufferBase = (Byte *)src;
-+  p->matchFinderBase.directInputRem = srcLen;
-+}
-+
-+SRes LzmaEnc_MemPrepare(CLzmaEncHandle pp, const Byte *src, SizeT srcLen,
-+    UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig)
-+{
-+  CLzmaEnc *p = (CLzmaEnc *)pp;
-+  LzmaEnc_SetInputBuf(p, src, srcLen);
-+  p->needInit = 1;
-+
-+  return LzmaEnc_AllocAndInit(p, keepWindowSize, alloc, allocBig);
-+}
-+
-+void LzmaEnc_Finish(CLzmaEncHandle pp)
-+{
-+  #ifndef _7ZIP_ST
-+  CLzmaEnc *p = (CLzmaEnc *)pp;
-+  if (p->mtMode)
-+    MatchFinderMt_ReleaseStream(&p->matchFinderMt);
-+  #else
-+  pp = pp;
-+  #endif
-+}
-+
-+typedef struct
-+{
-+  ISeqOutStream funcTable;
-+  Byte *data;
-+  SizeT rem;
-+  Bool overflow;
-+} CSeqOutStreamBuf;
-+
-+static size_t MyWrite(void *pp, const void *data, size_t size)
-+{
-+  CSeqOutStreamBuf *p = (CSeqOutStreamBuf *)pp;
-+  if (p->rem < size)
-+  {
-+    size = p->rem;
-+    p->overflow = True;
-+  }
-+  memcpy(p->data, data, size);
-+  p->rem -= size;
-+  p->data += size;
-+  return size;
-+}
-+
-+
-+UInt32 LzmaEnc_GetNumAvailableBytes(CLzmaEncHandle pp)
-+{
-+  const CLzmaEnc *p = (CLzmaEnc *)pp;
-+  return p->matchFinder.GetNumAvailableBytes(p->matchFinderObj);
-+}
-+
-+const Byte *LzmaEnc_GetCurBuf(CLzmaEncHandle pp)
-+{
-+  const CLzmaEnc *p = (CLzmaEnc *)pp;
-+  return p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - p->additionalOffset;
-+}
-+
-+SRes LzmaEnc_CodeOneMemBlock(CLzmaEncHandle pp, Bool reInit,
-+    Byte *dest, size_t *destLen, UInt32 desiredPackSize, UInt32 *unpackSize)
-+{
-+  CLzmaEnc *p = (CLzmaEnc *)pp;
-+  UInt64 nowPos64;
-+  SRes res;
-+  CSeqOutStreamBuf outStream;
-+
-+  outStream.funcTable.Write = MyWrite;
-+  outStream.data = dest;
-+  outStream.rem = *destLen;
-+  outStream.overflow = False;
-+
-+  p->writeEndMark = False;
-+  p->finished = False;
-+  p->result = SZ_OK;
-+
-+  if (reInit)
-+    LzmaEnc_Init(p);
-+  LzmaEnc_InitPrices(p);
-+  nowPos64 = p->nowPos64;
-+  RangeEnc_Init(&p->rc);
-+  p->rc.outStream = &outStream.funcTable;
-+
-+  res = LzmaEnc_CodeOneBlock(p, True, desiredPackSize, *unpackSize);
-+  
-+  *unpackSize = (UInt32)(p->nowPos64 - nowPos64);
-+  *destLen -= outStream.rem;
-+  if (outStream.overflow)
-+    return SZ_ERROR_OUTPUT_EOF;
-+
-+  return res;
-+}
-+
-+static SRes LzmaEnc_Encode2(CLzmaEnc *p, ICompressProgress *progress)
-+{
-+  SRes res = SZ_OK;
-+
-+  #ifndef _7ZIP_ST
-+  Byte allocaDummy[0x300];
-+  int i = 0;
-+  for (i = 0; i < 16; i++)
-+    allocaDummy[i] = (Byte)i;
-+  #endif
-+
-+  for (;;)
-+  {
-+    res = LzmaEnc_CodeOneBlock(p, False, 0, 0);
-+    if (res != SZ_OK || p->finished != 0)
-+      break;
-+    if (progress != 0)
-+    {
-+      res = progress->Progress(progress, p->nowPos64, RangeEnc_GetProcessed(&p->rc));
-+      if (res != SZ_OK)
-+      {
-+        res = SZ_ERROR_PROGRESS;
-+        break;
-+      }
-+    }
-+  }
-+  LzmaEnc_Finish(p);
-+  return res;
-+}
-+
-+SRes LzmaEnc_Encode(CLzmaEncHandle pp, ISeqOutStream *outStream, ISeqInStream *inStream, ICompressProgress *progress,
-+    ISzAlloc *alloc, ISzAlloc *allocBig)
-+{
-+  RINOK(LzmaEnc_Prepare(pp, outStream, inStream, alloc, allocBig));
-+  return LzmaEnc_Encode2((CLzmaEnc *)pp, progress);
-+}
-+
-+SRes LzmaEnc_WriteProperties(CLzmaEncHandle pp, Byte *props, SizeT *size)
-+{
-+  CLzmaEnc *p = (CLzmaEnc *)pp;
-+  int i;
-+  UInt32 dictSize = p->dictSize;
-+  if (*size < LZMA_PROPS_SIZE)
-+    return SZ_ERROR_PARAM;
-+  *size = LZMA_PROPS_SIZE;
-+  props[0] = (Byte)((p->pb * 5 + p->lp) * 9 + p->lc);
-+
-+  for (i = 11; i <= 30; i++)
-+  {
-+    if (dictSize <= ((UInt32)2 << i))
-+    {
-+      dictSize = (2 << i);
-+      break;
-+    }
-+    if (dictSize <= ((UInt32)3 << i))
-+    {
-+      dictSize = (3 << i);
-+      break;
-+    }
-+  }
-+
-+  for (i = 0; i < 4; i++)
-+    props[1 + i] = (Byte)(dictSize >> (8 * i));
-+  return SZ_OK;
-+}
-+
-+SRes LzmaEnc_MemEncode(CLzmaEncHandle pp, Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen,
-+    int writeEndMark, ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig)
-+{
-+  SRes res;
-+  CLzmaEnc *p = (CLzmaEnc *)pp;
-+
-+  CSeqOutStreamBuf outStream;
-+
-+  LzmaEnc_SetInputBuf(p, src, srcLen);
-+
-+  outStream.funcTable.Write = MyWrite;
-+  outStream.data = dest;
-+  outStream.rem = *destLen;
-+  outStream.overflow = False;
-+
-+  p->writeEndMark = writeEndMark;
-+
-+  p->rc.outStream = &outStream.funcTable;
-+  res = LzmaEnc_MemPrepare(pp, src, srcLen, 0, alloc, allocBig);
-+  if (res == SZ_OK)
-+    res = LzmaEnc_Encode2(p, progress);
-+
-+  *destLen -= outStream.rem;
-+  if (outStream.overflow)
-+    return SZ_ERROR_OUTPUT_EOF;
-+  return res;
-+}
-+
-+SRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen,
-+    const CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark,
-+    ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig)
-+{
-+  CLzmaEnc *p = (CLzmaEnc *)LzmaEnc_Create(alloc);
-+  SRes res;
-+  if (p == 0)
-+    return SZ_ERROR_MEM;
-+
-+  res = LzmaEnc_SetProps(p, props);
-+  if (res == SZ_OK)
-+  {
-+    res = LzmaEnc_WriteProperties(p, propsEncoded, propsSize);
-+    if (res == SZ_OK)
-+      res = LzmaEnc_MemEncode(p, dest, destLen, src, srcLen,
-+          writeEndMark, progress, alloc, allocBig);
-+  }
-+
-+  LzmaEnc_Destroy(p, alloc, allocBig);
-+  return res;
-+}
---- /dev/null
-+++ b/lib/lzma/Makefile
-@@ -0,0 +1,7 @@
-+lzma_compress-objs := LzFind.o LzmaEnc.o
-+lzma_decompress-objs := LzmaDec.o
-+
-+obj-$(CONFIG_LZMA_COMPRESS) += lzma_compress.o
-+obj-$(CONFIG_LZMA_DECOMPRESS) += lzma_decompress.o
-+
-+EXTRA_CFLAGS += -Iinclude/linux -Iinclude/linux/lzma -include types.h
diff --git a/target/linux/generic/patches-2.6.37/009-decompress_unlzo_fix.patch b/target/linux/generic/patches-2.6.37/009-decompress_unlzo_fix.patch
deleted file mode 100644 (file)
index 37e322a..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
---- /dev/null
-+++ b/include/linux/decompress/unlzo_mm.h
-@@ -0,0 +1,10 @@
-+#ifndef UNLZO_MM_H
-+#define UNLZO_MM_H
-+
-+#ifdef STATIC
-+#define INIT
-+#else
-+#define INIT __init
-+#endif
-+
-+#endif
---- a/lib/decompress_unlzo.c
-+++ b/lib/decompress_unlzo.c
-@@ -39,6 +39,7 @@
- #include <linux/types.h>
- #include <linux/lzo.h>
-+#include <linux/decompress/unlzo_mm.h>
- #include <linux/decompress/mm.h>
- #include <linux/compiler.h>
diff --git a/target/linux/generic/patches-2.6.37/010-debloat_lzma.patch b/target/linux/generic/patches-2.6.37/010-debloat_lzma.patch
deleted file mode 100644 (file)
index 1e41661..0000000
+++ /dev/null
@@ -1,485 +0,0 @@
---- a/include/linux/lzma/LzmaDec.h
-+++ b/include/linux/lzma/LzmaDec.h
-@@ -31,14 +31,6 @@ typedef struct _CLzmaProps
-   UInt32 dicSize;
- } CLzmaProps;
--/* LzmaProps_Decode - decodes properties
--Returns:
--  SZ_OK
--  SZ_ERROR_UNSUPPORTED - Unsupported properties
--*/
--
--SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size);
--
- /* ---------- LZMA Decoder state ---------- */
-@@ -70,8 +62,6 @@ typedef struct
- #define LzmaDec_Construct(p) { (p)->dic = 0; (p)->probs = 0; }
--void LzmaDec_Init(CLzmaDec *p);
--
- /* There are two types of LZMA streams:
-      0) Stream with end mark. That end mark adds about 6 bytes to compressed size.
-      1) Stream without end mark. You must know exact uncompressed size to decompress such stream. */
-@@ -108,97 +98,6 @@ typedef enum
- /* ELzmaStatus is used only as output value for function call */
--
--/* ---------- Interfaces ---------- */
--
--/* There are 3 levels of interfaces:
--     1) Dictionary Interface
--     2) Buffer Interface
--     3) One Call Interface
--   You can select any of these interfaces, but don't mix functions from different
--   groups for same object. */
--
--
--/* There are two variants to allocate state for Dictionary Interface:
--     1) LzmaDec_Allocate / LzmaDec_Free
--     2) LzmaDec_AllocateProbs / LzmaDec_FreeProbs
--   You can use variant 2, if you set dictionary buffer manually.
--   For Buffer Interface you must always use variant 1.
--
--LzmaDec_Allocate* can return:
--  SZ_OK
--  SZ_ERROR_MEM         - Memory allocation error
--  SZ_ERROR_UNSUPPORTED - Unsupported properties
--*/
--   
--SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc);
--void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc);
--
--SRes LzmaDec_Allocate(CLzmaDec *state, const Byte *prop, unsigned propsSize, ISzAlloc *alloc);
--void LzmaDec_Free(CLzmaDec *state, ISzAlloc *alloc);
--
--/* ---------- Dictionary Interface ---------- */
--
--/* You can use it, if you want to eliminate the overhead for data copying from
--   dictionary to some other external buffer.
--   You must work with CLzmaDec variables directly in this interface.
--
--   STEPS:
--     LzmaDec_Constr()
--     LzmaDec_Allocate()
--     for (each new stream)
--     {
--       LzmaDec_Init()
--       while (it needs more decompression)
--       {
--         LzmaDec_DecodeToDic()
--         use data from CLzmaDec::dic and update CLzmaDec::dicPos
--       }
--     }
--     LzmaDec_Free()
--*/
--
--/* LzmaDec_DecodeToDic
--   
--   The decoding to internal dictionary buffer (CLzmaDec::dic).
--   You must manually update CLzmaDec::dicPos, if it reaches CLzmaDec::dicBufSize !!!
--
--finishMode:
--  It has meaning only if the decoding reaches output limit (dicLimit).
--  LZMA_FINISH_ANY - Decode just dicLimit bytes.
--  LZMA_FINISH_END - Stream must be finished after dicLimit.
--
--Returns:
--  SZ_OK
--    status:
--      LZMA_STATUS_FINISHED_WITH_MARK
--      LZMA_STATUS_NOT_FINISHED
--      LZMA_STATUS_NEEDS_MORE_INPUT
--      LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK
--  SZ_ERROR_DATA - Data error
--*/
--
--SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit,
--    const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status);
--
--
--/* ---------- Buffer Interface ---------- */
--
--/* It's zlib-like interface.
--   See LzmaDec_DecodeToDic description for information about STEPS and return results,
--   but you must use LzmaDec_DecodeToBuf instead of LzmaDec_DecodeToDic and you don't need
--   to work with CLzmaDec variables manually.
--
--finishMode:
--  It has meaning only if the decoding reaches output limit (*destLen).
--  LZMA_FINISH_ANY - Decode just destLen bytes.
--  LZMA_FINISH_END - Stream must be finished after (*destLen).
--*/
--
--SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen,
--    const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status);
--
--
- /* ---------- One Call Interface ---------- */
- /* LzmaDecode
---- a/lib/lzma/LzmaDec.c
-+++ b/lib/lzma/LzmaDec.c
-@@ -682,7 +682,7 @@ static void LzmaDec_InitRc(CLzmaDec *p,
-   p->needFlush = 0;
- }
--void LzmaDec_InitDicAndState(CLzmaDec *p, Bool initDic, Bool initState)
-+static void LzmaDec_InitDicAndState(CLzmaDec *p, Bool initDic, Bool initState)
- {
-   p->needFlush = 1;
-   p->remainLen = 0;
-@@ -698,7 +698,7 @@ void LzmaDec_InitDicAndState(CLzmaDec *p
-     p->needInitState = 1;
- }
--void LzmaDec_Init(CLzmaDec *p)
-+static void LzmaDec_Init(CLzmaDec *p)
- {
-   p->dicPos = 0;
-   LzmaDec_InitDicAndState(p, True, True);
-@@ -716,7 +716,7 @@ static void LzmaDec_InitStateReal(CLzmaD
-   p->needInitState = 0;
- }
--SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, const Byte *src, SizeT *srcLen,
-+static SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, const Byte *src, SizeT *srcLen,
-     ELzmaFinishMode finishMode, ELzmaStatus *status)
- {
-   SizeT inSize = *srcLen;
-@@ -837,7 +837,7 @@ SRes LzmaDec_DecodeToDic(CLzmaDec *p, Si
-   return (p->code == 0) ? SZ_OK : SZ_ERROR_DATA;
- }
--SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status)
-+static __maybe_unused SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status)
- {
-   SizeT outSize = *destLen;
-   SizeT inSize = *srcLen;
-@@ -877,7 +877,7 @@ SRes LzmaDec_DecodeToBuf(CLzmaDec *p, By
-   }
- }
--void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc)
-+static void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc)
- {
-   alloc->Free(alloc, p->probs);
-   p->probs = 0;
-@@ -889,13 +889,13 @@ static void LzmaDec_FreeDict(CLzmaDec *p
-   p->dic = 0;
- }
--void LzmaDec_Free(CLzmaDec *p, ISzAlloc *alloc)
-+static void __maybe_unused LzmaDec_Free(CLzmaDec *p, ISzAlloc *alloc)
- {
-   LzmaDec_FreeProbs(p, alloc);
-   LzmaDec_FreeDict(p, alloc);
- }
--SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size)
-+static SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size)
- {
-   UInt32 dicSize;
-   Byte d;
-@@ -935,7 +935,7 @@ static SRes LzmaDec_AllocateProbs2(CLzma
-   return SZ_OK;
- }
--SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc)
-+static SRes __maybe_unused LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc)
- {
-   CLzmaProps propNew;
-   RINOK(LzmaProps_Decode(&propNew, props, propsSize));
-@@ -944,7 +944,7 @@ SRes LzmaDec_AllocateProbs(CLzmaDec *p,
-   return SZ_OK;
- }
--SRes LzmaDec_Allocate(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc)
-+static SRes __maybe_unused LzmaDec_Allocate(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc)
- {
-   CLzmaProps propNew;
-   SizeT dicBufSize;
---- a/include/linux/lzma/LzmaEnc.h
-+++ b/include/linux/lzma/LzmaEnc.h
-@@ -31,9 +31,6 @@ typedef struct _CLzmaEncProps
- } CLzmaEncProps;
- void LzmaEncProps_Init(CLzmaEncProps *p);
--void LzmaEncProps_Normalize(CLzmaEncProps *p);
--UInt32 LzmaEncProps_GetDictSize(const CLzmaEncProps *props2);
--
- /* ---------- CLzmaEncHandle Interface ---------- */
-@@ -53,26 +50,9 @@ CLzmaEncHandle LzmaEnc_Create(ISzAlloc *
- void LzmaEnc_Destroy(CLzmaEncHandle p, ISzAlloc *alloc, ISzAlloc *allocBig);
- SRes LzmaEnc_SetProps(CLzmaEncHandle p, const CLzmaEncProps *props);
- SRes LzmaEnc_WriteProperties(CLzmaEncHandle p, Byte *properties, SizeT *size);
--SRes LzmaEnc_Encode(CLzmaEncHandle p, ISeqOutStream *outStream, ISeqInStream *inStream,
--    ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig);
- SRes LzmaEnc_MemEncode(CLzmaEncHandle p, Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen,
-     int writeEndMark, ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig);
--/* ---------- One Call Interface ---------- */
--
--/* LzmaEncode
--Return code:
--  SZ_OK               - OK
--  SZ_ERROR_MEM        - Memory allocation error
--  SZ_ERROR_PARAM      - Incorrect paramater
--  SZ_ERROR_OUTPUT_EOF - output buffer overflow
--  SZ_ERROR_THREAD     - errors in multithreading functions (only for Mt version)
--*/
--
--SRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen,
--    const CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark,
--    ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig);
--
- #ifdef __cplusplus
- }
- #endif
---- a/lib/lzma/LzmaEnc.c
-+++ b/lib/lzma/LzmaEnc.c
-@@ -53,7 +53,7 @@ void LzmaEncProps_Init(CLzmaEncProps *p)
-   p->writeEndMark = 0;
- }
--void LzmaEncProps_Normalize(CLzmaEncProps *p)
-+static void LzmaEncProps_Normalize(CLzmaEncProps *p)
- {
-   int level = p->level;
-   if (level < 0) level = 5;
-@@ -76,7 +76,7 @@ void LzmaEncProps_Normalize(CLzmaEncProp
-       #endif
- }
--UInt32 LzmaEncProps_GetDictSize(const CLzmaEncProps *props2)
-+static UInt32 __maybe_unused LzmaEncProps_GetDictSize(const CLzmaEncProps *props2)
- {
-   CLzmaEncProps props = *props2;
-   LzmaEncProps_Normalize(&props);
-@@ -93,7 +93,7 @@ UInt32 LzmaEncProps_GetDictSize(const CL
- #define BSR2_RET(pos, res) { unsigned long i; _BitScanReverse(&i, (pos)); res = (i + i) + ((pos >> (i - 1)) & 1); }
--UInt32 GetPosSlot1(UInt32 pos)
-+static UInt32 GetPosSlot1(UInt32 pos)
- {
-   UInt32 res;
-   BSR2_RET(pos, res);
-@@ -107,7 +107,7 @@ UInt32 GetPosSlot1(UInt32 pos)
- #define kNumLogBits (9 + (int)sizeof(size_t) / 2)
- #define kDicLogSizeMaxCompress ((kNumLogBits - 1) * 2 + 7)
--void LzmaEnc_FastPosInit(Byte *g_FastPos)
-+static void LzmaEnc_FastPosInit(Byte *g_FastPos)
- {
-   int c = 2, slotFast;
-   g_FastPos[0] = 0;
-@@ -339,7 +339,7 @@ typedef struct
-   CSaveState saveState;
- } CLzmaEnc;
--void LzmaEnc_SaveState(CLzmaEncHandle pp)
-+static void __maybe_unused LzmaEnc_SaveState(CLzmaEncHandle pp)
- {
-   CLzmaEnc *p = (CLzmaEnc *)pp;
-   CSaveState *dest = &p->saveState;
-@@ -365,7 +365,7 @@ void LzmaEnc_SaveState(CLzmaEncHandle pp
-   memcpy(dest->litProbs, p->litProbs, (0x300 << p->lclp) * sizeof(CLzmaProb));
- }
--void LzmaEnc_RestoreState(CLzmaEncHandle pp)
-+static void __maybe_unused LzmaEnc_RestoreState(CLzmaEncHandle pp)
- {
-   CLzmaEnc *dest = (CLzmaEnc *)pp;
-   const CSaveState *p = &dest->saveState;
-@@ -600,7 +600,7 @@ static void LitEnc_EncodeMatched(CRangeE
-   while (symbol < 0x10000);
- }
--void LzmaEnc_InitPriceTables(UInt32 *ProbPrices)
-+static void LzmaEnc_InitPriceTables(UInt32 *ProbPrices)
- {
-   UInt32 i;
-   for (i = (1 << kNumMoveReducingBits) / 2; i < kBitModelTotal; i += (1 << kNumMoveReducingBits))
-@@ -1676,7 +1676,7 @@ static void FillDistancesPrices(CLzmaEnc
-   p->matchPriceCount = 0;
- }
--void LzmaEnc_Construct(CLzmaEnc *p)
-+static void LzmaEnc_Construct(CLzmaEnc *p)
- {
-   RangeEnc_Construct(&p->rc);
-   MatchFinder_Construct(&p->matchFinderBase);
-@@ -1709,7 +1709,7 @@ CLzmaEncHandle LzmaEnc_Create(ISzAlloc *
-   return p;
- }
--void LzmaEnc_FreeLits(CLzmaEnc *p, ISzAlloc *alloc)
-+static void LzmaEnc_FreeLits(CLzmaEnc *p, ISzAlloc *alloc)
- {
-   alloc->Free(alloc, p->litProbs);
-   alloc->Free(alloc, p->saveState.litProbs);
-@@ -2074,7 +2074,7 @@ SRes LzmaEnc_MemPrepare(CLzmaEncHandle p
-   return LzmaEnc_AllocAndInit(p, keepWindowSize, alloc, allocBig);
- }
--void LzmaEnc_Finish(CLzmaEncHandle pp)
-+static void LzmaEnc_Finish(CLzmaEncHandle pp)
- {
-   #ifndef _7ZIP_ST
-   CLzmaEnc *p = (CLzmaEnc *)pp;
-@@ -2108,7 +2108,7 @@ static size_t MyWrite(void *pp, const vo
- }
--UInt32 LzmaEnc_GetNumAvailableBytes(CLzmaEncHandle pp)
-+static UInt32 __maybe_unused LzmaEnc_GetNumAvailableBytes(CLzmaEncHandle pp)
- {
-   const CLzmaEnc *p = (CLzmaEnc *)pp;
-   return p->matchFinder.GetNumAvailableBytes(p->matchFinderObj);
-@@ -2120,7 +2120,7 @@ const Byte *LzmaEnc_GetCurBuf(CLzmaEncHa
-   return p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - p->additionalOffset;
- }
--SRes LzmaEnc_CodeOneMemBlock(CLzmaEncHandle pp, Bool reInit,
-+static SRes __maybe_unused LzmaEnc_CodeOneMemBlock(CLzmaEncHandle pp, Bool reInit,
-     Byte *dest, size_t *destLen, UInt32 desiredPackSize, UInt32 *unpackSize)
- {
-   CLzmaEnc *p = (CLzmaEnc *)pp;
-@@ -2248,7 +2248,7 @@ SRes LzmaEnc_MemEncode(CLzmaEncHandle pp
-   return res;
- }
--SRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen,
-+static __maybe_unused SRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen,
-     const CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark,
-     ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig)
- {
---- a/include/linux/lzma/LzFind.h
-+++ b/include/linux/lzma/LzFind.h
-@@ -55,11 +55,6 @@ typedef struct _CMatchFinder
- #define Inline_MatchFinder_GetNumAvailableBytes(p) ((p)->streamPos - (p)->pos)
--int MatchFinder_NeedMove(CMatchFinder *p);
--Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p);
--void MatchFinder_MoveBlock(CMatchFinder *p);
--void MatchFinder_ReadIfRequired(CMatchFinder *p);
--
- void MatchFinder_Construct(CMatchFinder *p);
- /* Conditions:
-@@ -70,12 +65,6 @@ int MatchFinder_Create(CMatchFinder *p,
-     UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter,
-     ISzAlloc *alloc);
- void MatchFinder_Free(CMatchFinder *p, ISzAlloc *alloc);
--void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, UInt32 numItems);
--void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue);
--
--UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *buffer, CLzRef *son,
--    UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 _cutValue,
--    UInt32 *distances, UInt32 maxLen);
- /*
- Conditions:
-@@ -102,12 +91,6 @@ typedef struct _IMatchFinder
- void MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder *vTable);
--void MatchFinder_Init(CMatchFinder *p);
--UInt32 Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances);
--UInt32 Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances);
--void Bt3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num);
--void Hc3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num);
--
- #ifdef __cplusplus
- }
- #endif
---- a/lib/lzma/LzFind.c
-+++ b/lib/lzma/LzFind.c
-@@ -42,12 +42,12 @@ static int LzInWindow_Create(CMatchFinde
-   return (p->bufferBase != 0);
- }
--Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p) { return p->buffer; }
--Byte MatchFinder_GetIndexByte(CMatchFinder *p, Int32 index) { return p->buffer[index]; }
-+static Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p) { return p->buffer; }
-+static Byte MatchFinder_GetIndexByte(CMatchFinder *p, Int32 index) { return p->buffer[index]; }
--UInt32 MatchFinder_GetNumAvailableBytes(CMatchFinder *p) { return p->streamPos - p->pos; }
-+static UInt32 MatchFinder_GetNumAvailableBytes(CMatchFinder *p) { return p->streamPos - p->pos; }
--void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue)
-+static void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue)
- {
-   p->posLimit -= subValue;
-   p->pos -= subValue;
-@@ -268,7 +268,7 @@ static void MatchFinder_SetLimits(CMatch
-   p->posLimit = p->pos + limit;
- }
--void MatchFinder_Init(CMatchFinder *p)
-+static void MatchFinder_Init(CMatchFinder *p)
- {
-   UInt32 i;
-   for (i = 0; i < p->hashSizeSum; i++)
-@@ -287,7 +287,7 @@ static UInt32 MatchFinder_GetSubValue(CM
-   return (p->pos - p->historySize - 1) & kNormalizeMask;
- }
--void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, UInt32 numItems)
-+static void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, UInt32 numItems)
- {
-   UInt32 i;
-   for (i = 0; i < numItems; i++)
-@@ -350,7 +350,7 @@ static UInt32 * Hc_GetMatchesSpec(UInt32
-   }
- }
--UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son,
-+static UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son,
-     UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue,
-     UInt32 *distances, UInt32 maxLen)
- {
-@@ -492,7 +492,7 @@ static UInt32 Bt2_MatchFinder_GetMatches
-   GET_MATCHES_FOOTER(offset, 1)
- }
--UInt32 Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
-+static __maybe_unused UInt32 Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
- {
-   UInt32 offset;
-   GET_MATCHES_HEADER(3)
-@@ -632,7 +632,7 @@ static UInt32 Hc4_MatchFinder_GetMatches
-   MOVE_POS_RET
- }
--UInt32 Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
-+static __maybe_unused UInt32 Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
- {
-   UInt32 offset;
-   GET_MATCHES_HEADER(3)
-@@ -657,7 +657,7 @@ static void Bt2_MatchFinder_Skip(CMatchF
-   while (--num != 0);
- }
--void Bt3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
-+static __maybe_unused void Bt3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
- {
-   do
-   {
-@@ -718,7 +718,7 @@ static void Hc4_MatchFinder_Skip(CMatchF
-   while (--num != 0);
- }
--void Hc3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
-+static __maybe_unused void Hc3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
- {
-   do
-   {
diff --git a/target/linux/generic/patches-2.6.37/010-gcc4_inline_fix.patch b/target/linux/generic/patches-2.6.37/010-gcc4_inline_fix.patch
new file mode 100644 (file)
index 0000000..77ab405
--- /dev/null
@@ -0,0 +1,11 @@
+--- a/arch/mips/include/asm/system.h
++++ b/arch/mips/include/asm/system.h
+@@ -194,7 +194,7 @@ extern __u64 __xchg_u64_unsupported_on_3
+ #define __xchg_u64 __xchg_u64_unsupported_on_32bit_kernels
+ #endif
+-static inline unsigned long __xchg(unsigned long x, volatile void * ptr, int size)
++static __always_inline unsigned long __xchg(unsigned long x, volatile void * ptr, int size)
+ {
+       switch (size) {
+       case 4:
diff --git a/target/linux/generic/patches-2.6.37/011-mips_boot.patch b/target/linux/generic/patches-2.6.37/011-mips_boot.patch
deleted file mode 100644 (file)
index c2a043a..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
---- a/arch/mips/kernel/head.S
-+++ b/arch/mips/kernel/head.S
-@@ -121,6 +121,8 @@
- #endif
-       .endm
-+      j kernel_entry
-+      nop
- #ifndef CONFIG_NO_EXCEPT_FILL
-       /*
-        * Reserved space for exception handlers.
diff --git a/target/linux/generic/patches-2.6.37/012-extra_optimization.patch b/target/linux/generic/patches-2.6.37/012-extra_optimization.patch
deleted file mode 100644 (file)
index a7811d7..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
---- a/Makefile
-+++ b/Makefile
-@@ -538,9 +538,9 @@ endif # $(dot-config)
- all: vmlinux
- ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
--KBUILD_CFLAGS += -Os
-+KBUILD_CFLAGS += -Os -fno-caller-saves
- else
--KBUILD_CFLAGS += -O2
-+KBUILD_CFLAGS += -O2 -fno-reorder-blocks -fno-tree-ch -fno-caller-saves
- endif
- include $(srctree)/arch/$(SRCARCH)/Makefile
-@@ -595,6 +595,9 @@ endif
- NOSTDINC_FLAGS += -nostdinc -isystem $(shell $(CC) -print-file-name=include)
- CHECKFLAGS     += $(NOSTDINC_FLAGS)
-+# improve gcc optimization
-+CFLAGS += $(call cc-option,-funit-at-a-time,)
-+
- # warn about C99 declaration after statement
- KBUILD_CFLAGS += $(call cc-option,-Wdeclaration-after-statement,)
diff --git a/target/linux/generic/patches-2.6.37/013-gcc4_inline_fix.patch b/target/linux/generic/patches-2.6.37/013-gcc4_inline_fix.patch
deleted file mode 100644 (file)
index 77ab405..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
---- a/arch/mips/include/asm/system.h
-+++ b/arch/mips/include/asm/system.h
-@@ -194,7 +194,7 @@ extern __u64 __xchg_u64_unsupported_on_3
- #define __xchg_u64 __xchg_u64_unsupported_on_32bit_kernels
- #endif
--static inline unsigned long __xchg(unsigned long x, volatile void * ptr, int size)
-+static __always_inline unsigned long __xchg(unsigned long x, volatile void * ptr, int size)
- {
-       switch (size) {
-       case 4:
diff --git a/target/linux/generic/patches-2.6.37/014-cfi_show_amd_extended_table_version.patch b/target/linux/generic/patches-2.6.37/014-cfi_show_amd_extended_table_version.patch
deleted file mode 100644 (file)
index 38ba76d..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
---- a/drivers/mtd/chips/cfi_cmdset_0002.c
-+++ b/drivers/mtd/chips/cfi_cmdset_0002.c
-@@ -446,9 +446,9 @@ struct mtd_info *cfi_cmdset_0002(struct
-                       /*
-                        * Valid primary extension versions are: 1.0, 1.1, 1.2, 1.3, 1.4
--                       * see: http://cs.ozerki.net/zap/pub/axim-x5/docs/cfi_r20.pdf, page 19 
--                       *      http://www.spansion.com/Support/AppNotes/cfi_100_20011201.pdf
--                       *      http://www.spansion.com/Support/Datasheets/s29ws-p_00_a12_e.pdf
-+                       * see: Spec 1.3 http://cs.ozerki.net/zap/pub/axim-x5/docs/cfi_r20.pdf, page 19 
-+                       *               http://www.spansion.com/Support/AppNotes/cfi_100_20011201.pdf
-+                       *      Spec 1.4 http://www.spansion.com/Support/AppNotes/CFI_Spec_AN_03.pdf, page 9
-                        */
-                       if (extp->MajorVersion != '1' ||
-                           (extp->MajorVersion == '1' && (extp->MinorVersion < '0' || extp->MinorVersion > '4'))) {
diff --git a/target/linux/generic/patches-2.6.37/020-mips_multi_machine_support.patch b/target/linux/generic/patches-2.6.37/020-mips_multi_machine_support.patch
deleted file mode 100644 (file)
index 729934f..0000000
+++ /dev/null
@@ -1,208 +0,0 @@
---- /dev/null
-+++ b/arch/mips/include/asm/mips_machine.h
-@@ -0,0 +1,54 @@
-+/*
-+ *  Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org>
-+ *
-+ *  This program is free software; you can redistribute it and/or modify it
-+ *  under the terms of the GNU General Public License version 2 as published
-+ *  by the Free Software Foundation.
-+ *
-+ */
-+
-+#ifndef __ASM_MIPS_MACHINE_H
-+#define __ASM_MIPS_MACHINE_H
-+
-+#include <linux/init.h>
-+#include <linux/list.h>
-+
-+#include <asm/bootinfo.h>
-+
-+struct mips_machine {
-+      unsigned long           mach_type;
-+      const char              *mach_id;
-+      const char              *mach_name;
-+      void                    (*mach_setup)(void);
-+};
-+
-+#define MIPS_MACHINE(_type, _id, _name, _setup)               \
-+static const char machine_name_##_type[] __initconst          \
-+                      __aligned(1) = _name;                   \
-+static const char machine_id_##_type[] __initconst            \
-+                      __aligned(1) = _id;                     \
-+static struct mips_machine machine_##_type                    \
-+              __used __section(.mips.machines.init) =         \
-+{                                                             \
-+      .mach_type      = _type,                                \
-+      .mach_id        = machine_id_##_type,                   \
-+      .mach_name      = machine_name_##_type,                 \
-+      .mach_setup     = _setup,                               \
-+};
-+
-+extern long __mips_machines_start;
-+extern long __mips_machines_end;
-+
-+#ifdef CONFIG_MIPS_MACHINE
-+int  mips_machtype_setup(char *id) __init;
-+void mips_machine_setup(void) __init;
-+void mips_set_machine_name(const char *name) __init;
-+char *mips_get_machine_name(void);
-+#else
-+static inline int mips_machtype_setup(char *id) { return 1; }
-+static inline void mips_machine_setup(void) { }
-+static inline void mips_set_machine_name(const char *name) { }
-+static inline char *mips_get_machine_name(void) { return NULL; }
-+#endif /* CONFIG_MIPS_MACHINE */
-+
-+#endif /* __ASM_MIPS_MACHINE_H */
---- /dev/null
-+++ b/arch/mips/kernel/mips_machine.c
-@@ -0,0 +1,86 @@
-+/*
-+ *  Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org>
-+ *
-+ *  This program is free software; you can redistribute it and/or modify it
-+ *  under the terms of the GNU General Public License version 2 as published
-+ *  by the Free Software Foundation.
-+ *
-+ */
-+#include <linux/mm.h>
-+#include <linux/string.h>
-+#include <linux/slab.h>
-+
-+#include <asm/mips_machine.h>
-+
-+static struct mips_machine *mips_machine __initdata;
-+static char *mips_machine_name = "Unknown";
-+
-+#define for_each_machine(mach) \
-+      for ((mach) = (struct mips_machine *)&__mips_machines_start; \
-+           (mach) && \
-+           (unsigned long)(mach) < (unsigned long)&__mips_machines_end; \
-+           (mach)++)
-+
-+__init void mips_set_machine_name(const char *name)
-+{
-+      char *p;
-+
-+      if (name == NULL)
-+              return;
-+
-+      p = kstrdup(name, GFP_KERNEL);
-+      if (!p)
-+              pr_err("MIPS: no memory for machine_name\n");
-+
-+      mips_machine_name = p;
-+}
-+
-+char *mips_get_machine_name(void)
-+{
-+      return mips_machine_name;
-+}
-+
-+__init int mips_machtype_setup(char *id)
-+{
-+      struct mips_machine *mach;
-+
-+      for_each_machine(mach) {
-+              if (mach->mach_id == NULL)
-+                      continue;
-+
-+              if (strcmp(mach->mach_id, id) == 0) {
-+                      mips_machtype = mach->mach_type;
-+                      return 0;
-+              }
-+      }
-+
-+      pr_err("MIPS: no machine found for id '%s', supported machines:\n", id);
-+      pr_err("%-24s : %s\n", "id", "name");
-+      for_each_machine(mach)
-+              pr_err("%-24s : %s\n", mach->mach_id, mach->mach_name);
-+
-+      return 1;
-+}
-+
-+__setup("machtype=", mips_machtype_setup);
-+
-+__init void mips_machine_setup(void)
-+{
-+      struct mips_machine *mach;
-+
-+      for_each_machine(mach) {
-+              if (mips_machtype == mach->mach_type) {
-+                      mips_machine = mach;
-+                      break;
-+              }
-+      }
-+
-+      if (!mips_machine)
-+              return;
-+
-+      mips_set_machine_name(mips_machine->mach_name);
-+      pr_info("MIPS: machine is %s\n", mips_machine_name);
-+
-+      if (mips_machine->mach_setup)
-+              mips_machine->mach_setup();
-+}
---- a/arch/mips/kernel/Makefile
-+++ b/arch/mips/kernel/Makefile
-@@ -95,6 +95,7 @@ obj-$(CONFIG_GPIO_TXX9)              += gpio_txx9.o
- obj-$(CONFIG_KEXEC)           += machine_kexec.o relocate_kernel.o
- obj-$(CONFIG_EARLY_PRINTK)    += early_printk.o
- obj-$(CONFIG_SPINLOCK_TEST)   += spinlock_test.o
-+obj-$(CONFIG_MIPS_MACHINE)    += mips_machine.o
- obj-$(CONFIG_OF)              += prom.o
---- a/arch/mips/Kconfig
-+++ b/arch/mips/Kconfig
-@@ -883,6 +883,9 @@ config MIPS_DISABLE_OBSOLETE_IDE
- config SYNC_R4K
-       bool
-+config MIPS_MACHINE
-+      def_bool n
-+
- config NO_IOPORT
-       def_bool n
---- a/arch/mips/kernel/proc.c
-+++ b/arch/mips/kernel/proc.c
-@@ -12,6 +12,7 @@
- #include <asm/cpu-features.h>
- #include <asm/mipsregs.h>
- #include <asm/processor.h>
-+#include <asm/mips_machine.h>
- unsigned int vced_count, vcei_count;
-@@ -31,8 +32,12 @@ static int show_cpuinfo(struct seq_file
-       /*
-        * For the first processor also print the system type
-        */
--      if (n == 0)
-+      if (n == 0) {
-               seq_printf(m, "system type\t\t: %s\n", get_system_type());
-+              if (mips_get_machine_name())
-+                      seq_printf(m, "machine\t\t\t: %s\n",
-+                                 mips_get_machine_name());
-+      }
-       seq_printf(m, "processor\t\t: %ld\n", n);
-       sprintf(fmt, "cpu model\t\t: %%s V%%d.%%d%s\n",
---- a/arch/mips/kernel/vmlinux.lds.S
-+++ b/arch/mips/kernel/vmlinux.lds.S
-@@ -98,6 +98,13 @@ SECTIONS
-       INIT_TEXT_SECTION(PAGE_SIZE)
-       INIT_DATA_SECTION(16)
-+      . = ALIGN(4);
-+      .mips.machines.init : AT(ADDR(.mips.machines.init) - LOAD_OFFSET) {
-+              __mips_machines_start = .;
-+              *(.mips.machines.init)
-+              __mips_machines_end = .;
-+      }
-+
-       /* .exit.text is discarded at runtime, not link time, to deal with
-        * references from .rodata
-        */
diff --git a/target/linux/generic/patches-2.6.37/020-ssb_update.patch b/target/linux/generic/patches-2.6.37/020-ssb_update.patch
new file mode 100644 (file)
index 0000000..718b005
--- /dev/null
@@ -0,0 +1,445 @@
+--- a/drivers/ssb/main.c
++++ b/drivers/ssb/main.c
+@@ -383,6 +383,35 @@ static int ssb_device_uevent(struct devi
+                            ssb_dev->id.revision);
+ }
++#define ssb_config_attr(attrib, field, format_string) \
++static ssize_t \
++attrib##_show(struct device *dev, struct device_attribute *attr, char *buf) \
++{ \
++      return sprintf(buf, format_string, dev_to_ssb_dev(dev)->field); \
++}
++
++ssb_config_attr(core_num, core_index, "%u\n")
++ssb_config_attr(coreid, id.coreid, "0x%04x\n")
++ssb_config_attr(vendor, id.vendor, "0x%04x\n")
++ssb_config_attr(revision, id.revision, "%u\n")
++ssb_config_attr(irq, irq, "%u\n")
++static ssize_t
++name_show(struct device *dev, struct device_attribute *attr, char *buf)
++{
++      return sprintf(buf, "%s\n",
++                     ssb_core_name(dev_to_ssb_dev(dev)->id.coreid));
++}
++
++static struct device_attribute ssb_device_attrs[] = {
++      __ATTR_RO(name),
++      __ATTR_RO(core_num),
++      __ATTR_RO(coreid),
++      __ATTR_RO(vendor),
++      __ATTR_RO(revision),
++      __ATTR_RO(irq),
++      __ATTR_NULL,
++};
++
+ static struct bus_type ssb_bustype = {
+       .name           = "ssb",
+       .match          = ssb_bus_match,
+@@ -392,6 +421,7 @@ static struct bus_type ssb_bustype = {
+       .suspend        = ssb_device_suspend,
+       .resume         = ssb_device_resume,
+       .uevent         = ssb_device_uevent,
++      .dev_attrs      = ssb_device_attrs,
+ };
+ static void ssb_buses_lock(void)
+@@ -1162,10 +1192,10 @@ void ssb_device_enable(struct ssb_device
+ }
+ EXPORT_SYMBOL(ssb_device_enable);
+-/* Wait for a bit in a register to get set or unset.
++/* Wait for bitmask in a register to get set or cleared.
+  * timeout is in units of ten-microseconds */
+-static int ssb_wait_bit(struct ssb_device *dev, u16 reg, u32 bitmask,
+-                      int timeout, int set)
++static int ssb_wait_bits(struct ssb_device *dev, u16 reg, u32 bitmask,
++                       int timeout, int set)
+ {
+       int i;
+       u32 val;
+@@ -1173,7 +1203,7 @@ static int ssb_wait_bit(struct ssb_devic
+       for (i = 0; i < timeout; i++) {
+               val = ssb_read32(dev, reg);
+               if (set) {
+-                      if (val & bitmask)
++                      if ((val & bitmask) == bitmask)
+                               return 0;
+               } else {
+                       if (!(val & bitmask))
+@@ -1190,20 +1220,38 @@ static int ssb_wait_bit(struct ssb_devic
+ void ssb_device_disable(struct ssb_device *dev, u32 core_specific_flags)
+ {
+-      u32 reject;
++      u32 reject, val;
+       if (ssb_read32(dev, SSB_TMSLOW) & SSB_TMSLOW_RESET)
+               return;
+       reject = ssb_tmslow_reject_bitmask(dev);
+-      ssb_write32(dev, SSB_TMSLOW, reject | SSB_TMSLOW_CLOCK);
+-      ssb_wait_bit(dev, SSB_TMSLOW, reject, 1000, 1);
+-      ssb_wait_bit(dev, SSB_TMSHIGH, SSB_TMSHIGH_BUSY, 1000, 0);
+-      ssb_write32(dev, SSB_TMSLOW,
+-                  SSB_TMSLOW_FGC | SSB_TMSLOW_CLOCK |
+-                  reject | SSB_TMSLOW_RESET |
+-                  core_specific_flags);
+-      ssb_flush_tmslow(dev);
++
++      if (ssb_read32(dev, SSB_TMSLOW) & SSB_TMSLOW_CLOCK) {
++              ssb_write32(dev, SSB_TMSLOW, reject | SSB_TMSLOW_CLOCK);
++              ssb_wait_bits(dev, SSB_TMSLOW, reject, 1000, 1);
++              ssb_wait_bits(dev, SSB_TMSHIGH, SSB_TMSHIGH_BUSY, 1000, 0);
++
++              if (ssb_read32(dev, SSB_IDLOW) & SSB_IDLOW_INITIATOR) {
++                      val = ssb_read32(dev, SSB_IMSTATE);
++                      val |= SSB_IMSTATE_REJECT;
++                      ssb_write32(dev, SSB_IMSTATE, val);
++                      ssb_wait_bits(dev, SSB_IMSTATE, SSB_IMSTATE_BUSY, 1000,
++                                    0);
++              }
++
++              ssb_write32(dev, SSB_TMSLOW,
++                      SSB_TMSLOW_FGC | SSB_TMSLOW_CLOCK |
++                      reject | SSB_TMSLOW_RESET |
++                      core_specific_flags);
++              ssb_flush_tmslow(dev);
++
++              if (ssb_read32(dev, SSB_IDLOW) & SSB_IDLOW_INITIATOR) {
++                      val = ssb_read32(dev, SSB_IMSTATE);
++                      val &= ~SSB_IMSTATE_REJECT;
++                      ssb_write32(dev, SSB_IMSTATE, val);
++              }
++      }
+       ssb_write32(dev, SSB_TMSLOW,
+                   reject | SSB_TMSLOW_RESET |
+--- a/drivers/ssb/pci.c
++++ b/drivers/ssb/pci.c
+@@ -406,6 +406,46 @@ static void sprom_extract_r123(struct ss
+       out->antenna_gain.ghz5.a3 = gain;
+ }
++/* Revs 4 5 and 8 have partially shared layout */
++static void sprom_extract_r458(struct ssb_sprom *out, const u16 *in)
++{
++      SPEX(txpid2g[0], SSB_SPROM4_TXPID2G01,
++           SSB_SPROM4_TXPID2G0, SSB_SPROM4_TXPID2G0_SHIFT);
++      SPEX(txpid2g[1], SSB_SPROM4_TXPID2G01,
++           SSB_SPROM4_TXPID2G1, SSB_SPROM4_TXPID2G1_SHIFT);
++      SPEX(txpid2g[2], SSB_SPROM4_TXPID2G23,
++           SSB_SPROM4_TXPID2G2, SSB_SPROM4_TXPID2G2_SHIFT);
++      SPEX(txpid2g[3], SSB_SPROM4_TXPID2G23,
++           SSB_SPROM4_TXPID2G3, SSB_SPROM4_TXPID2G3_SHIFT);
++
++      SPEX(txpid5gl[0], SSB_SPROM4_TXPID5GL01,
++           SSB_SPROM4_TXPID5GL0, SSB_SPROM4_TXPID5GL0_SHIFT);
++      SPEX(txpid5gl[1], SSB_SPROM4_TXPID5GL01,
++           SSB_SPROM4_TXPID5GL1, SSB_SPROM4_TXPID5GL1_SHIFT);
++      SPEX(txpid5gl[2], SSB_SPROM4_TXPID5GL23,
++           SSB_SPROM4_TXPID5GL2, SSB_SPROM4_TXPID5GL2_SHIFT);
++      SPEX(txpid5gl[3], SSB_SPROM4_TXPID5GL23,
++           SSB_SPROM4_TXPID5GL3, SSB_SPROM4_TXPID5GL3_SHIFT);
++
++      SPEX(txpid5g[0], SSB_SPROM4_TXPID5G01,
++           SSB_SPROM4_TXPID5G0, SSB_SPROM4_TXPID5G0_SHIFT);
++      SPEX(txpid5g[1], SSB_SPROM4_TXPID5G01,
++           SSB_SPROM4_TXPID5G1, SSB_SPROM4_TXPID5G1_SHIFT);
++      SPEX(txpid5g[2], SSB_SPROM4_TXPID5G23,
++           SSB_SPROM4_TXPID5G2, SSB_SPROM4_TXPID5G2_SHIFT);
++      SPEX(txpid5g[3], SSB_SPROM4_TXPID5G23,
++           SSB_SPROM4_TXPID5G3, SSB_SPROM4_TXPID5G3_SHIFT);
++
++      SPEX(txpid5gh[0], SSB_SPROM4_TXPID5GH01,
++           SSB_SPROM4_TXPID5GH0, SSB_SPROM4_TXPID5GH0_SHIFT);
++      SPEX(txpid5gh[1], SSB_SPROM4_TXPID5GH01,
++           SSB_SPROM4_TXPID5GH1, SSB_SPROM4_TXPID5GH1_SHIFT);
++      SPEX(txpid5gh[2], SSB_SPROM4_TXPID5GH23,
++           SSB_SPROM4_TXPID5GH2, SSB_SPROM4_TXPID5GH2_SHIFT);
++      SPEX(txpid5gh[3], SSB_SPROM4_TXPID5GH23,
++           SSB_SPROM4_TXPID5GH3, SSB_SPROM4_TXPID5GH3_SHIFT);
++}
++
+ static void sprom_extract_r45(struct ssb_sprom *out, const u16 *in)
+ {
+       int i;
+@@ -428,10 +468,14 @@ static void sprom_extract_r45(struct ssb
+               SPEX(country_code, SSB_SPROM4_CCODE, 0xFFFF, 0);
+               SPEX(boardflags_lo, SSB_SPROM4_BFLLO, 0xFFFF, 0);
+               SPEX(boardflags_hi, SSB_SPROM4_BFLHI, 0xFFFF, 0);
++              SPEX(boardflags2_lo, SSB_SPROM4_BFL2LO, 0xFFFF, 0);
++              SPEX(boardflags2_hi, SSB_SPROM4_BFL2HI, 0xFFFF, 0);
+       } else {
+               SPEX(country_code, SSB_SPROM5_CCODE, 0xFFFF, 0);
+               SPEX(boardflags_lo, SSB_SPROM5_BFLLO, 0xFFFF, 0);
+               SPEX(boardflags_hi, SSB_SPROM5_BFLHI, 0xFFFF, 0);
++              SPEX(boardflags2_lo, SSB_SPROM5_BFL2LO, 0xFFFF, 0);
++              SPEX(boardflags2_hi, SSB_SPROM5_BFL2HI, 0xFFFF, 0);
+       }
+       SPEX(ant_available_a, SSB_SPROM4_ANTAVAIL, SSB_SPROM4_ANTAVAIL_A,
+            SSB_SPROM4_ANTAVAIL_A_SHIFT);
+@@ -471,6 +515,8 @@ static void sprom_extract_r45(struct ssb
+       memcpy(&out->antenna_gain.ghz5, &out->antenna_gain.ghz24,
+              sizeof(out->antenna_gain.ghz5));
++      sprom_extract_r458(out, in);
++
+       /* TODO - get remaining rev 4 stuff needed */
+ }
+@@ -561,6 +607,8 @@ static void sprom_extract_r8(struct ssb_
+       memcpy(&out->antenna_gain.ghz5, &out->antenna_gain.ghz24,
+              sizeof(out->antenna_gain.ghz5));
++      sprom_extract_r458(out, in);
++
+       /* TODO - get remaining rev 8 stuff needed */
+ }
+@@ -573,37 +621,34 @@ static int sprom_extract(struct ssb_bus 
+       ssb_dprintk(KERN_DEBUG PFX "SPROM revision %d detected.\n", out->revision);
+       memset(out->et0mac, 0xFF, 6);           /* preset et0 and et1 mac */
+       memset(out->et1mac, 0xFF, 6);
++
+       if ((bus->chip_id & 0xFF00) == 0x4400) {
+               /* Workaround: The BCM44XX chip has a stupid revision
+                * number stored in the SPROM.
+                * Always extract r1. */
+               out->revision = 1;
++              ssb_dprintk(KERN_DEBUG PFX "SPROM treated as revision %d\n", out->revision);
++      }
++
++      switch (out->revision) {
++      case 1:
++      case 2:
++      case 3:
+               sprom_extract_r123(out, in);
+-      } else if (bus->chip_id == 0x4321) {
+-              /* the BCM4328 has a chipid == 0x4321 and a rev 4 SPROM */
+-              out->revision = 4;
++              break;
++      case 4:
++      case 5:
+               sprom_extract_r45(out, in);
+-      } else {
+-              switch (out->revision) {
+-              case 1:
+-              case 2:
+-              case 3:
+-                      sprom_extract_r123(out, in);
+-                      break;
+-              case 4:
+-              case 5:
+-                      sprom_extract_r45(out, in);
+-                      break;
+-              case 8:
+-                      sprom_extract_r8(out, in);
+-                      break;
+-              default:
+-                      ssb_printk(KERN_WARNING PFX "Unsupported SPROM"
+-                                 "  revision %d detected. Will extract"
+-                                 " v1\n", out->revision);
+-                      out->revision = 1;
+-                      sprom_extract_r123(out, in);
+-              }
++              break;
++      case 8:
++              sprom_extract_r8(out, in);
++              break;
++      default:
++              ssb_printk(KERN_WARNING PFX "Unsupported SPROM"
++                         " revision %d detected. Will extract"
++                         " v1\n", out->revision);
++              out->revision = 1;
++              sprom_extract_r123(out, in);
+       }
+       if (out->boardflags_lo == 0xFFFF)
+@@ -618,7 +663,7 @@ static int ssb_pci_sprom_get(struct ssb_
+                            struct ssb_sprom *sprom)
+ {
+       const struct ssb_sprom *fallback;
+-      int err = -ENOMEM;
++      int err;
+       u16 *buf;
+       if (!ssb_is_sprom_available(bus)) {
+@@ -645,7 +690,7 @@ static int ssb_pci_sprom_get(struct ssb_
+       buf = kcalloc(SSB_SPROMSIZE_WORDS_R123, sizeof(u16), GFP_KERNEL);
+       if (!buf)
+-              goto out;
++              return -ENOMEM;
+       bus->sprom_size = SSB_SPROMSIZE_WORDS_R123;
+       sprom_do_read(bus, buf);
+       err = sprom_check_crc(buf, bus->sprom_size);
+@@ -655,7 +700,7 @@ static int ssb_pci_sprom_get(struct ssb_
+               buf = kcalloc(SSB_SPROMSIZE_WORDS_R4, sizeof(u16),
+                             GFP_KERNEL);
+               if (!buf)
+-                      goto out;
++                      return -ENOMEM;
+               bus->sprom_size = SSB_SPROMSIZE_WORDS_R4;
+               sprom_do_read(bus, buf);
+               err = sprom_check_crc(buf, bus->sprom_size);
+@@ -677,7 +722,6 @@ static int ssb_pci_sprom_get(struct ssb_
+ out_free:
+       kfree(buf);
+-out:
+       return err;
+ }
+--- a/drivers/ssb/pcihost_wrapper.c
++++ b/drivers/ssb/pcihost_wrapper.c
+@@ -59,6 +59,7 @@ static int ssb_pcihost_probe(struct pci_
+       struct ssb_bus *ssb;
+       int err = -ENOMEM;
+       const char *name;
++      u32 val;
+       ssb = kzalloc(sizeof(*ssb), GFP_KERNEL);
+       if (!ssb)
+@@ -74,6 +75,12 @@ static int ssb_pcihost_probe(struct pci_
+               goto err_pci_disable;
+       pci_set_master(dev);
++      /* Disable the RETRY_TIMEOUT register (0x41) to keep
++       * PCI Tx retries from interfering with C3 CPU state */
++      pci_read_config_dword(dev, 0x40, &val);
++      if ((val & 0x0000ff00) != 0)
++              pci_write_config_dword(dev, 0x40, val & 0xffff00ff);
++
+       err = ssb_bus_pcibus_register(ssb, dev);
+       if (err)
+               goto err_pci_release_regions;
+--- a/drivers/ssb/scan.c
++++ b/drivers/ssb/scan.c
+@@ -405,10 +405,10 @@ int ssb_bus_scan(struct ssb_bus *bus,
+                               /* Ignore PCI cores on PCI-E cards.
+                                * Ignore PCI-E cores on PCI cards. */
+                               if (dev->id.coreid == SSB_DEV_PCI) {
+-                                      if (bus->host_pci->is_pcie)
++                                      if (pci_is_pcie(bus->host_pci))
+                                               continue;
+                               } else {
+-                                      if (!bus->host_pci->is_pcie)
++                                      if (!pci_is_pcie(bus->host_pci))
+                                               continue;
+                               }
+                       }
+@@ -420,6 +420,16 @@ int ssb_bus_scan(struct ssb_bus *bus,
+                       bus->pcicore.dev = dev;
+ #endif /* CONFIG_SSB_DRIVER_PCICORE */
+                       break;
++              case SSB_DEV_ETHERNET:
++                      if (bus->bustype == SSB_BUSTYPE_PCI) {
++                              if (bus->host_pci->vendor == PCI_VENDOR_ID_BROADCOM &&
++                                  (bus->host_pci->device & 0xFF00) == 0x4300) {
++                                      /* This is a dangling ethernet core on a
++                                       * wireless device. Ignore it. */
++                                      continue;
++                              }
++                      }
++                      break;
+               default:
+                       break;
+               }
+--- a/include/linux/ssb/ssb.h
++++ b/include/linux/ssb/ssb.h
+@@ -55,6 +55,10 @@ struct ssb_sprom {
+       u8 tri5gl;              /* 5.2GHz TX isolation */
+       u8 tri5g;               /* 5.3GHz TX isolation */
+       u8 tri5gh;              /* 5.8GHz TX isolation */
++      u8 txpid2g[4];          /* 2GHz TX power index */
++      u8 txpid5gl[4];         /* 4.9 - 5.1GHz TX power index */
++      u8 txpid5g[4];          /* 5.1 - 5.5GHz TX power index */
++      u8 txpid5gh[4];         /* 5.5 - ...GHz TX power index */
+       u8 rxpo2g;              /* 2GHz RX power offset */
+       u8 rxpo5g;              /* 5GHz RX power offset */
+       u8 rssisav2g;           /* 2GHz RSSI params */
+--- a/include/linux/ssb/ssb_regs.h
++++ b/include/linux/ssb/ssb_regs.h
+@@ -85,6 +85,8 @@
+ #define  SSB_IMSTATE_AP_RSV   0x00000030 /* Reserved */
+ #define  SSB_IMSTATE_IBE      0x00020000 /* In Band Error */
+ #define  SSB_IMSTATE_TO               0x00040000 /* Timeout */
++#define  SSB_IMSTATE_BUSY     0x01800000 /* Busy (Backplane rev >= 2.3 only) */
++#define  SSB_IMSTATE_REJECT   0x02000000 /* Reject (Backplane rev >= 2.3 only) */
+ #define SSB_INTVEC            0x0F94     /* SB Interrupt Mask */
+ #define  SSB_INTVEC_PCI               0x00000001 /* Enable interrupts for PCI */
+ #define  SSB_INTVEC_ENET0     0x00000002 /* Enable interrupts for enet 0 */
+@@ -97,7 +99,6 @@
+ #define  SSB_TMSLOW_RESET     0x00000001 /* Reset */
+ #define  SSB_TMSLOW_REJECT_22 0x00000002 /* Reject (Backplane rev 2.2) */
+ #define  SSB_TMSLOW_REJECT_23 0x00000004 /* Reject (Backplane rev 2.3) */
+-#define  SSB_TMSLOW_PHYCLK    0x00000010 /* MAC PHY Clock Control Enable */
+ #define  SSB_TMSLOW_CLOCK     0x00010000 /* Clock Enable */
+ #define  SSB_TMSLOW_FGC               0x00020000 /* Force Gated Clocks On */
+ #define  SSB_TMSLOW_PE                0x40000000 /* Power Management Enable */
+@@ -268,6 +269,8 @@
+ /* SPROM Revision 4 */
+ #define SSB_SPROM4_BFLLO              0x0044  /* Boardflags (low 16 bits) */
+ #define SSB_SPROM4_BFLHI              0x0046  /* Board Flags Hi */
++#define SSB_SPROM4_BFL2LO             0x0048  /* Board flags 2 (low 16 bits) */
++#define SSB_SPROM4_BFL2HI             0x004A  /* Board flags 2 Hi */
+ #define SSB_SPROM4_IL0MAC             0x004C  /* 6 byte MAC address for a/b/g/n */
+ #define SSB_SPROM4_CCODE              0x0052  /* Country Code (2 bytes) */
+ #define SSB_SPROM4_GPIOA              0x0056  /* Gen. Purpose IO # 0 and 1 */
+@@ -299,6 +302,46 @@
+ #define  SSB_SPROM4_AGAIN2_SHIFT      0
+ #define  SSB_SPROM4_AGAIN3            0xFF00  /* Antenna 3 */
+ #define  SSB_SPROM4_AGAIN3_SHIFT      8
++#define SSB_SPROM4_TXPID2G01          0x0062  /* TX Power Index 2GHz */
++#define  SSB_SPROM4_TXPID2G0          0x00FF
++#define  SSB_SPROM4_TXPID2G0_SHIFT    0
++#define  SSB_SPROM4_TXPID2G1          0xFF00
++#define  SSB_SPROM4_TXPID2G1_SHIFT    8
++#define SSB_SPROM4_TXPID2G23          0x0064  /* TX Power Index 2GHz */
++#define  SSB_SPROM4_TXPID2G2          0x00FF
++#define  SSB_SPROM4_TXPID2G2_SHIFT    0
++#define  SSB_SPROM4_TXPID2G3          0xFF00
++#define  SSB_SPROM4_TXPID2G3_SHIFT    8
++#define SSB_SPROM4_TXPID5G01          0x0066  /* TX Power Index 5GHz middle subband */
++#define  SSB_SPROM4_TXPID5G0          0x00FF
++#define  SSB_SPROM4_TXPID5G0_SHIFT    0
++#define  SSB_SPROM4_TXPID5G1          0xFF00
++#define  SSB_SPROM4_TXPID5G1_SHIFT    8
++#define SSB_SPROM4_TXPID5G23          0x0068  /* TX Power Index 5GHz middle subband */
++#define  SSB_SPROM4_TXPID5G2          0x00FF
++#define  SSB_SPROM4_TXPID5G2_SHIFT    0
++#define  SSB_SPROM4_TXPID5G3          0xFF00
++#define  SSB_SPROM4_TXPID5G3_SHIFT    8
++#define SSB_SPROM4_TXPID5GL01         0x006A  /* TX Power Index 5GHz low subband */
++#define  SSB_SPROM4_TXPID5GL0         0x00FF
++#define  SSB_SPROM4_TXPID5GL0_SHIFT   0
++#define  SSB_SPROM4_TXPID5GL1         0xFF00
++#define  SSB_SPROM4_TXPID5GL1_SHIFT   8
++#define SSB_SPROM4_TXPID5GL23         0x006C  /* TX Power Index 5GHz low subband */
++#define  SSB_SPROM4_TXPID5GL2         0x00FF
++#define  SSB_SPROM4_TXPID5GL2_SHIFT   0
++#define  SSB_SPROM4_TXPID5GL3         0xFF00
++#define  SSB_SPROM4_TXPID5GL3_SHIFT   8
++#define SSB_SPROM4_TXPID5GH01         0x006E  /* TX Power Index 5GHz high subband */
++#define  SSB_SPROM4_TXPID5GH0         0x00FF
++#define  SSB_SPROM4_TXPID5GH0_SHIFT   0
++#define  SSB_SPROM4_TXPID5GH1         0xFF00
++#define  SSB_SPROM4_TXPID5GH1_SHIFT   8
++#define SSB_SPROM4_TXPID5GH23         0x0070  /* TX Power Index 5GHz high subband */
++#define  SSB_SPROM4_TXPID5GH2         0x00FF
++#define  SSB_SPROM4_TXPID5GH2_SHIFT   0
++#define  SSB_SPROM4_TXPID5GH3         0xFF00
++#define  SSB_SPROM4_TXPID5GH3_SHIFT   8
+ #define SSB_SPROM4_MAXP_BG            0x0080  /* Max Power BG in path 1 */
+ #define  SSB_SPROM4_MAXP_BG_MASK      0x00FF  /* Mask for Max Power BG */
+ #define  SSB_SPROM4_ITSSI_BG          0xFF00  /* Mask for path 1 itssi_bg */
+@@ -318,6 +361,8 @@
+ #define SSB_SPROM5_CCODE              0x0044  /* Country Code (2 bytes) */
+ #define SSB_SPROM5_BFLLO              0x004A  /* Boardflags (low 16 bits) */
+ #define SSB_SPROM5_BFLHI              0x004C  /* Board Flags Hi */
++#define SSB_SPROM5_BFL2LO             0x004E  /* Board flags 2 (low 16 bits) */
++#define SSB_SPROM5_BFL2HI             0x0050  /* Board flags 2 Hi */
+ #define SSB_SPROM5_IL0MAC             0x0052  /* 6 byte MAC address for a/b/g/n */
+ #define SSB_SPROM5_GPIOA              0x0076  /* Gen. Purpose IO # 0 and 1 */
+ #define  SSB_SPROM5_GPIOA_P0          0x00FF  /* Pin 0 */
diff --git a/target/linux/generic/patches-2.6.37/021-mips_image_cmdline_hack.patch b/target/linux/generic/patches-2.6.37/021-mips_image_cmdline_hack.patch
deleted file mode 100644 (file)
index f1d1aac..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
---- a/arch/mips/Kconfig
-+++ b/arch/mips/Kconfig
-@@ -886,6 +886,10 @@ config SYNC_R4K
- config MIPS_MACHINE
-       def_bool n
-+config IMAGE_CMDLINE_HACK
-+      bool "OpenWrt specific image command line hack"
-+      default n
-+
- config NO_IOPORT
-       def_bool n
---- a/arch/mips/kernel/head.S
-+++ b/arch/mips/kernel/head.S
-@@ -143,6 +143,12 @@ FEXPORT(__kernel_entry)
-       j       kernel_entry
- #endif
-+#ifdef CONFIG_IMAGE_CMDLINE_HACK
-+      .ascii  "CMDLINE:"
-+EXPORT(__image_cmdline)
-+      .fill   0x400
-+#endif /* CONFIG_IMAGE_CMDLINE_HACK */
-+
-       __REF
- NESTED(kernel_entry, 16, sp)                  # kernel entry point
diff --git a/target/linux/generic/patches-2.6.37/022-mips_use_generic_thread_info_allocator.patch b/target/linux/generic/patches-2.6.37/022-mips_use_generic_thread_info_allocator.patch
deleted file mode 100644 (file)
index 915bb5f..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
---- a/arch/mips/include/asm/thread_info.h
-+++ b/arch/mips/include/asm/thread_info.h
-@@ -85,6 +85,7 @@ register struct thread_info *__current_t
- #define STACK_WARN    (THREAD_SIZE / 8)
-+#if 0
- #define __HAVE_ARCH_THREAD_INFO_ALLOCATOR
- #ifdef CONFIG_DEBUG_STACK_USAGE
-@@ -94,6 +95,7 @@ register struct thread_info *__current_t
- #endif
- #define free_thread_info(info) kfree(info)
-+#endif
- #endif /* !__ASSEMBLY__ */
diff --git a/target/linux/generic/patches-2.6.37/023-mips-fix-kexec.patch b/target/linux/generic/patches-2.6.37/023-mips-fix-kexec.patch
deleted file mode 100644 (file)
index e6928dd..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
---- a/arch/mips/kernel/machine_kexec.c
-+++ b/arch/mips/kernel/machine_kexec.c
-@@ -52,7 +52,7 @@ machine_kexec(struct kimage *image)
-       reboot_code_buffer =
-         (unsigned long)page_address(image->control_code_page);
--      kexec_start_address = image->start;
-+      kexec_start_address = (unsigned long) phys_to_virt(image->start);
-       kexec_indirection_page =
-               (unsigned long) phys_to_virt(image->head & PAGE_MASK);
diff --git a/target/linux/generic/patches-2.6.37/025-mips_disable_fpu.patch b/target/linux/generic/patches-2.6.37/025-mips_disable_fpu.patch
deleted file mode 100644 (file)
index 2ccfe4b..0000000
+++ /dev/null
@@ -1,160 +0,0 @@
-MIPS: allow disabling the kernel FPU emulator
-
-This patch allows turning off the in-kernel Algorithmics
-FPU emulator support, which allows one to save a couple of
-precious blocks on an embedded system.
-
-Signed-off-by: Florian Fainelli <florian@openwrt.org>
---
---- a/arch/mips/Kconfig
-+++ b/arch/mips/Kconfig
-@@ -871,6 +871,17 @@ config I8259
- config MIPS_BONITO64
-       bool
-+config MIPS_FPU_EMU
-+      bool "Enable FPU emulation"
-+      default y
-+      help
-+         This option allows building a kernel with or without the Algorithmics
-+         FPU emulator enabled. Turning off this option results in a kernel which
-+         does not catch floating operations exceptions. Make sure that your toolchain
-+         is configured to enable software floating point emulation in that case.
-+              
-+         If unsure say Y here.
-+
- config MIPS_MSC
-       bool
---- a/arch/mips/math-emu/Makefile
-+++ b/arch/mips/math-emu/Makefile
-@@ -2,11 +2,13 @@
- # Makefile for the Linux/MIPS kernel FPU emulation.
- #
--obj-y := cp1emu.o ieee754m.o ieee754d.o ieee754dp.o ieee754sp.o ieee754.o \
-+obj-y :=      kernel_linkage.o dsemul.o cp1emu.o
-+
-+obj-$(CONFIG_MIPS_FPU_EMU)    += ieee754m.o ieee754d.o ieee754dp.o ieee754sp.o ieee754.o \
-          ieee754xcpt.o dp_frexp.o dp_modf.o dp_div.o dp_mul.o dp_sub.o \
-          dp_add.o dp_fsp.o dp_cmp.o dp_logb.o dp_scalb.o dp_simple.o \
-          dp_tint.o dp_fint.o dp_tlong.o dp_flong.o sp_frexp.o sp_modf.o \
-          sp_div.o sp_mul.o sp_sub.o sp_add.o sp_fdp.o sp_cmp.o sp_logb.o \
-          sp_scalb.o sp_simple.o sp_tint.o sp_fint.o sp_tlong.o sp_flong.o \
--         dp_sqrt.o sp_sqrt.o kernel_linkage.o dsemul.o
-+         dp_sqrt.o sp_sqrt.o
---- a/arch/mips/math-emu/cp1emu.c
-+++ b/arch/mips/math-emu/cp1emu.c
-@@ -58,7 +58,11 @@
- #define __mips 4
- /* Function which emulates a floating point instruction. */
-+#ifdef CONFIG_DEBUG_FS
-+DEFINE_PER_CPU(struct mips_fpu_emulator_stats, fpuemustats);
-+#endif
-+#ifdef CONFIG_MIPS_FPU_EMU
- static int fpu_emu(struct pt_regs *, struct mips_fpu_struct *,
-       mips_instruction);
-@@ -69,10 +73,6 @@ static int fpux_emu(struct pt_regs *,
- /* Further private data for which no space exists in mips_fpu_struct */
--#ifdef CONFIG_DEBUG_FS
--DEFINE_PER_CPU(struct mips_fpu_emulator_stats, fpuemustats);
--#endif
--
- /* Control registers */
- #define FPCREG_RID    0       /* $0  = revision id */
-@@ -1361,7 +1361,6 @@ int fpu_emulator_cop1Handler(struct pt_r
-       return sig;
- }
--
- #ifdef CONFIG_DEBUG_FS
- static int fpuemu_stat_get(void *data, u64 *val)
-@@ -1410,4 +1409,11 @@ static int __init debugfs_fpuemu(void)
-       return 0;
- }
- __initcall(debugfs_fpuemu);
--#endif
-+#endif /* CONFIG_DEBUGFS */
-+#else
-+int fpu_emulator_cop1Handler(struct pt_regs *xcp, struct mips_fpu_struct *ctx,
-+        int has_fpu)
-+{
-+      return 0;
-+}
-+#endif /* CONFIG_MIPS_FPU_EMU */
---- a/arch/mips/math-emu/dsemul.c
-+++ b/arch/mips/math-emu/dsemul.c
-@@ -109,6 +109,7 @@ int mips_dsemul(struct pt_regs *regs, mi
-       return SIGILL;          /* force out of emulation loop */
- }
-+#ifdef CONFIG_MIPS_FPU_EMU
- int do_dsemulret(struct pt_regs *xcp)
- {
-       struct emuframe __user *fr;
-@@ -165,3 +166,9 @@ int do_dsemulret(struct pt_regs *xcp)
-       return 1;
- }
-+#else
-+int do_dsemulret(struct pt_regs *xcp)
-+{
-+      return 0;
-+}
-+#endif /* CONFIG_MIPS_FPU_EMU */
---- a/arch/mips/math-emu/kernel_linkage.c
-+++ b/arch/mips/math-emu/kernel_linkage.c
-@@ -29,6 +29,7 @@
- #define SIGNALLING_NAN 0x7ff800007ff80000LL
-+#ifdef CONFIG_MIPS_FPU_EMU
- void fpu_emulator_init_fpu(void)
- {
-       static int first = 1;
-@@ -112,4 +113,36 @@ int fpu_emulator_restore_context32(struc
-       return err;
- }
--#endif
-+#endif        /* CONFIG_64BIT */
-+#else
-+
-+void fpu_emulator_init_fpu(void)
-+{
-+      printk(KERN_INFO "FPU emulator disabled, make sure your toolchain"
-+              "was compiled with software floating point support (soft-float)\n");
-+      return;
-+}
-+
-+int fpu_emulator_save_context(struct sigcontext __user *sc)
-+{
-+      return 0;
-+}
-+
-+int fpu_emulator_restore_context(struct sigcontext __user *sc)
-+{
-+      return 0;
-+}
-+
-+int fpu_emulator_save_context32(struct sigcontext32 __user *sc)
-+{
-+      return 0;
-+}
-+
-+int fpu_emulator_restore_context32(struct sigcontext32 __user *sc)
-+{
-+      return 0;
-+}
-+
-+#ifdef CONFIG_64BIT
-+#endif        /* CONFIG_64BIT */
-+#endif /* CONFIG_MIPS_FPU_EMU */
diff --git a/target/linux/generic/patches-2.6.37/027-mips_module_reloc.patch b/target/linux/generic/patches-2.6.37/027-mips_module_reloc.patch
deleted file mode 100644 (file)
index 2d60749..0000000
+++ /dev/null
@@ -1,370 +0,0 @@
---- a/arch/mips/Makefile
-+++ b/arch/mips/Makefile
-@@ -90,8 +90,8 @@ all-$(CONFIG_SYS_SUPPORTS_ZBOOT)+= vmlin
- cflags-y                      += -G 0 -mno-abicalls -fno-pic -pipe
- cflags-y                      += -msoft-float
- LDFLAGS_vmlinux                       += -G 0 -static -n -nostdlib
--KBUILD_AFLAGS_MODULE          += -mlong-calls
--KBUILD_CFLAGS_MODULE          += -mlong-calls
-+KBUILD_AFLAGS_MODULE          += -mno-long-calls
-+KBUILD_CFLAGS_MODULE          += -mno-long-calls
- cflags-y += -ffreestanding
---- a/arch/mips/include/asm/module.h
-+++ b/arch/mips/include/asm/module.h
-@@ -9,6 +9,11 @@ struct mod_arch_specific {
-       struct list_head dbe_list;
-       const struct exception_table_entry *dbe_start;
-       const struct exception_table_entry *dbe_end;
-+
-+      void *phys_plt_tbl;
-+      void *virt_plt_tbl;
-+      unsigned int phys_plt_offset;
-+      unsigned int virt_plt_offset;
- };
- typedef uint8_t Elf64_Byte;           /* Type for a 8-bit quantity.  */
---- a/arch/mips/kernel/module.c
-+++ b/arch/mips/kernel/module.c
-@@ -43,6 +43,117 @@ static struct mips_hi16 *mips_hi16_list;
- static LIST_HEAD(dbe_list);
- static DEFINE_SPINLOCK(dbe_lock);
-+/*
-+ * Get the potential max trampolines size required of the init and
-+ * non-init sections. Only used if we cannot find enough contiguous
-+ * physically mapped memory to put the module into.
-+ */
-+static unsigned int
-+get_plt_size(const Elf_Ehdr *hdr, const Elf_Shdr *sechdrs,
-+             const char *secstrings, unsigned int symindex, bool is_init)
-+{
-+      unsigned long ret = 0;
-+      unsigned int i, j;
-+      Elf_Sym *syms;
-+
-+      /* Everything marked ALLOC (this includes the exported symbols) */
-+      for (i = 1; i < hdr->e_shnum; ++i) {
-+              unsigned int info = sechdrs[i].sh_info;
-+
-+              if (sechdrs[i].sh_type != SHT_REL
-+                  && sechdrs[i].sh_type != SHT_RELA)
-+                      continue;
-+
-+              /* Not a valid relocation section? */
-+              if (info >= hdr->e_shnum)
-+                      continue;
-+
-+              /* Don't bother with non-allocated sections */
-+              if (!(sechdrs[info].sh_flags & SHF_ALLOC))
-+                      continue;
-+
-+              /* If it's called *.init*, and we're not init, we're
-+                   not interested */
-+              if ((strstr(secstrings + sechdrs[i].sh_name, ".init") != 0)
-+                  != is_init)
-+                      continue;
-+
-+              syms = (Elf_Sym *) sechdrs[symindex].sh_addr;
-+              if (sechdrs[i].sh_type == SHT_REL) {
-+                      Elf_Mips_Rel *rel = (void *) sechdrs[i].sh_addr;
-+                      unsigned int size = sechdrs[i].sh_size / sizeof(*rel);
-+
-+                      for (j = 0; j < size; ++j) {
-+                              Elf_Sym *sym;
-+
-+                              if (ELF_MIPS_R_TYPE(rel[j]) != R_MIPS_26)
-+                                      continue;
-+
-+                              sym = syms + ELF_MIPS_R_SYM(rel[j]);
-+                              if (!is_init && sym->st_shndx != SHN_UNDEF)
-+                                      continue;
-+
-+                              ret += 4 * sizeof(int);
-+                      }
-+              } else {
-+                      Elf_Mips_Rela *rela = (void *) sechdrs[i].sh_addr;
-+                      unsigned int size = sechdrs[i].sh_size / sizeof(*rela);
-+
-+                      for (j = 0; j < size; ++j) {
-+                              Elf_Sym *sym;
-+
-+                              if (ELF_MIPS_R_TYPE(rela[j]) != R_MIPS_26)
-+                                      continue;
-+
-+                              sym = syms + ELF_MIPS_R_SYM(rela[j]);
-+                              if (!is_init && sym->st_shndx != SHN_UNDEF)
-+                                      continue;
-+
-+                              ret += 4 * sizeof(int);
-+                      }
-+              }
-+      }
-+
-+      return ret;
-+}
-+
-+#ifndef MODULE_START
-+static void *alloc_phys(unsigned long size)
-+{
-+      unsigned order;
-+      struct page *page;
-+      struct page *p;
-+
-+      size = PAGE_ALIGN(size);
-+      order = get_order(size);
-+
-+      page = alloc_pages(GFP_KERNEL | __GFP_NORETRY | __GFP_NOWARN |
-+                      __GFP_THISNODE, order);
-+      if (!page)
-+              return NULL;
-+
-+      split_page(page, order);
-+
-+      for (p = page + (size >> PAGE_SHIFT); p < page + (1 << order); ++p)
-+              __free_page(p);
-+
-+      return page_address(page);
-+}
-+#endif
-+
-+static void free_phys(void *ptr, unsigned long size)
-+{
-+      struct page *page;
-+      struct page *end;
-+
-+      page = virt_to_page(ptr);
-+      end = page + (PAGE_ALIGN(size) >> PAGE_SHIFT);
-+
-+      for (; page < end; ++page)
-+              __free_page(page);
-+}
-+
-+
- void *module_alloc(unsigned long size)
- {
- #ifdef MODULE_START
-@@ -58,21 +169,99 @@ void *module_alloc(unsigned long size)
-       return __vmalloc_area(area, GFP_KERNEL, PAGE_KERNEL);
- #else
-+      void *ptr;
-+
-       if (size == 0)
-               return NULL;
--      return vmalloc(size);
-+
-+      ptr = alloc_phys(size);
-+
-+      /* If we failed to allocate physically contiguous memory,
-+       * fall back to regular vmalloc. The module loader code will
-+       * create jump tables to handle long jumps */
-+      if (!ptr)
-+              return vmalloc(size);
-+
-+      return ptr;
-+#endif
-+}
-+
-+static inline bool is_phys_addr(void *ptr)
-+{
-+#ifdef CONFIG_64BIT
-+      return (KSEGX((unsigned long)ptr) == CKSEG0);
-+#else
-+      return (KSEGX(ptr) == KSEG0);
- #endif
- }
- /* Free memory returned from module_alloc */
- void module_free(struct module *mod, void *module_region)
- {
--      vfree(module_region);
-+      if (is_phys_addr(module_region)) {
-+              if (mod->module_init == module_region)
-+                      free_phys(module_region, mod->init_size);
-+              else if (mod->module_core == module_region)
-+                      free_phys(module_region, mod->core_size);
-+              else
-+                      BUG();
-+      } else {
-+              vfree(module_region);
-+      }
-+}
-+
-+static void *__module_alloc(int size, bool phys)
-+{
-+      void *ptr;
-+
-+      if (phys)
-+              ptr = kmalloc(size, GFP_KERNEL);
-+      else
-+              ptr = vmalloc(size);
-+      return ptr;
-+}
-+
-+static void __module_free(void *ptr)
-+{
-+      if (is_phys_addr(ptr))
-+              kfree(ptr);
-+      else
-+              vfree(ptr);
- }
- int module_frob_arch_sections(Elf_Ehdr *hdr, Elf_Shdr *sechdrs,
-                             char *secstrings, struct module *mod)
- {
-+      unsigned int symindex = 0;
-+      unsigned int core_size, init_size;
-+      int i;
-+
-+      for (i = 1; i < hdr->e_shnum; i++)
-+              if (sechdrs[i].sh_type == SHT_SYMTAB)
-+                      symindex = i;
-+
-+      core_size = get_plt_size(hdr, sechdrs, secstrings, symindex, false);
-+      init_size = get_plt_size(hdr, sechdrs, secstrings, symindex, true);
-+
-+      mod->arch.phys_plt_offset = 0;
-+      mod->arch.virt_plt_offset = 0;
-+      mod->arch.phys_plt_tbl = NULL;
-+      mod->arch.virt_plt_tbl = NULL;
-+
-+      if ((core_size + init_size) == 0)
-+              return 0;
-+
-+      mod->arch.phys_plt_tbl = __module_alloc(core_size + init_size, 1);
-+      if (!mod->arch.phys_plt_tbl)
-+              return -ENOMEM;
-+
-+      mod->arch.virt_plt_tbl = __module_alloc(core_size + init_size, 0);
-+      if (!mod->arch.virt_plt_tbl) {
-+              __module_free(mod->arch.phys_plt_tbl);
-+              mod->arch.phys_plt_tbl = NULL;
-+              return -ENOMEM;
-+      }
-+
-       return 0;
- }
-@@ -95,28 +284,36 @@ static int apply_r_mips_32_rela(struct m
-       return 0;
- }
--static int apply_r_mips_26_rel(struct module *me, u32 *location, Elf_Addr v)
-+static Elf_Addr add_plt_entry_to(unsigned *plt_offset,
-+                               void *start, Elf_Addr v)
- {
--      if (v % 4) {
--              pr_err("module %s: dangerous R_MIPS_26 REL relocation\n",
--                     me->name);
--              return -ENOEXEC;
--      }
-+      unsigned *tramp = start + *plt_offset;
-+      *plt_offset += 4 * sizeof(int);
--      if ((v & 0xf0000000) != (((unsigned long)location + 4) & 0xf0000000)) {
--              printk(KERN_ERR
--                     "module %s: relocation overflow\n",
--                     me->name);
--              return -ENOEXEC;
--      }
-+      /* adjust carry for addiu */
-+      if (v & 0x00008000)
-+              v += 0x10000;
--      *location = (*location & ~0x03ffffff) |
--                  ((*location + (v >> 2)) & 0x03ffffff);
-+      tramp[0] = 0x3c190000 | (v >> 16);      /* lui t9, hi16 */
-+      tramp[1] = 0x27390000 | (v & 0xffff);   /* addiu t9, t9, lo16 */
-+      tramp[2] = 0x03200008;                  /* jr t9 */
-+      tramp[3] = 0x00000000;                  /* nop */
--      return 0;
-+      return (Elf_Addr) tramp;
- }
--static int apply_r_mips_26_rela(struct module *me, u32 *location, Elf_Addr v)
-+static Elf_Addr add_plt_entry(struct module *me, void *location, Elf_Addr v)
-+{
-+      if (is_phys_addr(location))
-+              return add_plt_entry_to(&me->arch.phys_plt_offset,
-+                              me->arch.phys_plt_tbl, v);
-+      else
-+              return add_plt_entry_to(&me->arch.virt_plt_offset,
-+                              me->arch.virt_plt_tbl, v);
-+
-+}
-+
-+static int set_r_mips_26(struct module *me, u32 *location, u32 ofs, Elf_Addr v)
- {
-       if (v % 4) {
-               pr_err("module %s: dangerous R_MIPS_26 RELArelocation\n",
-@@ -125,17 +322,31 @@ static int apply_r_mips_26_rela(struct m
-       }
-       if ((v & 0xf0000000) != (((unsigned long)location + 4) & 0xf0000000)) {
--              printk(KERN_ERR
-+          v = add_plt_entry(me, location, v + (ofs << 2));
-+              if (!v) {
-+                      printk(KERN_ERR
-                      "module %s: relocation overflow\n",
-                      me->name);
--              return -ENOEXEC;
-+                      return -ENOEXEC;
-+              }
-+              ofs = 0;
-       }
--      *location = (*location & ~0x03ffffff) | ((v >> 2) & 0x03ffffff);
-+      *location = (*location & ~0x03ffffff) | ((ofs + (v >> 2)) & 0x03ffffff);
-       return 0;
- }
-+static int apply_r_mips_26_rel(struct module *me, u32 *location, Elf_Addr v)
-+{
-+      return set_r_mips_26(me, location, *location & 0x03ffffff, v);
-+}
-+
-+static int apply_r_mips_26_rela(struct module *me, u32 *location, Elf_Addr v)
-+{
-+      return set_r_mips_26(me, location, 0, v);
-+}
-+
- static int apply_r_mips_hi16_rel(struct module *me, u32 *location, Elf_Addr v)
- {
-       struct mips_hi16 *n;
-@@ -400,11 +611,32 @@ int module_finalize(const Elf_Ehdr *hdr,
-               list_add(&me->arch.dbe_list, &dbe_list);
-               spin_unlock_irq(&dbe_lock);
-       }
-+
-+      /* Get rid of the fixup trampoline if we're running the module
-+       * from physically mapped address space */
-+      if (me->arch.phys_plt_offset == 0) {
-+              __module_free(me->arch.phys_plt_tbl);
-+              me->arch.phys_plt_tbl = NULL;
-+      }
-+      if (me->arch.virt_plt_offset == 0) {
-+              __module_free(me->arch.virt_plt_tbl);
-+              me->arch.virt_plt_tbl = NULL;
-+      }
-+
-       return 0;
- }
- void module_arch_cleanup(struct module *mod)
- {
-+      if (mod->arch.phys_plt_tbl) {
-+              __module_free(mod->arch.phys_plt_tbl);
-+              mod->arch.phys_plt_tbl = NULL;
-+      }
-+      if (mod->arch.virt_plt_tbl) {
-+              __module_free(mod->arch.virt_plt_tbl);
-+              mod->arch.virt_plt_tbl = NULL;
-+      }
-+
-       spin_lock_irq(&dbe_lock);
-       list_del(&mod->arch.dbe_list);
-       spin_unlock_irq(&dbe_lock);
diff --git a/target/linux/generic/patches-2.6.37/028-module_exports.patch b/target/linux/generic/patches-2.6.37/028-module_exports.patch
deleted file mode 100644 (file)
index 60b12f7..0000000
+++ /dev/null
@@ -1,119 +0,0 @@
---- a/include/asm-generic/vmlinux.lds.h
-+++ b/include/asm-generic/vmlinux.lds.h
-@@ -52,6 +52,27 @@
- #define LOAD_OFFSET 0
- #endif
-+#ifndef SYMTAB_KEEP_STR
-+#define SYMTAB_KEEP_STR *(__ksymtab_strings.*)
-+#define SYMTAB_DISCARD_STR
-+#else
-+#define SYMTAB_DISCARD_STR *(__ksymtab_strings.*)
-+#endif
-+
-+#ifndef SYMTAB_KEEP
-+#define SYMTAB_KEEP *(__ksymtab.*)
-+#define SYMTAB_DISCARD
-+#else
-+#define SYMTAB_DISCARD *(__ksymtab.*)
-+#endif
-+
-+#ifndef SYMTAB_KEEP_GPL
-+#define SYMTAB_KEEP_GPL *(__ksymtab_gpl.*)
-+#define SYMTAB_DISCARD_GPL
-+#else
-+#define SYMTAB_DISCARD_GPL *(__ksymtab_gpl.*)
-+#endif
-+
- #ifndef SYMBOL_PREFIX
- #define VMLINUX_SYMBOL(sym) sym
- #else
-@@ -267,35 +288,35 @@
-       /* Kernel symbol table: Normal symbols */                       \
-       __ksymtab         : AT(ADDR(__ksymtab) - LOAD_OFFSET) {         \
-               VMLINUX_SYMBOL(__start___ksymtab) = .;                  \
--              *(__ksymtab)                                            \
-+              SYMTAB_KEEP                                             \
-               VMLINUX_SYMBOL(__stop___ksymtab) = .;                   \
-       }                                                               \
-                                                                       \
-       /* Kernel symbol table: GPL-only symbols */                     \
-       __ksymtab_gpl     : AT(ADDR(__ksymtab_gpl) - LOAD_OFFSET) {     \
-               VMLINUX_SYMBOL(__start___ksymtab_gpl) = .;              \
--              *(__ksymtab_gpl)                                        \
-+              SYMTAB_KEEP_GPL                                         \
-               VMLINUX_SYMBOL(__stop___ksymtab_gpl) = .;               \
-       }                                                               \
-                                                                       \
-       /* Kernel symbol table: Normal unused symbols */                \
-       __ksymtab_unused  : AT(ADDR(__ksymtab_unused) - LOAD_OFFSET) {  \
-               VMLINUX_SYMBOL(__start___ksymtab_unused) = .;           \
--              *(__ksymtab_unused)                                     \
-+              *(__ksymtab_unused.*)                                   \
-               VMLINUX_SYMBOL(__stop___ksymtab_unused) = .;            \
-       }                                                               \
-                                                                       \
-       /* Kernel symbol table: GPL-only unused symbols */              \
-       __ksymtab_unused_gpl : AT(ADDR(__ksymtab_unused_gpl) - LOAD_OFFSET) { \
-               VMLINUX_SYMBOL(__start___ksymtab_unused_gpl) = .;       \
--              *(__ksymtab_unused_gpl)                                 \
-+              *(__ksymtab_unused_gpl.*)                               \
-               VMLINUX_SYMBOL(__stop___ksymtab_unused_gpl) = .;        \
-       }                                                               \
-                                                                       \
-       /* Kernel symbol table: GPL-future-only symbols */              \
-       __ksymtab_gpl_future : AT(ADDR(__ksymtab_gpl_future) - LOAD_OFFSET) { \
-               VMLINUX_SYMBOL(__start___ksymtab_gpl_future) = .;       \
--              *(__ksymtab_gpl_future)                                 \
-+              *(__ksymtab_gpl_future.*)                               \
-               VMLINUX_SYMBOL(__stop___ksymtab_gpl_future) = .;        \
-       }                                                               \
-                                                                       \
-@@ -336,7 +357,7 @@
-                                                                       \
-       /* Kernel symbol table: strings */                              \
-         __ksymtab_strings : AT(ADDR(__ksymtab_strings) - LOAD_OFFSET) {       \
--              *(__ksymtab_strings)                                    \
-+              SYMTAB_KEEP_STR                                         \
-       }                                                               \
-                                                                       \
-       /* __*init sections */                                          \
-@@ -660,6 +681,9 @@
-       EXIT_TEXT                                                       \
-       EXIT_DATA                                                       \
-       EXIT_CALL                                                       \
-+      SYMTAB_DISCARD                                                  \
-+      SYMTAB_DISCARD_GPL                                              \
-+      SYMTAB_DISCARD_STR                                              \
-       *(.discard)                                                     \
-       *(.discard.*)                                                   \
-       }
---- a/include/linux/module.h
-+++ b/include/linux/module.h
-@@ -202,16 +202,24 @@ struct module_use {
- #define __CRC_SYMBOL(sym, sec)
- #endif
-+#ifdef MODULE
-+#define __EXPORT_SUFFIX(sym)
-+#else
-+#define __EXPORT_SUFFIX(sym) "." #sym
-+#endif
-+
- /* For every exported symbol, place a struct in the __ksymtab section */
- #define __EXPORT_SYMBOL(sym, sec)                             \
-       extern typeof(sym) sym;                                 \
-       __CRC_SYMBOL(sym, sec)                                  \
-       static const char __kstrtab_##sym[]                     \
--      __attribute__((section("__ksymtab_strings"), aligned(1))) \
-+      __attribute__((section("__ksymtab_strings"              \
-+        __EXPORT_SUFFIX(sym)), aligned(1)))                   \
-       = MODULE_SYMBOL_PREFIX #sym;                            \
-       static const struct kernel_symbol __ksymtab_##sym       \
-       __used                                                  \
--      __attribute__((section("__ksymtab" sec), unused))       \
-+      __attribute__((section("__ksymtab" sec                  \
-+        __EXPORT_SUFFIX(sym)), unused))                       \
-       = { (unsigned long)&sym, __kstrtab_##sym }
- #define EXPORT_SYMBOL(sym)                                    \
diff --git a/target/linux/generic/patches-2.6.37/029-arm_module_unresolved_weak_sym.patch b/target/linux/generic/patches-2.6.37/029-arm_module_unresolved_weak_sym.patch
deleted file mode 100644 (file)
index 19a09f8..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
---- a/arch/arm/kernel/module.c
-+++ b/arch/arm/kernel/module.c
-@@ -134,6 +134,10 @@ apply_relocate(Elf32_Shdr *sechdrs, cons
-                       return -ENOEXEC;
-               }
-+              if ((IS_ERR_VALUE(sym->st_value) || !sym->st_value) &&
-+                  ELF_ST_BIND(sym->st_info) == STB_WEAK)
-+                      continue;
-+
-               loc = dstsec->sh_addr + rel->r_offset;
-               switch (ELF32_R_TYPE(rel->r_info)) {
diff --git a/target/linux/generic/patches-2.6.37/030-mips_multi_machine_support.patch b/target/linux/generic/patches-2.6.37/030-mips_multi_machine_support.patch
new file mode 100644 (file)
index 0000000..ab270ff
--- /dev/null
@@ -0,0 +1,208 @@
+--- /dev/null
++++ b/arch/mips/include/asm/mips_machine.h
+@@ -0,0 +1,54 @@
++/*
++ *  Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org>
++ *
++ *  This program is free software; you can redistribute it and/or modify it
++ *  under the terms of the GNU General Public License version 2 as published
++ *  by the Free Software Foundation.
++ *
++ */
++
++#ifndef __ASM_MIPS_MACHINE_H
++#define __ASM_MIPS_MACHINE_H
++
++#include <linux/init.h>
++#include <linux/list.h>
++
++#include <asm/bootinfo.h>
++
++struct mips_machine {
++      unsigned long           mach_type;
++      const char              *mach_id;
++      const char              *mach_name;
++      void                    (*mach_setup)(void);
++};
++
++#define MIPS_MACHINE(_type, _id, _name, _setup)               \
++static const char machine_name_##_type[] __initconst          \
++                      __aligned(1) = _name;                   \
++static const char machine_id_##_type[] __initconst            \
++                      __aligned(1) = _id;                     \
++static struct mips_machine machine_##_type                    \
++              __used __section(.mips.machines.init) =         \
++{                                                             \
++      .mach_type      = _type,                                \
++      .mach_id        = machine_id_##_type,                   \
++      .mach_name      = machine_name_##_type,                 \
++      .mach_setup     = _setup,                               \
++};
++
++extern long __mips_machines_start;
++extern long __mips_machines_end;
++
++#ifdef CONFIG_MIPS_MACHINE
++int  mips_machtype_setup(char *id) __init;
++void mips_machine_setup(void) __init;
++void mips_set_machine_name(const char *name) __init;
++char *mips_get_machine_name(void);
++#else
++static inline int mips_machtype_setup(char *id) { return 1; }
++static inline void mips_machine_setup(void) { }
++static inline void mips_set_machine_name(const char *name) { }
++static inline char *mips_get_machine_name(void) { return NULL; }
++#endif /* CONFIG_MIPS_MACHINE */
++
++#endif /* __ASM_MIPS_MACHINE_H */
+--- /dev/null
++++ b/arch/mips/kernel/mips_machine.c
+@@ -0,0 +1,86 @@
++/*
++ *  Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org>
++ *
++ *  This program is free software; you can redistribute it and/or modify it
++ *  under the terms of the GNU General Public License version 2 as published
++ *  by the Free Software Foundation.
++ *
++ */
++#include <linux/mm.h>
++#include <linux/string.h>
++#include <linux/slab.h>
++
++#include <asm/mips_machine.h>
++
++static struct mips_machine *mips_machine __initdata;
++static char *mips_machine_name = "Unknown";
++
++#define for_each_machine(mach) \
++      for ((mach) = (struct mips_machine *)&__mips_machines_start; \
++           (mach) && \
++           (unsigned long)(mach) < (unsigned long)&__mips_machines_end; \
++           (mach)++)
++
++__init void mips_set_machine_name(const char *name)
++{
++      char *p;
++
++      if (name == NULL)
++              return;
++
++      p = kstrdup(name, GFP_KERNEL);
++      if (!p)
++              pr_err("MIPS: no memory for machine_name\n");
++
++      mips_machine_name = p;
++}
++
++char *mips_get_machine_name(void)
++{
++      return mips_machine_name;
++}
++
++__init int mips_machtype_setup(char *id)
++{
++      struct mips_machine *mach;
++
++      for_each_machine(mach) {
++              if (mach->mach_id == NULL)
++                      continue;
++
++              if (strcmp(mach->mach_id, id) == 0) {
++                      mips_machtype = mach->mach_type;
++                      return 0;
++              }
++      }
++
++      pr_err("MIPS: no machine found for id '%s', supported machines:\n", id);
++      pr_err("%-24s : %s\n", "id", "name");
++      for_each_machine(mach)
++              pr_err("%-24s : %s\n", mach->mach_id, mach->mach_name);
++
++      return 1;
++}
++
++__setup("machtype=", mips_machtype_setup);
++
++__init void mips_machine_setup(void)
++{
++      struct mips_machine *mach;
++
++      for_each_machine(mach) {
++              if (mips_machtype == mach->mach_type) {
++                      mips_machine = mach;
++                      break;
++              }
++      }
++
++      if (!mips_machine)
++              return;
++
++      mips_set_machine_name(mips_machine->mach_name);
++      pr_info("MIPS: machine is %s\n", mips_machine_name);
++
++      if (mips_machine->mach_setup)
++              mips_machine->mach_setup();
++}
+--- a/arch/mips/kernel/Makefile
++++ b/arch/mips/kernel/Makefile
+@@ -95,6 +95,7 @@ obj-$(CONFIG_GPIO_TXX9)              += gpio_txx9.o
+ obj-$(CONFIG_KEXEC)           += machine_kexec.o relocate_kernel.o
+ obj-$(CONFIG_EARLY_PRINTK)    += early_printk.o
+ obj-$(CONFIG_SPINLOCK_TEST)   += spinlock_test.o
++obj-$(CONFIG_MIPS_MACHINE)    += mips_machine.o
+ obj-$(CONFIG_OF)              += prom.o
+--- a/arch/mips/Kconfig
++++ b/arch/mips/Kconfig
+@@ -883,6 +883,9 @@ config MIPS_DISABLE_OBSOLETE_IDE
+ config SYNC_R4K
+       bool
++config MIPS_MACHINE
++      def_bool n
++
+ config NO_IOPORT
+       def_bool n
+--- a/arch/mips/kernel/proc.c
++++ b/arch/mips/kernel/proc.c
+@@ -12,6 +12,7 @@
+ #include <asm/cpu-features.h>
+ #include <asm/mipsregs.h>
+ #include <asm/processor.h>
++#include <asm/mips_machine.h>
+ unsigned int vced_count, vcei_count;
+@@ -31,8 +32,12 @@ static int show_cpuinfo(struct seq_file 
+       /*
+        * For the first processor also print the system type
+        */
+-      if (n == 0)
++      if (n == 0) {
+               seq_printf(m, "system type\t\t: %s\n", get_system_type());
++              if (mips_get_machine_name())
++                      seq_printf(m, "machine\t\t\t: %s\n",
++                                 mips_get_machine_name());
++      }
+       seq_printf(m, "processor\t\t: %ld\n", n);
+       sprintf(fmt, "cpu model\t\t: %%s V%%d.%%d%s\n",
+--- a/arch/mips/kernel/vmlinux.lds.S
++++ b/arch/mips/kernel/vmlinux.lds.S
+@@ -98,6 +98,13 @@ SECTIONS
+       INIT_TEXT_SECTION(PAGE_SIZE)
+       INIT_DATA_SECTION(16)
++      . = ALIGN(4);
++      .mips.machines.init : AT(ADDR(.mips.machines.init) - LOAD_OFFSET) {
++              __mips_machines_start = .;
++              *(.mips.machines.init)
++              __mips_machines_end = .;
++      }
++
+       /* .exit.text is discarded at runtime, not link time, to deal with
+        * references from .rodata
+        */
diff --git a/target/linux/generic/patches-2.6.37/030-pci_disable_common_quirks.patch b/target/linux/generic/patches-2.6.37/030-pci_disable_common_quirks.patch
deleted file mode 100644 (file)
index 4627986..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
---- a/drivers/pci/Kconfig
-+++ b/drivers/pci/Kconfig
-@@ -61,6 +61,12 @@ config XEN_PCIDEV_FE_DEBUG
-         When in doubt, say N.
-+config PCI_DISABLE_COMMON_QUIRKS
-+      bool "PCI disable common quirks"
-+      depends on PCI
-+      help
-+        If you don't know what to do here, say N.
-+
- config HT_IRQ
-       bool "Interrupts on hypertransport devices"
-       default y
---- a/drivers/pci/quirks.c
-+++ b/drivers/pci/quirks.c
-@@ -104,6 +104,7 @@ static void __devinit quirk_mmio_always_
- }
- DECLARE_PCI_FIXUP_EARLY(PCI_ANY_ID, PCI_ANY_ID, quirk_mmio_always_on);
-+#ifndef CONFIG_PCI_DISABLE_COMMON_QUIRKS
- /* The Mellanox Tavor device gives false positive parity errors
-  * Mark this device with a broken_parity_status, to allow
-  * PCI scanning code to "skip" this now blacklisted device.
-@@ -1989,7 +1990,9 @@ static void __devinit fixup_rev1_53c810(
-       }
- }
- DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NCR, PCI_DEVICE_ID_NCR_53C810, fixup_rev1_53c810);
-+#endif /* !CONFIG_PCI_DISABLE_COMMON_QUIRKS */
-+#ifndef CONFIG_PCI_DISABLE_COMMON_QUIRKS
- /* Enable 1k I/O space granularity on the Intel P64H2 */
- static void __devinit quirk_p64h2_1k_io(struct pci_dev *dev)
- {
-@@ -2662,6 +2665,7 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AT
-                       quirk_msi_intx_disable_bug);
- #endif /* CONFIG_PCI_MSI */
-+#endif /* !CONFIG_PCI_DISABLE_COMMON_QUIRKS */
- /* Allow manual resource allocation for PCI hotplug bridges
-  * via pci=hpmemsize=nnM and pci=hpiosize=nnM parameters. For
diff --git a/target/linux/generic/patches-2.6.37/031-pci_disable_usb_common_quirks.patch b/target/linux/generic/patches-2.6.37/031-pci_disable_usb_common_quirks.patch
deleted file mode 100644 (file)
index e1efe9c..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-
---- a/drivers/usb/host/pci-quirks.c
-+++ b/drivers/usb/host/pci-quirks.c
-@@ -134,6 +134,8 @@ reset_needed:
- }
- EXPORT_SYMBOL_GPL(uhci_check_and_reset_hc);
-+#ifndef CONFIG_PCI_DISABLE_COMMON_QUIRKS
-+
- static inline int io_type_enabled(struct pci_dev *pdev, unsigned int mask)
- {
-       u16 cmd;
-@@ -478,3 +480,5 @@ static void __devinit quirk_usb_early_ha
-               quirk_usb_handoff_xhci(pdev);
- }
- DECLARE_PCI_FIXUP_FINAL(PCI_ANY_ID, PCI_ANY_ID, quirk_usb_early_handoff);
-+
-+#endif
diff --git a/target/linux/generic/patches-2.6.37/040-arm-update-mach-types.patch b/target/linux/generic/patches-2.6.37/040-arm-update-mach-types.patch
deleted file mode 100644 (file)
index 835f25a..0000000
+++ /dev/null
@@ -1,389 +0,0 @@
---- a/arch/arm/tools/mach-types
-+++ b/arch/arm/tools/mach-types
-@@ -12,7 +12,7 @@
- #
- #   http://www.arm.linux.org.uk/developer/machines/?action=new
- #
--# Last update: Sun Dec 12 23:24:27 2010
-+# Last update: Wed Feb 2 23:04:05 2011
- #
- # machine_is_xxx      CONFIG_xxxx             MACH_TYPE_xxx           number
- #
-@@ -1319,7 +1319,7 @@ mistral                  MACH_MISTRAL            MISTRAL                 1315
- msm                   MACH_MSM                MSM                     1316
- ct5910                        MACH_CT5910             CT5910                  1317
- ct5912                        MACH_CT5912             CT5912                  1318
--hynet_ine             MACH_HYNET_INE          HYNET_INE               1319
-+argonst_mp            MACH_HYNET_INE          HYNET_INE               1319
- hynet_app             MACH_HYNET_APP          HYNET_APP               1320
- msm7200                       MACH_MSM7200            MSM7200                 1321
- msm7600                       MACH_MSM7600            MSM7600                 1322
-@@ -1777,7 +1777,7 @@ wdg002                   MACH_WDG002             WDG002                  1785
- sg560adsl             MACH_SG560ADSL          SG560ADSL               1786
- nextio_n2800_ica      MACH_NEXTIO_N2800_ICA   NEXTIO_N2800_ICA        1787
- dove_db                       MACH_DOVE_DB            DOVE_DB                 1788
--marvell_newdb         MACH_MARVELL_NEWDB      MARVELL_NEWDB           1789
-+dove_avng             MACH_MARVELL_NEWDB      MARVELL_NEWDB           1789
- vandihud              MACH_VANDIHUD           VANDIHUD                1790
- magx_e8                       MACH_MAGX_E8            MAGX_E8                 1791
- magx_z6                       MACH_MAGX_Z6            MAGX_Z6                 1792
-@@ -1877,7 +1877,7 @@ ued                      MACH_UED                UED                     1885
- esiblade              MACH_ESIBLADE           ESIBLADE                1886
- eye02                 MACH_EYE02              EYE02                   1887
- imx27kbd              MACH_IMX27KBD           IMX27KBD                1888
--sst61vc010_fpga               MACH_SST61VC010_FPGA    SST61VC010_FPGA         1889
-+p87_fpga              MACH_SST61VC010_FPGA    SST61VC010_FPGA         1889
- kixvp435              MACH_KIXVP435           KIXVP435                1890
- kixnp435              MACH_KIXNP435           KIXNP435                1891
- africa                        MACH_AFRICA             AFRICA                  1892
-@@ -2240,7 +2240,7 @@ arm_ultimator2           MACH_ARM_ULTIMATOR2     ARM_
- vs_v210                       MACH_VS_V210            VS_V210                 2252
- vs_v212                       MACH_VS_V212            VS_V212                 2253
- hmt                   MACH_HMT                HMT                     2254
--suen3                 MACH_SUEN3              SUEN3                   2255
-+km_kirkwood           MACH_KM_KIRKWOOD        KM_KIRKWOOD             2255
- vesper                        MACH_VESPER             VESPER                  2256
- str9                  MACH_STR9               STR9                    2257
- omap3_wl_ff           MACH_OMAP3_WL_FF        OMAP3_WL_FF             2258
-@@ -2308,7 +2308,7 @@ ecac2378         MACH_ECAC2378           ECAC2378                2319
- tazkiosk              MACH_TAZKIOSK           TAZKIOSK                2320
- whiterabbit_mch               MACH_WHITERABBIT_MCH    WHITERABBIT_MCH         2321
- sbox9263              MACH_SBOX9263           SBOX9263                2322
--oreo                  MACH_OREO               OREO                    2323
-+oreo_camera           MACH_OREO               OREO                    2323
- smdk6442              MACH_SMDK6442           SMDK6442                2324
- openrd_base           MACH_OPENRD_BASE        OPENRD_BASE             2325
- incredible            MACH_INCREDIBLE         INCREDIBLE              2326
-@@ -2374,7 +2374,7 @@ sch_m490         MACH_SCH_M490           SCH_M490                2386
- rbl01                 MACH_RBL01              RBL01                   2387
- omnifi                        MACH_OMNIFI             OMNIFI                  2388
- otavalo                       MACH_OTAVALO            OTAVALO                 2389
--sienna                        MACH_SIENNA             SIENNA                  2390
-+siena                 MACH_SIENNA             SIENNA                  2390
- htc_excalibur_s620    MACH_HTC_EXCALIBUR_S620 HTC_EXCALIBUR_S620      2391
- htc_opal              MACH_HTC_OPAL           HTC_OPAL                2392
- touchbook             MACH_TOUCHBOOK          TOUCHBOOK               2393
-@@ -2446,7 +2446,7 @@ siogentoo1               MACH_SIOGENTOO1         SIOGENTOO1
- siogentoo2            MACH_SIOGENTOO2         SIOGENTOO2              2459
- sm3k                  MACH_SM3K               SM3K                    2460
- acer_tempo_f900               MACH_ACER_TEMPO_F900    ACER_TEMPO_F900         2461
--sst61vc010_dev                MACH_SST61VC010_DEV     SST61VC010_DEV          2462
-+p87_dev                       MACH_SST61VC010_DEV     SST61VC010_DEV          2462
- glittertind           MACH_GLITTERTIND        GLITTERTIND             2463
- omap_zoom3            MACH_OMAP_ZOOM3         OMAP_ZOOM3              2464
- omap_3630sdp          MACH_OMAP_3630SDP       OMAP_3630SDP            2465
-@@ -2498,7 +2498,7 @@ hiram                    MACH_HIRAM              HIRAM                   2510
- phy3250                       MACH_PHY3250            PHY3250                 2511
- ea3250                        MACH_EA3250             EA3250                  2512
- fdi3250                       MACH_FDI3250            FDI3250                 2513
--whitestone            MACH_WHITESTONE         WHITESTONE              2514
-+htcwhitestone         MACH_WHITESTONE         WHITESTONE              2514
- at91sam9263nit                MACH_AT91SAM9263NIT     AT91SAM9263NIT          2515
- ccmx51                        MACH_CCMX51             CCMX51                  2516
- ccmx51js              MACH_CCMX51JS           CCMX51JS                2517
-@@ -2561,7 +2561,7 @@ magnolia2                MACH_MAGNOLIA2          MAGNOLIA2               25
- emxx                  MACH_EMXX               EMXX                    2574
- outlaw                        MACH_OUTLAW             OUTLAW                  2575
- riot_bei2             MACH_RIOT_BEI2          RIOT_BEI2               2576
--riot_vox              MACH_RIOT_VOX           RIOT_VOX                2577
-+riot_gx2              MACH_RIOT_VOX           RIOT_VOX                2577
- riot_x37              MACH_RIOT_X37           RIOT_X37                2578
- mega25mx              MACH_MEGA25MX           MEGA25MX                2579
- benzina2              MACH_BENZINA2           BENZINA2                2580
-@@ -2582,7 +2582,7 @@ omap3_bulldog            MACH_OMAP3_BULLDOG      OMAP3_
- pca101                        MACH_PCA101             PCA101                  2595
- buzzc                 MACH_BUZZC              BUZZC                   2596
- sasie2                        MACH_SASIE2             SASIE2                  2597
--davinci_cio           MACH_DAVINCI_CIO        DAVINCI_CIO             2598
-+davinci_dm6467_cio    MACH_DAVINCI_CIO        DAVINCI_CIO             2598
- smartmeter_dl         MACH_SMARTMETER_DL      SMARTMETER_DL           2599
- wzl6410                       MACH_WZL6410            WZL6410                 2600
- wzl6410m              MACH_WZL6410M           WZL6410M                2601
-@@ -2591,7 +2591,7 @@ wzl6410i         MACH_WZL6410I           WZL6410I                2603
- spacecom1             MACH_SPACECOM1          SPACECOM1               2604
- pingu920              MACH_PINGU920           PINGU920                2605
- bravoc                        MACH_BRAVOC             BRAVOC                  2606
--cybo2440              MACH_CYBO2440           CYBO2440                2607
-+mydev                 MACH_CYBO2440           CYBO2440                2607
- vdssw                 MACH_VDSSW              VDSSW                   2608
- romulus                       MACH_ROMULUS            ROMULUS                 2609
- omap_magic            MACH_OMAP_MAGIC         OMAP_MAGIC              2610
-@@ -2683,7 +2683,7 @@ lkevm                    MACH_LKEVM              LKEVM                   2695
- mw6410                        MACH_MW6410             MW6410                  2696
- terastation_wxl               MACH_TERASTATION_WXL    TERASTATION_WXL         2697
- cpu8000e              MACH_CPU8000E           CPU8000E                2698
--catania                       MACH_CATANIA            CATANIA                 2699
-+catania_s             MACH_CATANIA            CATANIA                 2699
- tokyo                 MACH_TOKYO              TOKYO                   2700
- msm7201a_surf         MACH_MSM7201A_SURF      MSM7201A_SURF           2701
- msm7201a_ffa          MACH_MSM7201A_FFA       MSM7201A_FFA            2702
-@@ -2741,7 +2741,7 @@ wbd222                   MACH_WBD222             WBD222                  2753
- mt65xx                        MACH_MT65XX             MT65XX                  2754
- msm8x60_surf          MACH_MSM8X60_SURF       MSM8X60_SURF            2755
- msm8x60_sim           MACH_MSM8X60_SIM        MSM8X60_SIM             2756
--vmc300                        MACH_VMC300             VMC300                  2757
-+cvc600                        MACH_VMC300             VMC300                  2757
- tcc8000_sdk           MACH_TCC8000_SDK        TCC8000_SDK             2758
- nanos                 MACH_NANOS              NANOS                   2759
- stamp9g10             MACH_STAMP9G10          STAMP9G10               2760
-@@ -2750,7 +2750,7 @@ h6053                    MACH_H6053              H6053                   2762
- smint01                       MACH_SMINT01            SMINT01                 2763
- prtlvt2                       MACH_PRTLVT2            PRTLVT2                 2764
- ap420                 MACH_AP420              AP420                   2765
--htcshift              MACH_HTCSHIFT           HTCSHIFT                2766
-+htcclio                       MACH_HTCSHIFT           HTCSHIFT                2766
- davinci_dm365_fc      MACH_DAVINCI_DM365_FC   DAVINCI_DM365_FC        2767
- msm8x55_surf          MACH_MSM8X55_SURF       MSM8X55_SURF            2768
- msm8x55_ffa           MACH_MSM8X55_FFA        MSM8X55_FFA             2769
-@@ -2761,7 +2761,7 @@ oreo_controller          MACH_OREO_CONTROLLER    OR
- kopin_models          MACH_KOPIN_MODELS       KOPIN_MODELS            2774
- ttc_vision2           MACH_TTC_VISION2        TTC_VISION2             2775
- cns3420vb             MACH_CNS3420VB          CNS3420VB               2776
--lpc2                  MACH_LPC2               LPC2                    2777
-+lpc_evo                       MACH_LPC2               LPC2                    2777
- olympus                       MACH_OLYMPUS            OLYMPUS                 2778
- vortex                        MACH_VORTEX             VORTEX                  2779
- s5pc200                       MACH_S5PC200            S5PC200                 2780
-@@ -2788,7 +2788,7 @@ ti8168evm                MACH_TI8168EVM          TI8168EVM               28
- neocoreomap           MACH_NEOCOREOMAP        NEOCOREOMAP             2801
- withings_wbp          MACH_WITHINGS_WBP       WITHINGS_WBP            2802
- dbps                  MACH_DBPS               DBPS                    2803
--sbc9261                       MACH_SBC9261            SBC9261                 2804
-+at91sam9261           MACH_SBC9261            SBC9261                 2804
- pcbfp0001             MACH_PCBFP0001          PCBFP0001               2805
- speedy                        MACH_SPEEDY             SPEEDY                  2806
- chrysaor              MACH_CHRYSAOR           CHRYSAOR                2807
-@@ -2812,7 +2812,7 @@ p565                     MACH_P565               P565                    2824
- acer_a4                       MACH_ACER_A4            ACER_A4                 2825
- davinci_dm368_bip     MACH_DAVINCI_DM368_BIP  DAVINCI_DM368_BIP       2826
- eshare                        MACH_ESHARE             ESHARE                  2827
--hw_omapl138_europa    MACH_HW_OMAPL138_EUROPA HW_OMAPL138_EUROPA      2828
-+omapl138_europa               MACH_HW_OMAPL138_EUROPA HW_OMAPL138_EUROPA      2828
- wlbargn                       MACH_WLBARGN            WLBARGN                 2829
- bm170                 MACH_BM170              BM170                   2830
- netspace_mini_v2      MACH_NETSPACE_MINI_V2   NETSPACE_MINI_V2        2831
-@@ -2879,7 +2879,7 @@ davinci_picto            MACH_DAVINCI_PICTO      DAVINC
- mecha                 MACH_MECHA              MECHA                   2892
- bubba3                        MACH_BUBBA3             BUBBA3                  2893
- pupitre                       MACH_PUPITRE            PUPITRE                 2894
--tegra_harmony         MACH_TEGRA_HARMONY      TEGRA_HARMONY           2895
-+tegra_unused          MACH_TEGRA_HARMONY      TEGRA_HARMONY           2895
- tegra_vogue           MACH_TEGRA_VOGUE        TEGRA_VOGUE             2896
- tegra_e1165           MACH_TEGRA_E1165        TEGRA_E1165             2897
- simplenet             MACH_SIMPLENET          SIMPLENET               2898
-@@ -2896,6 +2896,7 @@ e10                      MACH_E10                E10                     2908
- app3k_robin           MACH_APP3K_ROBIN        APP3K_ROBIN             2909
- pov15hd                       MACH_POV15HD            POV15HD                 2910
- stella                        MACH_STELLA             STELLA                  2911
-+htc_iolite            MACH_MACH_HTC_IOLITE    MACH_HTC_IOLITE         2912
- linkstation_lschl     MACH_LINKSTATION_LSCHL  LINKSTATION_LSCHL       2913
- netwalker             MACH_NETWALKER          NETWALKER               2914
- acsx106                       MACH_ACSX106            ACSX106                 2915
-@@ -2959,6 +2960,7 @@ davinci_dm355_mmm        MACH_DAVINCI_DM355_MMM
- pc9260_v2             MACH_PC9260_V2          PC9260_V2               2973
- ptx7545                       MACH_PTX7545            PTX7545                 2974
- tm_efdc                       MACH_TM_EFDC            TM_EFDC                 2975
-+remove_me           &n