diff options
Diffstat (limited to 'scripts/lib')
-rw-r--r-- | scripts/lib/wic/plugins/source/bootimg_pcbios.py | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/scripts/lib/wic/plugins/source/bootimg_pcbios.py b/scripts/lib/wic/plugins/source/bootimg_pcbios.py index a4fabec0ae..f50a5ae0e2 100644 --- a/scripts/lib/wic/plugins/source/bootimg_pcbios.py +++ b/scripts/lib/wic/plugins/source/bootimg_pcbios.py | |||
@@ -13,7 +13,9 @@ | |||
13 | import logging | 13 | import logging |
14 | import os | 14 | import os |
15 | import re | 15 | import re |
16 | import shutil | ||
16 | 17 | ||
18 | from glob import glob | ||
17 | from wic import WicError | 19 | from wic import WicError |
18 | from wic.engine import get_custom_config | 20 | from wic.engine import get_custom_config |
19 | from wic.pluginbase import SourcePlugin | 21 | from wic.pluginbase import SourcePlugin |
@@ -73,6 +75,27 @@ class BootimgPcbiosPlugin(SourcePlugin): | |||
73 | kernel_dir, native_sysroot) | 75 | kernel_dir, native_sysroot) |
74 | 76 | ||
75 | @classmethod | 77 | @classmethod |
78 | def _get_staging_libdir(cls): | ||
79 | """ | ||
80 | For unknown reasons when running test with poky | ||
81 | STAGING_LIBDIR gets unset when wic create is executed. | ||
82 | Bellow is a hack to determine what STAGING_LIBDIR should | ||
83 | be if not specified. | ||
84 | """ | ||
85 | |||
86 | staging_libdir = get_bitbake_var('STAGING_LIBDIR') | ||
87 | staging_dir_target = get_bitbake_var('STAGING_DIR_TARGET') | ||
88 | |||
89 | if not staging_libdir: | ||
90 | staging_libdir = '%s/usr/lib64' % staging_dir_target | ||
91 | if not os.path.isdir(staging_libdir): | ||
92 | staging_libdir = '%s/usr/lib32' % staging_dir_target | ||
93 | if not os.path.isdir(staging_libdir): | ||
94 | staging_libdir = '%s/usr/lib' % staging_dir_target | ||
95 | |||
96 | return staging_libdir | ||
97 | |||
98 | @classmethod | ||
76 | def _get_bootloader_config(cls, bootloader, loader): | 99 | def _get_bootloader_config(cls, bootloader, loader): |
77 | custom_cfg = None | 100 | custom_cfg = None |
78 | 101 | ||
@@ -243,3 +266,147 @@ class BootimgPcbiosPlugin(SourcePlugin): | |||
243 | 266 | ||
244 | dd_cmd = "dd if=%s of=%s conv=notrunc" % (mbrfile, full_path) | 267 | dd_cmd = "dd if=%s of=%s conv=notrunc" % (mbrfile, full_path) |
245 | exec_cmd(dd_cmd, native_sysroot) | 268 | exec_cmd(dd_cmd, native_sysroot) |
269 | |||
270 | @classmethod | ||
271 | def _do_configure_grub(cls, part, creator, cr_workdir): | ||
272 | hdddir = "%s/hdd" % cr_workdir | ||
273 | bootloader = creator.ks.bootloader | ||
274 | |||
275 | grub_conf = cls._get_bootloader_config(bootloader, 'grub') | ||
276 | |||
277 | grub_prefix_path = get_bitbake_var('GRUB_PREFIX_PATH') | ||
278 | if not grub_prefix_path: | ||
279 | grub_prefix_path = '/boot/grub' | ||
280 | |||
281 | grub_path = "%s/%s" %(hdddir, grub_prefix_path) | ||
282 | install_cmd = "install -d %s" % grub_path | ||
283 | exec_cmd(install_cmd) | ||
284 | |||
285 | if not grub_conf: | ||
286 | # Set a default timeout if none specified to avoid | ||
287 | # 'None' being the value placed within the configuration | ||
288 | # file. | ||
289 | if not bootloader.timeout: | ||
290 | bootloader.timeout = 500 | ||
291 | |||
292 | # Set a default kernel params string if none specified | ||
293 | # to avoid 'None' being the value placed within the | ||
294 | # configuration file. | ||
295 | if not bootloader.append: | ||
296 | bootloader.append = "rootwait rootfstype=%s " % (part.fstype) | ||
297 | bootloader.append += "console=ttyS0,115200 console=tty0" | ||
298 | |||
299 | kernel = "/boot/" + get_bitbake_var("KERNEL_IMAGETYPE") | ||
300 | |||
301 | grub_conf = 'serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1\n' | ||
302 | grub_conf += 'set gfxmode=auto\n' | ||
303 | grub_conf += 'set gfxpayload=keep\n\n' | ||
304 | grub_conf += 'set default=0\n\n' | ||
305 | grub_conf += '# Boot automatically after %d secs.\n' % (bootloader.timeout) | ||
306 | grub_conf += 'set timeout=%d\n\n' % (bootloader.timeout) | ||
307 | grub_conf += 'menuentry \'default\' {\n' | ||
308 | grub_conf += '\tsearch --no-floppy --set=root --file %s\n' % (kernel) | ||
309 | grub_conf += '\tprobe --set partuuid --part-uuid ($root)\n' | ||
310 | grub_conf += '\tlinux %s root=PARTUUID=$partuuid %s\n}\n' % \ | ||
311 | (kernel, bootloader.append) | ||
312 | |||
313 | logger.debug("Writing grub config %s/grub.cfg", grub_path) | ||
314 | cfg = open("%s/grub.cfg" % grub_path, "w") | ||
315 | cfg.write(grub_conf) | ||
316 | cfg.close() | ||
317 | |||
318 | @classmethod | ||
319 | def _do_prepare_grub(cls, part, cr_workdir, oe_builddir, | ||
320 | kernel_dir, rootfs_dir, native_sysroot): | ||
321 | """ | ||
322 | 1. Generate embed.cfg that'll later be embedded into core.img. | ||
323 | So, that core.img knows where to search for grub.cfg. | ||
324 | 2. Generate core.img or grub stage 1.5. | ||
325 | 3. Copy modules into partition. | ||
326 | 4. Create partition rootfs file. | ||
327 | """ | ||
328 | |||
329 | hdddir = "%s/hdd" % cr_workdir | ||
330 | |||
331 | copy_types = [ '*.mod', '*.o', '*.lst' ] | ||
332 | |||
333 | builtin_modules = 'boot linux ext2 fat serial part_msdos part_gpt \ | ||
334 | normal multiboot probe biosdisk msdospart configfile search loadenv test' | ||
335 | |||
336 | staging_libdir = cls._get_staging_libdir() | ||
337 | |||
338 | grub_format = get_bitbake_var('GRUB_MKIMAGE_FORMAT_PC') | ||
339 | if not grub_format: | ||
340 | grub_format = 'i386-pc' | ||
341 | |||
342 | grub_prefix_path = get_bitbake_var('GRUB_PREFIX_PATH') | ||
343 | if not grub_prefix_path: | ||
344 | grub_prefix_path = '/boot/grub' | ||
345 | |||
346 | grub_path = "%s/%s" %(hdddir, grub_prefix_path) | ||
347 | core_img = '%s/grub-bios-core.img' % (kernel_dir) | ||
348 | grub_mods_path = '%s/grub/%s' % (staging_libdir, grub_format) | ||
349 | |||
350 | # Generate embedded grub config | ||
351 | embed_cfg_str = 'search.file %s/grub.cfg root\n' % (grub_prefix_path) | ||
352 | embed_cfg_str += 'set prefix=($root)%s\n' % (grub_prefix_path) | ||
353 | embed_cfg_str += 'configfile ($root)%s/grub.cfg\n' % (grub_prefix_path) | ||
354 | cfg = open('%s/embed.cfg' % (kernel_dir), 'w+') | ||
355 | cfg.write(embed_cfg_str) | ||
356 | cfg.close() | ||
357 | |||
358 | # core.img doesn't get included into boot partition | ||
359 | # it's later dd onto the resulting wic image. | ||
360 | grub_mkimage = 'grub-mkimage \ | ||
361 | --prefix=%s \ | ||
362 | --format=%s \ | ||
363 | --config=%s/embed.cfg \ | ||
364 | --directory=%s \ | ||
365 | --output=%s %s' % \ | ||
366 | (grub_prefix_path, grub_format, kernel_dir, | ||
367 | grub_mods_path, core_img, builtin_modules) | ||
368 | exec_native_cmd(grub_mkimage, native_sysroot) | ||
369 | |||
370 | # Copy grub modules | ||
371 | install_dir = '%s/%s/%s' % (hdddir, grub_prefix_path, grub_format) | ||
372 | os.makedirs(install_dir, exist_ok=True) | ||
373 | |||
374 | for ctype in copy_types: | ||
375 | files = glob('%s/grub/%s/%s' % \ | ||
376 | (staging_libdir, grub_format, ctype)) | ||
377 | for file in files: | ||
378 | shutil.copy2(file, install_dir, follow_symlinks=True) | ||
379 | |||
380 | # Create boot partition | ||
381 | logger.debug('Prepare partition using rootfs in %s', hdddir) | ||
382 | part.prepare_rootfs(cr_workdir, oe_builddir, hdddir, | ||
383 | native_sysroot, False) | ||
384 | |||
385 | @classmethod | ||
386 | def _do_install_grub(cls, creator, kernel_dir, | ||
387 | native_sysroot, full_path): | ||
388 | core_img = '%s/grub-bios-core.img' % (kernel_dir) | ||
389 | |||
390 | staging_libdir = cls._get_staging_libdir() | ||
391 | |||
392 | grub_format = get_bitbake_var('GRUB_MKIMAGE_FORMAT_PC') | ||
393 | if not grub_format: | ||
394 | grub_format = 'i386-pc' | ||
395 | |||
396 | boot_img = '%s/grub/%s/boot.img' % (staging_libdir, grub_format) | ||
397 | if not os.path.exists(boot_img): | ||
398 | raise WicError("Couldn't find %s. Did you include " | ||
399 | "do_image_wic[depends] += \"grub:do_populate_sysroot\" " | ||
400 | "in your image recipe" % boot_img) | ||
401 | |||
402 | # Install boot.img or grub stage 1 | ||
403 | dd_cmd = "dd if=%s of=%s conv=notrunc bs=1 seek=0 count=440" % (boot_img, full_path) | ||
404 | exec_cmd(dd_cmd, native_sysroot) | ||
405 | |||
406 | if creator.ptable_format == 'msdos': | ||
407 | # Install core.img or grub stage 1.5 | ||
408 | dd_cmd = "dd if=%s of=%s conv=notrunc bs=1 seek=512" % (core_img, full_path) | ||
409 | exec_cmd(dd_cmd, native_sysroot) | ||
410 | else: | ||
411 | raise WicError("Unsupported partition table: %s" % | ||
412 | creator.ptable_format) | ||