MEMORY {
    exceptions (rx)     : org = 0x80000000, len = 0x400
    ram (rwx)           : org = 0x80000400, len = 1M - 0x400
    framebuffer (rw)    : org = 0x80100000, len = 600k
}

ENTRY(entry_handler)

__stack_size = 16k;
__exception_stack_size = 8k;

SECTIONS {
    .exceptions : {
        KEEP(*(.text.exception_vector));
        . = ALIGN(8);
    } > exceptions

    .text : {
        *(.text.entry_handler)
        . = ALIGN(8);
        *(.text .text.* .gnu.linkonce.t.*)
        . = ALIGN(8);
    } > ram

    .assets : {
        *(.assets .assets.*)
        . = ALIGN(8);
    } > ram

    .rodata : {
        *(.rdata .rodata .rodata.* .gnu.linkonce.r.*)
        . = ALIGN(8);
    } > ram

    .data : {
        *(.data .data.* .gnu.linkonce.d.*)
        . = ALIGN(8);
    } > ram

    .sdata : {
        _gp = . + 0x8000;
        *(.sdata .sdata.* .gnu.linkonce.s.*)
        . = ALIGN(8);
    } > ram

    .lit8 : {
        *(.lit8)
        . = ALIGN(8);
    } > ram

    .lit4 : {
        *(.lit4)
        . = ALIGN(8);
    } > ram

    .sbss : {
        *(.sbss .sbss.* .gnu.linkonce.sb.*)
        *(.scommon .scommon.*)
        . = ALIGN(8);
    } > ram

    .bss : {
        *(.bss .bss.* .gnu.linkonce.b.*)
        *(COMMON)
        . = ALIGN(8);
    } > ram

    _sheap = .;
    . = ORIGIN(ram) + LENGTH(ram) - __stack_size - __exception_stack_size;
    _eheap = .;

    . += __stack_size;
    _sp = .;

    . += __exception_stack_size;
    _esp = .;

    .framebuffer (NOLOAD) : SUBALIGN(64) {
        *(.framebuffer .framebuffer.*)
    } > framebuffer

    /DISCARD/ : {
        *(.MIPS.*)
    }
}