You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
thinkpad-ec/Makefile

169 lines
5.3 KiB
Makefile

#
# Infrastructure to manage patching thinkpad EC firmware
#
# Copyright (C) 2016 Hamish Coleman
#
all:
cat README
list_iso:
$(info The following make targets are available to produce patched and)
$(info bootable ISO images)
$(info )
@for i in *.desc; do echo `basename $$i .orig.desc` - for patching `cat $$i`; done
@echo
# FIXME - need to automatically generate the iso image target list
list_images:
$(info The following make targets are available to produce firmware images:)
$(info )
$(info $(basename $(wildcard *.d)))
$(info )
$(info The following make targets are available to produce FL2 files:)
$(info )
$(info $(foreach i,$(basename $(basename $(wildcard *.d))),$(basename $(wildcard $(i).*.FL2.slice))))
$(info )
@true
.PHONY: list_iso list_images
# All the bios update iso images I have checked have had a fat16 filesystem
# embedded in a dos mbr image as the el-torito ISO payload. They also all
# had the same offset to this fat filesystem, so hardcode that offset here.
FAT_OFFSET := 71680
#
# Radare didnt seem to let me specify the directory to store the project file,
# so this target hacks around that
#
install.radare.projects:
mkdir -p ~/.config/radare2/projects/x220.8DHT34WW.d
cp -fs $(PWD)/radare/x220.8DHT34WW ~/.config/radare2/projects
mkdir -p ~/.config/radare2/projects/x230.G2HT35WW.d
cp -fs $(PWD)/radare/x230.G2HT35WW ~/.config/radare2/projects
DEPSDIR := .d
$(shell mkdir -p $(DEPSDIR))
-include $(DEPSDIR)/slice.extract.deps
$(DEPSDIR)/slice.extract.deps: Makefile
for i in *.slice; do read SLICEE other <$$i; echo $$i: $$SLICEE; done >$@
-include $(DEPSDIR)/slice.insert.deps
$(DEPSDIR)/slice.insert.deps: Makefile
for i in *.slice; do read SLICEE other <$$i; echo `basename $$SLICEE .orig`: $$i `basename $$i .slice`; done >$@
# FIXME - the slice.deps targets basically do not handle add/del/change of
# the *.slice files. I dont use any of the regular tricks because I also
# dont want to download every .iso file as a result of depending on the %.slice
# file - and I dont want to work around that with makefile magic as that would
# defeat the purpose of keeping the makefile simple
#
# Download any ISO image that we have a checksum for
# NOTE: makes an assumption about the Lenovo URL not changing
%.iso.orig: %.iso.orig.sha1
wget -O $@ https://download.lenovo.com/pccbbs/mobiles/$(basename $@)
sha1sum -c $<
touch $@
# Generate all the orig images so that we can diff against them later
# a the generic binary extractor
%.orig: %.slice slice.extract
./slice.extract $< $@
%.img.orig: %.img.enc.orig %.img.orig.sha1 mec-tools/mec_encrypt
mec-tools/mec_encrypt -d $< >$@
sha1sum -c $@.sha1
# a generic encryptor
%.img.enc: %.img xx30.encrypt
./xx30.encrypt $< $@
# TODO
# - if we ever get generic extraction or encryption for more than
# just the Xx30 series, these generic rules will need to be reworked
# keep intermediate files
.PRECIOUS: %.orig
.PRECIOUS: %.img
.PRECIOUS: %.img.orig
# Generate a working file with any known patches applied
%.img: %.img.orig
cp --reflink=auto $< $@
./hexpatch.pl $@ $@.d/*.patch
%.iso.bat: %.iso.orig %.iso.orig.desc autoexec.bat.template
sed -e "s%__FL2%`mdir -/ -b -i $<@@$(FAT_OFFSET) |grep FL2 |cut -d/ -f3-`%; s%__DESC%`cat $<.desc`%" autoexec.bat.template >$@
# helper to write the ISO onto a cdrw
%.iso.blank_burn: %.iso
wodim -eject -v speed=40 -tao gracetime=0 blank=fast $<
# if you want to work on more patches, you probably want the pre-patched ver
%.img.prepatch: %.img.orig
cp --reflink=auto $< $(basename $<)
%.hex: %
hd -v $< >$@
# Generate a patch report
%.diff: %.hex %.orig.hex
-diff -u $(basename $@).orig.hex $(basename $@).hex >$@
cat $@
# If we ever want a copy of the dosflash.exe, just get it from the iso image
%.dosflash.exe.orig: %.iso.orig
mcopy -i $^@@$(FAT_OFFSET) ::FLASH/DOSFLASH.EXE $@
mec-tools/Makefile:
git submodule update --init --remote
mec-tools/mec_encrypt: mec-tools/Makefile
make -C mec-tools
#
# TODO:
# - add a simple method to autogenerate these non-generic rules
# Hacky, non generic rules
t430.G1HT35WW.s01D2000.FL2: t430.G1HT35WW.img.enc
./slice.insert $<.slice $< $@
t430s.G7HT39WW.s01D8000.FL2: t430s.G7HT39WW.img.enc
./slice.insert $<.slice $< $@
t530.G4HT39WW.s01D5100.FL2: t530.G4HT39WW.img.enc
./slice.insert $<.slice $< $@
w530.G4HT39WW.s01D5200.FL2: w530.G4HT39WW.img.enc
./slice.insert $<.slice $< $@
x230.G2HT35WW.s01D3000.FL2: x230.G2HT35WW.img.enc
./slice.insert $<.slice $< $@
x230t.GCHT25WW.s01DA000.FL2: x230t.GCHT25WW.img.enc
./slice.insert $<.slice $< $@
g1uj38us.iso: t430.G1HT35WW.s01D2000.FL2 g1uj38us.iso.bat
./slice.insert $<.slice $< $@
mcopy -o -i $@@@$(FAT_OFFSET) $@.bat ::AUTOEXEC.BAT
g2uj23us.iso: x230.G2HT35WW.s01D3000.FL2 g2uj23us.iso.bat
./slice.insert $<.slice $< $@
mcopy -o -i $@@@$(FAT_OFFSET) $@.bat ::AUTOEXEC.BAT
g4uj30us.iso: t530.G4HT39WW.s01D5100.FL2 g4uj30us.iso.bat
./slice.insert $<.slice $< $@
mcopy -o -i $@@@$(FAT_OFFSET) $@.bat ::AUTOEXEC.BAT
g5uj28us.iso: w530.G4HT39WW.s01D5200.FL2 g5uj28us.iso.bat
./slice.insert $<.slice $< $@
mcopy -o -i $@@@$(FAT_OFFSET) $@.bat ::AUTOEXEC.BAT
g7uj18us.iso: t430s.G7HT39WW.s01D8000.FL2 g7uj18us.iso.bat
./slice.insert $<.slice $< $@
mcopy -o -i $@@@$(FAT_OFFSET) $@.bat ::AUTOEXEC.BAT
gcuj24us.iso: x230t.GCHT25WW.s01DA000.FL2 gcuj24us.iso.bat
./slice.insert $<.slice $< $@
mcopy -o -i $@@@$(FAT_OFFSET) $@.bat ::AUTOEXEC.BAT