diff --git a/arch/arm/core/aarch64/CMakeLists.txt b/arch/arm/core/aarch64/CMakeLists.txt index 7f4c8db9558..2d40677611d 100644 --- a/arch/arm/core/aarch64/CMakeLists.txt +++ b/arch/arm/core/aarch64/CMakeLists.txt @@ -31,5 +31,6 @@ zephyr_library_sources_ifdef(CONFIG_GEN_SW_ISR_TABLE isr_wrapper.S) zephyr_library_sources_ifdef(CONFIG_IRQ_OFFLOAD irq_offload.c) zephyr_library_sources_ifdef(CONFIG_THREAD_LOCAL_STORAGE ../common/tls.c) zephyr_library_sources_ifdef(CONFIG_ARM_PSCI smccc-call.S) +zephyr_library_sources_ifdef(CONFIG_AARCH64_IMAGE_HEADER header.S) add_subdirectory_ifdef(CONFIG_ARM_MMU mmu) diff --git a/arch/arm/core/aarch64/Kconfig b/arch/arm/core/aarch64/Kconfig index 8166f9ba98f..c92c6648a71 100644 --- a/arch/arm/core/aarch64/Kconfig +++ b/arch/arm/core/aarch64/Kconfig @@ -56,6 +56,12 @@ config CMSIS_V2_THREAD_DYNAMIC_STACK_SIZE config IPM_CONSOLE_STACK_SIZE default 2048 +config AARCH64_IMAGE_HEADER + bool "Add image header" + help + This option enables standard ARM64 boot image header used by Linux + and understood by loaders such as u-boot on Xen xl tool. + if CPU_CORTEX_A config ARMV8_A_NS diff --git a/arch/arm/core/aarch64/header.S b/arch/arm/core/aarch64/header.S new file mode 100644 index 00000000000..691ff76f8d0 --- /dev/null +++ b/arch/arm/core/aarch64/header.S @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2020 EPAM Systems + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include "mmu/arm_mmu.h" + +#if CONFIG_MMU_PAGE_SIZE == 4096 +#define HEADER_PGSIZE 1 +#elif CONFIG_MMU_PAGE_SIZE == 16384 +#define HEADER_PGSIZE 2 +#elif CONFIG_MMU_PAGE_SIZE == 65536 +#define HEADER_PGSIZE 3 +#else +#define HEADER_PGSIZE 0 +#warning "Can't determine page size for header flags" +#endif + +#define HEADER_FLAGS (HEADER_PGSIZE << 1) + +_ASM_FILE_PROLOGUE + +SECTION_SUBSEC_FUNC(image_header,_image_header_section,_image_header) + b __start // branch to kernel start + .long 0 // reserved + .quad 0 // Image load offset from start + // of RAM, little-endian + + .quad _flash_used // Effective size of kernel + // image, little-endian + + .quad HEADER_FLAGS // Informative flags, + // little-endian + + .quad 0 // reserved + .quad 0 // reserved + .quad 0 // reserved + .ascii "ARM\x64" // Magic number + .long 0 // reserved diff --git a/include/arch/arm/aarch64/scripts/linker.ld b/include/arch/arm/aarch64/scripts/linker.ld index 2b123e5fb30..38e066f302d 100644 --- a/include/arch/arm/aarch64/scripts/linker.ld +++ b/include/arch/arm/aarch64/scripts/linker.ld @@ -107,6 +107,12 @@ SECTIONS #ifndef CONFIG_XIP z_mapped_start = .; #endif + +#ifdef CONFIG_AARCH64_IMAGE_HEADER + KEEP(*(.image_header)) + KEEP(*(".image_header.*")) +#endif + _vector_start = .; KEEP(*(.exc_vector_table)) KEEP(*(".exc_vector_table.*"))