/* -*- ld-script -*- */

/*
 * Linker script for i386 images
 *
 */

SECTIONS {

    /* Each section starts at a virtual address of zero.
     *
     * We guarantee alignment of virtual addresses to any alignment
     * specified by the constituent object files (e.g. via
     * __attribute__((aligned(x)))).  Load addresses are guaranteed
     * only up to _max_align.  Provided that all loader and relocation
     * code honours _max_align, this means that physical addresses are
     * also guaranteed up to _max_align.
     *
     * Note that when using -DKEEP_IT_REAL, the UNDI segments are only
     * guaranteed to be loaded on a paragraph boundary (i.e. 16-byte
     * alignment).  Using _max_align>16 will therefore not guarantee
     * >16-byte alignment of physical addresses when -DKEEP_IT_REAL is
     * used (though virtual addresses will still be fully aligned).
     *
     */

    PROVIDE ( _max_align = 16 );

    /*
     * Values used in page table calculations
     *
     * On older versions of ld (without the SANE_EXPR feature),
     * numeric literals within a section description tend to be
     * interpreted as section-relative symbols.
     *
     */
    _page_size = 4096;
    _page_size_1 = ( _page_size - 1 );
    _pte_size = 8;
    _pte_count = ( _page_size / _pte_size );
    _pte_count_1 = ( _pte_count - 1 );

    /*
     * Allow decompressor to require a minimum amount of temporary stack
     * space.
     *
     */
    PROVIDE ( _min_decompress_stack = 0 );

    /*
     * The prefix
     *
     */

    .prefix 0x0 : AT ( _prefix_lma ) {
	_prefix = .;
	*(.prefix)
	*(SORT(.pci_devlist.*))
	*(.prefix.*)
	_mprefix = .;
    } .bss.prefix (NOLOAD) : AT ( _bss_prefix_lma ) {
	_eprefix = .;
    }
    _prefix_filesz	= ABSOLUTE ( _mprefix ) - ABSOLUTE ( _prefix );
    _prefix_memsz	= ABSOLUTE ( _eprefix ) - ABSOLUTE ( _prefix );
    _prefix_padsz	= ABSOLUTE ( _eprefix ) - ABSOLUTE ( _mprefix );

    /*
     * The 16-bit (real-mode) code section
     *
     */

    .text16.early 0x0 : AT ( _text16_early_lma ) {
	_text16 = .;
	KEEP(*(.text16.null))
	KEEP(*(.text16.null.*))
	. += 1;				/* Prevent NULL being valid */
	*(.text16.early)
	*(.text16.early.*)
	_etext16_early = .;
    } .text16.late ALIGN ( _max_align ) : AT ( _text16_late_lma ) {
	_text16_late = .;
	*(.text16)
	*(.text16.*)
	_mtext16 = .;
    } .bss.text16 (NOLOAD) : AT ( _bss_text16_lma ) {
	_etext16 = .;
    }
    _text16_early_filesz = ABSOLUTE ( _etext16_early ) - ABSOLUTE ( _text16 );
    _text16_early_memsz	= ABSOLUTE ( _etext16_early ) - ABSOLUTE ( _text16 );
    _text16_late_filesz	= ABSOLUTE ( _mtext16 ) - ABSOLUTE ( _text16_late );
    _text16_late_memsz	= ABSOLUTE ( _etext16 ) - ABSOLUTE ( _text16_late );
    _text16_memsz	= ABSOLUTE ( _etext16 ) - ABSOLUTE ( _text16 );
    _text16_padsz	= ABSOLUTE ( _etext16 ) - ABSOLUTE ( _mtext16 );

    /*
     * The 16-bit (real-mode) data section
     *
     */

    .data16 0x0 : AT ( _data16_lma ) {
	_data16 = .;
	. += 1;				/* Prevent NULL being valid */
	*(.rodata16)
	*(.rodata16.*)
	*(.data16)
	*(.data16.*)
	_mdata16 = .;
    } .bss.data16 (NOLOAD) : AT ( _bss_data16_lma ) {
	*(.bss16)
	*(.bss16.*)
	*(.stack16)
	*(.stack16.*)
	. = MAX ( ., _mdata16 + _min_decompress_stack );
	_edata16 = .;
    }
    _data16_filesz	= ABSOLUTE ( _mdata16 ) - ABSOLUTE ( _data16 );
    _data16_memsz	= ABSOLUTE ( _edata16 ) - ABSOLUTE ( _data16 );
    _data16_padsz	= ABSOLUTE ( _edata16 ) - ABSOLUTE ( _mdata16 );

    /*
     * The 32-bit sections
     *
     */

    .textdata 0x0 : AT ( _textdata_lma ) {
	_textdata = .;
	KEEP(*(.text.null_trap))
	KEEP(*(.text.null_trap.*))
	. += 1;				/* Prevent NULL being valid */
	*(.text)
	*(.text.*)
	*(.rodata)
	*(.rodata.*)
	*(.data)
	*(.data.*)
	KEEP(*(SORT(.tbl.*)))	/* Various tables.  See include/tables.h */
	KEEP(*(.provided))
	KEEP(*(.provided.*))
	_mtextdata = .;
    } .bss.textdata (NOLOAD) : AT ( _bss_textdata_lma ) {
	*(.bss)
	*(.bss.*)
	*(COMMON)
	*(.stack)
	*(.stack.*)
	_pages = .;
	*(.pages)
	*(.pages.*)
	_use_page_tables = ABSOLUTE ( . ) - ABSOLUTE ( _pages );
	_textdata_paged_len =
	    ABSOLUTE ( ABSOLUTE ( . ) - ABSOLUTE ( _textdata ) );
	_textdata_ptes =
	    ABSOLUTE ( ( _textdata_paged_len + _page_size_1 ) / _page_size );
	_textdata_pdes =
	    ABSOLUTE ( ( _textdata_ptes + _pte_count_1 ) / _pte_count );
	. += ( _use_page_tables ? ( _textdata_pdes * _page_size ) : 0 );
	_epages = .;
	_etextdata = .;
    }
    _textdata_filesz	= ABSOLUTE ( _mtextdata ) - ABSOLUTE ( _textdata );
    _textdata_memsz	= ABSOLUTE ( _etextdata ) - ABSOLUTE ( _textdata );
    _textdata_padsz	= ABSOLUTE ( _etextdata ) - ABSOLUTE ( _mtextdata );

    /*
     * Payload prefix
     *
     * If present, this will be placed between .text16.early and .text16.late.
     *
     */
    .pprefix 0x0 : AT ( _pprefix_lma ) {
	_pprefix = .;
	KEEP(*(.pprefix))
	KEEP(*(.pprefix.*))
	_mpprefix = .;
    } .bss.pprefix (NOLOAD) : AT ( _bss_pprefix_lma ) {
	_epprefix = .;
    }
    _pprefix_filesz	= ABSOLUTE ( _mpprefix ) - ABSOLUTE ( _pprefix );
    _pprefix_memsz	= ABSOLUTE ( _epprefix ) - ABSOLUTE ( _pprefix );
    _pprefix_padsz	= ABSOLUTE ( _epprefix ) - ABSOLUTE ( _mpprefix );

    /*
     * Compressor information block
     *
     */

    .zinfo 0x0 : AT ( _zinfo_lma ) {
	_zinfo = .;
	KEEP(*(.zinfo))
	KEEP(*(.zinfo.*))
	_mzinfo = .;
    } .bss.zinfo (NOLOAD) : AT ( _bss_zinfo_lma ) {
	_ezinfo = .;
    }
    _zinfo_filesz	= ABSOLUTE ( _mzinfo ) - ABSOLUTE ( _zinfo );
    _zinfo_memsz	= ABSOLUTE ( _ezinfo ) - ABSOLUTE ( _zinfo );
    _zinfo_padsz	= ABSOLUTE ( _ezinfo ) - ABSOLUTE ( _mzinfo );

    /*
     * Weak symbols that need zero values if not otherwise defined
     *
     */

    .weak 0x0 : AT ( _end_lma ) {
	_weak = .;
	*(.weak)
	*(.weak.*)
	_eweak = .;
    }
    _assert = ASSERT ( ( _weak == _eweak ), ".weak is non-zero length" );

    /*
     * Dispose of the comment and note sections to make the link map
     * easier to read
     *
     */

    /DISCARD/ : {
	*(.comment)
	*(.comment.*)
	*(.note)
	*(.note.*)
	*(.eh_frame)
	*(.eh_frame.*)
	*(.rel)
	*(.rel.*)
	*(.einfo)
	*(.einfo.*)
	*(.discard)
	*(.discard.*)
    }

    /*
     * Load address calculations.  In older versions of ld, ALIGN()
     * can operate only on the location counter, so we use that.
     *
     */

    .			= 0;

    .			= ALIGN ( _max_align );
    _prefix_lma		= .;
    .			+= ABSOLUTE ( _prefix_filesz );

    .			= ALIGN ( _max_align );
    _text16_early_lma	= .;
    .			+= ABSOLUTE ( _text16_early_filesz );

    .			= ALIGN ( _max_align );
    .			= ALIGN ( _payload_align );
    _pprefix_lma	= .;
    .			+= ABSOLUTE ( _pprefix_filesz );

    .			= ALIGN ( _max_align );
    _payload_lma	= .;
    _pprefix_skip	= ABSOLUTE ( _payload_lma ) - ABSOLUTE ( _pprefix_lma );
    _text16_late_lma	= .;
    .			+= ABSOLUTE ( _text16_late_filesz );

    .			= ALIGN ( _max_align );
    _data16_lma		= .;
    .			+= ABSOLUTE ( _data16_filesz );

    .			= ALIGN ( _max_align );
    _textdata_lma	= .;
    .			+= ABSOLUTE ( _textdata_filesz );

    _filesz		= .; /* Do not include .bss.* or .zinfo in file size */

    /*
     * Dummy load addresses for .bss.* and .zinfo sections
     *
     */

    .			= ALIGN ( _max_align );
    _bss_prefix_lma	= .;
    .			+= ABSOLUTE ( _prefix_padsz );

    .			= ALIGN ( _max_align );
    _bss_text16_lma	= .;
    .			+= ABSOLUTE ( _text16_padsz );

    .			= ALIGN ( _max_align );
    _bss_data16_lma	= .;
    .			+= ABSOLUTE ( _data16_padsz );

    .			= ALIGN ( _max_align );
    _bss_textdata_lma	= .;
    .			+= ABSOLUTE ( _textdata_padsz );

    .			= ALIGN ( _max_align );
    _bss_pprefix_lma	= .;
    .			+= ABSOLUTE ( _pprefix_padsz );

    .			= ALIGN ( _max_align );
    _bss_zinfo_lma	= .;
    .			+= ABSOLUTE ( _zinfo_padsz );

    .			= ALIGN ( _max_align );
    _zinfo_lma		= .;
    .			+= ABSOLUTE ( _zinfo_filesz );

    .			= ALIGN ( _max_align );
    _end_lma		= .;

    /*
     * Values calculated to save code from doing it
     *
     */
    _text16_memsz_ppgh	= ( ( ( _text16_memsz + 63 ) / 64 ) * 4 );
    _data16_memsz_ppgh	= ( ( ( _data16_memsz + 63 ) / 64 ) * 4 );
    _textdata_memsz_pgh	= ( ( _textdata_memsz + 15 ) / 16 );
    _textdata_memsz_kb	= ( ( _textdata_memsz + 1023 ) / 1024 );
}
