blob: 0d2ed898c7556a30091ce1048930e34bf4210b19 [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
Eddie Jamesb2b7ff62018-02-09 11:59:18 -060061SIGNING_KEY ?= "${STAGING_DIR_NATIVE}${datadir}/OpenBMC.priv"
62INSECURE_KEY = "${@'${SIGNING_KEY}' == '${STAGING_DIR_NATIVE}${datadir}/OpenBMC.priv'}"
63SIGNING_KEY_DEPENDS = "${@oe.utils.conditional('INSECURE_KEY', 'True', 'phosphor-insecure-signing-key-native:do_populate_sysroot', '', d)}"
64
Adriana Kobylakfb62a682019-10-28 16:03:12 -050065VERSION_PURPOSE ?= "xyz.openbmc_project.Software.Version.VersionPurpose.BMC"
66
Brad Bishop3e37d382018-03-31 12:17:28 -040067UBOOT_SUFFIX ?= "bin"
68
Brad Bishop3aa1ef62017-08-04 23:48:12 -040069python() {
70 # Compute rwfs LEB count and LEB size.
71 page_size = d.getVar('FLASH_PAGE_SIZE', True)
72 nor_overhead_size = d.getVar('FLASH_NOR_UBI_OVERHEAD', True)
73 overhead_size = max(int(page_size), int(nor_overhead_size))
74 peb_size = d.getVar('FLASH_PEB_SIZE', True)
75 leb_size = (int(peb_size) * 1024) - (2 * overhead_size)
76 d.setVar('FLASH_LEB_SIZE', str(leb_size)) # In bytes
77
78 rwfs_size = d.getVar('FLASH_UBI_RWFS_SIZE', True)
79 rwfs_size = int(rwfs_size) * 1024
80 lebs = int((rwfs_size + leb_size - 1) / leb_size) # Rounding up
81 d.setVar('FLASH_UBI_RWFS_LEBS', str(lebs))
82}
83
Brad Bishop19fc4f82017-08-04 23:38:54 -040084# Allow rwfs mkfs configuration through OVERLAY_MKFS_OPTS and OVERRIDES. However,
85# avoid setting 'ext4' or 'jffs2' in OVERRIDES as such raw filesystem types are
86# reserved for the primary image (and setting them currently breaks the build).
87# Instead, prefix the overlay override value with 'rwfs-' to avoid collisions.
88DISTROOVERRIDES .= ":static-rwfs-${OVERLAY_BASETYPE}"
Brad Bishop3aa1ef62017-08-04 23:48:12 -040089DISTROOVERRIDES .= ":ubi-rwfs-${FLASH_UBI_OVERLAY_BASETYPE}"
Adriana Kobylak5a5753a2019-07-30 11:27:46 -050090DISTROOVERRIDES .= ":mmc-rwfs-${FLASH_EXT4_OVERLAY_BASETYPE}"
Brad Bishop19fc4f82017-08-04 23:38:54 -040091
William A. Kennington IIIc230ab32019-09-16 17:44:48 -070092JFFS2_RWFS_CMD = "mkfs.jffs2 --root=jffs2 --faketime --output=${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.jffs2"
93UBIFS_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 -050094EXT4_RWFS_CMD = "mkfs.ext4 -F ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.rwfs.ext4"
Brad Bishop19fc4f82017-08-04 23:38:54 -040095
96FLASH_STATIC_RWFS_CMD_static-rwfs-jffs2 = "${JFFS2_RWFS_CMD}"
Brad Bishop3aa1ef62017-08-04 23:48:12 -040097FLASH_UBI_RWFS_CMD_ubi-rwfs-jffs2 = "${JFFS2_RWFS_CMD}"
98FLASH_UBI_RWFS_CMD_ubi-rwfs-ubifs = "${UBIFS_RWFS_CMD}"
Adriana Kobylak5a5753a2019-07-30 11:27:46 -050099FLASH_EXT4_RWFS_CMD_mmc-rwfs-ext4 = "${EXT4_RWFS_CMD}"
Brad Bishop19fc4f82017-08-04 23:38:54 -0400100
Adriana Kobylak661cf392019-07-29 14:39:00 -0500101mk_empty_image() {
Brad Bishop19fc4f82017-08-04 23:38:54 -0400102 image_dst="$1"
103 image_size_kb=$2
104 dd if=/dev/zero bs=1k count=$image_size_kb \
105 | tr '\000' '\377' > $image_dst
106}
107
Adriana Kobylakf494bb52019-07-29 16:14:11 -0500108clean_rwfs() {
109 type=$1
110 shift
111
112 rm -f ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.$type
113 rm -rf $type
114 mkdir $type
115}
116
Brad Bishop19fc4f82017-08-04 23:38:54 -0400117make_rwfs() {
118 type=$1
119 cmd=$2
120 shift
121 shift
122 opts="$@"
123
Adriana Kobylakf494bb52019-07-29 16:14:11 -0500124 mkdir -p $type
Brad Bishop19fc4f82017-08-04 23:38:54 -0400125
126 $cmd $opts
127}
128
129do_generate_rwfs_static() {
Adriana Kobylakf494bb52019-07-29 16:14:11 -0500130 clean_rwfs ${OVERLAY_BASETYPE}
Brad Bishop19fc4f82017-08-04 23:38:54 -0400131 make_rwfs ${OVERLAY_BASETYPE} "${FLASH_STATIC_RWFS_CMD}" ${OVERLAY_MKFS_OPTS}
132}
133do_generate_rwfs_static[dirs] = " ${S}/static"
134do_generate_rwfs_static[depends] += " \
135 mtd-utils-native:do_populate_sysroot \
136 "
137
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400138do_generate_rwfs_ubi() {
Adriana Kobylakf494bb52019-07-29 16:14:11 -0500139 clean_rwfs ${FLASH_UBI_OVERLAY_BASETYPE}
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400140 make_rwfs ${FLASH_UBI_OVERLAY_BASETYPE} "${FLASH_UBI_RWFS_CMD}"
141}
142do_generate_rwfs_ubi[dirs] = " ${S}/ubi"
143do_generate_rwfs_ubi[depends] += " \
144 mtd-utils-native:do_populate_sysroot \
145 "
146
Adriana Kobylak5a5753a2019-07-30 11:27:46 -0500147do_generate_rwfs_ext4() {
148 clean_rwfs rwfs.${FLASH_EXT4_OVERLAY_BASETYPE}
149 mk_empty_image ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.rwfs.ext4 1024
150 make_rwfs ${FLASH_EXT4_OVERLAY_BASETYPE} "${FLASH_EXT4_RWFS_CMD}" ${OVERLAY_MKFS_OPTS}
151}
152do_generate_rwfs_ext4[dirs] = " ${S}/ext4"
153do_generate_rwfs_ext4[depends] += " \
154 e2fsprogs-native:do_populate_sysroot \
155 "
156
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400157add_volume() {
158 config_file=$1
159 vol_id=$2
160 vol_type=$3
161 vol_name=$4
162 image=$5
163 vol_size=$6
164
165 echo \[$vol_name\] >> $config_file
166 echo mode=ubi >> $config_file
167 echo image=$image >> $config_file
168 echo vol_type=$vol_type >> $config_file
169 echo vol_name=$vol_name >> $config_file
170 echo vol_id=$vol_id >> $config_file
171 if [ ! -z $vol_size ]; then
172 echo vol_size=$vol_size >> $config_file
173 fi
174}
175
Saqib Khan41723472017-09-22 10:21:30 -0500176python do_generate_ubi() {
177 version_id = do_get_versionID(d)
178 d.setVar('VERSION_ID', version_id)
179 bb.build.exec_func("do_make_ubi", d)
180}
181do_generate_ubi[dirs] = "${S}/ubi"
182do_generate_ubi[depends] += " \
183 ${PN}:do_image_${@d.getVar('FLASH_UBI_BASETYPE', True).replace('-', '_')} \
184 virtual/kernel:do_deploy \
185 u-boot:do_populate_sysroot \
186 mtd-utils-native:do_populate_sysroot \
187 "
188
189do_make_ubi() {
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400190 cfg=ubinize-${IMAGE_NAME}.cfg
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400191 rm -f $cfg ubi-img
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400192 # Construct the ubinize config file
Saqib Khan41723472017-09-22 10:21:30 -0500193 add_volume $cfg 0 static kernel-${VERSION_ID} \
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400194 ${DEPLOY_DIR_IMAGE}/${FLASH_KERNEL_IMAGE}
195
Saqib Khan41723472017-09-22 10:21:30 -0500196 add_volume $cfg 1 static rofs-${VERSION_ID} \
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400197 ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.${FLASH_UBI_BASETYPE}
198
William A. Kennington IIIc230ab32019-09-16 17:44:48 -0700199 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 -0400200
201 # Build the ubi partition image
202 ubinize -p ${FLASH_PEB_SIZE}KiB -m ${FLASH_PAGE_SIZE} -o ubi-img $cfg
203
204 # Concatenate the uboot and ubi partitions
Adriana Kobylak661cf392019-07-29 14:39:00 -0500205 mk_empty_image ${IMGDEPLOYDIR}/${IMAGE_NAME}.ubi.mtd ${FLASH_SIZE}
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400206 dd bs=1k conv=notrunc seek=${FLASH_UBOOT_OFFSET} \
207 if=${DEPLOY_DIR_IMAGE}/u-boot.${UBOOT_SUFFIX} \
208 of=${IMGDEPLOYDIR}/${IMAGE_NAME}.ubi.mtd
209 dd bs=1k conv=notrunc seek=${FLASH_UBI_OFFSET} \
210 if=ubi-img \
211 of=${IMGDEPLOYDIR}/${IMAGE_NAME}.ubi.mtd
212
213 cd ${IMGDEPLOYDIR}
214 ln -sf ${IMAGE_NAME}.ubi.mtd ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.ubi.mtd
215}
Saqib Khan41723472017-09-22 10:21:30 -0500216do_make_ubi[dirs] = "${S}/ubi"
217do_make_ubi[depends] += " \
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400218 ${PN}:do_image_${@d.getVar('FLASH_UBI_BASETYPE', True).replace('-', '_')} \
219 virtual/kernel:do_deploy \
220 u-boot:do_populate_sysroot \
221 mtd-utils-native:do_populate_sysroot \
222 "
223
Adriana Kobylak559224c2020-01-10 11:40:42 -0600224python do_generate_mmc_verity() {
225 import os
226 import subprocess
227
228 rootfs_image = os.path.join(d.getVar('IMGDEPLOYDIR', True),
229 '%s.%s' % (
230 d.getVar('IMAGE_LINK_NAME', True),
231 d.getVar('FLASH_EXT4_BASETYPE', True)))
232
233 verity_image = 'verity-%s.%s' % (
234 d.getVar('IMAGE_LINK_NAME', True),
235 d.getVar('FLASH_EXT4_BASETYPE', True))
236
237 subprocess.check_call(['dd',
238 'if=%s' % rootfs_image,
239 'of=%s' % verity_image])
240
241 # dm-verity values
242 sector_size = 512
243 block_size = int(d.getVar('IMAGE_BLOCK_SIZE', True))
244 verity_algo = "sha256"
245 rootfs_image_size = os.stat(rootfs_image).st_size
246
247 def align_up(number, boundary):
248 return ((number + (boundary - 1)) // boundary) * boundary
249
250 # verity metadata must be aligned on the block boundary subsequent to the
251 # end of the data
252 verity_hash_offset = align_up(rootfs_image_size, block_size)
253
254 verity_hash_blocks = verity_hash_offset // block_size
255
256 # the output of 'veritysetup format' looks like:
257 # VERITY header information for obmc-phosphor-image-witherspoon.squashfs-xz
258 # UUID: 269b5934-de5b-45b0-99a3-56b219a7b544
259 # Hash type: 1
260 # Data blocks: 4523
261 # Data block size: 4096
262 # Hash block size: 4096
263 # Hash algorithm: sha256
264 # Salt: 8fca9eff342fc0cf2964057257ea80813a223cb2e540a38458142edeb190e12e
265 # Root hash: 38ef00d23fa89300dcf66e7494d25246d03bf846b4119b34e7b1587c0b6fe1d9
266 verity_hash_file = "verity-hash-verification-data"
267 with open(verity_hash_file, 'w') as f:
268 subprocess.check_call(['veritysetup',
269 'format',
270 '--hash=%s'% verity_algo,
271 '--data-block-size=%i' % block_size,
272 '--hash-block-size=%i' % block_size,
273 '--hash-offset=%i' % verity_hash_offset,
274 '%s' % verity_image,
275 '%s' % verity_image], stdout=f, stderr=f)
276
277 for line in open(verity_hash_file, "r"):
278 if "Salt" in line:
279 verity_salt = line.split()[-1]
280 if "Root" in line:
281 verity_root = line.split()[-1]
282
283 verity_image_size = os.stat(verity_image).st_size
284
285 # Make an appropriately sized image for MMC
286 mmc_image_name = "%s.mmc" % d.getVar('IMAGE_NAME', True)
287 mmc_image_path = os.path.join(d.getVar('IMGDEPLOYDIR', True),
288 '%s' % mmc_image_name)
289
290 # CSD size accommodates MMC limitations that are relevant to QEMU
291 csd_size = (1 << (9 + 9 - 1 + 2))
292
293 with open(mmc_image_path, 'w') as fd:
294 os.posix_fallocate(fd.fileno(), 0, align_up(verity_image_size, csd_size))
295 subprocess.check_call(['dd',
296 'if=%s' % verity_image,
297 'of=%s' % mmc_image_path,
298 'conv=notrunc'])
299
300 os.chdir("%s" % d.getVar('IMGDEPLOYDIR', True))
301 mmc_link_name = os.path.join(d.getVar('IMGDEPLOYDIR', True),
302 '%s.mmc' % d.getVar('IMAGE_LINK_NAME', True))
303 if os.path.lexists(mmc_link_name):
304 os.remove(mmc_link_name)
305 os.symlink(mmc_image_name, mmc_link_name)
306}
307do_generate_mmc_verity[dirs] = "${S}/mmc"
308do_generate_mmc_verity[depends] += " \
309 ${PN}:do_image_${FLASH_EXT4_BASETYPE} \
310 cryptsetup-native:do_populate_sysroot \
311 "
312
Alexander Filippov3dcf6f92018-07-17 16:41:37 +0300313do_mk_static_nor_image() {
Brad Bishop19fc4f82017-08-04 23:38:54 -0400314 # Assemble the flash image
Adriana Kobylak661cf392019-07-29 14:39:00 -0500315 mk_empty_image ${IMGDEPLOYDIR}/${IMAGE_NAME}.static.mtd ${FLASH_SIZE}
Alexander Filippov3dcf6f92018-07-17 16:41:37 +0300316}
Brad Bishop19fc4f82017-08-04 23:38:54 -0400317
Adriana Kobylakf1954f02020-04-27 15:20:35 -0500318do_generate_image_uboot_file() {
319 image_dst="$1"
320 uboot_offset=${FLASH_UBOOT_OFFSET}
321
322 if [ ! -z ${SPL_BINARY} ]; then
323 dd bs=1k conv=notrunc seek=${FLASH_UBOOT_OFFSET} \
324 if=${DEPLOY_DIR_IMAGE}/u-boot-spl.${UBOOT_SUFFIX} \
325 of=${image_dst}
326 uboot_offset=${FLASH_UBOOT_SPL_SIZE}
327 fi
328
329 dd bs=1k conv=notrunc seek=${uboot_offset} \
330 if=${DEPLOY_DIR_IMAGE}/u-boot.${UBOOT_SUFFIX} \
331 of=${image_dst}
332}
333
Alexander Filippov3dcf6f92018-07-17 16:41:37 +0300334python do_generate_static() {
335 import subprocess
Brad Bishop19fc4f82017-08-04 23:38:54 -0400336
Alexander Filippov3dcf6f92018-07-17 16:41:37 +0300337 bb.build.exec_func("do_mk_static_nor_image", d)
Brad Bishop19fc4f82017-08-04 23:38:54 -0400338
Alexander Filippov3dcf6f92018-07-17 16:41:37 +0300339 nor_image = os.path.join(d.getVar('IMGDEPLOYDIR', True),
340 '%s.static.mtd' % d.getVar('IMAGE_NAME', True))
341
342 def _append_image(imgpath, start_kb, finish_kb):
343 imgsize = os.path.getsize(imgpath)
Josh Lehan0a5ef2a2020-02-26 12:11:33 -0800344 maxsize = (finish_kb - start_kb) * 1024
345 bb.debug(1, 'Considering file size=' + str(imgsize) + ' name=' + imgpath)
346 bb.debug(1, 'Spanning start=' + str(start_kb) + 'K end=' + str(finish_kb) + 'K')
347 bb.debug(1, 'Compare needed=' + str(imgsize) + ' available=' + str(maxsize) + ' margin=' + str(maxsize - imgsize))
348 if imgsize > maxsize:
Alexander Filippov3dcf6f92018-07-17 16:41:37 +0300349 bb.fatal("Image '%s' is too large!" % imgpath)
350
351 subprocess.check_call(['dd', 'bs=1k', 'conv=notrunc',
352 'seek=%d' % start_kb,
353 'if=%s' % imgpath,
354 'of=%s' % nor_image])
355
Adriana Kobylake913dd82020-04-13 13:56:41 -0500356 uboot_offset = int(d.getVar('FLASH_UBOOT_OFFSET', True))
357
358 spl_binary = d.getVar('SPL_BINARY', True)
359 if spl_binary:
360 _append_image(os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True),
361 'u-boot-spl.%s' % d.getVar('UBOOT_SUFFIX',True)),
362 int(d.getVar('FLASH_UBOOT_OFFSET', True)),
363 int(d.getVar('FLASH_UBOOT_SPL_SIZE', True)))
364 uboot_offset += int(d.getVar('FLASH_UBOOT_SPL_SIZE', True))
365
Alexander Filippov3dcf6f92018-07-17 16:41:37 +0300366 _append_image(os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True),
367 'u-boot.%s' % d.getVar('UBOOT_SUFFIX',True)),
Adriana Kobylake913dd82020-04-13 13:56:41 -0500368 uboot_offset,
Alexander Filippov3dcf6f92018-07-17 16:41:37 +0300369 int(d.getVar('FLASH_KERNEL_OFFSET', True)))
370
371 _append_image(os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True),
372 d.getVar('FLASH_KERNEL_IMAGE', True)),
373 int(d.getVar('FLASH_KERNEL_OFFSET', True)),
374 int(d.getVar('FLASH_ROFS_OFFSET', True)))
375
376 _append_image(os.path.join(d.getVar('IMGDEPLOYDIR', True),
377 '%s.%s' % (
378 d.getVar('IMAGE_LINK_NAME', True),
379 d.getVar('IMAGE_BASETYPE', True))),
380 int(d.getVar('FLASH_ROFS_OFFSET', True)),
381 int(d.getVar('FLASH_RWFS_OFFSET', True)))
382
William A. Kennington IIIc230ab32019-09-16 17:44:48 -0700383 _append_image(os.path.join(d.getVar('IMGDEPLOYDIR', True),
384 '%s.%s' % (
385 d.getVar('IMAGE_LINK_NAME', True),
386 d.getVar('OVERLAY_BASETYPE', True))),
Alexander Filippov3dcf6f92018-07-17 16:41:37 +0300387 int(d.getVar('FLASH_RWFS_OFFSET', True)),
388 int(d.getVar('FLASH_SIZE', True)))
389
390 bb.build.exec_func("do_mk_static_symlinks", d)
391}
392
393do_mk_static_symlinks() {
Brad Bishop19fc4f82017-08-04 23:38:54 -0400394 cd ${IMGDEPLOYDIR}
395 ln -sf ${IMAGE_NAME}.static.mtd ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.static.mtd
396
397 # Maintain non-standard legacy links
Adriana Kobylakf1954f02020-04-27 15:20:35 -0500398 do_generate_image_uboot_file ${IMGDEPLOYDIR}/image-u-boot
Brad Bishop19fc4f82017-08-04 23:38:54 -0400399 ln -sf ${IMAGE_NAME}.static.mtd ${IMGDEPLOYDIR}/flash-${MACHINE}
400 ln -sf ${IMAGE_NAME}.static.mtd ${IMGDEPLOYDIR}/image-bmc
Brad Bishop19fc4f82017-08-04 23:38:54 -0400401 ln -sf ${FLASH_KERNEL_IMAGE} ${IMGDEPLOYDIR}/image-kernel
402 ln -sf ${IMAGE_LINK_NAME}.${IMAGE_BASETYPE} ${IMGDEPLOYDIR}/image-rofs
William A. Kennington IIIc230ab32019-09-16 17:44:48 -0700403 ln -sf ${IMAGE_LINK_NAME}.${OVERLAY_BASETYPE} ${IMGDEPLOYDIR}/image-rwfs
Brad Bishop19fc4f82017-08-04 23:38:54 -0400404}
405do_generate_static[dirs] = "${S}/static"
406do_generate_static[depends] += " \
407 ${PN}:do_image_${@d.getVar('IMAGE_BASETYPE', True).replace('-', '_')} \
408 virtual/kernel:do_deploy \
409 u-boot:do_populate_sysroot \
410 "
411
Lei YUf2072212018-06-20 13:27:34 +0800412make_signatures() {
413 signature_files=""
414 for file in "$@"; do
415 openssl dgst -sha256 -sign ${SIGNING_KEY} -out "${file}.sig" $file
416 signature_files="${signature_files} ${file}.sig"
417 done
418}
419
Brad Bishop19fc4f82017-08-04 23:38:54 -0400420do_generate_static_alltar() {
Lei YUa4674942018-05-23 14:01:14 +0800421 ln -sf ${S}/MANIFEST MANIFEST
422 ln -sf ${S}/publickey publickey
Brad Bishop19fc4f82017-08-04 23:38:54 -0400423 ln -sf ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.static.mtd image-bmc
Lei YUa4674942018-05-23 14:01:14 +0800424
Lei YUf2072212018-06-20 13:27:34 +0800425 make_signatures image-bmc MANIFEST publickey
Lei YUa4674942018-05-23 14:01:14 +0800426
427 tar -h -cvf ${IMGDEPLOYDIR}/${IMAGE_NAME}.static.mtd.all.tar \
428 image-bmc MANIFEST publickey ${signature_files}
Brad Bishop19fc4f82017-08-04 23:38:54 -0400429
430 cd ${IMGDEPLOYDIR}
431
432 ln -sf ${IMAGE_NAME}.static.mtd.all.tar \
433 ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.static.mtd.all.tar
434
435 # Maintain non-standard legacy link.
436 ln -sf ${IMAGE_NAME}.static.mtd.all.tar \
437 ${IMGDEPLOYDIR}/${MACHINE}-${DATETIME}.all.tar
Lei YUa4674942018-05-23 14:01:14 +0800438
Brad Bishop19fc4f82017-08-04 23:38:54 -0400439}
440do_generate_static_alltar[vardepsexclude] = "DATETIME"
441do_generate_static_alltar[dirs] = "${S}/static"
Lei YUa4674942018-05-23 14:01:14 +0800442do_generate_static_alltar[depends] += " \
443 openssl-native:do_populate_sysroot \
444 ${SIGNING_KEY_DEPENDS} \
445 ${PN}:do_copy_signing_pubkey \
446 "
Brad Bishop19fc4f82017-08-04 23:38:54 -0400447
Brad Bishopde659382018-03-30 01:46:16 -0400448make_image_links() {
Brad Bishop19fc4f82017-08-04 23:38:54 -0400449 rwfs=$1
450 rofs=$2
Brad Bishop19fc4f82017-08-04 23:38:54 -0400451 shift
452 shift
Brad Bishop19fc4f82017-08-04 23:38:54 -0400453
Brad Bishopde659382018-03-30 01:46:16 -0400454 # Create some links to help make the tar archive in the format
455 # expected by phosphor-bmc-code-mgmt.
Adriana Kobylakf1954f02020-04-27 15:20:35 -0500456 do_generate_image_uboot_file image-u-boot
Brad Bishop19fc4f82017-08-04 23:38:54 -0400457 ln -sf ${DEPLOY_DIR_IMAGE}/${FLASH_KERNEL_IMAGE} image-kernel
458 ln -sf ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.$rofs image-rofs
William A. Kennington IIIc230ab32019-09-16 17:44:48 -0700459 ln -sf ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.$rwfs image-rwfs
Brad Bishopde659382018-03-30 01:46:16 -0400460}
461
462make_tar_of_images() {
463 type=$1
464 shift
465 extra_files="$@"
Brad Bishop19fc4f82017-08-04 23:38:54 -0400466
467 # Create the tar archive
Adriana Kobylake67e9db2019-07-30 11:31:50 -0500468 tar -h -cvf ${IMGDEPLOYDIR}/${IMAGE_NAME}.$type.tar \
Brad Bishop19fc4f82017-08-04 23:38:54 -0400469 image-u-boot image-kernel image-rofs image-rwfs $extra_files
470
471 cd ${IMGDEPLOYDIR}
Adriana Kobylake67e9db2019-07-30 11:31:50 -0500472 ln -sf ${IMAGE_NAME}.$type.tar ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.$type.tar
Brad Bishop19fc4f82017-08-04 23:38:54 -0400473}
474
475do_generate_static_tar() {
Lei YUa4674942018-05-23 14:01:14 +0800476 ln -sf ${S}/MANIFEST MANIFEST
477 ln -sf ${S}/publickey publickey
Brad Bishopde659382018-03-30 01:46:16 -0400478 make_image_links ${OVERLAY_BASETYPE} ${IMAGE_BASETYPE}
Lei YUf2072212018-06-20 13:27:34 +0800479 make_signatures image-u-boot image-kernel image-rofs image-rwfs MANIFEST publickey
Adriana Kobylake67e9db2019-07-30 11:31:50 -0500480 make_tar_of_images static.mtd MANIFEST publickey ${signature_files}
Brad Bishop19fc4f82017-08-04 23:38:54 -0400481
482 # Maintain non-standard legacy link.
483 cd ${IMGDEPLOYDIR}
484 ln -sf ${IMAGE_NAME}.static.mtd.tar ${IMGDEPLOYDIR}/${MACHINE}-${DATETIME}.tar
485}
486do_generate_static_tar[dirs] = " ${S}/static"
487do_generate_static_tar[depends] += " \
488 ${PN}:do_image_${@d.getVar('IMAGE_BASETYPE', True).replace('-', '_')} \
489 virtual/kernel:do_deploy \
490 u-boot:do_populate_sysroot \
Lei YUa4674942018-05-23 14:01:14 +0800491 openssl-native:do_populate_sysroot \
492 ${SIGNING_KEY_DEPENDS} \
493 ${PN}:do_copy_signing_pubkey \
Brad Bishop19fc4f82017-08-04 23:38:54 -0400494 "
495do_generate_static_tar[vardepsexclude] = "DATETIME"
496
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400497do_generate_ubi_tar() {
498 ln -sf ${S}/MANIFEST MANIFEST
Eddie Jamesb2b7ff62018-02-09 11:59:18 -0600499 ln -sf ${S}/publickey publickey
Brad Bishopde659382018-03-30 01:46:16 -0400500 make_image_links ${FLASH_UBI_OVERLAY_BASETYPE} ${FLASH_UBI_BASETYPE}
Lei YUf2072212018-06-20 13:27:34 +0800501 make_signatures image-u-boot image-kernel image-rofs image-rwfs MANIFEST publickey
Adriana Kobylake67e9db2019-07-30 11:31:50 -0500502 make_tar_of_images ubi.mtd MANIFEST publickey ${signature_files}
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400503}
504do_generate_ubi_tar[dirs] = " ${S}/ubi"
505do_generate_ubi_tar[depends] += " \
506 ${PN}:do_image_${@d.getVar('FLASH_UBI_BASETYPE', True).replace('-', '_')} \
507 virtual/kernel:do_deploy \
508 u-boot:do_populate_sysroot \
Eddie Jamesb2b7ff62018-02-09 11:59:18 -0600509 openssl-native:do_populate_sysroot \
510 ${SIGNING_KEY_DEPENDS} \
511 ${PN}:do_copy_signing_pubkey \
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400512 "
513
Adriana Kobylak9b7197e2019-07-29 15:25:33 -0500514do_generate_ext4_tar() {
515 ln -sf ${S}/MANIFEST MANIFEST
516 ln -sf ${S}/publickey publickey
517 make_image_links rwfs.${FLASH_EXT4_OVERLAY_BASETYPE} ${FLASH_EXT4_BASETYPE}
518 make_signatures image-u-boot image-kernel image-rofs image-rwfs MANIFEST publickey
519 make_tar_of_images ext4.mmc MANIFEST publickey ${signature_files}
520}
521do_generate_ext4_tar[dirs] = " ${S}/ext4"
522do_generate_ext4_tar[depends] += " \
523 ${PN}:do_image_${FLASH_EXT4_BASETYPE} \
524 virtual/kernel:do_deploy \
525 u-boot:do_populate_sysroot \
526 openssl-native:do_populate_sysroot \
527 ${SIGNING_KEY_DEPENDS} \
528 ${PN}:do_copy_signing_pubkey \
529 "
530
Eddie Jamesb2b7ff62018-02-09 11:59:18 -0600531def get_pubkey_basedir(d):
532 return os.path.join(
533 d.getVar('STAGING_DIR_TARGET', True),
534 d.getVar('sysconfdir', True).strip(os.sep),
535 'activationdata')
536
537def get_pubkey_type(d):
538 return os.listdir(get_pubkey_basedir(d))[0]
539
540def get_pubkey_path(d):
541 return os.path.join(
542 get_pubkey_basedir(d),
543 get_pubkey_type(d),
544 'publickey')
545
Brad Bishop19fc4f82017-08-04 23:38:54 -0400546python do_generate_phosphor_manifest() {
Adriana Kobylakfb62a682019-10-28 16:03:12 -0500547 purpose = d.getVar('VERSION_PURPOSE', True)
Saqib Khan41723472017-09-22 10:21:30 -0500548 version = do_get_version(d)
Vijay Khemkaae614bd2019-09-18 12:28:46 -0700549 target_machine = d.getVar('MACHINE', True)
Brad Bishop19fc4f82017-08-04 23:38:54 -0400550 with open('MANIFEST', 'w') as fd:
Adriana Kobylakfb62a682019-10-28 16:03:12 -0500551 fd.write('purpose={}\n'.format(purpose))
Brad Bishop19fc4f82017-08-04 23:38:54 -0400552 fd.write('version={}\n'.format(version.strip('"')))
Eddie Jamesb2b7ff62018-02-09 11:59:18 -0600553 fd.write('KeyType={}\n'.format(get_pubkey_type(d)))
554 fd.write('HashType=RSA-SHA256\n')
Vijay Khemkaae614bd2019-09-18 12:28:46 -0700555 fd.write('MachineName={}\n'.format(target_machine))
Brad Bishop19fc4f82017-08-04 23:38:54 -0400556}
557do_generate_phosphor_manifest[dirs] = "${S}"
558do_generate_phosphor_manifest[depends] += " \
559 os-release:do_populate_sysroot \
Eddie Jamesb2b7ff62018-02-09 11:59:18 -0600560 phosphor-image-signing:do_populate_sysroot \
Brad Bishop19fc4f82017-08-04 23:38:54 -0400561 "
562
Eddie Jamesb2b7ff62018-02-09 11:59:18 -0600563python do_copy_signing_pubkey() {
564 with open(get_pubkey_path(d), 'r') as read_fd:
565 with open('publickey', 'w') as write_fd:
566 write_fd.write(read_fd.read())
567}
568
569do_copy_signing_pubkey[dirs] = "${S}"
570do_copy_signing_pubkey[depends] += " \
571 phosphor-image-signing:do_populate_sysroot \
572 "
573
574addtask copy_signing_pubkey after do_rootfs
Brad Bishop19fc4f82017-08-04 23:38:54 -0400575addtask generate_phosphor_manifest after do_rootfs
576addtask generate_rwfs_static after do_rootfs
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400577addtask generate_rwfs_ubi after do_rootfs
Adriana Kobylak5a5753a2019-07-30 11:27:46 -0500578addtask generate_rwfs_ext4 after do_rootfs
Brad Bishop19fc4f82017-08-04 23:38:54 -0400579
580python() {
581 types = d.getVar('IMAGE_FSTYPES', True).split()
582
583 if any([x in types for x in ['mtd-static', 'mtd-static-alltar']]):
584 bb.build.addtask(
585 'do_generate_static',
586 'do_image_complete',
587 'do_generate_rwfs_static', d)
588 if 'mtd-static-alltar' in types:
589 bb.build.addtask(
590 'do_generate_static_alltar',
591 'do_image_complete',
Lei YUa4674942018-05-23 14:01:14 +0800592 'do_generate_static do_generate_phosphor_manifest', d)
Brad Bishop19fc4f82017-08-04 23:38:54 -0400593 if 'mtd-static-tar' in types:
594 bb.build.addtask(
595 'do_generate_static_tar',
596 'do_image_complete',
Lei YUa4674942018-05-23 14:01:14 +0800597 'do_generate_rwfs_static do_generate_phosphor_manifest', d)
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400598
599 if 'mtd-ubi' in types:
600 bb.build.addtask(
601 'do_generate_ubi',
602 'do_image_complete',
603 'do_generate_rwfs_ubi', d)
604 if 'mtd-ubi-tar' in types:
605 bb.build.addtask(
606 'do_generate_ubi_tar',
607 'do_image_complete',
608 'do_generate_rwfs_ubi do_generate_phosphor_manifest', d)
Adriana Kobylak9b7197e2019-07-29 15:25:33 -0500609
Adriana Kobylak559224c2020-01-10 11:40:42 -0600610 if 'mmc-verity' in types:
611 bb.build.addtask(
612 'do_generate_mmc_verity',
613 'do_image_complete','', d)
Adriana Kobylak9b7197e2019-07-29 15:25:33 -0500614 if 'mmc-ext4-tar' in types:
615 bb.build.addtask(
616 'do_generate_ext4_tar',
617 'do_image_complete',
618 'do_generate_rwfs_ext4 do_generate_phosphor_manifest', d)
Brad Bishop19fc4f82017-08-04 23:38:54 -0400619}