diff options
author | Sylvain Chouleur <sylvain.chouleur@intel.com> | 2015-02-27 13:59:16 +0100 |
---|---|---|
committer | Heather Lee Wilson <hwilson@google.com> | 2015-04-09 12:09:25 -0700 |
commit | 88c2e83d0651d76a288ca54280f6d2b0a8e7b9cf (patch) | |
tree | 9bc6e26d36d73571bf8e7330ef3f0c1a00834635 | |
parent | f35042d850c2a056c937a1140a6462dd6411279b (diff) | |
download | bootstub-88c2e83d0651d76a288ca54280f6d2b0a8e7b9cf.tar.gz |
Factorize bootstub makefile
Bug: 19708986
This patch aims to remove the huge code duplications in Android.mk and
also add a new kind of bootstub target: ramdump, which is used to boot a
post-crash OS with different memory constraints.
Change-Id: I962b48290994b75a44eb2e47487e1c1a8293f4df
Signed-off-by: Sylvain Chouleur <sylvain.chouleur@intel.com>
-rw-r--r-- | 2ndbootloader.lds | 2 | ||||
-rw-r--r-- | Android.mk | 119 | ||||
-rw-r--r-- | bootimg.h | 96 | ||||
-rw-r--r-- | bootstub.c | 27 | ||||
-rw-r--r-- | bootstub.h | 5 | ||||
-rw-r--r-- | bootstub.lds | 37 | ||||
-rw-r--r-- | bootstub.mk | 60 |
7 files changed, 100 insertions, 246 deletions
diff --git a/2ndbootloader.lds b/2ndbootloader.lds index 547692d..5189d98 100644 --- a/2ndbootloader.lds +++ b/2ndbootloader.lds @@ -3,7 +3,7 @@ OUTPUT_ARCH(i386) ENTRY(_start) SECTIONS { - . = 0x10F00000; /* bootstub entry in DRAM */ + . = BOOTSTUB_ENTRY; /* bootstub entry in DRAM */ .text.head : { _head = . ; *(.text.head) @@ -1,107 +1,28 @@ LOCAL_PATH := $(call my-dir) -ifeq ($(TARGET_BOARD_PLATFORM),moorefield) - -CMDLINE_SIZE ?= 0x400 -BOOTSTUB_SIZE ?= 8192 - -BOOTSTUB_SRC_FILES := bootstub.c sfi.c ssp-uart.c imr_toc.c spi-uart.c -BOOTSTUB_SRC_FILES_x86 := head.S e820_bios.S - include $(CLEAR_VARS) - # bootstub.bin -LOCAL_SRC_FILES := $(BOOTSTUB_SRC_FILES) -LOCAL_SRC_FILES_x86 := $(BOOTSTUB_SRC_FILES_x86) -ANDROID_TOOLCHAIN_FLAGS := -m32 -ffreestanding -LOCAL_CFLAGS := $(ANDROID_TOOLCHAIN_FLAGS) -Wall -O1 -DCMDLINE_SIZE=${CMDLINE_SIZE} -LOCAL_MODULE := bootstub.bin -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_PATH := $(PRODUCT_OUT) -LOCAL_MODULE_CLASS := EXECUTABLES -LOCAL_FORCE_STATIC_EXECUTABLE := true - - -include $(BUILD_SYSTEM)/binary.mk - -$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_TARGET_GLOBAL_CFLAGS := $(LOCAL_CFLAGS) -$(LOCAL_BUILT_MODULE) : PRIVATE_ELF_FILE := $(intermediates)/$(PRIVATE_MODULE).elf -$(LOCAL_BUILT_MODULE) : PRIVATE_LINK_SCRIPT := $(LOCAL_PATH)/bootstub.lds -$(LOCAL_BUILT_MODULE) : BOOTSTUB_OBJS := $(patsubst %.c, %.o , $(LOCAL_SRC_FILES)) -$(LOCAL_BUILT_MODULE) : BOOTSTUB_OBJS += $(patsubst %.S, %.o , $(LOCAL_SRC_FILES_x86)) -$(LOCAL_BUILT_MODULE) : BOOTSTUB_OBJS := $(addprefix $(intermediates)/, $(BOOTSTUB_OBJS)) - -$(LOCAL_BUILT_MODULE): $(all_objects) - @$(mkdir -p $(dir $@) - @echo "Generating bootstub.bin: $@" - $(hide) $(TARGET_LD) \ - -m elf_i386 \ - -T $(PRIVATE_LINK_SCRIPT) \ - $(BOOTSTUB_OBJS) \ - -o $(PRIVATE_ELF_FILE) - $(hide) $(TARGET_OBJCOPY) -O binary -R .note -R .comment -S $(PRIVATE_ELF_FILE) $@ - -# Then assemble the final bootstub file -bootstub_bin := $(PRODUCT_OUT)/bootstub.bin -bootstub_full := $(PRODUCT_OUT)/bootstub - -CHECK_BOOTSTUB_SIZE : $(bootstub_bin) - $(hide) ACTUAL_SIZE=`$(call get-file-size,$(bootstub_bin))`; \ - if [ "$$ACTUAL_SIZE" -gt "$(BOOTSTUB_SIZE)" ]; then \ - echo "$(bootstub_bin): $$ACTUAL_SIZE exceeds size limit of $(BOOTSTUB_SIZE) bytes, aborting."; \ - exit 1; \ - fi +BOOTSTUB_BINARY := bootstub +BOOTSTUB_AOSP_HEADER_ADDRESS := 0x10007800 +BOOTSTUB_CFLAGS := +BOOTSTUB_STACK_OFFSET := 0X10F00000 +BOOTSTUB_ENTRY := 0x1101000 +include $(LOCAL_PATH)/bootstub.mk -$(bootstub_full) : CHECK_BOOTSTUB_SIZE - @echo "Generating bootstub: $@" - $(hide) cat $(bootstub_bin) /dev/zero | dd bs=$(BOOTSTUB_SIZE) count=1 > $@ - -# build specific bootstub for GPT/AOSP image support include $(CLEAR_VARS) - # 2ndbootloader.bin -LOCAL_SRC_FILES := $(BOOTSTUB_SRC_FILES) -LOCAL_SRC_FILES_x86 := $(BOOTSTUB_SRC_FILES_x86) -ANDROID_TOOLCHAIN_FLAGS := -m32 -ffreestanding -LOCAL_CFLAGS := $(ANDROID_TOOLCHAIN_FLAGS) -Wall -O1 -DCMDLINE_SIZE=${CMDLINE_SIZE} -DBUILD_RAMDUMP -LOCAL_MODULE := 2ndbootloader.bin -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_PATH := $(PRODUCT_OUT) -LOCAL_MODULE_CLASS := EXECUTABLES -LOCAL_FORCE_STATIC_EXECUTABLE := true - -include $(BUILD_SYSTEM)/binary.mk - -$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_TARGET_GLOBAL_CFLAGS := $(LOCAL_CFLAGS) -$(LOCAL_BUILT_MODULE) : PRIVATE_ELF_FILE := $(intermediates)/$(PRIVATE_MODULE).elf -$(LOCAL_BUILT_MODULE) : PRIVATE_LINK_SCRIPT := $(LOCAL_PATH)/2ndbootloader.lds -$(LOCAL_BUILT_MODULE) : BOOTSTUB_OBJS := $(patsubst %.c, %.o , $(LOCAL_SRC_FILES)) -$(LOCAL_BUILT_MODULE) : BOOTSTUB_OBJS += $(patsubst %.S, %.o , $(LOCAL_SRC_FILES_x86)) -$(LOCAL_BUILT_MODULE) : BOOTSTUB_OBJS := $(addprefix $(intermediates)/, $(BOOTSTUB_OBJS)) - -$(LOCAL_BUILT_MODULE): $(all_objects) - @$(mkdir -p $(dir $@) - @echo "Generating bootstub $@" - $(hide) $(TARGET_LD) \ - -m elf_i386 \ - -T $(PRIVATE_LINK_SCRIPT) \ - $(BOOTSTUB_OBJS) \ - -o $(PRIVATE_ELF_FILE) - $(hide) $(TARGET_OBJCOPY) -O binary -R .note -R .comment -S $(PRIVATE_ELF_FILE) $@ +BOOTSTUB_BINARY := 2ndbootloader +BOOTSTUB_AOSP_HEADER_ADDRESS := 0x10007800 +BOOTSTUB_CFLAGS := +BOOTSTUB_STACK_OFFSET := 0x10F00000 +BOOTSTUB_ENTRY := 0x10F00000 +include $(LOCAL_PATH)/bootstub.mk -# Then assemble the final 2ndbootloader file -bootstub_aosp_bin := $(PRODUCT_OUT)/2ndbootloader.bin -bootstub_aosp_full := $(PRODUCT_OUT)/2ndbootloader - -CHECK_BOOTSTUB_AOSP_SIZE : $(bootstub_aosp_bin) - $(hide) ACTUAL_SIZE=`$(call get-file-size,$(bootstub_aosp_bin))`; \ - if [ "$$ACTUAL_SIZE" -gt "$(BOOTSTUB_SIZE)" ]; then \ - echo "$(bootstub_aosp_bin): $$ACTUAL_SIZE exceeds size limit of $(BOOTSTUB_SIZE) bytes, aborting."; \ - exit 1; \ - fi - -$(bootstub_aosp_full) : CHECK_BOOTSTUB_AOSP_SIZE - @echo "Generating bootstub $@" - $(hide) cat $(bootstub_aosp_bin) /dev/zero | dd bs=$(BOOTSTUB_SIZE) count=1 > $@ - -endif #($(TARGET_BOARD_PLATFORM),moorefield) +include $(CLEAR_VARS) +# bootstub_ramdump.bin +BOOTSTUB_BINARY := bootstub_ramdump +BOOTSTUB_AOSP_HEADER_ADDRESS := 0x79000000 +BOOTSTUB_CFLAGS := -DBUILD_RAMDUMP +BOOTSTUB_STACK_OFFSET := 0x78F00000 +BOOTSTUB_ENTRY := 0x78F00000 +include $(LOCAL_PATH)/bootstub.mk diff --git a/bootimg.h b/bootimg.h deleted file mode 100644 index 4c5d00c..0000000 --- a/bootimg.h +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright (C) 2008 The Android Open Source Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef _BOOT_IMAGE_H_ -#define _BOOT_IMAGE_H_ - -typedef struct boot_img_hdr boot_img_hdr; - -#define BOOT_MAGIC "ANDROID!" -#define BOOT_MAGIC_SIZE 8 -#define BOOT_NAME_SIZE 16 -#define BOOT_ARGS_SIZE 512 - -struct boot_img_hdr -{ - unsigned char magic[BOOT_MAGIC_SIZE]; - - unsigned kernel_size; /* size in bytes */ - unsigned kernel_addr; /* physical load addr */ - - unsigned ramdisk_size; /* size in bytes */ - unsigned ramdisk_addr; /* physical load addr */ - - unsigned second_size; /* size in bytes */ - unsigned second_addr; /* physical load addr */ - - unsigned tags_addr; /* physical addr for kernel tags */ - unsigned page_size; /* flash page size we assume */ - unsigned unused[2]; /* future expansion: should be 0 */ - - unsigned char name[BOOT_NAME_SIZE]; /* asciiz product name */ - unsigned char cmdline[BOOT_ARGS_SIZE]; - - unsigned id[8]; /* timestamp / checksum / sha1 / etc */ -}; - -/* -** +-----------------+ -** | boot header | 1 page -** +-----------------+ -** | kernel | n pages -** +-----------------+ -** | ramdisk | m pages -** +-----------------+ -** | second stage | o pages -** +-----------------+ -** -** n = (kernel_size + page_size - 1) / page_size -** m = (ramdisk_size + page_size - 1) / page_size -** o = (second_size + page_size - 1) / page_size -** -** 0. all entities are page_size aligned in flash -** 1. kernel and ramdisk are required (size != 0) -** 2. second is optional (second_size == 0 -> no second) -** 3. load each element (kernel, ramdisk, second) at -** the specified physical address (kernel_addr, etc) -** 4. prepare tags at tag_addr. kernel_args[] is -** appended to the kernel commandline in the tags. -** 5. r0 = 0, r1 = MACHINE_TYPE, r2 = tags_addr -** 6. if second_size != 0: jump to second_addr -** else: jump to kernel_addr -*/ - -boot_img_hdr *mkbootimg(void *kernel, unsigned kernel_size, - void *ramdisk, unsigned ramdisk_size, - void *second, unsigned second_size, - unsigned page_size, - unsigned *bootimg_size); - -void bootimg_set_cmdline(boot_img_hdr *hdr, const char *cmdline); -#endif @@ -1,5 +1,5 @@ /* - * bootstub 32 bit entry setting routings + * bootstub 32 bit entry setting routings * * Copyright (C) 2008-2010 Intel Corporation. * Author: Alek Du <alek.du@intel.com> @@ -14,7 +14,7 @@ * more details. * * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., + * this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. * */ @@ -26,7 +26,7 @@ #include "ssp-uart.h" #include "mb.h" #include "sfi.h" -#include "bootimg.h" +#include <bootimg.h> #include <stdint.h> #include <stddef.h> @@ -84,14 +84,14 @@ static void *memset(void *s, unsigned char c, size_t count) char *xs = s; size_t _count = count / 4; unsigned long _c = c << 24 | c << 16 | c << 8 | c; - + while (_count--) { *(long *)xs = _c; xs += 4; } count %= 4; while (count--) - *xs++ = c; + *xs++ = c; return s; } @@ -150,19 +150,21 @@ static u32 bzImage_setup(struct boot_params *bp, struct setup_header *sh) { void *cmdline = (void *)BOOT_CMDLINE_OFFSET; struct boot_img_hdr *aosp = (struct boot_img_hdr *)AOSP_HEADER_ADDRESS; - size_t cmdline_len; + size_t cmdline_len, extra_cmdline_len; u8 *initramfs, *ptr; if (is_image_aosp(aosp->magic)) { ptr = (u8*)aosp->kernel_addr; cmdline_len = strnlen((const char *)aosp->cmdline, sizeof(aosp->cmdline)); + extra_cmdline_len = strnlen((const char *)aosp->extra_cmdline, sizeof(aosp->extra_cmdline)); /* - * Copy the command line to be after bootparams so that it won't be - * overwritten by the kernel executable. + * Copy the command + extra command line to be after bootparams + * so that it won't be overwritten by the kernel executable. */ - memset(cmdline, 0, sizeof(aosp->cmdline)); + memset(cmdline, 0, sizeof(aosp->cmdline) + sizeof(aosp->extra_cmdline)); memcpy(cmdline, (const void *)aosp->cmdline, cmdline_len); + memcpy(cmdline + cmdline_len, (const void *)aosp->extra_cmdline, extra_cmdline_len); bp->hdr.ramdisk_size = aosp->ramdisk_size; @@ -184,6 +186,7 @@ static u32 bzImage_setup(struct boot_params *bp, struct setup_header *sh) bp->hdr.cmd_line_ptr = BOOT_CMDLINE_OFFSET; bp->hdr.cmdline_size = cmdline_len; +#ifndef BUILD_RAMDUMP bp->hdr.ramdisk_image = (bp->alt_mem_k*1024 - bp->hdr.ramdisk_size) & 0xFFFFF000; if (*initramfs) { @@ -192,6 +195,9 @@ static u32 bzImage_setup(struct boot_params *bp, struct setup_header *sh) } else { bs_printk("Won't relocate initramfs, are you in SLE?\n"); } +#else + bp->hdr.ramdisk_image = (u32) initramfs; +#endif while (1){ if (*(u32 *)ptr == SETUP_SIGNATURE && *(u32 *)(ptr+4) == 0) @@ -468,7 +474,8 @@ int bootstub(void) int nr_entries; if (is_image_aosp(aosp->magic)) { - sh = (struct setup_header *)((unsigned int)aosp->kernel_addr + 0x1F1); + sh = (struct setup_header *)((unsigned int)aosp->kernel_addr + \ + (unsigned int)offsetof(struct boot_params,hdr)); /* disable the bs_printk through SPI/UART */ *(int *)SPI_UART_SUPPRESSION = 1; *(int *)SPI_TYPE = SPI_2; @@ -1,4 +1,4 @@ -/* define bootstub constrains here, like memory map etc. +/* define bootstub constrains here, like memory map etc. */ #ifndef _BOOT_STUB_HEAD @@ -25,7 +25,6 @@ #define BZIMAGE_SIZE_OFFSET (CMDLINE_OFFSET + CMDLINE_SIZE) #define INITRD_SIZE_OFFSET (BZIMAGE_SIZE_OFFSET + 4) #define SPI_UART_SUPPRESSION (INITRD_SIZE_OFFSET + 4) -#define AOSP_HEADER_ADDRESS 0x10007800 #define SPI_TYPE (SPI_UART_SUPPRESSION + 4) /*0:SPI0 1:SPI1*/ #define SPI_0 0 @@ -39,7 +38,7 @@ #define XEN_SIZE_OFFSET (SEC_PLAT_SVCS_SIZE_OFFSET + 4) #define BOOTSTUB_OFFSET (BASE_ADDRESS + 0x1000) -#define STACK_OFFSET 0x10f00000 + #define BZIMAGE_OFFSET (BASE_ADDRESS + 0x3000) #define SETUP_HEADER_OFFSET (BZIMAGE_OFFSET + 0x1F1) diff --git a/bootstub.lds b/bootstub.lds deleted file mode 100644 index 80c8771..0000000 --- a/bootstub.lds +++ /dev/null @@ -1,37 +0,0 @@ -OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386")
-OUTPUT_ARCH(i386)
-ENTRY(_start)
-SECTIONS
-{
- . = 0x1101000; /* bootstub entry in DRAM */
- .text.head : {
- _head = . ;
- *(.text.head)
- _ehead = . ;
- }
- .text : {
- _text = .; /* Text */
- *(.text)
- *(.text.*)
- _etext = . ;
- }
- .rodata : {
- _rodata = . ;
- *(.rodata) /* read-only data */
- *(.rodata.*)
- _erodata = . ;
- }
- .data : {
- _data = . ;
- *(.data)
- *(.data.*)
- _edata = . ;
- }
- .bss : {
- _bss = . ;
- *(.bss)
- *(.bss.*)
- *(COMMON)
- _end = . ;
- }
-}
diff --git a/bootstub.mk b/bootstub.mk new file mode 100644 index 0000000..56adcfe --- /dev/null +++ b/bootstub.mk @@ -0,0 +1,60 @@ +CMDLINE_SIZE ?= 0x400 +BOOTSTUB_SIZE ?= 8192 + +BOOTSTUB_SRC_FILES := bootstub.c sfi.c ssp-uart.c imr_toc.c spi-uart.c +BOOTSTUB_SRC_FILES_x86 := head.S e820_bios.S + +ifeq ($(TARGET_IS_64_BIT),true) +BOOTSTUB_2ND_ARCH_VAR_PREFIX := $(TARGET_2ND_ARCH_VAR_PREFIX) +else +BOOTSTUB_2ND_ARCH_VAR_PREFIX := +endif + +LOCAL_SRC_FILES := $(BOOTSTUB_SRC_FILES) +LOCAL_SRC_FILES_x86 := $(BOOTSTUB_SRC_FILES_x86) +ANDROID_TOOLCHAIN_FLAGS := -m32 -ffreestanding +LOCAL_CFLAGS := $(ANDROID_TOOLCHAIN_FLAGS) -Wall -O1 -DCMDLINE_SIZE=${CMDLINE_SIZE} -DAOSP_HEADER_ADDRESS=$(BOOTSTUB_AOSP_HEADER_ADDRESS) $(BOOTSTUB_CFLAGS) +LOCAL_ASFLAGS := -DSTACK_OFFSET=$(BOOTSTUB_STACK_OFFSET) +LOCAL_C_INCLUDES = system/core/mkbootimg +LOCAL_MODULE := $(BOOTSTUB_BINARY).bin +LOCAL_MODULE_TAGS := optional +LOCAL_MULTILIB := 32 +LOCAL_MODULE_PATH := $(PRODUCT_OUT) +LOCAL_MODULE_CLASS := EXECUTABLES +LOCAL_FORCE_STATIC_EXECUTABLE := true +LOCAL_2ND_ARCH_VAR_PREFIX := $(BOOTSTUB_2ND_ARCH_VAR_PREFIX) + +include $(BUILD_SYSTEM)/binary.mk + +$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_TARGET_GLOBAL_CFLAGS := $(LOCAL_CFLAGS) +$(LOCAL_BUILT_MODULE) : PRIVATE_ELF_FILE := $(intermediates)/$(PRIVATE_MODULE).elf +$(LOCAL_BUILT_MODULE) : PRIVATE_LINK_SCRIPT := $(LOCAL_PATH)/2ndbootloader.lds +$(LOCAL_BUILT_MODULE) : BOOTSTUB_OBJS := $(patsubst %.c, %.o , $(LOCAL_SRC_FILES)) +$(LOCAL_BUILT_MODULE) : BOOTSTUB_OBJS += $(patsubst %.S, %.o , $(LOCAL_SRC_FILES_x86)) +$(LOCAL_BUILT_MODULE) : BOOTSTUB_OBJS := $(addprefix $(intermediates)/, $(BOOTSTUB_OBJS)) +$(LOCAL_BUILT_MODULE) : BOOTSTUB_ENTRY := $(BOOTSTUB_ENTRY) + +$(LOCAL_BUILT_MODULE): $(all_objects) + $(hide) mkdir -p $(dir $@) + @echo "Generating bootstub.bin: $@" + $(hide) $(TARGET_LD) \ + -m elf_i386 \ + -T $(PRIVATE_LINK_SCRIPT) --defsym=BOOTSTUB_ENTRY=$(BOOTSTUB_ENTRY) \ + $(BOOTSTUB_OBJS) \ + -o $(PRIVATE_ELF_FILE) + $(hide) $(TARGET_OBJCOPY) -O binary -R .note -R .comment -S $(PRIVATE_ELF_FILE) $@ + +# Then assemble the final bootstub file + +bootstub_full := $(PRODUCT_OUT)/$(BOOTSTUB_BINARY) +$(BOOTSTUB_BINARY)_CHECK_BOOTSTUB_SIZE : $(LOCAL_BUILT_MODULE) + $(hide) ACTUAL_SIZE=`$(call get-file-size,$<)`; \ + if [ "$$ACTUAL_SIZE" -gt "$(BOOTSTUB_SIZE)" ]; then \ + echo "$<: $$ACTUAL_SIZE exceeds size limit of $(BOOTSTUB_SIZE) bytes, aborting."; \ + exit 1; \ + fi + +$(bootstub_full) : $(LOCAL_BUILT_MODULE) $(BOOTSTUB_BINARY)_CHECK_BOOTSTUB_SIZE + @echo "Generating bootstub: $@" + $(hide) cat $< /dev/zero | dd bs=$(BOOTSTUB_SIZE) count=1 > $@ + |