blob: 0ee77d4c31ae9b830e5f9dc1e2e386a79ee711d4 [file] [log] [blame]
Brad Bishop97cce002017-07-22 14:49:25 -04001# Base image class extension, inlined into every image.
2
Saqib Khan41723472017-09-22 10:21:30 -05003inherit image_version
Brad Bishop97cce002017-07-22 14:49:25 -04004
Brad Bishop19fc4f82017-08-04 23:38:54 -04005# Phosphor image types
6#
Brad Bishop3aa1ef62017-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 Bishop19fc4f82017-08-04 23:38:54 -040010
11# Image composition
Brad Bishop1a4b7ee2018-12-16 17:11:34 -080012FLASH_KERNEL_IMAGE ?= "fitImage-${INITRAMFS_IMAGE}-${MACHINE}-${MACHINE}"
Brad Bishop8623bbe2018-03-09 00:04:00 -050013FLASH_KERNEL_IMAGE_df-obmc-ubi-fs ?= "fitImage-${MACHINE}.bin"
14
Brad Bishop19fc4f82017-08-04 23:38:54 -040015IMAGE_BASETYPE ?= "squashfs-xz"
16OVERLAY_BASETYPE ?= "jffs2"
Brad Bishop3aa1ef62017-08-04 23:48:12 -040017FLASH_UBI_BASETYPE ?= "${IMAGE_BASETYPE}"
18FLASH_UBI_OVERLAY_BASETYPE ?= "ubifs"
Adriana Kobylak9b7197e2019-07-29 15:25:33 -050019FLASH_EXT4_BASETYPE ?= "ext4"
Adriana Kobylak5a5753a2019-07-30 11:27:46 -050020FLASH_EXT4_OVERLAY_BASETYPE ?= "ext4"
Brad Bishop19fc4f82017-08-04 23:38:54 -040021
Adriana Kobylak559224c2020-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 Bishop19fc4f82017-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 Bishop3aa1ef62017-08-04 23:48:12 -040027IMAGE_TYPEDEP_mtd-ubi = "${FLASH_UBI_BASETYPE}"
28IMAGE_TYPEDEP_mtd-ubi-tar = "${FLASH_UBI_BASETYPE}"
Adriana Kobylak559224c2020-01-10 11:40:42 -060029IMAGE_TYPEDEP_mmc-verity = "${FLASH_EXT4_BASETYPE}"
Adriana Kobylak9b7197e2019-07-29 15:25:33 -050030IMAGE_TYPEDEP_mmc-ext4-tar = "${FLASH_EXT4_BASETYPE}"
Adriana Kobylak559224c2020-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 Bishop19fc4f82017-08-04 23:38:54 -040035
Brad Bishop3aa1ef62017-08-04 23:48:12 -040036# Flash characteristics in KB unless otherwise noted
Brad Bishopdcd861c2019-09-24 21:16:09 -040037DISTROOVERRIDES .= ":flash-${FLASH_SIZE}"
Brad Bishop19fc4f82017-08-04 23:38:54 -040038FLASH_SIZE ?= "32768"
Brad Bishop3aa1ef62017-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 Bishop19fc4f82017-08-04 23:38:54 -040043
44# Fixed partition offsets
Adriana Kobylake913dd82020-04-13 13:56:41 -050045FLASH_UBOOT_SPL_SIZE ?= "64"
Brad Bishop19fc4f82017-08-04 23:38:54 -040046FLASH_UBOOT_OFFSET ?= "0"
47FLASH_KERNEL_OFFSET ?= "512"
Brad Bishopdcd861c2019-09-24 21:16:09 -040048FLASH_KERNEL_OFFSET_flash-131072 ?= "1024"
Brad Bishop3aa1ef62017-08-04 23:48:12 -040049FLASH_UBI_OFFSET ?= "${FLASH_KERNEL_OFFSET}"
Brad Bishop19fc4f82017-08-04 23:38:54 -040050FLASH_ROFS_OFFSET ?= "4864"
Brad Bishopdcd861c2019-09-24 21:16:09 -040051FLASH_ROFS_OFFSET_flash-131072 ?= "10240"
Brad Bishop19fc4f82017-08-04 23:38:54 -040052FLASH_RWFS_OFFSET ?= "28672"
Brad Bishopdcd861c2019-09-24 21:16:09 -040053FLASH_RWFS_OFFSET_flash-131072 ?= "98304"
Brad Bishop19fc4f82017-08-04 23:38:54 -040054
Brad Bishop3aa1ef62017-08-04 23:48:12 -040055# UBI volume sizes in KB unless otherwise noted.
Adriana Kobylakb70005d2018-02-14 16:35:30 -060056FLASH_UBI_RWFS_SIZE ?= "6144"
Brad Bishopdcd861c2019-09-24 21:16:09 -040057FLASH_UBI_RWFS_SIZE_flash-131072 ?= "32768"
Adriana Kobylakb70005d2018-02-14 16:35:30 -060058FLASH_UBI_RWFS_TXT_SIZE ?= "6MiB"
Brad Bishopdcd861c2019-09-24 21:16:09 -040059FLASH_UBI_RWFS_TXT_SIZE_flash-131072 ?= "32MiB"
Brad Bishop3aa1ef62017-08-04 23:48:12 -040060
Adriana Kobylak45a57952020-07-01 16:23:11 -050061# eMMC sizes in KB unless otherwise noted.
62MMC_BOOT_PARTITION_SIZE ?= "65536"
63
Eddie Jamesb2b7ff62018-02-09 11:59:18 -060064SIGNING_KEY ?= "${STAGING_DIR_NATIVE}${datadir}/OpenBMC.priv"
65INSECURE_KEY = "${@'${SIGNING_KEY}' == '${STAGING_DIR_NATIVE}${datadir}/OpenBMC.priv'}"
66SIGNING_KEY_DEPENDS = "${@oe.utils.conditional('INSECURE_KEY', 'True', 'phosphor-insecure-signing-key-native:do_populate_sysroot', '', d)}"
67
Adriana Kobylakfb62a682019-10-28 16:03:12 -050068VERSION_PURPOSE ?= "xyz.openbmc_project.Software.Version.VersionPurpose.BMC"
69
Brad Bishop3e37d382018-03-31 12:17:28 -040070UBOOT_SUFFIX ?= "bin"
71
Brad Bishop3aa1ef62017-08-04 23:48:12 -040072python() {
73 # Compute rwfs LEB count and LEB size.
74 page_size = d.getVar('FLASH_PAGE_SIZE', True)
75 nor_overhead_size = d.getVar('FLASH_NOR_UBI_OVERHEAD', True)
76 overhead_size = max(int(page_size), int(nor_overhead_size))
77 peb_size = d.getVar('FLASH_PEB_SIZE', True)
78 leb_size = (int(peb_size) * 1024) - (2 * overhead_size)
79 d.setVar('FLASH_LEB_SIZE', str(leb_size)) # In bytes
80
81 rwfs_size = d.getVar('FLASH_UBI_RWFS_SIZE', True)
82 rwfs_size = int(rwfs_size) * 1024
83 lebs = int((rwfs_size + leb_size - 1) / leb_size) # Rounding up
84 d.setVar('FLASH_UBI_RWFS_LEBS', str(lebs))
85}
86
Brad Bishop19fc4f82017-08-04 23:38:54 -040087# Allow rwfs mkfs configuration through OVERLAY_MKFS_OPTS and OVERRIDES. However,
88# avoid setting 'ext4' or 'jffs2' in OVERRIDES as such raw filesystem types are
89# reserved for the primary image (and setting them currently breaks the build).
90# Instead, prefix the overlay override value with 'rwfs-' to avoid collisions.
91DISTROOVERRIDES .= ":static-rwfs-${OVERLAY_BASETYPE}"
Brad Bishop3aa1ef62017-08-04 23:48:12 -040092DISTROOVERRIDES .= ":ubi-rwfs-${FLASH_UBI_OVERLAY_BASETYPE}"
Adriana Kobylak5a5753a2019-07-30 11:27:46 -050093DISTROOVERRIDES .= ":mmc-rwfs-${FLASH_EXT4_OVERLAY_BASETYPE}"
Brad Bishop19fc4f82017-08-04 23:38:54 -040094
William A. Kennington IIIc230ab32019-09-16 17:44:48 -070095JFFS2_RWFS_CMD = "mkfs.jffs2 --root=jffs2 --faketime --output=${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.jffs2"
96UBIFS_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 Kobylak5a5753a2019-07-30 11:27:46 -050097EXT4_RWFS_CMD = "mkfs.ext4 -F ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.rwfs.ext4"
Brad Bishop19fc4f82017-08-04 23:38:54 -040098
99FLASH_STATIC_RWFS_CMD_static-rwfs-jffs2 = "${JFFS2_RWFS_CMD}"
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400100FLASH_UBI_RWFS_CMD_ubi-rwfs-jffs2 = "${JFFS2_RWFS_CMD}"
101FLASH_UBI_RWFS_CMD_ubi-rwfs-ubifs = "${UBIFS_RWFS_CMD}"
Adriana Kobylak5a5753a2019-07-30 11:27:46 -0500102FLASH_EXT4_RWFS_CMD_mmc-rwfs-ext4 = "${EXT4_RWFS_CMD}"
Brad Bishop19fc4f82017-08-04 23:38:54 -0400103
Adriana Kobylak661cf392019-07-29 14:39:00 -0500104mk_empty_image() {
Brad Bishop19fc4f82017-08-04 23:38:54 -0400105 image_dst="$1"
106 image_size_kb=$2
107 dd if=/dev/zero bs=1k count=$image_size_kb \
108 | tr '\000' '\377' > $image_dst
109}
110
Adriana Kobylakf494bb52019-07-29 16:14:11 -0500111clean_rwfs() {
112 type=$1
113 shift
114
115 rm -f ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.$type
116 rm -rf $type
117 mkdir $type
118}
119
Brad Bishop19fc4f82017-08-04 23:38:54 -0400120make_rwfs() {
121 type=$1
122 cmd=$2
123 shift
124 shift
125 opts="$@"
126
Adriana Kobylakf494bb52019-07-29 16:14:11 -0500127 mkdir -p $type
Brad Bishop19fc4f82017-08-04 23:38:54 -0400128
129 $cmd $opts
130}
131
132do_generate_rwfs_static() {
Adriana Kobylakf494bb52019-07-29 16:14:11 -0500133 clean_rwfs ${OVERLAY_BASETYPE}
Brad Bishop19fc4f82017-08-04 23:38:54 -0400134 make_rwfs ${OVERLAY_BASETYPE} "${FLASH_STATIC_RWFS_CMD}" ${OVERLAY_MKFS_OPTS}
135}
136do_generate_rwfs_static[dirs] = " ${S}/static"
137do_generate_rwfs_static[depends] += " \
138 mtd-utils-native:do_populate_sysroot \
139 "
140
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400141do_generate_rwfs_ubi() {
Adriana Kobylakf494bb52019-07-29 16:14:11 -0500142 clean_rwfs ${FLASH_UBI_OVERLAY_BASETYPE}
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400143 make_rwfs ${FLASH_UBI_OVERLAY_BASETYPE} "${FLASH_UBI_RWFS_CMD}"
144}
145do_generate_rwfs_ubi[dirs] = " ${S}/ubi"
146do_generate_rwfs_ubi[depends] += " \
147 mtd-utils-native:do_populate_sysroot \
148 "
149
Adriana Kobylak5a5753a2019-07-30 11:27:46 -0500150do_generate_rwfs_ext4() {
151 clean_rwfs rwfs.${FLASH_EXT4_OVERLAY_BASETYPE}
152 mk_empty_image ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.rwfs.ext4 1024
153 make_rwfs ${FLASH_EXT4_OVERLAY_BASETYPE} "${FLASH_EXT4_RWFS_CMD}" ${OVERLAY_MKFS_OPTS}
154}
155do_generate_rwfs_ext4[dirs] = " ${S}/ext4"
156do_generate_rwfs_ext4[depends] += " \
157 e2fsprogs-native:do_populate_sysroot \
158 "
159
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400160add_volume() {
161 config_file=$1
162 vol_id=$2
163 vol_type=$3
164 vol_name=$4
165 image=$5
166 vol_size=$6
167
168 echo \[$vol_name\] >> $config_file
169 echo mode=ubi >> $config_file
170 echo image=$image >> $config_file
171 echo vol_type=$vol_type >> $config_file
172 echo vol_name=$vol_name >> $config_file
173 echo vol_id=$vol_id >> $config_file
174 if [ ! -z $vol_size ]; then
175 echo vol_size=$vol_size >> $config_file
176 fi
177}
178
Saqib Khan41723472017-09-22 10:21:30 -0500179python do_generate_ubi() {
180 version_id = do_get_versionID(d)
181 d.setVar('VERSION_ID', version_id)
182 bb.build.exec_func("do_make_ubi", d)
183}
184do_generate_ubi[dirs] = "${S}/ubi"
185do_generate_ubi[depends] += " \
186 ${PN}:do_image_${@d.getVar('FLASH_UBI_BASETYPE', True).replace('-', '_')} \
187 virtual/kernel:do_deploy \
188 u-boot:do_populate_sysroot \
189 mtd-utils-native:do_populate_sysroot \
190 "
191
192do_make_ubi() {
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400193 cfg=ubinize-${IMAGE_NAME}.cfg
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400194 rm -f $cfg ubi-img
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400195 # Construct the ubinize config file
Saqib Khan41723472017-09-22 10:21:30 -0500196 add_volume $cfg 0 static kernel-${VERSION_ID} \
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400197 ${DEPLOY_DIR_IMAGE}/${FLASH_KERNEL_IMAGE}
198
Saqib Khan41723472017-09-22 10:21:30 -0500199 add_volume $cfg 1 static rofs-${VERSION_ID} \
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400200 ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.${FLASH_UBI_BASETYPE}
201
William A. Kennington IIIc230ab32019-09-16 17:44:48 -0700202 add_volume $cfg 2 dynamic rwfs ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.${FLASH_UBI_OVERLAY_BASETYPE} ${FLASH_UBI_RWFS_TXT_SIZE}
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400203
204 # Build the ubi partition image
205 ubinize -p ${FLASH_PEB_SIZE}KiB -m ${FLASH_PAGE_SIZE} -o ubi-img $cfg
206
207 # Concatenate the uboot and ubi partitions
Adriana Kobylak661cf392019-07-29 14:39:00 -0500208 mk_empty_image ${IMGDEPLOYDIR}/${IMAGE_NAME}.ubi.mtd ${FLASH_SIZE}
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400209 dd bs=1k conv=notrunc seek=${FLASH_UBOOT_OFFSET} \
210 if=${DEPLOY_DIR_IMAGE}/u-boot.${UBOOT_SUFFIX} \
211 of=${IMGDEPLOYDIR}/${IMAGE_NAME}.ubi.mtd
212 dd bs=1k conv=notrunc seek=${FLASH_UBI_OFFSET} \
213 if=ubi-img \
214 of=${IMGDEPLOYDIR}/${IMAGE_NAME}.ubi.mtd
215
216 cd ${IMGDEPLOYDIR}
217 ln -sf ${IMAGE_NAME}.ubi.mtd ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.ubi.mtd
218}
Saqib Khan41723472017-09-22 10:21:30 -0500219do_make_ubi[dirs] = "${S}/ubi"
220do_make_ubi[depends] += " \
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400221 ${PN}:do_image_${@d.getVar('FLASH_UBI_BASETYPE', True).replace('-', '_')} \
222 virtual/kernel:do_deploy \
223 u-boot:do_populate_sysroot \
224 mtd-utils-native:do_populate_sysroot \
225 "
226
Adriana Kobylak559224c2020-01-10 11:40:42 -0600227python do_generate_mmc_verity() {
228 import os
229 import subprocess
230
231 rootfs_image = os.path.join(d.getVar('IMGDEPLOYDIR', True),
232 '%s.%s' % (
233 d.getVar('IMAGE_LINK_NAME', True),
234 d.getVar('FLASH_EXT4_BASETYPE', True)))
235
236 verity_image = 'verity-%s.%s' % (
237 d.getVar('IMAGE_LINK_NAME', True),
238 d.getVar('FLASH_EXT4_BASETYPE', True))
239
240 subprocess.check_call(['dd',
241 'if=%s' % rootfs_image,
242 'of=%s' % verity_image])
243
244 # dm-verity values
245 sector_size = 512
246 block_size = int(d.getVar('IMAGE_BLOCK_SIZE', True))
247 verity_algo = "sha256"
248 rootfs_image_size = os.stat(rootfs_image).st_size
249
250 def align_up(number, boundary):
251 return ((number + (boundary - 1)) // boundary) * boundary
252
253 # verity metadata must be aligned on the block boundary subsequent to the
254 # end of the data
255 verity_hash_offset = align_up(rootfs_image_size, block_size)
256
257 verity_hash_blocks = verity_hash_offset // block_size
258
259 # the output of 'veritysetup format' looks like:
260 # VERITY header information for obmc-phosphor-image-witherspoon.squashfs-xz
261 # UUID: 269b5934-de5b-45b0-99a3-56b219a7b544
262 # Hash type: 1
263 # Data blocks: 4523
264 # Data block size: 4096
265 # Hash block size: 4096
266 # Hash algorithm: sha256
267 # Salt: 8fca9eff342fc0cf2964057257ea80813a223cb2e540a38458142edeb190e12e
268 # Root hash: 38ef00d23fa89300dcf66e7494d25246d03bf846b4119b34e7b1587c0b6fe1d9
269 verity_hash_file = "verity-hash-verification-data"
270 with open(verity_hash_file, 'w') as f:
271 subprocess.check_call(['veritysetup',
272 'format',
273 '--hash=%s'% verity_algo,
274 '--data-block-size=%i' % block_size,
275 '--hash-block-size=%i' % block_size,
276 '--hash-offset=%i' % verity_hash_offset,
277 '%s' % verity_image,
278 '%s' % verity_image], stdout=f, stderr=f)
279
280 for line in open(verity_hash_file, "r"):
281 if "Salt" in line:
282 verity_salt = line.split()[-1]
283 if "Root" in line:
284 verity_root = line.split()[-1]
285
286 verity_image_size = os.stat(verity_image).st_size
287
288 # Make an appropriately sized image for MMC
289 mmc_image_name = "%s.mmc" % d.getVar('IMAGE_NAME', True)
290 mmc_image_path = os.path.join(d.getVar('IMGDEPLOYDIR', True),
291 '%s' % mmc_image_name)
292
293 # CSD size accommodates MMC limitations that are relevant to QEMU
294 csd_size = (1 << (9 + 9 - 1 + 2))
295
296 with open(mmc_image_path, 'w') as fd:
297 os.posix_fallocate(fd.fileno(), 0, align_up(verity_image_size, csd_size))
298 subprocess.check_call(['dd',
299 'if=%s' % verity_image,
300 'of=%s' % mmc_image_path,
301 'conv=notrunc'])
302
303 os.chdir("%s" % d.getVar('IMGDEPLOYDIR', True))
304 mmc_link_name = os.path.join(d.getVar('IMGDEPLOYDIR', True),
305 '%s.mmc' % d.getVar('IMAGE_LINK_NAME', True))
306 if os.path.lexists(mmc_link_name):
307 os.remove(mmc_link_name)
308 os.symlink(mmc_image_name, mmc_link_name)
309}
310do_generate_mmc_verity[dirs] = "${S}/mmc"
311do_generate_mmc_verity[depends] += " \
312 ${PN}:do_image_${FLASH_EXT4_BASETYPE} \
313 cryptsetup-native:do_populate_sysroot \
314 "
315
Alexander Filippov3dcf6f92018-07-17 16:41:37 +0300316do_mk_static_nor_image() {
Brad Bishop19fc4f82017-08-04 23:38:54 -0400317 # Assemble the flash image
Adriana Kobylak661cf392019-07-29 14:39:00 -0500318 mk_empty_image ${IMGDEPLOYDIR}/${IMAGE_NAME}.static.mtd ${FLASH_SIZE}
Alexander Filippov3dcf6f92018-07-17 16:41:37 +0300319}
Brad Bishop19fc4f82017-08-04 23:38:54 -0400320
Adriana Kobylakf1954f02020-04-27 15:20:35 -0500321do_generate_image_uboot_file() {
322 image_dst="$1"
323 uboot_offset=${FLASH_UBOOT_OFFSET}
324
325 if [ ! -z ${SPL_BINARY} ]; then
326 dd bs=1k conv=notrunc seek=${FLASH_UBOOT_OFFSET} \
327 if=${DEPLOY_DIR_IMAGE}/u-boot-spl.${UBOOT_SUFFIX} \
328 of=${image_dst}
329 uboot_offset=${FLASH_UBOOT_SPL_SIZE}
330 fi
331
332 dd bs=1k conv=notrunc seek=${uboot_offset} \
333 if=${DEPLOY_DIR_IMAGE}/u-boot.${UBOOT_SUFFIX} \
334 of=${image_dst}
335}
336
Alexander Filippov3dcf6f92018-07-17 16:41:37 +0300337python do_generate_static() {
338 import subprocess
Brad Bishop19fc4f82017-08-04 23:38:54 -0400339
Alexander Filippov3dcf6f92018-07-17 16:41:37 +0300340 bb.build.exec_func("do_mk_static_nor_image", d)
Brad Bishop19fc4f82017-08-04 23:38:54 -0400341
Alexander Filippov3dcf6f92018-07-17 16:41:37 +0300342 nor_image = os.path.join(d.getVar('IMGDEPLOYDIR', True),
343 '%s.static.mtd' % d.getVar('IMAGE_NAME', True))
344
345 def _append_image(imgpath, start_kb, finish_kb):
346 imgsize = os.path.getsize(imgpath)
Josh Lehan0a5ef2a2020-02-26 12:11:33 -0800347 maxsize = (finish_kb - start_kb) * 1024
348 bb.debug(1, 'Considering file size=' + str(imgsize) + ' name=' + imgpath)
349 bb.debug(1, 'Spanning start=' + str(start_kb) + 'K end=' + str(finish_kb) + 'K')
350 bb.debug(1, 'Compare needed=' + str(imgsize) + ' available=' + str(maxsize) + ' margin=' + str(maxsize - imgsize))
351 if imgsize > maxsize:
Alexander Filippov3dcf6f92018-07-17 16:41:37 +0300352 bb.fatal("Image '%s' is too large!" % imgpath)
353
354 subprocess.check_call(['dd', 'bs=1k', 'conv=notrunc',
355 'seek=%d' % start_kb,
356 'if=%s' % imgpath,
357 'of=%s' % nor_image])
358
Adriana Kobylake913dd82020-04-13 13:56:41 -0500359 uboot_offset = int(d.getVar('FLASH_UBOOT_OFFSET', True))
360
361 spl_binary = d.getVar('SPL_BINARY', True)
362 if spl_binary:
363 _append_image(os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True),
364 'u-boot-spl.%s' % d.getVar('UBOOT_SUFFIX',True)),
365 int(d.getVar('FLASH_UBOOT_OFFSET', True)),
366 int(d.getVar('FLASH_UBOOT_SPL_SIZE', True)))
367 uboot_offset += int(d.getVar('FLASH_UBOOT_SPL_SIZE', True))
368
Alexander Filippov3dcf6f92018-07-17 16:41:37 +0300369 _append_image(os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True),
370 'u-boot.%s' % d.getVar('UBOOT_SUFFIX',True)),
Adriana Kobylake913dd82020-04-13 13:56:41 -0500371 uboot_offset,
Alexander Filippov3dcf6f92018-07-17 16:41:37 +0300372 int(d.getVar('FLASH_KERNEL_OFFSET', True)))
373
374 _append_image(os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True),
375 d.getVar('FLASH_KERNEL_IMAGE', True)),
376 int(d.getVar('FLASH_KERNEL_OFFSET', True)),
377 int(d.getVar('FLASH_ROFS_OFFSET', True)))
378
379 _append_image(os.path.join(d.getVar('IMGDEPLOYDIR', True),
380 '%s.%s' % (
381 d.getVar('IMAGE_LINK_NAME', True),
382 d.getVar('IMAGE_BASETYPE', True))),
383 int(d.getVar('FLASH_ROFS_OFFSET', True)),
384 int(d.getVar('FLASH_RWFS_OFFSET', True)))
385
William A. Kennington IIIc230ab32019-09-16 17:44:48 -0700386 _append_image(os.path.join(d.getVar('IMGDEPLOYDIR', True),
387 '%s.%s' % (
388 d.getVar('IMAGE_LINK_NAME', True),
389 d.getVar('OVERLAY_BASETYPE', True))),
Alexander Filippov3dcf6f92018-07-17 16:41:37 +0300390 int(d.getVar('FLASH_RWFS_OFFSET', True)),
391 int(d.getVar('FLASH_SIZE', True)))
392
393 bb.build.exec_func("do_mk_static_symlinks", d)
394}
395
396do_mk_static_symlinks() {
Brad Bishop19fc4f82017-08-04 23:38:54 -0400397 cd ${IMGDEPLOYDIR}
398 ln -sf ${IMAGE_NAME}.static.mtd ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.static.mtd
399
400 # Maintain non-standard legacy links
Adriana Kobylakf1954f02020-04-27 15:20:35 -0500401 do_generate_image_uboot_file ${IMGDEPLOYDIR}/image-u-boot
Brad Bishop19fc4f82017-08-04 23:38:54 -0400402 ln -sf ${IMAGE_NAME}.static.mtd ${IMGDEPLOYDIR}/flash-${MACHINE}
403 ln -sf ${IMAGE_NAME}.static.mtd ${IMGDEPLOYDIR}/image-bmc
Brad Bishop19fc4f82017-08-04 23:38:54 -0400404 ln -sf ${FLASH_KERNEL_IMAGE} ${IMGDEPLOYDIR}/image-kernel
405 ln -sf ${IMAGE_LINK_NAME}.${IMAGE_BASETYPE} ${IMGDEPLOYDIR}/image-rofs
William A. Kennington IIIc230ab32019-09-16 17:44:48 -0700406 ln -sf ${IMAGE_LINK_NAME}.${OVERLAY_BASETYPE} ${IMGDEPLOYDIR}/image-rwfs
Brad Bishop19fc4f82017-08-04 23:38:54 -0400407}
408do_generate_static[dirs] = "${S}/static"
409do_generate_static[depends] += " \
410 ${PN}:do_image_${@d.getVar('IMAGE_BASETYPE', True).replace('-', '_')} \
411 virtual/kernel:do_deploy \
412 u-boot:do_populate_sysroot \
413 "
414
Lei YUf2072212018-06-20 13:27:34 +0800415make_signatures() {
416 signature_files=""
417 for file in "$@"; do
418 openssl dgst -sha256 -sign ${SIGNING_KEY} -out "${file}.sig" $file
419 signature_files="${signature_files} ${file}.sig"
420 done
421}
422
Brad Bishop19fc4f82017-08-04 23:38:54 -0400423do_generate_static_alltar() {
Lei YUa4674942018-05-23 14:01:14 +0800424 ln -sf ${S}/MANIFEST MANIFEST
425 ln -sf ${S}/publickey publickey
Brad Bishop19fc4f82017-08-04 23:38:54 -0400426 ln -sf ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.static.mtd image-bmc
Lei YUa4674942018-05-23 14:01:14 +0800427
Lei YUf2072212018-06-20 13:27:34 +0800428 make_signatures image-bmc MANIFEST publickey
Lei YUa4674942018-05-23 14:01:14 +0800429
430 tar -h -cvf ${IMGDEPLOYDIR}/${IMAGE_NAME}.static.mtd.all.tar \
431 image-bmc MANIFEST publickey ${signature_files}
Brad Bishop19fc4f82017-08-04 23:38:54 -0400432
433 cd ${IMGDEPLOYDIR}
434
435 ln -sf ${IMAGE_NAME}.static.mtd.all.tar \
436 ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.static.mtd.all.tar
437
438 # Maintain non-standard legacy link.
439 ln -sf ${IMAGE_NAME}.static.mtd.all.tar \
440 ${IMGDEPLOYDIR}/${MACHINE}-${DATETIME}.all.tar
Lei YUa4674942018-05-23 14:01:14 +0800441
Brad Bishop19fc4f82017-08-04 23:38:54 -0400442}
443do_generate_static_alltar[vardepsexclude] = "DATETIME"
444do_generate_static_alltar[dirs] = "${S}/static"
Lei YUa4674942018-05-23 14:01:14 +0800445do_generate_static_alltar[depends] += " \
446 openssl-native:do_populate_sysroot \
447 ${SIGNING_KEY_DEPENDS} \
448 ${PN}:do_copy_signing_pubkey \
449 "
Brad Bishop19fc4f82017-08-04 23:38:54 -0400450
Brad Bishopde659382018-03-30 01:46:16 -0400451make_image_links() {
Brad Bishop19fc4f82017-08-04 23:38:54 -0400452 rwfs=$1
453 rofs=$2
Brad Bishop19fc4f82017-08-04 23:38:54 -0400454 shift
455 shift
Brad Bishop19fc4f82017-08-04 23:38:54 -0400456
Brad Bishopde659382018-03-30 01:46:16 -0400457 # Create some links to help make the tar archive in the format
458 # expected by phosphor-bmc-code-mgmt.
Adriana Kobylakf1954f02020-04-27 15:20:35 -0500459 do_generate_image_uboot_file image-u-boot
Brad Bishop19fc4f82017-08-04 23:38:54 -0400460 ln -sf ${DEPLOY_DIR_IMAGE}/${FLASH_KERNEL_IMAGE} image-kernel
461 ln -sf ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.$rofs image-rofs
William A. Kennington IIIc230ab32019-09-16 17:44:48 -0700462 ln -sf ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.$rwfs image-rwfs
Brad Bishopde659382018-03-30 01:46:16 -0400463}
464
465make_tar_of_images() {
466 type=$1
467 shift
468 extra_files="$@"
Brad Bishop19fc4f82017-08-04 23:38:54 -0400469
470 # Create the tar archive
Adriana Kobylake67e9db2019-07-30 11:31:50 -0500471 tar -h -cvf ${IMGDEPLOYDIR}/${IMAGE_NAME}.$type.tar \
Brad Bishop19fc4f82017-08-04 23:38:54 -0400472 image-u-boot image-kernel image-rofs image-rwfs $extra_files
473
474 cd ${IMGDEPLOYDIR}
Adriana Kobylake67e9db2019-07-30 11:31:50 -0500475 ln -sf ${IMAGE_NAME}.$type.tar ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.$type.tar
Brad Bishop19fc4f82017-08-04 23:38:54 -0400476}
477
478do_generate_static_tar() {
Lei YUa4674942018-05-23 14:01:14 +0800479 ln -sf ${S}/MANIFEST MANIFEST
480 ln -sf ${S}/publickey publickey
Brad Bishopde659382018-03-30 01:46:16 -0400481 make_image_links ${OVERLAY_BASETYPE} ${IMAGE_BASETYPE}
Lei YUf2072212018-06-20 13:27:34 +0800482 make_signatures image-u-boot image-kernel image-rofs image-rwfs MANIFEST publickey
Adriana Kobylake67e9db2019-07-30 11:31:50 -0500483 make_tar_of_images static.mtd MANIFEST publickey ${signature_files}
Brad Bishop19fc4f82017-08-04 23:38:54 -0400484
485 # Maintain non-standard legacy link.
486 cd ${IMGDEPLOYDIR}
487 ln -sf ${IMAGE_NAME}.static.mtd.tar ${IMGDEPLOYDIR}/${MACHINE}-${DATETIME}.tar
488}
489do_generate_static_tar[dirs] = " ${S}/static"
490do_generate_static_tar[depends] += " \
491 ${PN}:do_image_${@d.getVar('IMAGE_BASETYPE', True).replace('-', '_')} \
492 virtual/kernel:do_deploy \
493 u-boot:do_populate_sysroot \
Lei YUa4674942018-05-23 14:01:14 +0800494 openssl-native:do_populate_sysroot \
495 ${SIGNING_KEY_DEPENDS} \
496 ${PN}:do_copy_signing_pubkey \
Brad Bishop19fc4f82017-08-04 23:38:54 -0400497 "
498do_generate_static_tar[vardepsexclude] = "DATETIME"
499
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400500do_generate_ubi_tar() {
501 ln -sf ${S}/MANIFEST MANIFEST
Eddie Jamesb2b7ff62018-02-09 11:59:18 -0600502 ln -sf ${S}/publickey publickey
Brad Bishopde659382018-03-30 01:46:16 -0400503 make_image_links ${FLASH_UBI_OVERLAY_BASETYPE} ${FLASH_UBI_BASETYPE}
Lei YUf2072212018-06-20 13:27:34 +0800504 make_signatures image-u-boot image-kernel image-rofs image-rwfs MANIFEST publickey
Adriana Kobylake67e9db2019-07-30 11:31:50 -0500505 make_tar_of_images ubi.mtd MANIFEST publickey ${signature_files}
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400506}
507do_generate_ubi_tar[dirs] = " ${S}/ubi"
508do_generate_ubi_tar[depends] += " \
509 ${PN}:do_image_${@d.getVar('FLASH_UBI_BASETYPE', True).replace('-', '_')} \
510 virtual/kernel:do_deploy \
511 u-boot:do_populate_sysroot \
Eddie Jamesb2b7ff62018-02-09 11:59:18 -0600512 openssl-native:do_populate_sysroot \
513 ${SIGNING_KEY_DEPENDS} \
514 ${PN}:do_copy_signing_pubkey \
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400515 "
516
Adriana Kobylak9b7197e2019-07-29 15:25:33 -0500517do_generate_ext4_tar() {
Adriana Kobylak45a57952020-07-01 16:23:11 -0500518 # Generate the U-Boot image
519 do_generate_image_uboot_file image-u-boot
520
521 # Generate a compressed ext4 filesystem with the fitImage file in it to be
522 # flashed to the boot partition of the eMMC
523 install -d boot-image
524 install -m 644 ${DEPLOY_DIR_IMAGE}/${FLASH_KERNEL_IMAGE} boot-image/fitImage
525 mk_empty_image boot-image.${FLASH_EXT4_BASETYPE} ${MMC_BOOT_PARTITION_SIZE}
526 mkfs.ext4 -F -i 4096 -d boot-image boot-image.${FLASH_EXT4_BASETYPE}
527 # Error codes 0-3 indicate successfull operation of fsck
528 fsck.ext4 -pvfD boot-image.${FLASH_EXT4_BASETYPE} || [ $? -le 3 ]
529 zstd -f -k -T0 -c ${ZSTD_COMPRESSION_LEVEL} boot-image.${FLASH_EXT4_BASETYPE} > boot-image.${FLASH_EXT4_BASETYPE}.zst
530
531 # Generate the compressed ext4 rootfs
532 zstd -f -k -T0 -c ${ZSTD_COMPRESSION_LEVEL} ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.${FLASH_EXT4_BASETYPE} > ${IMAGE_LINK_NAME}.${FLASH_EXT4_BASETYPE}.zst
533
534 ln -sf boot-image.${FLASH_EXT4_BASETYPE}.zst image-kernel
535 ln -sf ${IMAGE_LINK_NAME}.${FLASH_EXT4_BASETYPE}.zst image-rofs
536 ln -sf ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.rwfs.${FLASH_EXT4_OVERLAY_BASETYPE} image-rwfs
Adriana Kobylak9b7197e2019-07-29 15:25:33 -0500537 ln -sf ${S}/MANIFEST MANIFEST
538 ln -sf ${S}/publickey publickey
Adriana Kobylak81846a22020-07-12 15:12:36 -0500539
540 hostfw_update_file="${DEPLOY_DIR_IMAGE}/hostfw/update/image-hostfw"
541 if [ -e "${hostfw_update_file}" ]; then
542 ln -sf "${hostfw_update_file}" image-hostfw
543 make_signatures image-u-boot image-kernel image-rofs image-rwfs MANIFEST publickey image-hostfw
544 make_tar_of_images ext4.mmc MANIFEST publickey ${signature_files} image-hostfw
545 else
546 make_signatures image-u-boot image-kernel image-rofs image-rwfs MANIFEST publickey
547 make_tar_of_images ext4.mmc MANIFEST publickey ${signature_files}
548 fi
Adriana Kobylak9b7197e2019-07-29 15:25:33 -0500549}
550do_generate_ext4_tar[dirs] = " ${S}/ext4"
551do_generate_ext4_tar[depends] += " \
Adriana Kobylak4cc866b2020-03-28 13:43:33 -0500552 zstd-native:do_populate_sysroot \
Adriana Kobylak9b7197e2019-07-29 15:25:33 -0500553 ${PN}:do_image_${FLASH_EXT4_BASETYPE} \
554 virtual/kernel:do_deploy \
555 u-boot:do_populate_sysroot \
556 openssl-native:do_populate_sysroot \
557 ${SIGNING_KEY_DEPENDS} \
558 ${PN}:do_copy_signing_pubkey \
Adriana Kobylak81846a22020-07-12 15:12:36 -0500559 phosphor-hostfw-image:do_populate_sysroot \
Adriana Kobylak9b7197e2019-07-29 15:25:33 -0500560 "
561
Eddie Jamesb2b7ff62018-02-09 11:59:18 -0600562def get_pubkey_basedir(d):
563 return os.path.join(
564 d.getVar('STAGING_DIR_TARGET', True),
565 d.getVar('sysconfdir', True).strip(os.sep),
566 'activationdata')
567
568def get_pubkey_type(d):
569 return os.listdir(get_pubkey_basedir(d))[0]
570
571def get_pubkey_path(d):
572 return os.path.join(
573 get_pubkey_basedir(d),
574 get_pubkey_type(d),
575 'publickey')
576
Brad Bishop19fc4f82017-08-04 23:38:54 -0400577python do_generate_phosphor_manifest() {
Adriana Kobylakfb62a682019-10-28 16:03:12 -0500578 purpose = d.getVar('VERSION_PURPOSE', True)
Saqib Khan41723472017-09-22 10:21:30 -0500579 version = do_get_version(d)
Vijay Khemkaae614bd2019-09-18 12:28:46 -0700580 target_machine = d.getVar('MACHINE', True)
Brad Bishop19fc4f82017-08-04 23:38:54 -0400581 with open('MANIFEST', 'w') as fd:
Adriana Kobylakfb62a682019-10-28 16:03:12 -0500582 fd.write('purpose={}\n'.format(purpose))
Brad Bishop19fc4f82017-08-04 23:38:54 -0400583 fd.write('version={}\n'.format(version.strip('"')))
Eddie Jamesb2b7ff62018-02-09 11:59:18 -0600584 fd.write('KeyType={}\n'.format(get_pubkey_type(d)))
585 fd.write('HashType=RSA-SHA256\n')
Vijay Khemkaae614bd2019-09-18 12:28:46 -0700586 fd.write('MachineName={}\n'.format(target_machine))
Brad Bishop19fc4f82017-08-04 23:38:54 -0400587}
588do_generate_phosphor_manifest[dirs] = "${S}"
589do_generate_phosphor_manifest[depends] += " \
590 os-release:do_populate_sysroot \
Eddie Jamesb2b7ff62018-02-09 11:59:18 -0600591 phosphor-image-signing:do_populate_sysroot \
Brad Bishop19fc4f82017-08-04 23:38:54 -0400592 "
593
Eddie Jamesb2b7ff62018-02-09 11:59:18 -0600594python do_copy_signing_pubkey() {
595 with open(get_pubkey_path(d), 'r') as read_fd:
596 with open('publickey', 'w') as write_fd:
597 write_fd.write(read_fd.read())
598}
599
600do_copy_signing_pubkey[dirs] = "${S}"
601do_copy_signing_pubkey[depends] += " \
602 phosphor-image-signing:do_populate_sysroot \
603 "
604
605addtask copy_signing_pubkey after do_rootfs
Brad Bishop19fc4f82017-08-04 23:38:54 -0400606addtask generate_phosphor_manifest after do_rootfs
607addtask generate_rwfs_static after do_rootfs
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400608addtask generate_rwfs_ubi after do_rootfs
Adriana Kobylak5a5753a2019-07-30 11:27:46 -0500609addtask generate_rwfs_ext4 after do_rootfs
Brad Bishop19fc4f82017-08-04 23:38:54 -0400610
611python() {
612 types = d.getVar('IMAGE_FSTYPES', True).split()
613
614 if any([x in types for x in ['mtd-static', 'mtd-static-alltar']]):
615 bb.build.addtask(
616 'do_generate_static',
617 'do_image_complete',
618 'do_generate_rwfs_static', d)
619 if 'mtd-static-alltar' in types:
620 bb.build.addtask(
621 'do_generate_static_alltar',
622 'do_image_complete',
Lei YUa4674942018-05-23 14:01:14 +0800623 'do_generate_static do_generate_phosphor_manifest', d)
Brad Bishop19fc4f82017-08-04 23:38:54 -0400624 if 'mtd-static-tar' in types:
625 bb.build.addtask(
626 'do_generate_static_tar',
627 'do_image_complete',
Lei YUa4674942018-05-23 14:01:14 +0800628 'do_generate_rwfs_static do_generate_phosphor_manifest', d)
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400629
630 if 'mtd-ubi' in types:
631 bb.build.addtask(
632 'do_generate_ubi',
633 'do_image_complete',
634 'do_generate_rwfs_ubi', d)
635 if 'mtd-ubi-tar' in types:
636 bb.build.addtask(
637 'do_generate_ubi_tar',
638 'do_image_complete',
639 'do_generate_rwfs_ubi do_generate_phosphor_manifest', d)
Adriana Kobylak9b7197e2019-07-29 15:25:33 -0500640
Adriana Kobylak559224c2020-01-10 11:40:42 -0600641 if 'mmc-verity' in types:
642 bb.build.addtask(
643 'do_generate_mmc_verity',
644 'do_image_complete','', d)
Adriana Kobylak9b7197e2019-07-29 15:25:33 -0500645 if 'mmc-ext4-tar' in types:
646 bb.build.addtask(
647 'do_generate_ext4_tar',
648 'do_image_complete',
649 'do_generate_rwfs_ext4 do_generate_phosphor_manifest', d)
Brad Bishop19fc4f82017-08-04 23:38:54 -0400650}