summaryrefslogtreecommitdiff
path: root/scripts/repack-bootimg
blob: 69065d28e0ea6840f892bdefa032a6f368a60f3a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
# Copyright (c) 2019 Fuzhou Rockchip Electronics Co., Ltd.
set -e

usage() {
	cat >&2 << USAGE
usage: $0 [-h] [-z] --boot_img BOOT_IMG [--out OUT] [--kernel KERNEL] [--ramdisk RAMDISK] [--second SECOND] [--dtb DTB ] [--recovery_dtbo RECOVERY_DTBO] -o OUTPUT

optional arguments:
  -h, --help            show this help message and exit
  -z                    pack compressed kernel image
  --boot_img BOOT_IMG   path to the original boot image
  --out OUT             path to out binaries (default: out)
  --kernel KERNEL       path to the new kernel
  --ramdisk RAMDISK     path to the new ramdisk
  --second SECOND       path to the new 2nd bootloader (default: resource.img)
  --dtb DTB             path to the new dtb
  --recovery_dtbo RECOVERY_DTBO
                        path to the new recovery DTBO
  -o OUTPUT, --output OUTPUT
                        output file name
USAGE
}

# Parse command-line arguments
while [ $# -gt 0 ]; do
	case $1 in
		--boot_img)
			boot_img=$2
			shift 2
			;;
		--out)
			out=$2
			shift 2
			;;
		--kernel)
			kernel=$2
			shift 2
			;;
		--ramdisk)
			ramdisk=$2
			shift 2
			;;
		--second)
			second=$2
			shift 2
			;;
		--dtb)
			dtb=$2
			shift 2
			;;
		--recovery_dtbo)
			recovery_dtbo=$2
			shift 2
			;;
		-h)
			usage
			exit 0
			;;
		--help)
			usage
			exit 0
			;;
		-z)
			compressed_kernel=y
			shift
			;;
		-o)
			output=$2
			shift 2
			;;
		--output)
			output=$2
			shift 2
			;;
		*)
			shift
			;;
        esac
done

if [ "$boot_img" == "" -o ! -e "$boot_img" ]; then
	echo "No boot img"
	usage
	exit 1
fi

if [ "$output" == "" ]; then
	echo "No output file name"
	usage
	exit 1
fi

srctree=${srctree-"."}
objtree=${objtree-"."}
out=${out-"out"}
if [ "$($srctree/scripts/config --state CONFIG_ARM64)" == "y" ]; then
	if [ "$compressed_kernel" == "y" ]; then
		default_kernel=arch/arm64/boot/Image.lz4
	else
		default_kernel=arch/arm64/boot/Image
	fi
else
	if [ "$compressed_kernel" == "y" ]; then
		default_kernel=arch/arm/boot/zImage
	else
		default_kernel=arch/arm/boot/Image
	fi
fi
kernel=${kernel-$objtree/$default_kernel}
second=${second-$objtree/resource.img}
ramdisk=${ramdisk-$out/ramdisk}
dtb=${dtb-$out/dtb}
recovery_dtbo=${recovery_dtbo-$out/recovery_dtbo}
log="$out/unpack.log"

mkdir -p $out
$srctree/scripts/unpack_bootimg --boot_img $boot_img --out $out > $log

cmdline=$(grep -a "^command line args: " $log | tr '\0' '\n'| sed "s/^command line args: //")
extra_cmdline=$(grep -a "^additional command line args: " $log | tr '\0' '\n'| sed "s/^additional command line args: //")
version=$(grep -a "^boot image header version: " $log | sed "s/^boot image header version: //")
os_version=$(grep -a "^os version: " $log | sed "s/^os version: //")
os_patch_level=$(grep -a "^os patch level: " $log | sed "s/^os patch level: //")

dtb_size=$(grep -a "^dtb size: " $log | sed "s/^dtb size: //")
dtb_size=${dtb_size:-0}
if [ $dtb_size -gt 0 -a -e "$dtb" ]; then
	DTB="--dtb $dtb"
fi

recovery_dtbo_size=$(grep -a "^recovery dtbo size: " $log | sed "s/^recovery dtbo size: //")
recovery_dtbo_size=${recovery_dtbo_size:-0}
if [ $recovery_dtbo_size -gt 0 -a -e "$recovery_dtbo" ]; then
	RECOVERY_DTBO="--recovery_dtbo $recovery_dtbo"
fi

if [ $version -lt 3 ]; then
	SECOND="--second $second"
fi

$srctree/scripts/mkbootimg \
--kernel $kernel \
$SECOND \
--ramdisk $ramdisk \
$DTB \
$RECOVERY_DTBO \
--cmdline "${cmdline}${extra_cmdline}" \
--header_version $version \
--os_version $os_version \
--os_patch_level $os_patch_level \
--output $output