2
0
mirror of https://github.com/edk2-porting/linux-next.git synced 2024-12-25 05:34:00 +08:00
linux-next/arch/arm
Masahiro Yamada 3939f33450 ARM: 8418/1: add boot image dependencies to not generate invalid images
U-Boot is often used to boot the kernel on ARM boards, but uImage
is not built by "make all", so we are often inclined to do
"make all uImage" to generate DTBs, modules and uImage in a single
command, but we should notice a pitfall behind it.  In fact,
"make all uImage" could generate an invalid uImage if it is run with
the parallel option (-j).

You can reproduce this problem with the following procedure:

[1] First, build "all" and "uImage" separately.
    You will get a valid uImage

  $ git clean -f -x -d
  $ export CROSS_COMPILE=<your-tools-prefix>
  $ make -s -j8 ARCH=arm multi_v7_defconfig
  $ make -s -j8 ARCH=arm all
  $ make -j8 ARCH=arm UIMAGE_LOADADDR=0x80208000 uImage
    CHK     include/config/kernel.release
    CHK     include/generated/uapi/linux/version.h
    CHK     include/generated/utsrelease.h
  make[1]: `include/generated/mach-types.h' is up to date.
    CHK     include/generated/timeconst.h
    CHK     include/generated/bounds.h
    CHK     include/generated/asm-offsets.h
    CALL    scripts/checksyscalls.sh
    CHK     include/generated/compile.h
    Kernel: arch/arm/boot/Image is ready
    Kernel: arch/arm/boot/zImage is ready
    UIMAGE  arch/arm/boot/uImage
  Image Name:   Linux-4.2.0-rc5-00156-gdd2384a-d
  Created:      Sat Aug  8 23:21:35 2015
  Image Type:   ARM Linux Kernel Image (uncompressed)
  Data Size:    6138648 Bytes = 5994.77 kB = 5.85 MB
  Load Address: 80208000
  Entry Point:  80208000
    Image arch/arm/boot/uImage is ready
  $ ls -l arch/arm/boot/*Image
  -rwxrwxr-x 1 masahiro masahiro 13766656 Aug  8 23:20 arch/arm/boot/Image
  -rw-rw-r-- 1 masahiro masahiro  6138712 Aug  8 23:21 arch/arm/boot/uImage
  -rwxrwxr-x 1 masahiro masahiro  6138648 Aug  8 23:20 arch/arm/boot/zImage

[2] Update some source file(s)

  $ touch init/main.c

[3] Then, re-build "all" and "uImage" simultaneously.
    You will get an invalid uImage at random.

  $ make -j8 ARCH=arm UIMAGE_LOADADDR=0x80208000 all uImage
    CHK     include/config/kernel.release
    CHK     include/generated/uapi/linux/version.h
    CHK     include/generated/utsrelease.h
  make[1]: `include/generated/mach-types.h' is up to date.
    CHK     include/generated/timeconst.h
    CHK     include/generated/bounds.h
    CHK     include/generated/asm-offsets.h
    CALL    scripts/checksyscalls.sh
    CC      init/main.o
    CHK     include/generated/compile.h
    LD      init/built-in.o
    LINK    vmlinux
    LD      vmlinux.o
    MODPOST vmlinux.o
    GEN     .version
    CHK     include/generated/compile.h
    UPD     include/generated/compile.h
    CC      init/version.o
    LD      init/built-in.o
    KSYM    .tmp_kallsyms1.o
    KSYM    .tmp_kallsyms2.o
    LD      vmlinux
    SORTEX  vmlinux
    SYSMAP  System.map
    OBJCOPY arch/arm/boot/Image
    Building modules, stage 2.
    Kernel: arch/arm/boot/Image is ready
    GZIP    arch/arm/boot/compressed/piggy.gzip
    AS      arch/arm/boot/compressed/piggy.gzip.o
    Kernel: arch/arm/boot/Image is ready
    LD      arch/arm/boot/compressed/vmlinux
    GZIP    arch/arm/boot/compressed/piggy.gzip
    OBJCOPY arch/arm/boot/zImage
    Kernel: arch/arm/boot/zImage is ready
    UIMAGE  arch/arm/boot/uImage
  Image Name:   Linux-4.2.0-rc5-00156-gdd2384a-d
  Created:      Sat Aug  8 23:23:14 2015
  Image Type:   ARM Linux Kernel Image (uncompressed)
  Data Size:    26472 Bytes = 25.85 kB = 0.03 MB
  Load Address: 80208000
  Entry Point:  80208000
    Image arch/arm/boot/uImage is ready
    MODPOST 192 modules
    AS      arch/arm/boot/compressed/piggy.gzip.o
    LD      arch/arm/boot/compressed/vmlinux
    OBJCOPY arch/arm/boot/zImage
    Kernel: arch/arm/boot/zImage is ready
  $ ls -l arch/arm/boot/*Image
  -rwxrwxr-x 1 masahiro masahiro 13766656 Aug  8 23:23 arch/arm/boot/Image
  -rw-rw-r-- 1 masahiro masahiro    26536 Aug  8 23:23 arch/arm/boot/uImage
  -rwxrwxr-x 1 masahiro masahiro  6138648 Aug  8 23:23 arch/arm/boot/zImage

Please notice the uImage is extremely small when this issue is
encountered.  Besides, "Kernel: arch/arm/boot/zImage is ready" is
displayed twice, before and after the uImage log.

The root cause of this is the race condition between zImage and
uImage.  Actually, uImage depends on zImage, but the dependency
between the two is only described in arch/arm/boot/Makefile.
Because arch/arm/boot/Makefile is not included from the top-level
Makefile, it cannot know the dependency between zImage and uImage.

Consequently, when we run make with the parallel option, Kbuild
updates vmlinux first, and then two different threads descends into
the arch/arm/boot/Makefile almost at the same time, one for updating
zImage and the other for uImage.  While one thread is re-generating
zImage, the other also tries to update zImage before creating uImage
on top of that.  zImage is overwritten by the slower thread and then
uImage is created based on the half-written zImage.

This is the reason why "Kernel: arch/arm/boot/zImage is ready" is
displayed twice, and a broken uImage is created.

The same problem could happen on bootpImage.

This commit adds dependencies among Image, zImage, uImage, and
bootpImage to arch/arm/Makefile, which is included from the
top-level Makefile.

Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
2015-08-18 13:59:59 +01:00
..
boot Minor fixes for omaps against v4.2-rc1. Mostly just minor dts changes 2015-07-09 15:38:16 -07:00
common TTY/Serial driver patches for 4.2-rc1 2015-06-26 15:53:22 -07:00
configs Allwinner late changes for 4.2 2015-07-09 15:08:44 -07:00
crypto
firmware
include ARM: fix __virt_to_idmap build error on !MMU 2015-07-17 15:08:40 +01:00
kernel ARM: 8410/1: VDSO: fix coarse clock monotonicity regression 2015-08-11 13:42:44 +01:00
kvm Merge branch 'for-linus' of git://ftp.arm.linux.org.uk/~rmk/linux-arm 2015-06-26 12:20:00 -07:00
lib ARM: 8414/1: __copy_to_user_memcpy: fix mmap semaphore usage 2015-08-18 13:59:59 +01:00
mach-alpine
mach-asm9260
mach-at91 genalloc: rename dev_get_gen_pool() to gen_pool_get() 2015-06-30 19:45:01 -07:00
mach-axxia
mach-bcm ARM: BCM: Do not select CONFIG_MTD_NAND_BRCMNAND 2015-07-01 13:04:13 -07:00
mach-berlin ARM: SoC: driver updates for v4.2 2015-06-26 11:54:29 -07:00
mach-clps711x
mach-cns3xxx
mach-davinci ARM: SoC cleanups for v4.2 2015-06-26 11:08:27 -07:00
mach-digicolor
mach-dove ARM: dove: fix legacy dove IRQ numbers 2015-06-24 11:05:57 +02:00
mach-ebsa110
mach-efm32
mach-ep93xx ARM: ep93xx: simone: support for SPI-based MMC/SD cards 2015-06-11 14:21:29 -07:00
mach-exynos The changes to the common clock framework for 4.2 are dominated by new 2015-07-01 19:22:00 -07:00
mach-footbridge
mach-gemini ARM: gemini: Fix race in installing GPIO chained IRQ handler 2015-06-18 14:03:08 +02:00
mach-highbank
mach-hisi arm/mach-hisi: remove legacy __CPUINIT section that crept in 2015-06-16 14:12:21 -04:00
mach-imx genalloc: rename dev_get_gen_pool() to gen_pool_get() 2015-06-30 19:45:01 -07:00
mach-integrator ARM: 8365/1: introduce sp804_timer_disable and remove arm_timer.h inclusion 2015-06-02 09:58:18 +01:00
mach-iop13xx
mach-iop32x
mach-iop33x
mach-ixp4xx
mach-keystone Merge branch 'for-linus' of git://ftp.arm.linux.org.uk/~rmk/linux-arm 2015-06-26 12:20:00 -07:00
mach-ks8695
mach-lpc18xx ARM: lpc18xx: add basic support for NXP LPC18xx/43xx SoCs 2015-05-15 21:43:56 +02:00
mach-lpc32xx Merge branch 'irq-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip 2015-07-01 15:19:35 -07:00
mach-mediatek
mach-meson
mach-mmp
mach-moxart
mach-mv78xx0
mach-mvebu ARM: SoC: late fixes and dependencies 2015-07-02 14:40:49 -07:00
mach-mxs
mach-netx
mach-nomadik
mach-nspire ARM: 8366/1: move Dual-Timer SP804 driver to drivers/clocksource 2015-06-02 09:58:18 +01:00
mach-omap1 ARM: SoC: platform support for v4.2 2015-06-26 11:34:35 -07:00
mach-omap2 Merge branch 'fixes-rc1' into omap-for-v4.2/fixes 2015-07-06 05:33:17 -07:00
mach-orion5x
mach-picoxcell
mach-prima2 move CSR rtc iobrg read/write API to be regmap 2015-07-08 14:20:12 -07:00
mach-pxa ARM: SoC: platform support for v4.2 2015-06-26 11:34:35 -07:00
mach-qcom
mach-realview ARM: 8366/1: move Dual-Timer SP804 driver to drivers/clocksource 2015-06-02 09:58:18 +01:00
mach-rockchip Remove __cpuinit macros and users. 2015-07-02 09:54:14 -07:00
mach-rpc
mach-s3c24xx
mach-s3c64xx
mach-s5pv210
mach-sa1100 Merge branch 'for-linus' of git://ftp.arm.linux.org.uk/~rmk/linux-arm 2015-06-26 12:20:00 -07:00
mach-shmobile ARM: SoC: platform support for v4.2 2015-06-26 11:34:35 -07:00
mach-socfpga genalloc: rename dev_get_gen_pool() to gen_pool_get() 2015-06-30 19:45:01 -07:00
mach-spear
mach-sti
mach-stm32 ARM: Add STM32 family machine 2015-05-15 21:43:23 +02:00
mach-sunxi Allwinner late changes for 4.2 2015-07-09 15:08:44 -07:00
mach-tegra ARM: SoC: platform support for v4.2 2015-06-26 11:34:35 -07:00
mach-u300
mach-uniphier ARM: uniphier: only select TWD for SMP 2015-05-20 17:21:30 +02:00
mach-ux500 ARM: ux500: delete static resource defines 2015-05-18 15:08:15 +02:00
mach-versatile ARM: 8366/1: move Dual-Timer SP804 driver to drivers/clocksource 2015-06-02 09:58:18 +01:00
mach-vexpress arm: don't use module_init in non-modular mach-vexpress/spc.c code 2015-06-16 14:12:29 -04:00
mach-vt8500
mach-w90x900
mach-zx ARM: zx: fix building with CONFIG_THUMB2_KERNEL 2015-05-22 16:45:54 +02:00
mach-zynq ARM: SoC: platform support for v4.2 2015-06-26 11:34:35 -07:00
mm ARM: invalidate L1 before enabling coherency 2015-07-17 15:08:40 +01:00
net
nwfpe
oprofile
plat-iop
plat-omap ARM: OMAP1: Change interrupt numbering for sparse IRQ 2015-05-20 09:01:21 -07:00
plat-orion
plat-pxa
plat-samsung ARM: SAMSUNG: Constify platform_device_id 2015-06-06 02:18:02 +09:00
plat-versatile
probes
tools
vdso ARM: 8405/1: VDSO: fix regression with toolchains lacking ld.bfd executable 2015-07-31 18:54:45 +01:00
vfp ARM: vfp: Add vfp_disable for problematic platforms 2015-05-20 15:07:00 -07:00
xen xen: Include xen/page.h rather than asm/xen/page.h 2015-06-17 16:14:18 +01:00
Kconfig Merge branches 'fixes' and 'ioremap' into for-linus 2015-07-07 12:35:33 +01:00
Kconfig-nommu
Kconfig.debug Merge branches 'fixes' and 'ioremap' into for-linus 2015-07-07 12:35:33 +01:00
Makefile ARM: 8418/1: add boot image dependencies to not generate invalid images 2015-08-18 13:59:59 +01:00