summaryrefslogtreecommitdiffstats
path: root/meta/classes
diff options
context:
space:
mode:
authorMarek Vasut <marex@denx.de>2015-05-14 14:31:12 +0200
committerRichard Purdie <richard.purdie@linuxfoundation.org>2015-05-26 10:57:52 +0100
commita33a567644b70b8a63779957fb48dd01a94e1f45 (patch)
tree86cd26e355c47cdc5783c2cc43dfdba2f02f92c7 /meta/classes
parentd2e26ef348664791ede44884679282301bd10e11 (diff)
downloadpoky-a33a567644b70b8a63779957fb48dd01a94e1f45.tar.gz
kernel: Add basic fitImage support
This patch adds support for generating a kernel fitImage, which is a a successor to the uImage format. Unlike uImage, which could only contain the kernel image itself, the fitImage can contain all kinds of artifacts, like the kernel image, device tree blobs, initramfs images, binary firmwares etc. Furthermore, the fitImage supports different kinds of checksums, not only CRC32 like the uImage did. Last, but not least, fitImage supports signatures such that either the whole image or it's parts can be signed and then in turn can be verified by the bootloader. So far we only add support for wrapping the kernel image and DTB into the fitImage. The fitImage uses the sha1 checksum, which is the default. (From OE-Core rev: d92664278cfd0fdb455f78f73f2c44a9ee1716e4) Signed-off-by: Marek Vasut <marex@denx.de> Cc: Richard Purdie <richard.purdie@linuxfoundation.org> Cc: Koen Kooi <koen@dominion.thruhere.net> Cc: Paul Eggleton <paul.eggleton@linux.intel.com> Cc: Ross Burton <ross.burton@intel.com> Cc: Bruce Ashfield <bruce.ashfield@windriver.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta/classes')
-rw-r--r--meta/classes/kernel-fitimage.bbclass234
1 files changed, 234 insertions, 0 deletions
diff --git a/meta/classes/kernel-fitimage.bbclass b/meta/classes/kernel-fitimage.bbclass
new file mode 100644
index 0000000000..2a56a54516
--- /dev/null
+++ b/meta/classes/kernel-fitimage.bbclass
@@ -0,0 +1,234 @@
1inherit kernel-uboot
2
3python __anonymous () {
4 kerneltype = d.getVar('KERNEL_IMAGETYPE', True)
5 if kerneltype == 'fitImage':
6 depends = d.getVar("DEPENDS", True)
7 depends = "%s u-boot-mkimage-native dtc-native" % depends
8 d.setVar("DEPENDS", depends)
9
10 # Override KERNEL_IMAGETYPE_FOR_MAKE variable, which is internal
11 # to kernel.bbclass . We have to override it, since we pack zImage
12 # (at least for now) into the fitImage .
13 d.setVar("KERNEL_IMAGETYPE_FOR_MAKE", "zImage")
14
15 image = d.getVar('INITRAMFS_IMAGE', True)
16 if image:
17 d.appendVarFlag('do_assemble_fitimage', 'depends', ' ${INITRAMFS_IMAGE}:do_rootfs')
18}
19
20#
21# Emit the fitImage ITS header
22#
23fitimage_emit_fit_header() {
24 cat << EOF >> fit-image.its
25/dts-v1/;
26
27/ {
28 description = "U-Boot fitImage for ${DISTRO_NAME}/${PV}/${MACHINE}";
29 #address-cells = <1>;
30EOF
31}
32
33#
34# Emit the fitImage section bits
35#
36# $1 ... Section bit type: imagestart - image section start
37# confstart - configuration section start
38# sectend - section end
39# fitend - fitimage end
40#
41fitimage_emit_section_maint() {
42 case $1 in
43 imagestart)
44 cat << EOF >> fit-image.its
45
46 images {
47EOF
48 ;;
49 confstart)
50 cat << EOF >> fit-image.its
51
52 configurations {
53EOF
54 ;;
55 sectend)
56 cat << EOF >> fit-image.its
57 };
58EOF
59 ;;
60 fitend)
61 cat << EOF >> fit-image.its
62};
63EOF
64 ;;
65 esac
66}
67
68#
69# Emit the fitImage ITS kernel section
70#
71# $1 ... Image counter
72# $2 ... Path to kernel image
73# $3 ... Compression type
74fitimage_emit_section_kernel() {
75
76 kernel_csum="sha1"
77
78 ENTRYPOINT=${UBOOT_ENTRYPOINT}
79 if test -n "${UBOOT_ENTRYSYMBOL}"; then
80 ENTRYPOINT=`${HOST_PREFIX}nm ${S}/vmlinux | \
81 awk '$3=="${UBOOT_ENTRYSYMBOL}" {print $1}'`
82 fi
83
84 cat << EOF >> fit-image.its
85 kernel@${1} {
86 description = "Linux kernel";
87 data = /incbin/("${2}");
88 type = "kernel";
89 arch = "${UBOOT_ARCH}";
90 os = "linux";
91 compression = "${3}";
92 load = <${UBOOT_LOADADDRESS}>;
93 entry = <${ENTRYPOINT}>;
94 hash@1 {
95 algo = "${kernel_csum}";
96 };
97 };
98EOF
99}
100
101#
102# Emit the fitImage ITS DTB section
103#
104# $1 ... Image counter
105# $2 ... Path to DTB image
106fitimage_emit_section_dtb() {
107
108 dtb_csum="sha1"
109
110 cat << EOF >> fit-image.its
111 fdt@${1} {
112 description = "Flattened Device Tree blob";
113 data = /incbin/("${2}");
114 type = "flat_dt";
115 arch = "${UBOOT_ARCH}";
116 compression = "none";
117 hash@1 {
118 algo = "${dtb_csum}";
119 };
120 };
121EOF
122}
123
124#
125# Emit the fitImage ITS configuration section
126#
127# $1 ... Linux kernel ID
128# $2 ... DTB image ID
129fitimage_emit_section_config() {
130
131 conf_csum="sha1"
132
133 # Test if we have any DTBs at all
134 if [ -z "${2}" ] ; then
135 conf_desc="Boot Linux kernel"
136 fdt_line=""
137 else
138 conf_desc="Boot Linux kernel with FDT blob"
139 fdt_line="fdt = \"fdt@${2}\";"
140 fi
141 kernel_line="kernel = \"kernel@${1}\";"
142
143 cat << EOF >> fit-image.its
144 default = "conf@1";
145 conf@1 {
146 description = "${conf_desc}";
147 ${kernel_line}
148 ${fdt_line}
149 hash@1 {
150 algo = "${conf_csum}";
151 };
152 };
153EOF
154}
155
156do_assemble_fitimage() {
157 if test "x${KERNEL_IMAGETYPE}" = "xfitImage" ; then
158 kernelcount=1
159 dtbcount=""
160 rm -f fit-image.its
161
162 fitimage_emit_fit_header
163
164 #
165 # Step 1: Prepare a kernel image section.
166 #
167 fitimage_emit_section_maint imagestart
168
169 uboot_prep_kimage
170 fitimage_emit_section_kernel "${kernelcount}" linux.bin "${linux_comp}"
171
172 #
173 # Step 2: Prepare a DTB image section
174 #
175 if test -n "${KERNEL_DEVICETREE}"; then
176 dtbcount=1
177 for DTB in ${KERNEL_DEVICETREE}; do
178 if echo ${DTB} | grep -q '/dts/'; then
179 bbwarn "${DTB} contains the full path to the the dts file, but only the dtb name should be used."
180 DTB=`basename ${DTB} | sed 's,\.dts$,.dtb,g'`
181 fi
182 DTB_PATH="arch/${ARCH}/boot/dts/${DTB}"
183 if [ ! -e "${DTB_PATH}" ]; then
184 DTB_PATH="arch/${ARCH}/boot/${DTB}"
185 fi
186
187 fitimage_emit_section_dtb ${dtbcount} ${DTB_PATH}
188 dtbcount=`expr ${dtbcount} + 1`
189 done
190 fi
191
192 fitimage_emit_section_maint sectend
193
194 # Force the first Kernel and DTB in the default config
195 kernelcount=1
196 dtbcount=1
197
198 #
199 # Step 3: Prepare a configurations section
200 #
201 fitimage_emit_section_maint confstart
202
203 fitimage_emit_section_config ${kernelcount} ${dtbcount}
204
205 fitimage_emit_section_maint sectend
206
207 fitimage_emit_section_maint fitend
208
209 #
210 # Step 4: Assemble the image
211 #
212 uboot-mkimage -f fit-image.its arch/${ARCH}/boot/fitImage
213 fi
214}
215
216addtask assemble_fitimage before do_install after do_compile
217
218kernel_do_deploy_append() {
219 # Update deploy directory
220 if test "x${KERNEL_IMAGETYPE}" = "xfitImage" ; then
221 cd ${B}
222 echo "Copying fit-image.its source file..."
223 its_base_name="${KERNEL_IMAGETYPE}-its-${PV}-${PR}-${MACHINE}-${DATETIME}"
224 its_symlink_name=${KERNEL_IMAGETYPE}-its-${MACHINE}
225 install -m 0644 fit-image.its ${DEPLOYDIR}/${its_base_name}.its
226 linux_bin_base_name="${KERNEL_IMAGETYPE}-linux.bin-${PV}-${PR}-${MACHINE}-${DATETIME}"
227 linux_bin_symlink_name=${KERNEL_IMAGETYPE}-linux.bin-${MACHINE}
228 install -m 0644 linux.bin ${DEPLOYDIR}/${linux_bin_base_name}.bin
229
230 cd ${DEPLOYDIR}
231 ln -sf ${its_base_name}.its ${its_symlink_name}.its
232 ln -sf ${linux_bin_base_name}.bin ${linux_bin_symlink_name}.bin
233 fi
234}