/* Copyright 2018 The Fuchsia Authors. All rights reserved.
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

/*
 * This is the linker script for the final load image of the kernel.  The
 * entire thing was assembled into a single .text section in one .o file
 * (see kernel/$ARCH/image.S).  The purpose of this link is to resolve
 * symbols used in image.S but defined in the kernel proper.  That's made
 * possible by using ld's --just-symbols switch to copy the symbols from
 * the kernel proper into this link.  That's how the boot loader headers in
 * image.S can encode things like the entry point address, the exact load
 * image size including KASLR fixup code, and the "end of .bss" memory
 * reservation size.
 *
 * Boot loaders use only the raw binary load image extracted from this
 * link, not the ELF file itself; image.S encodes the platform-specific
 * headers the boot loaders look for at the beginning of the raw binary.
 * Setting the .text address to its physical address is nice for looking at
 * the ELF file and debugging the boot sequence, but it has no effect on
 * the load image.  However, other loaders (e.g. qemu) actually use the ELF
 * file container of the load image to guide their loading.  So we need
 * this linker script to produce a PT_LOAD with the right p_paddr.
 */

ENTRY(IMAGE_ELF_ENTRY)

SECTIONS {
    . = IMAGE_LOAD_START;

    .load_image : {
        KEEP(*(.text))

        /*
         * This includes the fixup code, which overlaps the bss.
         */
        IMAGE_LOAD_END = .;

        /*
         * This is the end of the kernel load image proper, where the bss
         * starts at runtime and the fixup code starts in the image.
         */
        ASSERT(ABSOLUTE(IMAGE_LOAD_KERNEL_END) < ABSOLUTE(IMAGE_LOAD_END),
               "image symbols bad");
    } :load_image

    /*
     * This is the high bound of the address range that must be reserved.
     * Since the fixups and the bss overlap and are both of varying sizes,
     * this might be past IMAGE_LOAD_END (more bss than fixups) or vice versa.
     */
    IMAGE_RESERVE_END = IMAGE_MEMORY_END + IMAGE_RESERVE_SIZE;

    /*
     * When a boot loader is actually using the ELF headers, it needs to
     * know how much memory to reserve after the load image (p_filesz is
     * the load image, and p_memsz > p_filesz to indicate the extra space
     * to reserve).  This ensures that the segment has the right p_memsz.
     */
    .bss : {
        . = MAX(ABSOLUTE(IMAGE_RESERVE_END), ABSOLUTE(.));
        ASSERT(ABSOLUTE(.) >= ABSOLUTE(IMAGE_RESERVE_END), "image layout bad");
    }
}

PHDRS {
    load_image PT_LOAD FLAGS(7); /* PF_R|PF_W|PF_X */
}
