aboutsummaryrefslogtreecommitdiff
path: root/resources/libreboot/install/depthcharge/cros-flash-replace
diff options
context:
space:
mode:
Diffstat (limited to 'resources/libreboot/install/depthcharge/cros-flash-replace')
-rwxr-xr-xresources/libreboot/install/depthcharge/cros-flash-replace96
1 files changed, 96 insertions, 0 deletions
diff --git a/resources/libreboot/install/depthcharge/cros-flash-replace b/resources/libreboot/install/depthcharge/cros-flash-replace
new file mode 100755
index 00000000..4ad3fabd
--- /dev/null
+++ b/resources/libreboot/install/depthcharge/cros-flash-replace
@@ -0,0 +1,96 @@
+#!/bin/bash
+
+# replace the requested parts in the flash image with separate parts images
+#
+# Copyright (C) 2015 Paul Kocialkowski <contact@paulk.fr>
+#
+# 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 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+[ "x${DEBUG+set}" = 'xset' ] && set -v
+
+regex="\([0-9a-fA-F]*\):\([0-9a-fA-F]*\)[[:space:]]*\(.*\)"
+block=256
+layout="layout.txt"
+flash=$1
+
+shift 1
+
+if [ ! -f "$flash" ]
+then
+ echo "Usage: $0 [flash image] [image] ..."
+ exit 1
+fi
+
+if [ ! -f "$layout" ]
+then
+ echo "Missing layout file: $layout"
+ exit 1
+fi
+
+flashsize=$( stat $flash -c "%s" )
+
+for image in $@; do
+ range=$( grep "$image" "$layout" )
+ name=$( echo "$range" | sed "s/$regex/\3/g" )
+ file="$name.img"
+
+ if [ -z "$range" ] || [ ! -f "$file" ]
+ then
+ echo "Invalid image name: $name"
+ continue
+ fi
+
+ start=$( echo "$range" | sed "s/$regex/\1/g" )
+ start=$( printf "%d\n" "0x$start" )
+ stop=$( echo "$range" | sed "s/$regex/\2/g" )
+ stop=$( printf "%d\n" "0x$stop" )
+
+ size=$(( $stop - $start + 1 ))
+ filesize=$( stat $file -c "%s" )
+
+ if [ $size -ne $filesize ]
+ then
+ echo "Invalid file size: expected $size, read $filesize"
+ continue
+ fi
+
+ if [ $size -gt $flashsize ]
+ then
+ echo "Image size too big for flash"
+ continue
+ fi
+
+ printf "Replacing $image in $flash\n\n"
+
+ if [ $start -gt 0 ]
+ then
+ dd if=$flash of=before.img bs=$block count=$(( $start / $block ))
+ else
+ touch before.img
+ fi
+
+ if [ $(( $stop + 1 )) -lt $flashsize ]
+ then
+ dd if=$flash of=after.img skip=$(( ($stop + 1) / $block )) bs=$block count=$(( ($flashsize - $stop - 1) / $block ))
+ else
+ touch after.img
+ fi
+
+ cat before.img $file after.img > $flash
+
+ rm before.img after.img
+
+ printf "\n"
+done