summaryrefslogtreecommitdiffstats
path: root/meta-phosphor/classes/image-overlay.bbclass
blob: 443c27131c1af68ff3cef2d89db00dacb296695f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
# Constructs a bootable, fixed-offset mtd image with u-boot
# bootloader, kernel fitimage, read only root filesystem,
# and writeable overlay filesystem.

IMAGE_BASETYPE ?= "squashfs-xz"
OVERLAY_BASETYPE ?= "jffs2"

IMAGE_TYPES += "overlay"

IMAGE_TYPEDEP_overlay = "${IMAGE_BASETYPE}"
IMAGE_TYPES_MASKED += "overlay"

FLASH_KERNEL_IMAGE ?= "fitImage-${INITRAMFS_IMAGE}-${MACHINE}.bin"

FLASH_UBOOT_OFFSET ?= "0"
FLASH_KERNEL_OFFSET ?= "512"
FLASH_ROFS_OFFSET ?= "4864"
FLASH_RWFS_OFFSET ?= "28672"
RWFS_SIZE ?= "4096"

# Allow rwfs mkfs configuration through OVERLAY_MKFS_OPTS and OVERRIDES. However,
# avoid setting 'ext4' or 'jffs2' in OVERRIDES as such raw filesystem types are
# reserved for the primary image (and setting them currently breaks the build).
# Instead, prefix the overlay override value with 'rwfs-' to avoid collisions.
DISTROOVERRIDES .= ":rwfs-${OVERLAY_BASETYPE}"

OVERLAY_MKFS_OPTS_rwfs-ext4 = "-b 4096 -F -O^huge_file"

# $(( ${FLASH_SIZE} - ${FLASH_RWFS_OFFSET} ))

mk_nor_image() {
	image_dst="$1"
	image_size_kb=$2
	dd if=/dev/zero bs=1k count=$image_size_kb \
		| tr '\000' '\377' > $image_dst
}

do_generate_flash() {
	ddir="${IMGDEPLOYDIR}"
	kernel="${FLASH_KERNEL_IMAGE}"
	uboot="u-boot.${UBOOT_SUFFIX}"
	rootfs="${IMAGE_LINK_NAME}.${IMAGE_BASETYPE}"
	rwfs="rwfs.${OVERLAY_BASETYPE}"

	flash="${IMAGE_NAME}.overlay"

	mk_nor_image ${S}/$rwfs ${RWFS_SIZE}
	if [ "${OVERLAY_BASETYPE}" != jffs2 ]; then
		mkfs.${OVERLAY_BASETYPE} ${OVERLAY_MKFS_OPTS} ${S}/$rwfs || \
			bbfatal "mkfs rwfs"
	fi

	# Assemble the flash image
	dst="$ddir/$flash"
	mk_nor_image $dst ${FLASH_SIZE}
	dd if=${DEPLOY_DIR_IMAGE}/$uboot of=$dst bs=1k conv=notrunc seek=${FLASH_UBOOT_OFFSET}
	dd if=${DEPLOY_DIR_IMAGE}/$kernel of=$dst bs=1k conv=notrunc seek=${FLASH_KERNEL_OFFSET}
	dd if=$ddir/$rootfs of=$dst bs=1k conv=notrunc seek=${FLASH_ROFS_OFFSET}
	dd if=${S}/$rwfs of=$dst bs=1k conv=notrunc seek=${FLASH_RWFS_OFFSET}

	cd ${IMGDEPLOYDIR}
	ln -sf $flash ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.overlay

	# Maintain a number of non-standard name legacy links.
	ln -sf $flash ${IMGDEPLOYDIR}/flash-${MACHINE}
	ln -sf $flash ${IMGDEPLOYDIR}/image-bmc
	ln -sf $uboot ${IMGDEPLOYDIR}/image-u-boot
	ln -sf $kernel ${IMGDEPLOYDIR}/image-kernel
	ln -sf $rootfs ${IMGDEPLOYDIR}/image-rofs
	cp ${S}/$rwfs ${IMGDEPLOYDIR}/$rwfs
	ln -sf $rwfs ${IMGDEPLOYDIR}/image-rwfs
}

make_overlay_tars() {
	ddir="${IMGDEPLOYDIR}"
	kernel="${FLASH_KERNEL_IMAGE}"
	uboot="u-boot.${UBOOT_SUFFIX}"
	rootfs="${IMAGE_LINK_NAME}.${IMAGE_BASETYPE}"
	rwfs="rwfs.${OVERLAY_BASETYPE}"

	flash="${IMAGE_NAME}.overlay"
	alltar="${IMAGE_NAME}.all.tar"
	tar="${IMAGE_NAME}.tar"

	# Create some links to help make the tar archives
	ln -sf $ddir/${IMAGE_LINK_NAME}.overlay ${S}/image-bmc
	ln -sf ${DEPLOY_DIR_IMAGE}/$uboot ${S}/image-u-boot
	ln -sf ${DEPLOY_DIR_IMAGE}/$kernel ${S}/image-kernel
	ln -sf $ddir/$rootfs ${S}/image-rofs
	ln -sf $rwfs ${S}/image-rwfs

	# Create the tar archives
	tar -h -cvf $ddir/$alltar -C ${S} image-bmc MANIFEST
	tar -h -cvf $ddir/$tar -C ${S} image-u-boot image-kernel image-rofs image-rwfs MANIFEST

	cd ${IMGDEPLOYDIR}
	ln -sf $alltar ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.all.tar
	ln -sf $tar ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.tar

	# Maintain a number of non-standard name legacy links.
	ln -sf $tar ${IMGDEPLOYDIR}/${MACHINE}-${DATETIME}.tar
	ln -sf $alltar ${IMGDEPLOYDIR}/${MACHINE}-${DATETIME}.all.tar
}

make_overlay_tars[vardepsexclude] = "DATETIME"

def generate_manifest(d):
    import configparser
    import io
    path = d.getVar('STAGING_DIR_HOST', True) + d.getVar('sysconfdir', True)
    path = os.path.join(path, 'os-release')
    parser = configparser.SafeConfigParser(strict=False)
    parser.optionxform = str
    version = ''
    with open(path, 'r') as fd:
        buf = '[root]\n' + fd.read()
        fd = io.StringIO(buf)
        parser.readfp(fd)
        version = parser['root']['VERSION_ID']

    with open(os.path.join(d.getVar('S', True), 'MANIFEST'), 'w') as fd:
        fd.write('purpose=xyz.openbmc_project.Software.Version.VersionPurpose.BMC\n')
        fd.write('version={}\n'.format(version.strip('"')))


python do_generate_tars() {
    generate_manifest(d)
    bb.build.exec_func('make_overlay_tars', d)
}


do_generate_flash[depends] += " \
        ${PN}:do_image_${@d.getVar('IMAGE_BASETYPE', True).replace('-', '_')} \
        virtual/kernel:do_deploy \
        u-boot:do_populate_sysroot \
        "

do_generate_tars[depends] += " \
        ${PN}:do_generate_flash  \
        os-release:do_populate_sysroot \
        "

addtask generate_flash before do_image_complete
addtask generate_tars before do_image_complete
OpenPOWER on IntegriCloud