blob: 10388d2570ac2ad1243879ef8fb0820ed2a036dd [file] [log] [blame]
Brad Bishop0e27f202017-07-22 14:49:25 -04001# Base image class extension, inlined into every image.
2
Saqib Khana8433f52017-09-22 10:21:30 -05003inherit image_version
Brad Bishop0e27f202017-07-22 14:49:25 -04004
Brad Bishop95c130a2017-08-04 23:38:54 -04005# Phosphor image types
6#
Brad Bishopfbb736d2017-08-04 23:48:12 -04007# Phosphor OpenBMC supports a fixed partition mtd layout,
8# A dynamic mtd with ubi layout, and a tar file for use with
9# The reference BMC software update implementation.
Brad Bishop95c130a2017-08-04 23:38:54 -040010
11# Image composition
Brad Bishop82db9d52019-01-08 14:04:48 -050012FLASH_KERNEL_IMAGE ?= "fitImage-${INITRAMFS_IMAGE}-${MACHINE}-${MACHINE}"
Brad Bishop811eeec2018-03-09 00:04:00 -050013FLASH_KERNEL_IMAGE_df-obmc-ubi-fs ?= "fitImage-${MACHINE}.bin"
14
Brad Bishop95c130a2017-08-04 23:38:54 -040015IMAGE_BASETYPE ?= "squashfs-xz"
16OVERLAY_BASETYPE ?= "jffs2"
Brad Bishopfbb736d2017-08-04 23:48:12 -040017FLASH_UBI_BASETYPE ?= "${IMAGE_BASETYPE}"
18FLASH_UBI_OVERLAY_BASETYPE ?= "ubifs"
Adriana Kobylak02d65b72019-07-29 15:25:33 -050019FLASH_EXT4_BASETYPE ?= "ext4"
Adriana Kobylak846990e2019-07-30 11:27:46 -050020FLASH_EXT4_OVERLAY_BASETYPE ?= "ext4"
Brad Bishop95c130a2017-08-04 23:38:54 -040021
Adriana Kobylak86cfbd52020-01-10 11:40:42 -060022IMAGE_TYPES += "mtd-static mtd-static-alltar mtd-static-tar mtd-ubi mtd-ubi-tar mmc-verity mmc-ext4-tar"
Brad Bishop95c130a2017-08-04 23:38:54 -040023
24IMAGE_TYPEDEP_mtd-static = "${IMAGE_BASETYPE}"
25IMAGE_TYPEDEP_mtd-static-tar = "${IMAGE_BASETYPE}"
26IMAGE_TYPEDEP_mtd-static-alltar = "mtd-static"
Brad Bishopfbb736d2017-08-04 23:48:12 -040027IMAGE_TYPEDEP_mtd-ubi = "${FLASH_UBI_BASETYPE}"
28IMAGE_TYPEDEP_mtd-ubi-tar = "${FLASH_UBI_BASETYPE}"
Adriana Kobylak86cfbd52020-01-10 11:40:42 -060029IMAGE_TYPEDEP_mmc-verity = "${FLASH_EXT4_BASETYPE}"
Adriana Kobylak02d65b72019-07-29 15:25:33 -050030IMAGE_TYPEDEP_mmc-ext4-tar = "${FLASH_EXT4_BASETYPE}"
Adriana Kobylak86cfbd52020-01-10 11:40:42 -060031IMAGE_TYPES_MASKED += "mtd-static mtd-static-alltar mtd-static-tar mtd-ubi mtd-ubi-tar mmc-verity mmc-ext4-tar"
32
33IMAGE_BLOCK_SIZE ?= "4096"
34EXTRA_IMAGECMD_ext4 = "-b ${IMAGE_BLOCK_SIZE}"
Brad Bishop95c130a2017-08-04 23:38:54 -040035
Brad Bishopfbb736d2017-08-04 23:48:12 -040036# Flash characteristics in KB unless otherwise noted
Brad Bishop9e84ca22019-09-24 21:16:09 -040037DISTROOVERRIDES .= ":flash-${FLASH_SIZE}"
Brad Bishop95c130a2017-08-04 23:38:54 -040038FLASH_SIZE ?= "32768"
Brad Bishopfbb736d2017-08-04 23:48:12 -040039FLASH_PEB_SIZE ?= "64"
40# Flash page and overhead sizes in bytes
41FLASH_PAGE_SIZE ?= "1"
42FLASH_NOR_UBI_OVERHEAD ?= "64"
Brad Bishop95c130a2017-08-04 23:38:54 -040043
44# Fixed partition offsets
45FLASH_UBOOT_OFFSET ?= "0"
46FLASH_KERNEL_OFFSET ?= "512"
Brad Bishop9e84ca22019-09-24 21:16:09 -040047FLASH_KERNEL_OFFSET_flash-131072 ?= "1024"
Brad Bishopfbb736d2017-08-04 23:48:12 -040048FLASH_UBI_OFFSET ?= "${FLASH_KERNEL_OFFSET}"
Brad Bishop95c130a2017-08-04 23:38:54 -040049FLASH_ROFS_OFFSET ?= "4864"
Brad Bishop9e84ca22019-09-24 21:16:09 -040050FLASH_ROFS_OFFSET_flash-131072 ?= "10240"
Brad Bishop95c130a2017-08-04 23:38:54 -040051FLASH_RWFS_OFFSET ?= "28672"
Brad Bishop9e84ca22019-09-24 21:16:09 -040052FLASH_RWFS_OFFSET_flash-131072 ?= "98304"
Brad Bishop95c130a2017-08-04 23:38:54 -040053
Brad Bishopfbb736d2017-08-04 23:48:12 -040054# UBI volume sizes in KB unless otherwise noted.
Adriana Kobylakb7059982018-02-14 16:35:30 -060055FLASH_UBI_RWFS_SIZE ?= "6144"
Brad Bishop9e84ca22019-09-24 21:16:09 -040056FLASH_UBI_RWFS_SIZE_flash-131072 ?= "32768"
Adriana Kobylakb7059982018-02-14 16:35:30 -060057FLASH_UBI_RWFS_TXT_SIZE ?= "6MiB"
Brad Bishop9e84ca22019-09-24 21:16:09 -040058FLASH_UBI_RWFS_TXT_SIZE_flash-131072 ?= "32MiB"
Brad Bishopfbb736d2017-08-04 23:48:12 -040059
Eddie James1a623ef2018-02-09 11:59:18 -060060SIGNING_KEY ?= "${STAGING_DIR_NATIVE}${datadir}/OpenBMC.priv"
61INSECURE_KEY = "${@'${SIGNING_KEY}' == '${STAGING_DIR_NATIVE}${datadir}/OpenBMC.priv'}"
62SIGNING_KEY_DEPENDS = "${@oe.utils.conditional('INSECURE_KEY', 'True', 'phosphor-insecure-signing-key-native:do_populate_sysroot', '', d)}"
63
Adriana Kobylak35626552019-10-28 16:03:12 -050064VERSION_PURPOSE ?= "xyz.openbmc_project.Software.Version.VersionPurpose.BMC"
65
Brad Bishopf3cc7ae2018-03-31 12:17:28 -040066UBOOT_SUFFIX ?= "bin"
67
Brad Bishopfbb736d2017-08-04 23:48:12 -040068python() {
69 # Compute rwfs LEB count and LEB size.
70 page_size = d.getVar('FLASH_PAGE_SIZE', True)
71 nor_overhead_size = d.getVar('FLASH_NOR_UBI_OVERHEAD', True)
72 overhead_size = max(int(page_size), int(nor_overhead_size))
73 peb_size = d.getVar('FLASH_PEB_SIZE', True)
74 leb_size = (int(peb_size) * 1024) - (2 * overhead_size)
75 d.setVar('FLASH_LEB_SIZE', str(leb_size)) # In bytes
76
77 rwfs_size = d.getVar('FLASH_UBI_RWFS_SIZE', True)
78 rwfs_size = int(rwfs_size) * 1024
79 lebs = int((rwfs_size + leb_size - 1) / leb_size) # Rounding up
80 d.setVar('FLASH_UBI_RWFS_LEBS', str(lebs))
81}
82
Brad Bishop95c130a2017-08-04 23:38:54 -040083# Allow rwfs mkfs configuration through OVERLAY_MKFS_OPTS and OVERRIDES. However,
84# avoid setting 'ext4' or 'jffs2' in OVERRIDES as such raw filesystem types are
85# reserved for the primary image (and setting them currently breaks the build).
86# Instead, prefix the overlay override value with 'rwfs-' to avoid collisions.
87DISTROOVERRIDES .= ":static-rwfs-${OVERLAY_BASETYPE}"
Brad Bishopfbb736d2017-08-04 23:48:12 -040088DISTROOVERRIDES .= ":ubi-rwfs-${FLASH_UBI_OVERLAY_BASETYPE}"
Adriana Kobylak846990e2019-07-30 11:27:46 -050089DISTROOVERRIDES .= ":mmc-rwfs-${FLASH_EXT4_OVERLAY_BASETYPE}"
Brad Bishop95c130a2017-08-04 23:38:54 -040090
William A. Kennington III8ba81f72019-09-16 17:44:48 -070091JFFS2_RWFS_CMD = "mkfs.jffs2 --root=jffs2 --faketime --output=${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.jffs2"
92UBIFS_RWFS_CMD = "mkfs.ubifs -r ubifs -c ${FLASH_UBI_RWFS_LEBS} -m ${FLASH_PAGE_SIZE} -e ${FLASH_LEB_SIZE} ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.ubifs"
Adriana Kobylak846990e2019-07-30 11:27:46 -050093EXT4_RWFS_CMD = "mkfs.ext4 -F ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.rwfs.ext4"
Brad Bishop95c130a2017-08-04 23:38:54 -040094
95FLASH_STATIC_RWFS_CMD_static-rwfs-jffs2 = "${JFFS2_RWFS_CMD}"
Brad Bishopfbb736d2017-08-04 23:48:12 -040096FLASH_UBI_RWFS_CMD_ubi-rwfs-jffs2 = "${JFFS2_RWFS_CMD}"
97FLASH_UBI_RWFS_CMD_ubi-rwfs-ubifs = "${UBIFS_RWFS_CMD}"
Adriana Kobylak846990e2019-07-30 11:27:46 -050098FLASH_EXT4_RWFS_CMD_mmc-rwfs-ext4 = "${EXT4_RWFS_CMD}"
Brad Bishop95c130a2017-08-04 23:38:54 -040099
Adriana Kobylakfdb81a32019-07-29 14:39:00 -0500100mk_empty_image() {
Brad Bishop95c130a2017-08-04 23:38:54 -0400101 image_dst="$1"
102 image_size_kb=$2
103 dd if=/dev/zero bs=1k count=$image_size_kb \
104 | tr '\000' '\377' > $image_dst
105}
106
Adriana Kobylake82e8bc2019-07-29 16:14:11 -0500107clean_rwfs() {
108 type=$1
109 shift
110
111 rm -f ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.$type
112 rm -rf $type
113 mkdir $type
114}
115
Brad Bishop95c130a2017-08-04 23:38:54 -0400116make_rwfs() {
117 type=$1
118 cmd=$2
119 shift
120 shift
121 opts="$@"
122
Adriana Kobylake82e8bc2019-07-29 16:14:11 -0500123 mkdir -p $type
Brad Bishop95c130a2017-08-04 23:38:54 -0400124
125 $cmd $opts
126}
127
128do_generate_rwfs_static() {
Adriana Kobylake82e8bc2019-07-29 16:14:11 -0500129 clean_rwfs ${OVERLAY_BASETYPE}
Brad Bishop95c130a2017-08-04 23:38:54 -0400130 make_rwfs ${OVERLAY_BASETYPE} "${FLASH_STATIC_RWFS_CMD}" ${OVERLAY_MKFS_OPTS}
131}
132do_generate_rwfs_static[dirs] = " ${S}/static"
133do_generate_rwfs_static[depends] += " \
134 mtd-utils-native:do_populate_sysroot \
135 "
136
Brad Bishopfbb736d2017-08-04 23:48:12 -0400137do_generate_rwfs_ubi() {
Adriana Kobylake82e8bc2019-07-29 16:14:11 -0500138 clean_rwfs ${FLASH_UBI_OVERLAY_BASETYPE}
Brad Bishopfbb736d2017-08-04 23:48:12 -0400139 make_rwfs ${FLASH_UBI_OVERLAY_BASETYPE} "${FLASH_UBI_RWFS_CMD}"
140}
141do_generate_rwfs_ubi[dirs] = " ${S}/ubi"
142do_generate_rwfs_ubi[depends] += " \
143 mtd-utils-native:do_populate_sysroot \
144 "
145
Adriana Kobylak846990e2019-07-30 11:27:46 -0500146do_generate_rwfs_ext4() {
147 clean_rwfs rwfs.${FLASH_EXT4_OVERLAY_BASETYPE}
148 mk_empty_image ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.rwfs.ext4 1024
149 make_rwfs ${FLASH_EXT4_OVERLAY_BASETYPE} "${FLASH_EXT4_RWFS_CMD}" ${OVERLAY_MKFS_OPTS}
150}
151do_generate_rwfs_ext4[dirs] = " ${S}/ext4"
152do_generate_rwfs_ext4[depends] += " \
153 e2fsprogs-native:do_populate_sysroot \
154 "
155
Brad Bishopfbb736d2017-08-04 23:48:12 -0400156add_volume() {
157 config_file=$1
158 vol_id=$2
159 vol_type=$3
160 vol_name=$4
161 image=$5
162 vol_size=$6
163
164 echo \[$vol_name\] >> $config_file
165 echo mode=ubi >> $config_file
166 echo image=$image >> $config_file
167 echo vol_type=$vol_type >> $config_file
168 echo vol_name=$vol_name >> $config_file
169 echo vol_id=$vol_id >> $config_file
170 if [ ! -z $vol_size ]; then
171 echo vol_size=$vol_size >> $config_file
172 fi
173}
174
Saqib Khana8433f52017-09-22 10:21:30 -0500175python do_generate_ubi() {
176 version_id = do_get_versionID(d)
177 d.setVar('VERSION_ID', version_id)
178 bb.build.exec_func("do_make_ubi", d)
179}
180do_generate_ubi[dirs] = "${S}/ubi"
181do_generate_ubi[depends] += " \
182 ${PN}:do_image_${@d.getVar('FLASH_UBI_BASETYPE', True).replace('-', '_')} \
183 virtual/kernel:do_deploy \
184 u-boot:do_populate_sysroot \
185 mtd-utils-native:do_populate_sysroot \
186 "
187
188do_make_ubi() {
Brad Bishopfbb736d2017-08-04 23:48:12 -0400189 cfg=ubinize-${IMAGE_NAME}.cfg
Brad Bishopfbb736d2017-08-04 23:48:12 -0400190 rm -f $cfg ubi-img
Brad Bishopfbb736d2017-08-04 23:48:12 -0400191 # Construct the ubinize config file
Saqib Khana8433f52017-09-22 10:21:30 -0500192 add_volume $cfg 0 static kernel-${VERSION_ID} \
Brad Bishopfbb736d2017-08-04 23:48:12 -0400193 ${DEPLOY_DIR_IMAGE}/${FLASH_KERNEL_IMAGE}
194
Saqib Khana8433f52017-09-22 10:21:30 -0500195 add_volume $cfg 1 static rofs-${VERSION_ID} \
Brad Bishopfbb736d2017-08-04 23:48:12 -0400196 ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.${FLASH_UBI_BASETYPE}
197
William A. Kennington III8ba81f72019-09-16 17:44:48 -0700198 add_volume $cfg 2 dynamic rwfs ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.${FLASH_UBI_OVERLAY_BASETYPE} ${FLASH_UBI_RWFS_TXT_SIZE}
Brad Bishopfbb736d2017-08-04 23:48:12 -0400199
200 # Build the ubi partition image
201 ubinize -p ${FLASH_PEB_SIZE}KiB -m ${FLASH_PAGE_SIZE} -o ubi-img $cfg
202
203 # Concatenate the uboot and ubi partitions
Adriana Kobylakfdb81a32019-07-29 14:39:00 -0500204 mk_empty_image ${IMGDEPLOYDIR}/${IMAGE_NAME}.ubi.mtd ${FLASH_SIZE}
Brad Bishopfbb736d2017-08-04 23:48:12 -0400205 dd bs=1k conv=notrunc seek=${FLASH_UBOOT_OFFSET} \
206 if=${DEPLOY_DIR_IMAGE}/u-boot.${UBOOT_SUFFIX} \
207 of=${IMGDEPLOYDIR}/${IMAGE_NAME}.ubi.mtd
208 dd bs=1k conv=notrunc seek=${FLASH_UBI_OFFSET} \
209 if=ubi-img \
210 of=${IMGDEPLOYDIR}/${IMAGE_NAME}.ubi.mtd
211
212 cd ${IMGDEPLOYDIR}
213 ln -sf ${IMAGE_NAME}.ubi.mtd ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.ubi.mtd
214}
Saqib Khana8433f52017-09-22 10:21:30 -0500215do_make_ubi[dirs] = "${S}/ubi"
216do_make_ubi[depends] += " \
Brad Bishopfbb736d2017-08-04 23:48:12 -0400217 ${PN}:do_image_${@d.getVar('FLASH_UBI_BASETYPE', True).replace('-', '_')} \
218 virtual/kernel:do_deploy \
219 u-boot:do_populate_sysroot \
220 mtd-utils-native:do_populate_sysroot \
221 "
222
Adriana Kobylak86cfbd52020-01-10 11:40:42 -0600223python do_generate_mmc_verity() {
224 import os
225 import subprocess
226
227 rootfs_image = os.path.join(d.getVar('IMGDEPLOYDIR', True),
228 '%s.%s' % (
229 d.getVar('IMAGE_LINK_NAME', True),
230 d.getVar('FLASH_EXT4_BASETYPE', True)))
231
232 verity_image = 'verity-%s.%s' % (
233 d.getVar('IMAGE_LINK_NAME', True),
234 d.getVar('FLASH_EXT4_BASETYPE', True))
235
236 subprocess.check_call(['dd',
237 'if=%s' % rootfs_image,
238 'of=%s' % verity_image])
239
240 # dm-verity values
241 sector_size = 512
242 block_size = int(d.getVar('IMAGE_BLOCK_SIZE', True))
243 verity_algo = "sha256"
244 rootfs_image_size = os.stat(rootfs_image).st_size
245
246 def align_up(number, boundary):
247 return ((number + (boundary - 1)) // boundary) * boundary
248
249 # verity metadata must be aligned on the block boundary subsequent to the
250 # end of the data
251 verity_hash_offset = align_up(rootfs_image_size, block_size)
252
253 verity_hash_blocks = verity_hash_offset // block_size
254
255 # the output of 'veritysetup format' looks like:
256 # VERITY header information for obmc-phosphor-image-witherspoon.squashfs-xz
257 # UUID: 269b5934-de5b-45b0-99a3-56b219a7b544
258 # Hash type: 1
259 # Data blocks: 4523
260 # Data block size: 4096
261 # Hash block size: 4096
262 # Hash algorithm: sha256
263 # Salt: 8fca9eff342fc0cf2964057257ea80813a223cb2e540a38458142edeb190e12e
264 # Root hash: 38ef00d23fa89300dcf66e7494d25246d03bf846b4119b34e7b1587c0b6fe1d9
265 verity_hash_file = "verity-hash-verification-data"
266 with open(verity_hash_file, 'w') as f:
267 subprocess.check_call(['veritysetup',
268 'format',
269 '--hash=%s'% verity_algo,
270 '--data-block-size=%i' % block_size,
271 '--hash-block-size=%i' % block_size,
272 '--hash-offset=%i' % verity_hash_offset,
273 '%s' % verity_image,
274 '%s' % verity_image], stdout=f, stderr=f)
275
276 for line in open(verity_hash_file, "r"):
277 if "Salt" in line:
278 verity_salt = line.split()[-1]
279 if "Root" in line:
280 verity_root = line.split()[-1]
281
282 verity_image_size = os.stat(verity_image).st_size
283
284 # Make an appropriately sized image for MMC
285 mmc_image_name = "%s.mmc" % d.getVar('IMAGE_NAME', True)
286 mmc_image_path = os.path.join(d.getVar('IMGDEPLOYDIR', True),
287 '%s' % mmc_image_name)
288
289 # CSD size accommodates MMC limitations that are relevant to QEMU
290 csd_size = (1 << (9 + 9 - 1 + 2))
291
292 with open(mmc_image_path, 'w') as fd:
293 os.posix_fallocate(fd.fileno(), 0, align_up(verity_image_size, csd_size))
294 subprocess.check_call(['dd',
295 'if=%s' % verity_image,
296 'of=%s' % mmc_image_path,
297 'conv=notrunc'])
298
299 os.chdir("%s" % d.getVar('IMGDEPLOYDIR', True))
300 mmc_link_name = os.path.join(d.getVar('IMGDEPLOYDIR', True),
301 '%s.mmc' % d.getVar('IMAGE_LINK_NAME', True))
302 if os.path.lexists(mmc_link_name):
303 os.remove(mmc_link_name)
304 os.symlink(mmc_image_name, mmc_link_name)
305}
306do_generate_mmc_verity[dirs] = "${S}/mmc"
307do_generate_mmc_verity[depends] += " \
308 ${PN}:do_image_${FLASH_EXT4_BASETYPE} \
309 cryptsetup-native:do_populate_sysroot \
310 "
311
Alexander Filippov726672c2018-07-17 16:41:37 +0300312do_mk_static_nor_image() {
Brad Bishop95c130a2017-08-04 23:38:54 -0400313 # Assemble the flash image
Adriana Kobylakfdb81a32019-07-29 14:39:00 -0500314 mk_empty_image ${IMGDEPLOYDIR}/${IMAGE_NAME}.static.mtd ${FLASH_SIZE}
Alexander Filippov726672c2018-07-17 16:41:37 +0300315}
Brad Bishop95c130a2017-08-04 23:38:54 -0400316
Alexander Filippov726672c2018-07-17 16:41:37 +0300317python do_generate_static() {
318 import subprocess
Brad Bishop95c130a2017-08-04 23:38:54 -0400319
Alexander Filippov726672c2018-07-17 16:41:37 +0300320 bb.build.exec_func("do_mk_static_nor_image", d)
Brad Bishop95c130a2017-08-04 23:38:54 -0400321
Alexander Filippov726672c2018-07-17 16:41:37 +0300322 nor_image = os.path.join(d.getVar('IMGDEPLOYDIR', True),
323 '%s.static.mtd' % d.getVar('IMAGE_NAME', True))
324
325 def _append_image(imgpath, start_kb, finish_kb):
326 imgsize = os.path.getsize(imgpath)
327 if imgsize > (finish_kb - start_kb) * 1024:
328 bb.fatal("Image '%s' is too large!" % imgpath)
329
330 subprocess.check_call(['dd', 'bs=1k', 'conv=notrunc',
331 'seek=%d' % start_kb,
332 'if=%s' % imgpath,
333 'of=%s' % nor_image])
334
335 _append_image(os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True),
336 'u-boot.%s' % d.getVar('UBOOT_SUFFIX',True)),
337 int(d.getVar('FLASH_UBOOT_OFFSET', True)),
338 int(d.getVar('FLASH_KERNEL_OFFSET', True)))
339
340 _append_image(os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True),
341 d.getVar('FLASH_KERNEL_IMAGE', True)),
342 int(d.getVar('FLASH_KERNEL_OFFSET', True)),
343 int(d.getVar('FLASH_ROFS_OFFSET', True)))
344
345 _append_image(os.path.join(d.getVar('IMGDEPLOYDIR', True),
346 '%s.%s' % (
347 d.getVar('IMAGE_LINK_NAME', True),
348 d.getVar('IMAGE_BASETYPE', True))),
349 int(d.getVar('FLASH_ROFS_OFFSET', True)),
350 int(d.getVar('FLASH_RWFS_OFFSET', True)))
351
William A. Kennington III8ba81f72019-09-16 17:44:48 -0700352 _append_image(os.path.join(d.getVar('IMGDEPLOYDIR', True),
353 '%s.%s' % (
354 d.getVar('IMAGE_LINK_NAME', True),
355 d.getVar('OVERLAY_BASETYPE', True))),
Alexander Filippov726672c2018-07-17 16:41:37 +0300356 int(d.getVar('FLASH_RWFS_OFFSET', True)),
357 int(d.getVar('FLASH_SIZE', True)))
358
359 bb.build.exec_func("do_mk_static_symlinks", d)
360}
361
362do_mk_static_symlinks() {
Brad Bishop95c130a2017-08-04 23:38:54 -0400363 cd ${IMGDEPLOYDIR}
364 ln -sf ${IMAGE_NAME}.static.mtd ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.static.mtd
365
366 # Maintain non-standard legacy links
367 ln -sf ${IMAGE_NAME}.static.mtd ${IMGDEPLOYDIR}/flash-${MACHINE}
368 ln -sf ${IMAGE_NAME}.static.mtd ${IMGDEPLOYDIR}/image-bmc
369 ln -sf u-boot.${UBOOT_SUFFIX} ${IMGDEPLOYDIR}/image-u-boot
370 ln -sf ${FLASH_KERNEL_IMAGE} ${IMGDEPLOYDIR}/image-kernel
371 ln -sf ${IMAGE_LINK_NAME}.${IMAGE_BASETYPE} ${IMGDEPLOYDIR}/image-rofs
William A. Kennington III8ba81f72019-09-16 17:44:48 -0700372 ln -sf ${IMAGE_LINK_NAME}.${OVERLAY_BASETYPE} ${IMGDEPLOYDIR}/image-rwfs
Brad Bishop95c130a2017-08-04 23:38:54 -0400373}
374do_generate_static[dirs] = "${S}/static"
375do_generate_static[depends] += " \
376 ${PN}:do_image_${@d.getVar('IMAGE_BASETYPE', True).replace('-', '_')} \
377 virtual/kernel:do_deploy \
378 u-boot:do_populate_sysroot \
379 "
380
Lei YU325ac192018-06-20 13:27:34 +0800381make_signatures() {
382 signature_files=""
383 for file in "$@"; do
384 openssl dgst -sha256 -sign ${SIGNING_KEY} -out "${file}.sig" $file
385 signature_files="${signature_files} ${file}.sig"
386 done
387}
388
Brad Bishop95c130a2017-08-04 23:38:54 -0400389do_generate_static_alltar() {
Lei YU52724b02018-05-23 14:01:14 +0800390 ln -sf ${S}/MANIFEST MANIFEST
391 ln -sf ${S}/publickey publickey
Brad Bishop95c130a2017-08-04 23:38:54 -0400392 ln -sf ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.static.mtd image-bmc
Lei YU52724b02018-05-23 14:01:14 +0800393
Lei YU325ac192018-06-20 13:27:34 +0800394 make_signatures image-bmc MANIFEST publickey
Lei YU52724b02018-05-23 14:01:14 +0800395
396 tar -h -cvf ${IMGDEPLOYDIR}/${IMAGE_NAME}.static.mtd.all.tar \
397 image-bmc MANIFEST publickey ${signature_files}
Brad Bishop95c130a2017-08-04 23:38:54 -0400398
399 cd ${IMGDEPLOYDIR}
400
401 ln -sf ${IMAGE_NAME}.static.mtd.all.tar \
402 ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.static.mtd.all.tar
403
404 # Maintain non-standard legacy link.
405 ln -sf ${IMAGE_NAME}.static.mtd.all.tar \
406 ${IMGDEPLOYDIR}/${MACHINE}-${DATETIME}.all.tar
Lei YU52724b02018-05-23 14:01:14 +0800407
Brad Bishop95c130a2017-08-04 23:38:54 -0400408}
409do_generate_static_alltar[vardepsexclude] = "DATETIME"
410do_generate_static_alltar[dirs] = "${S}/static"
Lei YU52724b02018-05-23 14:01:14 +0800411do_generate_static_alltar[depends] += " \
412 openssl-native:do_populate_sysroot \
413 ${SIGNING_KEY_DEPENDS} \
414 ${PN}:do_copy_signing_pubkey \
415 "
Brad Bishop95c130a2017-08-04 23:38:54 -0400416
Brad Bishopc2e93502018-03-30 01:46:16 -0400417make_image_links() {
Brad Bishop95c130a2017-08-04 23:38:54 -0400418 rwfs=$1
419 rofs=$2
Brad Bishop95c130a2017-08-04 23:38:54 -0400420 shift
421 shift
Brad Bishop95c130a2017-08-04 23:38:54 -0400422
Brad Bishopc2e93502018-03-30 01:46:16 -0400423 # Create some links to help make the tar archive in the format
424 # expected by phosphor-bmc-code-mgmt.
Brad Bishop95c130a2017-08-04 23:38:54 -0400425 ln -sf ${DEPLOY_DIR_IMAGE}/u-boot.${UBOOT_SUFFIX} image-u-boot
426 ln -sf ${DEPLOY_DIR_IMAGE}/${FLASH_KERNEL_IMAGE} image-kernel
427 ln -sf ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.$rofs image-rofs
William A. Kennington III8ba81f72019-09-16 17:44:48 -0700428 ln -sf ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.$rwfs image-rwfs
Brad Bishopc2e93502018-03-30 01:46:16 -0400429}
430
431make_tar_of_images() {
432 type=$1
433 shift
434 extra_files="$@"
Brad Bishop95c130a2017-08-04 23:38:54 -0400435
436 # Create the tar archive
Adriana Kobylak7bdbb7a2019-07-30 11:31:50 -0500437 tar -h -cvf ${IMGDEPLOYDIR}/${IMAGE_NAME}.$type.tar \
Brad Bishop95c130a2017-08-04 23:38:54 -0400438 image-u-boot image-kernel image-rofs image-rwfs $extra_files
439
440 cd ${IMGDEPLOYDIR}
Adriana Kobylak7bdbb7a2019-07-30 11:31:50 -0500441 ln -sf ${IMAGE_NAME}.$type.tar ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.$type.tar
Brad Bishop95c130a2017-08-04 23:38:54 -0400442}
443
444do_generate_static_tar() {
Lei YU52724b02018-05-23 14:01:14 +0800445 ln -sf ${S}/MANIFEST MANIFEST
446 ln -sf ${S}/publickey publickey
Brad Bishopc2e93502018-03-30 01:46:16 -0400447 make_image_links ${OVERLAY_BASETYPE} ${IMAGE_BASETYPE}
Lei YU325ac192018-06-20 13:27:34 +0800448 make_signatures image-u-boot image-kernel image-rofs image-rwfs MANIFEST publickey
Adriana Kobylak7bdbb7a2019-07-30 11:31:50 -0500449 make_tar_of_images static.mtd MANIFEST publickey ${signature_files}
Brad Bishop95c130a2017-08-04 23:38:54 -0400450
451 # Maintain non-standard legacy link.
452 cd ${IMGDEPLOYDIR}
453 ln -sf ${IMAGE_NAME}.static.mtd.tar ${IMGDEPLOYDIR}/${MACHINE}-${DATETIME}.tar
454}
455do_generate_static_tar[dirs] = " ${S}/static"
456do_generate_static_tar[depends] += " \
457 ${PN}:do_image_${@d.getVar('IMAGE_BASETYPE', True).replace('-', '_')} \
458 virtual/kernel:do_deploy \
459 u-boot:do_populate_sysroot \
Lei YU52724b02018-05-23 14:01:14 +0800460 openssl-native:do_populate_sysroot \
461 ${SIGNING_KEY_DEPENDS} \
462 ${PN}:do_copy_signing_pubkey \
Brad Bishop95c130a2017-08-04 23:38:54 -0400463 "
464do_generate_static_tar[vardepsexclude] = "DATETIME"
465
Brad Bishopfbb736d2017-08-04 23:48:12 -0400466do_generate_ubi_tar() {
467 ln -sf ${S}/MANIFEST MANIFEST
Eddie James1a623ef2018-02-09 11:59:18 -0600468 ln -sf ${S}/publickey publickey
Brad Bishopc2e93502018-03-30 01:46:16 -0400469 make_image_links ${FLASH_UBI_OVERLAY_BASETYPE} ${FLASH_UBI_BASETYPE}
Lei YU325ac192018-06-20 13:27:34 +0800470 make_signatures image-u-boot image-kernel image-rofs image-rwfs MANIFEST publickey
Adriana Kobylak7bdbb7a2019-07-30 11:31:50 -0500471 make_tar_of_images ubi.mtd MANIFEST publickey ${signature_files}
Brad Bishopfbb736d2017-08-04 23:48:12 -0400472}
473do_generate_ubi_tar[dirs] = " ${S}/ubi"
474do_generate_ubi_tar[depends] += " \
475 ${PN}:do_image_${@d.getVar('FLASH_UBI_BASETYPE', True).replace('-', '_')} \
476 virtual/kernel:do_deploy \
477 u-boot:do_populate_sysroot \
Eddie James1a623ef2018-02-09 11:59:18 -0600478 openssl-native:do_populate_sysroot \
479 ${SIGNING_KEY_DEPENDS} \
480 ${PN}:do_copy_signing_pubkey \
Brad Bishopfbb736d2017-08-04 23:48:12 -0400481 "
482
Adriana Kobylak02d65b72019-07-29 15:25:33 -0500483do_generate_ext4_tar() {
484 ln -sf ${S}/MANIFEST MANIFEST
485 ln -sf ${S}/publickey publickey
486 make_image_links rwfs.${FLASH_EXT4_OVERLAY_BASETYPE} ${FLASH_EXT4_BASETYPE}
487 make_signatures image-u-boot image-kernel image-rofs image-rwfs MANIFEST publickey
488 make_tar_of_images ext4.mmc MANIFEST publickey ${signature_files}
489}
490do_generate_ext4_tar[dirs] = " ${S}/ext4"
491do_generate_ext4_tar[depends] += " \
492 ${PN}:do_image_${FLASH_EXT4_BASETYPE} \
493 virtual/kernel:do_deploy \
494 u-boot:do_populate_sysroot \
495 openssl-native:do_populate_sysroot \
496 ${SIGNING_KEY_DEPENDS} \
497 ${PN}:do_copy_signing_pubkey \
498 "
499
Eddie James1a623ef2018-02-09 11:59:18 -0600500def get_pubkey_basedir(d):
501 return os.path.join(
502 d.getVar('STAGING_DIR_TARGET', True),
503 d.getVar('sysconfdir', True).strip(os.sep),
504 'activationdata')
505
506def get_pubkey_type(d):
507 return os.listdir(get_pubkey_basedir(d))[0]
508
509def get_pubkey_path(d):
510 return os.path.join(
511 get_pubkey_basedir(d),
512 get_pubkey_type(d),
513 'publickey')
514
Brad Bishop95c130a2017-08-04 23:38:54 -0400515python do_generate_phosphor_manifest() {
Adriana Kobylak35626552019-10-28 16:03:12 -0500516 purpose = d.getVar('VERSION_PURPOSE', True)
Saqib Khana8433f52017-09-22 10:21:30 -0500517 version = do_get_version(d)
Vijay Khemkaba9f97e2019-09-18 12:28:46 -0700518 target_machine = d.getVar('MACHINE', True)
Brad Bishop95c130a2017-08-04 23:38:54 -0400519 with open('MANIFEST', 'w') as fd:
Adriana Kobylak35626552019-10-28 16:03:12 -0500520 fd.write('purpose={}\n'.format(purpose))
Brad Bishop95c130a2017-08-04 23:38:54 -0400521 fd.write('version={}\n'.format(version.strip('"')))
Eddie James1a623ef2018-02-09 11:59:18 -0600522 fd.write('KeyType={}\n'.format(get_pubkey_type(d)))
523 fd.write('HashType=RSA-SHA256\n')
Vijay Khemkaba9f97e2019-09-18 12:28:46 -0700524 fd.write('MachineName={}\n'.format(target_machine))
Brad Bishop95c130a2017-08-04 23:38:54 -0400525}
526do_generate_phosphor_manifest[dirs] = "${S}"
527do_generate_phosphor_manifest[depends] += " \
528 os-release:do_populate_sysroot \
Eddie James1a623ef2018-02-09 11:59:18 -0600529 phosphor-image-signing:do_populate_sysroot \
Brad Bishop95c130a2017-08-04 23:38:54 -0400530 "
531
Eddie James1a623ef2018-02-09 11:59:18 -0600532python do_copy_signing_pubkey() {
533 with open(get_pubkey_path(d), 'r') as read_fd:
534 with open('publickey', 'w') as write_fd:
535 write_fd.write(read_fd.read())
536}
537
538do_copy_signing_pubkey[dirs] = "${S}"
539do_copy_signing_pubkey[depends] += " \
540 phosphor-image-signing:do_populate_sysroot \
541 "
542
543addtask copy_signing_pubkey after do_rootfs
Brad Bishop95c130a2017-08-04 23:38:54 -0400544addtask generate_phosphor_manifest after do_rootfs
545addtask generate_rwfs_static after do_rootfs
Brad Bishopfbb736d2017-08-04 23:48:12 -0400546addtask generate_rwfs_ubi after do_rootfs
Adriana Kobylak846990e2019-07-30 11:27:46 -0500547addtask generate_rwfs_ext4 after do_rootfs
Brad Bishop95c130a2017-08-04 23:38:54 -0400548
549python() {
550 types = d.getVar('IMAGE_FSTYPES', True).split()
551
552 if any([x in types for x in ['mtd-static', 'mtd-static-alltar']]):
553 bb.build.addtask(
554 'do_generate_static',
555 'do_image_complete',
556 'do_generate_rwfs_static', d)
557 if 'mtd-static-alltar' in types:
558 bb.build.addtask(
559 'do_generate_static_alltar',
560 'do_image_complete',
Lei YU52724b02018-05-23 14:01:14 +0800561 'do_generate_static do_generate_phosphor_manifest', d)
Brad Bishop95c130a2017-08-04 23:38:54 -0400562 if 'mtd-static-tar' in types:
563 bb.build.addtask(
564 'do_generate_static_tar',
565 'do_image_complete',
Lei YU52724b02018-05-23 14:01:14 +0800566 'do_generate_rwfs_static do_generate_phosphor_manifest', d)
Brad Bishopfbb736d2017-08-04 23:48:12 -0400567
568 if 'mtd-ubi' in types:
569 bb.build.addtask(
570 'do_generate_ubi',
571 'do_image_complete',
572 'do_generate_rwfs_ubi', d)
573 if 'mtd-ubi-tar' in types:
574 bb.build.addtask(
575 'do_generate_ubi_tar',
576 'do_image_complete',
577 'do_generate_rwfs_ubi do_generate_phosphor_manifest', d)
Adriana Kobylak02d65b72019-07-29 15:25:33 -0500578
Adriana Kobylak86cfbd52020-01-10 11:40:42 -0600579 if 'mmc-verity' in types:
580 bb.build.addtask(
581 'do_generate_mmc_verity',
582 'do_image_complete','', d)
Adriana Kobylak02d65b72019-07-29 15:25:33 -0500583 if 'mmc-ext4-tar' in types:
584 bb.build.addtask(
585 'do_generate_ext4_tar',
586 'do_image_complete',
587 'do_generate_rwfs_ext4 do_generate_phosphor_manifest', d)
Brad Bishop95c130a2017-08-04 23:38:54 -0400588}