#! /bin/sh
-# deblob-check version 2009-03-18
+# deblob-check version 2009-03-24
# Inspired in gNewSense's find-firmware script.
# Written by Alexandre Oliva <lxoliva@fsfla.org>
case ${LANG+set} in set) LANG=C; export LANG;; esac
rm="rm -f"
+
+for echo in 'echo' 'printf %s\n'; do
+ case `$echo '\nx'` in
+ '\nx') break;;
+ esac
+done
+case `$echo '\nx'` in
+'\nx') ;; *) echo Cannot find out what echo to use >&2; exit 1;;
+esac
+
+for echo_n in "echo -n" "printf %s"; do
+ case `$echo_n '\na'; $echo_n '\nb'` in
+ '\na\nb') break;;
+ esac
+done
+case `$echo_n a; $echo_n b` in
+'ab') ;; *) echo Cannot find out an echo -n equivalent to use >&2; exit 1;;
+esac
+
case $1 in
--save-scripts | -S)
shift
set_sed_cmd () {
set_sedmain "" "" "
i\\
-$file
+$file\\
+/*(DEBLOB-\\
+ERROR)*/
q 1;"
}
;;
set_sed_cmd () {
set_sedmain "
i\\
-$file
+$file\\
+/*(DEBLOB-\\
+ERROR)*/
q 1;" "" "
i\\
-$file
+$file\\
+/*(DEBLOB-\\
+ERROR)*/
q 1;"
}
;;
set_sed_cmd () {
set_sedmain "
i\\
-$file
+$file\\
+/*(DEBLOB-\\
+ERROR)*/
q 1;"
}
;;
blob ' r128_cce_load_microcode([^;]*);' drivers/gpu/drm/r128/r128_cce.c
blob 'static const u32 R[S0-9]*0_cp_microcode\[\]\[2\] = {[^{};]*};\([\n][\n]*static const u32 R[S0-9]*0_cp_microcode\[\]\[2\] = {[^{};]*};\)*' drivers/gpu/drm/radeon/radeon_microcode.h
- blob 'static void radeon_cp_load_microcode([^{]*)[\n]{[\n]\([^}]\|[^\n}]}*\)*[\n]}[\n]' drivers/gpu/drm/radeon/radeon_cp.c
- blob ' radeon_cp_load_microcode([^;]*);' drivers/gpu/drm/radeon/radeon_cp.c
+ blob '\([/][*] Load the microcode\([^/]\|[^*/][/]*\)*[*][/][\n]\)\?static void radeon_cp_load_microcode([^{]*)[\n]{[\n]\([^}]\|[^\n}]}*\)*[\n]}[\n]' drivers/gpu/drm/radeon/radeon_cp.c
+ blobna 'radeon_cp_load_microcode([^;]*);' drivers/gpu/drm/radeon/radeon_cp.c
blob 'sub \(sp887[0x]\|tda1004\(5\|6\(lifeview\)\?\)\|av7110\|dec\(2\(00\|54\)0t\|3000s\)\|opera1\|vp7041\|dibusb\|nxt200[24]\|or51\(211\|132_\(qam\|vsb\)\)\|bluebird\) *{\([^}]*\|[^\n]}*\)[\n]}\([\n][\n]*sub \(sp887[0x]\|tda1004\(5\|6\(lifeview\)\?\)\|av7110\|dec\(2\(00\|54\)0t\|3000s\)\|opera1\|vp7041\|dibusb\|nxt200[24]\|or51\(211\|132_\(qam\|vsb\)\)\|bluebird\) *{\([^}]*\|[^\n]}*\)[\n]}\)*' Documentation/dvb/get_dvb_firmware
blobna 'Please use[^\n]*firmware[^\n]*sp887x[^\n]*\([\n][^\n]\+\)\+' Documentation/dvb/avermedia.txt
blob 'static u32 tigon2\?Fw\(Text\|Rodata\|Data\)\[(MAX_\(TEXT\|RODATA\|DATA\)_LEN\/4) + 1\] __devinitdata = {[^}]*};\([\n]static u32 tigon2\?Fw\(Text\|Rodata\|Data\)\[(MAX_\(TEXT\|RODATA\|DATA\)_LEN\/4) + 1\] __devinitdata = {[^}]*};\)*' drivers/net/acenic_firwmare.h
blob '#define tigon2\?Fw[^ ]*\(Addr\|Len\) 0x[^\n]*\([\n]#define tigon2\?Fw[^ ]*\(Addr\|Len\) 0x[^\n]*\)\+' drivers/net/acenic_firmware.h
- blob '\([/][*]\([^/]*\|[^*/][/]*\)*Do not try to clear\([^/]*\|[^*/][/]*\)*[*][/][\n] \)\?ace_clear[^;]*;[\n]\([^}]*{[^}]*ace_copy[^}]*tigon2\?Fw[^}]*}\)*[\n]\+ return 0;[\n]}'
+ blob '\([/][*]\([^/]*\|[^*/][/]*\)*Do not try to clear\([^/]*\|[^*/][/]*\)*[*][/][\n] \)\?ace_clear[^;]*;[\n]\([^}]*{[^}]*ace_copy[^}]*tigon2\?Fw[^}]*}\)*[\n]\+ return 0;[\n]}' drivers/net/acenic.c
+ blob 'if (\(ACE_IS_TIGON_I(ap)\|ap->version == 2\))[\n] writel(tigon2\?FwStartAddr, [&]regs->Pc);\([\n] if (\(ACE_IS_TIGON_I(ap)\|ap->version == 2\))[\n] writel(tigon2\?FwStartAddr, [&]regs->Pc);\)*' drivers/net/acenic.c
blob '#include "starfire_firmware\.h"' drivers/net/starfire.c
blob '[/][*]\([^/]*\|[^*/][/]*\)*Load Rx\/Tx firmware\([^/]*\|[^*/][/]*\)*[*][/]\([\n] for ([^)]*FIRMWARE_[RT]X_SIZE[^)]*)[\n] writel[^;]*firmware_[rt]x[^;]*;\)\+' drivers/net/starfire.c
blob 'static \(u8\|const u32\|struct fw_info\) bnx2_\(\(COM\|CP\|[RT]XP\|TPAT\)_b0[69]Fw\(Text\|Data\|Rodata\)\|\(xi_\)\?rv2p_proc[12]\|\(com\|cp\|[rt]xp\|tpat\)_fw_0[69]\)\(\[[^]};]*\]\)* = {[^}]*};\([\n][\n]*static \(u8\|const u32\|struct fw_info\) bnx2_\(\(COM\|CP\|[RT]XP\|TPAT\)_b0[69]Fw\(Text\|Data\|Rodata\)\|\(xi_\)\?rv2p_proc[12]\|\(com\|cp\|[rt]xp\|tpat\)_fw_0[69]\)\(\[[^]};]*\]\)* = {[^}]*};\)*' 'drivers/net/bnx2_fw2\?.h'
blob '#include "bnx2_fw2\?\.h"\([\n][\n]*#include "bnx2_fw2\?\.h"\)*' drivers/net/bnx2.c
+ blob 'static void[\n]load_rv2p_fw([^{]*)[\n]{[\n]\([^}]\|[^\n}]}*\)*[\n]}' drivers/net/bnx2.c
blob 'static int[\n]bnx2_init_cpus([^{]*)[\n]{[\n]\([^}]\|[^\n}]}*\)*[\n]}' drivers/net/bnx2.c
# init_data_e1h? might actually be just data, but it doesn't
blob 'static const u8 microcode\[\] = {[^}]*} *;' drivers/net/tokenring/3c359_microcode.h
blob '#include "3c359_microcode\.h"' drivers/net/tokenring/3c359.c
- blobna '\(printk(KERN_INFO "3C359: Uploading Microcode: ");[\n ]*\)\?for ([^{]*\(mc_size[^{]*) {[^}]*writeb(microcode\[\|) {[^}]*writeb(microcode\[mc_size\)[^}]*}\([\n][ ]*printk[^\n]*;[\n ]*for ([^{]*\(mc_size[^{]*) {[^}]*writeb(microcode\[\|) {[^}]*writeb(microcode\[mc_size\)[^}]*}\)*' drivers/net/tokenring/3c359.c
+ blobna 'start = (0xFFFF - (mc_size)[^;]*;[\n ]*[/][*]\([^/]\|[^*/][/]*\)*[*][/][\n ]*printk(KERN_INFO "3C359: Uploading Microcode: ");[\n ]*for ([^{]*\(mc_size[^{]*) {[^}]*writeb(microcode\[\|) {[^}]*writeb(microcode\[mc_size\)[^}]*}\([\n][ ]*printk[^\n]*;[\n ]*for ([^{]*\(mc_size[^{]*) {[^}]*writeb(microcode\[\|) {[^}]*writeb(microcode\[mc_size\)[^}]*}\)*' drivers/net/tokenring/3c359.c
blobname 'tr_smctr\.bin' drivers/net/tokenring/smctr.c
blobname 'dvb-fe-xc5000-1\.1\.fw' drivers/media/common/tuners/xc5000.c
blobname '4210\(100[12]\|%4X\)\.sb' drivers/net/irda/irda-usb.c
+ blobna '[/][*][ \n*]* Known firmware\([^/]\|[^*/][/]*\)*\(STIR421x\|4210\(100[12]\|%4X\)\.sb\)\([^/]\|[^*/][/]*\)*[*][/]' drivers/net/irda/irda-usb.c
blobname 'myri10ge_\(rss_\)\?ethp\?_z8e\.dat' drivers/net/myri10ge.c
+ blobna 'If the driver can neither enable ECRC\([^/]\|[^*/][/]*\)*myri10ge_\(rss_\)\?ethp\?_z8e\.dat\([^/]\|[^*/][/]*\)*[*][/]' drivers/net/myri10ge.c
blobname 'spider_fw\.bin' drivers/net/spider_net.h
blobname 'tms380tr\.bin' drivers/net/tokenring/tms380tr.c
blobname 'atmel_at76c50\(2\([de]\|_3com\)\?\|4a\?\(_2958\)\?\|6\)\(\.bin\)\?' drivers/net/wireless/atmel.c
+ accept ' *priv->firmware = \(NULL\|new_firmware\);' drivers/net/wireless/atmel.c
- blobname 'b43[^/]*[/]\(%s\|ucode\(5\|1[13]\)\|pcm5\|[abn]0g[01]initvals\(5\|1[13]\)\)\.fw' 'drivers/net/wireless/b43\(legacy\)\?/main.c'
+ blobname 'b43\(legacy\)\?\(%s\)\?[/]\(%s\|ucode\(5\|1[13]\)\|pcm5\|[abn]0g[01]initvals\(5\|1[13]\)\)\.fw' 'drivers/net/wireless/b43\(legacy\)\?/main.c'
+ blobna 'b43legacyerr([^;]*must go to http[^;]*b43#devicefirmware[^;]*);' drivers/net/wireless/b43legacy/main.c
- blob '#define IPW2100_FW_\(\(MAJOR\|MINOR\)\(_VERSION\|(x)\)\|VERSION\) \([^\n]\|[\\][\n]\)*\([\n][\n]*#define IPW2100_FW_\(\(MAJOR\|MINOR\)\(_VERSION\|(x)\)\|VERSION\) \([^\n]\|[\\][\n]\)*\)*' drivers/net/wireless/ipw2100.c
+ blob '#define IPW2100_FW_\(\(\(MAJOR\|MINOR\)_VERSION\|\(MAJOR\|MINOR\)(x)\)\|VERSION\)\([^\n]*\\[\n]\)*[^\n]*\([\n][\n]*#define IPW2100_FW_\(\(\(MAJOR\|MINOR\)_VERSION\|\(MAJOR\|MINOR\)(x)\)\|VERSION\)\([^\n]*\\[\n]\)*[^\n]*\)*' drivers/net/wireless/ipw2100.c
blobname 'ipw2100-\("\([^"\n]\|[\\][\n]\)*"\([^"]\|[\\]["]\)*\)\+' drivers/net/wireless/ipw2100.c
blobname '__stringify(IPW2100_FW_MINOR_VERSION)' drivers/net/wireless/ipw2100.c
+ accept ' *Portions of ipw2100_\(do_\)\?mod_firmware_load[, ]*\(ipw2100_\(do_\)\?mod_firmware_load[, and\n]*\)*' drivers/net/wireless/ipw2100.c
+ accept ' ipw2100_mod_firmware_load(fw);' drivers/net/wireless/ipw2100.c
+ accept 'static int ipw2100_mod_firmware_load(' drivers/net/wireless/ipw2100.c
+ blobna 'if (IPW2100_FW_MAJOR[^{]*{[^}]* }' drivers/net/wireless/ipw2100.c
- accept '[/][*] Call this function from process context\([^/]\|[^*][/]*\)*request_firmware' drivers/net/wireless/ipw2200.c
+ accept '[/][*] Call this function from process context\([^/]\|[^*/][/]*\)*request_firmware' drivers/net/wireless/ipw2200.c
blobname 'ipw2200-\(i\?bss\|sniffer\)\.fw' drivers/net/wireless/ipw2200.c
accept ' IPW_ERROR("%s request_firmware failed' drivers/net/wireless/ipw2200.c
blobname 'libertas_cs\(_helper\)\?\.fw' drivers/net/wireless/libertas/if_cs.c
blobname 'sd\(8385\|8686\)\(_helper\)\?\.bin' drivers/net/wireless/libertas/if_sdio.c
+ accept ' *card->firmware = \(if_sdio\|lbs_fw\)' drivers/net/wireless/libertas/if_sdio.c
blobname 'usb8388\(-5\.126\.0\.p5\)\?\.bin' drivers/net/wireless/libertas/if_usb.c
+ blob '[/][*]\([^/]\|[^*/][/]*\)*usb8388\(-5\.126\.0\.p5\)\?\.bin\([^/]\|[^*/][/]*\)*[*][/]' drivers/net/wireless/libertas/if_usb.c
accept ' lbs_pr_err("request_firmware() failed' drivers/net/wireless/if_usb.c
blobna 'o\. Copy the firmware image[^\n]*usb8388\([^\n]\|[\n][ ]*[^ \n]\)*' drivers/net/wireless/libertas/README
blobna '\[fw_name=usb8388[^]]*\]' drivers/net/wireless/libertas/README
blobname 'lbtf_usb\.bin' drivers/net/wireless/libertas_tf/if_usb.c
blobname 'isl38\(86\|87usb_bare\|90usb\)' 'drivers/net/wireless/p54/p54\(pci\.c\|usb\.[ch]\)'
- blob '[/][*] for isl3886 register definitions\([^/]\|[^*][/]*\)*[*][/]' drivers/net/wireless/p54/p54usb.h
+ blob '[/][*] for isl3886 register definitions\([^/]\|[^*/][/]*\)*[*][/]' drivers/net/wireless/p54/p54usb.h
blobna 'If you enable this\([^\n]\|[\n][ ]*[^ \n]\)*isl3890\([^\n]\|[\n][ ]*[^ \n]\)*' drivers/net/wireless/Kconfig
blobname 'isl38\(77\|86\|90\)' drivers/net/wireless/prism54/islpci_dev.c
blobname 'fsl_qe_ucode_uart_\(%u\|0-9]*\)_\(%u\|[0-9]*\)\(%u\|[0-9]*\)\.bin' drivers/serial/ucc_uart.c
- blobname 'atmel_at76c50\(3-\(i386[13]\|rfmd\(-acc\)\?\|5\(a\(mx\)\?\)\?-rfmd\(2958\)\?\)\)\.bin' drivers/staging/at76_usb/at76_usb.c
+ blobname 'atmel_at76c50\(3-\(i386[13]\|rfmd\(-acc\)\?\)\|5\(a\(mx\)\?\)\?-rfmd\(2958\)\?\)\.bin' 'drivers/\(staging\|net/wireless\)/at76_usb/at76_usb\.c'
blobname 'go7007\(fw\|tv\)\.bin' 'drivers/staging/go7007/\(go7007-\(driver\|usb\)\|saa7134-go7007\)\.c'
blobna 'You need to install[\n]*riptide\.hex[\n]\.[\n]' Documentation/sound/alsa/ALSA-Configuration.txt
blobname 'riptide\.hex' sound/pci/riptide/riptide.c
+ defsnc 'static union firmware_version firmware_versions\[\] =' sound/pci/riptide/riptide.c
blobname '\(multi\|digi\)face_firmware\(_rev11\)\?\.bin' sound/pci/rme9652/hdsp.c
blobname 'aica_firmware\.bin' sound/sh/aica.c
- accept ' [*]\([^/]\|[^*]*[/]*\)*Caution: This API\([^/]\|[^*]*[/]*\)*request_firmware.' sound/sound_firmware.c
+ accept ' [*]\([^/]\|[^*/][/]*\)*Caution: This API\([^/]\|[^*/][/]*\)*request_firmware.' sound/sound_firmware.c
accept 'static int do_mod_firmware_load(' sound/sound_firmware.c
accept 'int mod_firmware_load(' sound/sound_firmware.c
accept ' r = do_mod_firmware_load(' sound/sound_firmware.c
blobname 'dvb-fe-nxt2002\.fw' drivers/media/dvb/frontends/nxt200x.c
+ blob '[/][*][\n] [*] This driver needs two external firmware files\([^/]\|[^*/][/]*\)*dvb-fe-or51132-\(vsb\|qam\)\.fw\([^/]\|[^*/][/]*\)*[*][/]' drivers/media/dvb/frontends/or51132.c
blobname 'dvb-fe-or51132-\(vsb\|qam\)\.fw' drivers/media/dvb/frontends/or51132.c
blobname 'dvb-fe-or51211\.fw' drivers/media/dvb/frontends/or51211.c
defsnc 'static u8 serit_sp1511lhb_inittab\[\] =' drivers/media/dvb/frontends/si21xx.c
defsnc 'static u8 stv0288_inittab\[\] =' drivers/media/dvb/frontends/stv0288.c
+ blobname 'haup-ir-blaster\.bin' drivers/input/lirc/lirc_zilog.c
+
# Suspicious, deblob for now, until contributor responds.
# defsnc ' static u16 \(sr\|twinax\)_edc\[\] =' drivers/net/cxgb3/ael1002.cn
# Non-Free license in entire file.
;;
*/linux-2.6*-lirc.patch)
initnc 'const unsigned char map_table\[\] ='
+ blobname 'haup-ir-blaster\.bin' drivers/input/lirc/lirc_zilog.c
+ ;;
+ */linux-2.6*-at76.patch)
+ blobname 'atmel_at76c50\(3-\(i386[13]\|rfmd\(-acc\)\?\)\|5\(a\(mx\)\?\)\?-rfmd\(2958\)\?\)\.bin' drivers/net/wireless/at76_usb/at76_usb.c
;;
*/linux-2.6-modsign-mpilib.patch)
initnc 'const unsigned char __clz_tab\[\] ='
eol="\\([\\n]\\|\$\\)"
# Regular expression that matches a C-style comment.
-comment="\\([/][*]\\([^*]*\\|[*]\\+[^/*]\\)*[*]\\+[/]\\|[/][/][^\\n]*[\\n]\\)"
+comment="\\([/][*]\\([^/]\\|[^*/][/]*\\)*[*][/]\\|[/][/][^\\n]*[\\n]\\)"
# Regular expression that matches comments typically used in assembly.
asmcomment="\\($comment\\|[;#][^\\n]*[\\n]\\)"
sedmain="
/^$/N;
-/^[\n]\?;[/][*]\\(end .*\\)\\?[*][/];$/{
+/^[\\n]\\?;[/][*]\\(end .*\\)\\?[*][/];$/{
$4;
d;
}
i\\
Internal error at
p;
+ i\\
+/*(DEBLOB-\\
+ERROR)*/
q 2;
}
$v:reading file in
g;
$4
$v:read all
-s/^\\(;[/][*]begin [^\n]*[\\n]\\)*//;
+s/^\\(;[/][*]begin [^\\n]*[\\n]\\)*//;
s/\\($bol[\n]\?;[/][*]\\(end [^\\n]*\\)\\?[*][/];\\)*$//;
$v:???!blobfast
/$blobfast/!b clean;
# falsepos matches to files that match it.
addx () {
if test -n "$1"; then
- echo -n "\\|$1" >> $falsepos_name
+ $echo_n "\\|$1" >> $falsepos_name
fi
}
# the falseneg matches to files that match it.
badx () {
if test -n "$1"; then
- echo -n "\\|$1" >> $falseneg_name
+ $echo_n "\\|$1" >> $falseneg_name
fi
}
esac
# Then run through the selected action.
- if test "$rm" != "rm -f" || test ! `echo "$sedmain" | wc -c` -lt 1024; then
+ if test "$rm" != "rm -f" || test ! `$echo "$sedmain" | wc -c` -lt 1024; then
scriptname=`mktemp -t deblob-check-sedmain-XXXXXX`
tempfiles="$tempfiles $scriptname"
- echo "$sedmain" > $scriptname
+ $echo "$sedmain" > $scriptname
cmd="sed -n -f \"$scriptname\""
else
cmd='sed -n "$sedmain"'
: restart;
/[/][*](DEBLOB-$/ {
N;
+ /[/][*](DEBLOB-[\n]ERROR)[*][/]/{q 1;}
s,[/][*](DEBLOB-[\n]BED)[*][/],,
b restart;
-}'
- cmd='sed "$sedunbreak"'
+}
+p
+'
+ cmd='sed -n "$sedunbreak"'
set "$@" "$cmd"
# test $# = 1 || set "$@" "cat"