Loading arch/arm/Kconfig +11 −9 Original line number Diff line number Diff line Loading @@ -240,15 +240,6 @@ config NEED_RET_TO_USER config ARCH_MTD_XIP bool config VECTORS_BASE hex default 0xffff0000 if MMU || CPU_HIGH_VECTOR default DRAM_BASE if REMAP_VECTORS_TO_RAM default 0x00000000 help The base address of exception vectors. This must be two pages in size. config ARM_PATCH_PHYS_VIRT bool "Patch physical to virtual translations at runtime" if EMBEDDED default y Loading Loading @@ -2006,6 +1997,17 @@ config XIP_PHYS_ADDR be linked for and stored to. This address is dependent on your own flash usage. config XIP_DEFLATED_DATA bool "Store kernel .data section compressed in ROM" depends on XIP_KERNEL select ZLIB_INFLATE help Before the kernel is actually executed, its .data section has to be copied to RAM from ROM. This option allows for storing that data in compressed form and decompressed to RAM rather than merely being copied, saving some precious ROM space. A possible drawback is a slightly longer boot delay. config KEXEC bool "Kexec system call (EXPERIMENTAL)" depends on (!SMP || PM_SLEEP_SMP) Loading arch/arm/Kconfig-nommu +2 −2 Original line number Diff line number Diff line Loading @@ -52,8 +52,8 @@ config REMAP_VECTORS_TO_RAM config ARM_MPU bool 'Use the ARM v7 PMSA Compliant MPU' depends on CPU_V7 default y depends on CPU_V7 || CPU_V7M default y if CPU_V7 help Some ARM systems without an MMU have instead a Memory Protection Unit (MPU) that defines the type and permissions for regions of Loading arch/arm/boot/Makefile +12 −1 Original line number Diff line number Diff line Loading @@ -31,8 +31,19 @@ targets := Image zImage xipImage bootpImage uImage ifeq ($(CONFIG_XIP_KERNEL),y) cmd_deflate_xip_data = $(CONFIG_SHELL) -c \ '$(srctree)/$(src)/deflate_xip_data.sh $< $@ || { rm -f $@; false; }' ifeq ($(CONFIG_XIP_DEFLATED_DATA),y) quiet_cmd_mkxip = XIPZ $@ cmd_mkxip = $(cmd_objcopy) && $(cmd_deflate_xip_data) else quiet_cmd_mkxip = $(quiet_cmd_objcopy) cmd_mkxip = $(cmd_objcopy) endif $(obj)/xipImage: vmlinux FORCE $(call if_changed,objcopy) $(call if_changed,mkxip) @$(kecho) ' Physical Address of xipImage: $(CONFIG_XIP_PHYS_ADDR)' $(obj)/Image $(obj)/zImage: FORCE Loading arch/arm/boot/deflate_xip_data.sh 0 → 100755 +64 −0 Original line number Diff line number Diff line #!/bin/sh # XIP kernel .data segment compressor # # Created by: Nicolas Pitre, August 2017 # Copyright: (C) 2017 Linaro Limited # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation. # This script locates the start of the .data section in xipImage and # substitutes it with a compressed version. The needed offsets are obtained # from symbol addresses in vmlinux. It is expected that .data extends to # the end of xipImage. set -e VMLINUX="$1" XIPIMAGE="$2" DD="dd status=none" # Use "make V=1" to debug this script. case "$KBUILD_VERBOSE" in *1*) set -x ;; esac sym_val() { # extract hex value for symbol in $1 local val=$($NM "$VMLINUX" | sed -n "/ $1$/{s/ .*$//p;q}") [ "$val" ] || { echo "can't find $1 in $VMLINUX" 1>&2; exit 1; } # convert from hex to decimal echo $((0x$val)) } __data_loc=$(sym_val __data_loc) _edata_loc=$(sym_val _edata_loc) base_offset=$(sym_val _xiprom) # convert to file based offsets data_start=$(($__data_loc - $base_offset)) data_end=$(($_edata_loc - $base_offset)) # Make sure data occupies the last part of the file. file_end=$(stat -c "%s" "$XIPIMAGE") if [ "$file_end" != "$data_end" ]; then printf "end of xipImage doesn't match with _edata_loc (%#x vs %#x)\n" \ $(($file_end + $base_offset)) $_edata_loc 2>&1 exit 1; fi # be ready to clean up trap 'rm -f "$XIPIMAGE.tmp"' 0 1 2 3 # substitute the data section by a compressed version $DD if="$XIPIMAGE" count=$data_start iflag=count_bytes of="$XIPIMAGE.tmp" $DD if="$XIPIMAGE" skip=$data_start iflag=skip_bytes | gzip -9 >> "$XIPIMAGE.tmp" # replace kernel binary mv -f "$XIPIMAGE.tmp" "$XIPIMAGE" arch/arm/include/asm/cputype.h +10 −0 Original line number Diff line number Diff line Loading @@ -173,6 +173,11 @@ static inline unsigned int __attribute_const__ read_cpuid_cachetype(void) return read_cpuid(CPUID_CACHETYPE); } static inline unsigned int __attribute_const__ read_cpuid_mputype(void) { return read_cpuid(CPUID_MPUIR); } #elif defined(CONFIG_CPU_V7M) static inline unsigned int __attribute_const__ read_cpuid_id(void) Loading @@ -185,6 +190,11 @@ static inline unsigned int __attribute_const__ read_cpuid_cachetype(void) return readl(BASEADDR_V7M_SCB + V7M_SCB_CTR); } static inline unsigned int __attribute_const__ read_cpuid_mputype(void) { return readl(BASEADDR_V7M_SCB + MPU_TYPE); } #else /* ifdef CONFIG_CPU_CP15 / elif defined(CONFIG_CPU_V7M) */ static inline unsigned int __attribute_const__ read_cpuid_id(void) Loading Loading
arch/arm/Kconfig +11 −9 Original line number Diff line number Diff line Loading @@ -240,15 +240,6 @@ config NEED_RET_TO_USER config ARCH_MTD_XIP bool config VECTORS_BASE hex default 0xffff0000 if MMU || CPU_HIGH_VECTOR default DRAM_BASE if REMAP_VECTORS_TO_RAM default 0x00000000 help The base address of exception vectors. This must be two pages in size. config ARM_PATCH_PHYS_VIRT bool "Patch physical to virtual translations at runtime" if EMBEDDED default y Loading Loading @@ -2006,6 +1997,17 @@ config XIP_PHYS_ADDR be linked for and stored to. This address is dependent on your own flash usage. config XIP_DEFLATED_DATA bool "Store kernel .data section compressed in ROM" depends on XIP_KERNEL select ZLIB_INFLATE help Before the kernel is actually executed, its .data section has to be copied to RAM from ROM. This option allows for storing that data in compressed form and decompressed to RAM rather than merely being copied, saving some precious ROM space. A possible drawback is a slightly longer boot delay. config KEXEC bool "Kexec system call (EXPERIMENTAL)" depends on (!SMP || PM_SLEEP_SMP) Loading
arch/arm/Kconfig-nommu +2 −2 Original line number Diff line number Diff line Loading @@ -52,8 +52,8 @@ config REMAP_VECTORS_TO_RAM config ARM_MPU bool 'Use the ARM v7 PMSA Compliant MPU' depends on CPU_V7 default y depends on CPU_V7 || CPU_V7M default y if CPU_V7 help Some ARM systems without an MMU have instead a Memory Protection Unit (MPU) that defines the type and permissions for regions of Loading
arch/arm/boot/Makefile +12 −1 Original line number Diff line number Diff line Loading @@ -31,8 +31,19 @@ targets := Image zImage xipImage bootpImage uImage ifeq ($(CONFIG_XIP_KERNEL),y) cmd_deflate_xip_data = $(CONFIG_SHELL) -c \ '$(srctree)/$(src)/deflate_xip_data.sh $< $@ || { rm -f $@; false; }' ifeq ($(CONFIG_XIP_DEFLATED_DATA),y) quiet_cmd_mkxip = XIPZ $@ cmd_mkxip = $(cmd_objcopy) && $(cmd_deflate_xip_data) else quiet_cmd_mkxip = $(quiet_cmd_objcopy) cmd_mkxip = $(cmd_objcopy) endif $(obj)/xipImage: vmlinux FORCE $(call if_changed,objcopy) $(call if_changed,mkxip) @$(kecho) ' Physical Address of xipImage: $(CONFIG_XIP_PHYS_ADDR)' $(obj)/Image $(obj)/zImage: FORCE Loading
arch/arm/boot/deflate_xip_data.sh 0 → 100755 +64 −0 Original line number Diff line number Diff line #!/bin/sh # XIP kernel .data segment compressor # # Created by: Nicolas Pitre, August 2017 # Copyright: (C) 2017 Linaro Limited # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation. # This script locates the start of the .data section in xipImage and # substitutes it with a compressed version. The needed offsets are obtained # from symbol addresses in vmlinux. It is expected that .data extends to # the end of xipImage. set -e VMLINUX="$1" XIPIMAGE="$2" DD="dd status=none" # Use "make V=1" to debug this script. case "$KBUILD_VERBOSE" in *1*) set -x ;; esac sym_val() { # extract hex value for symbol in $1 local val=$($NM "$VMLINUX" | sed -n "/ $1$/{s/ .*$//p;q}") [ "$val" ] || { echo "can't find $1 in $VMLINUX" 1>&2; exit 1; } # convert from hex to decimal echo $((0x$val)) } __data_loc=$(sym_val __data_loc) _edata_loc=$(sym_val _edata_loc) base_offset=$(sym_val _xiprom) # convert to file based offsets data_start=$(($__data_loc - $base_offset)) data_end=$(($_edata_loc - $base_offset)) # Make sure data occupies the last part of the file. file_end=$(stat -c "%s" "$XIPIMAGE") if [ "$file_end" != "$data_end" ]; then printf "end of xipImage doesn't match with _edata_loc (%#x vs %#x)\n" \ $(($file_end + $base_offset)) $_edata_loc 2>&1 exit 1; fi # be ready to clean up trap 'rm -f "$XIPIMAGE.tmp"' 0 1 2 3 # substitute the data section by a compressed version $DD if="$XIPIMAGE" count=$data_start iflag=count_bytes of="$XIPIMAGE.tmp" $DD if="$XIPIMAGE" skip=$data_start iflag=skip_bytes | gzip -9 >> "$XIPIMAGE.tmp" # replace kernel binary mv -f "$XIPIMAGE.tmp" "$XIPIMAGE"
arch/arm/include/asm/cputype.h +10 −0 Original line number Diff line number Diff line Loading @@ -173,6 +173,11 @@ static inline unsigned int __attribute_const__ read_cpuid_cachetype(void) return read_cpuid(CPUID_CACHETYPE); } static inline unsigned int __attribute_const__ read_cpuid_mputype(void) { return read_cpuid(CPUID_MPUIR); } #elif defined(CONFIG_CPU_V7M) static inline unsigned int __attribute_const__ read_cpuid_id(void) Loading @@ -185,6 +190,11 @@ static inline unsigned int __attribute_const__ read_cpuid_cachetype(void) return readl(BASEADDR_V7M_SCB + V7M_SCB_CTR); } static inline unsigned int __attribute_const__ read_cpuid_mputype(void) { return readl(BASEADDR_V7M_SCB + MPU_TYPE); } #else /* ifdef CONFIG_CPU_CP15 / elif defined(CONFIG_CPU_V7M) */ static inline unsigned int __attribute_const__ read_cpuid_id(void) Loading