aarch64: add ability to generate image header

Image header is compatible with Linux aarch64 boot protocol,
so zephyr can be booted with U-boot or Xen loader.

Signed-off-by: Volodymyr Babchuk <volodymyr_babchuk@epam.com>
This commit is contained in:
Volodymyr Babchuk 2020-11-19 22:42:40 +02:00 committed by Anas Nashif
commit cd86ec2655
4 changed files with 55 additions and 0 deletions

View file

@ -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_IRQ_OFFLOAD irq_offload.c)
zephyr_library_sources_ifdef(CONFIG_THREAD_LOCAL_STORAGE ../common/tls.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_ARM_PSCI smccc-call.S)
zephyr_library_sources_ifdef(CONFIG_AARCH64_IMAGE_HEADER header.S)
add_subdirectory_ifdef(CONFIG_ARM_MMU mmu) add_subdirectory_ifdef(CONFIG_ARM_MMU mmu)

View file

@ -56,6 +56,12 @@ config CMSIS_V2_THREAD_DYNAMIC_STACK_SIZE
config IPM_CONSOLE_STACK_SIZE config IPM_CONSOLE_STACK_SIZE
default 2048 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 if CPU_CORTEX_A
config ARMV8_A_NS config ARMV8_A_NS

View file

@ -0,0 +1,42 @@
/*
* Copyright (c) 2020 EPAM Systems
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <linker/sections.h>
#include <arch/cpu.h>
#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

View file

@ -107,6 +107,12 @@ SECTIONS
#ifndef CONFIG_XIP #ifndef CONFIG_XIP
z_mapped_start = .; z_mapped_start = .;
#endif #endif
#ifdef CONFIG_AARCH64_IMAGE_HEADER
KEEP(*(.image_header))
KEEP(*(".image_header.*"))
#endif
_vector_start = .; _vector_start = .;
KEEP(*(.exc_vector_table)) KEEP(*(.exc_vector_table))
KEEP(*(".exc_vector_table.*")) KEEP(*(".exc_vector_table.*"))