mirror of
https://github.com/esp-rs/esp-hal.git
synced 2025-10-02 14:44:42 +00:00
312 lines
10 KiB
Plaintext
312 lines
10 KiB
Plaintext
/* before memory.x to allow override */
|
|
ENTRY(Reset)
|
|
|
|
INCLUDE memory.x
|
|
|
|
/* map generic regions to output sections */
|
|
INCLUDE "alias.x"
|
|
|
|
_external_ram_start = ABSOLUTE(ORIGIN(psram_seg));
|
|
_external_ram_end = ABSOLUTE(ORIGIN(psram_seg)+LENGTH(psram_seg));
|
|
|
|
_heap_end = ABSOLUTE(ORIGIN(dram_seg))+LENGTH(dram_seg)+LENGTH(reserved_for_boot_seg) - 2*STACK_SIZE;
|
|
_text_heap_end = ABSOLUTE(ORIGIN(iram_seg)+LENGTH(iram_seg));
|
|
_external_heap_end = ABSOLUTE(ORIGIN(psram_seg)+LENGTH(psram_seg));
|
|
|
|
_stack_start_cpu1 = _heap_end;
|
|
_stack_end_cpu1 = _stack_start_cpu1 + STACK_SIZE;
|
|
_stack_start_cpu0 = _stack_end_cpu1;
|
|
_stack_end_cpu0 = _stack_start_cpu0 + STACK_SIZE;
|
|
|
|
EXTERN(DefaultHandler);
|
|
|
|
INCLUDE "device.x"
|
|
|
|
/* after memory.x to allow override */
|
|
PROVIDE(__pre_init = DefaultPreInit);
|
|
PROVIDE(__zero_bss = default_mem_hook);
|
|
PROVIDE(__init_data = default_mem_hook);
|
|
|
|
/*INCLUDE exception.x*/
|
|
/* exception vector for the ESP32, requiring high priority interrupts and register window support */
|
|
|
|
/* high level exception/interrupt routines, which can be override with Rust functions */
|
|
PROVIDE(__exception = __default_exception);
|
|
PROVIDE(__user_exception = __default_user_exception);
|
|
PROVIDE(__double_exception = __default_double_exception);
|
|
PROVIDE(__level_1_interrupt = __default_interrupt);
|
|
PROVIDE(__level_2_interrupt = __default_interrupt);
|
|
PROVIDE(__level_3_interrupt = __default_interrupt);
|
|
PROVIDE(__level_4_interrupt = __default_interrupt);
|
|
PROVIDE(__level_5_interrupt = __default_interrupt);
|
|
PROVIDE(__level_6_interrupt = __default_interrupt);
|
|
PROVIDE(__level_7_interrupt = __default_interrupt);
|
|
|
|
/* low level exception/interrupt, which must be overridden using naked functions */
|
|
PROVIDE(__naked_user_exception = __default_naked_exception);
|
|
PROVIDE(__naked_kernel_exception = __default_naked_exception);
|
|
PROVIDE(__naked_double_exception = __default_naked_double_exception);
|
|
PROVIDE(__naked_level_2_interrupt = __default_naked_level_2_interrupt);
|
|
PROVIDE(__naked_level_3_interrupt = __default_naked_level_3_interrupt);
|
|
PROVIDE(__naked_level_4_interrupt = __default_naked_level_4_interrupt);
|
|
PROVIDE(__naked_level_5_interrupt = __default_naked_level_5_interrupt);
|
|
PROVIDE(__naked_level_6_interrupt = __default_naked_level_6_interrupt);
|
|
PROVIDE(__naked_level_7_interrupt = __default_naked_level_7_interrupt);
|
|
|
|
/* needed to force inclusion of the vectors */
|
|
EXTERN(__default_exception);
|
|
EXTERN(__default_double_exception);
|
|
EXTERN(__default_interrupt);
|
|
|
|
/* high level CPU interrupts */
|
|
PROVIDE(Timer0 = __default_user_exception);
|
|
PROVIDE(Timer1 = __default_user_exception);
|
|
PROVIDE(Timer2 = __default_user_exception);
|
|
PROVIDE(Timer3 = __default_user_exception);
|
|
PROVIDE(Profiling = __default_user_exception);
|
|
PROVIDE(NMI = __default_user_exception);
|
|
PROVIDE(Software0 = __default_user_exception);
|
|
PROVIDE(Software1 = __default_user_exception);
|
|
|
|
/* low level exception/interrupt, which must be overridden using naked functions */
|
|
EXTERN(__default_naked_exception);
|
|
EXTERN(__default_naked_double_exception);
|
|
EXTERN(__default_naked_level_2_interrupt);
|
|
EXTERN(__default_naked_level_3_interrupt);
|
|
EXTERN(__default_naked_level_4_interrupt);
|
|
EXTERN(__default_naked_level_5_interrupt);
|
|
EXTERN(__default_naked_level_6_interrupt);
|
|
EXTERN(__default_naked_level_7_interrupt);
|
|
|
|
SECTIONS {
|
|
.pre_header (NOLOAD) : AT(0)
|
|
{
|
|
. = . + 0x400;
|
|
}
|
|
|
|
.header ORIGIN(ROTEXT) : AT(0x400)
|
|
{
|
|
LONG(0xaedb041d)
|
|
LONG(0xaedb041d)
|
|
}
|
|
|
|
.text ORIGIN(ROTEXT) + 0x408 : AT(0x408)
|
|
{
|
|
_stext = .;
|
|
. = ALIGN (4);
|
|
_text_start = ABSOLUTE(.);
|
|
. = ALIGN (4);
|
|
KEEP(*(.init));
|
|
*(.literal .text .literal.* .text.*)
|
|
. = ALIGN (4);
|
|
_text_end = ABSOLUTE(.);
|
|
_etext = .;
|
|
}
|
|
_text_size = _etext - _stext;
|
|
|
|
.rodata ORIGIN(RODATA) + 0x408 + _text_size : AT(_text_size + SIZEOF(.header) + SIZEOF(.pre_header))
|
|
{
|
|
_rodata_start = ABSOLUTE(.);
|
|
. = ALIGN (4);
|
|
*(.rodata .rodata.*)
|
|
. = ALIGN (4);
|
|
_rodata_end = ABSOLUTE(.);
|
|
}
|
|
|
|
.rwtext ORIGIN(RWTEXT) + 0x408 + _text_size + SIZEOF(.rodata) :
|
|
AT(_text_size + SIZEOF(.header) + SIZEOF(.pre_header) + SIZEOF(.rodata))
|
|
{
|
|
_irwtext = ORIGIN(RODATA) + 0x408 + _text_size + SIZEOF(.rodata);
|
|
_srwtext = .;
|
|
|
|
. = ALIGN (4);
|
|
|
|
. = ALIGN(0x1000);
|
|
_init_start = ABSOLUTE(.);
|
|
KEEP(*(.WindowOverflow4.text));
|
|
. = ALIGN(64);
|
|
KEEP(*(.WindowUnderflow4.text));
|
|
. = ALIGN(64);
|
|
KEEP(*(.WindowOverflow8.text));
|
|
. = ALIGN(64);
|
|
KEEP(*(.WindowUnderflow8.text));
|
|
. = ALIGN(64);
|
|
KEEP(*(.WindowOverflow12.text));
|
|
. = ALIGN(64);
|
|
KEEP(*(.WindowUnderflow12.text));
|
|
. = ALIGN(64);
|
|
KEEP(*(.Level2InterruptVector.text));
|
|
. = ALIGN(64);
|
|
KEEP(*(.Level3InterruptVector.text));
|
|
. = ALIGN(64);
|
|
KEEP(*(.Level4InterruptVector.text));
|
|
. = ALIGN(64);
|
|
KEEP(*(.Level5InterruptVector.text));
|
|
. = ALIGN(64);
|
|
KEEP(*(.DebugExceptionVector.text));
|
|
. = ALIGN(64);
|
|
KEEP(*(.NMIExceptionVector.text));
|
|
. = ALIGN(64);
|
|
KEEP(*(.KernelExceptionVector.text));
|
|
. = ALIGN(64);
|
|
KEEP(*(.UserExceptionVector.text));
|
|
. = ALIGN(128);
|
|
KEEP(*(.DoubleExceptionVector.text));
|
|
. = ALIGN(0x400);
|
|
|
|
_init_end = ABSOLUTE(.);
|
|
|
|
*(.rwtext.literal .rwtext .rwtext.literal.* .rwtext.*)
|
|
|
|
. = ALIGN (4);
|
|
_erwtext = .;
|
|
}
|
|
|
|
.data ORIGIN(RWDATA) :
|
|
AT(_text_size + SIZEOF(.header) + SIZEOF(.pre_header) + SIZEOF(.rodata) + SIZEOF(.rwtext))
|
|
{
|
|
_data_start = ABSOLUTE(.);
|
|
. = ALIGN (4);
|
|
*(.data .data.*)
|
|
. = ALIGN (4);
|
|
_data_end = ABSOLUTE(.);
|
|
}
|
|
|
|
|
|
/* LMA of .data */
|
|
_sidata = ORIGIN(RODATA) + _text_size + SIZEOF(.header) + SIZEOF(.pre_header) + SIZEOF(.rodata) + SIZEOF(.rwtext);
|
|
|
|
.bss (NOLOAD) : ALIGN(4)
|
|
{
|
|
_bss_start = ABSOLUTE(.);
|
|
. = ALIGN (4);
|
|
*(.bss .bss.* COMMON)
|
|
. = ALIGN (4);
|
|
_bss_end = ABSOLUTE(.);
|
|
} > RWDATA
|
|
|
|
.noinit (NOLOAD) : ALIGN(4)
|
|
{
|
|
. = ALIGN(4);
|
|
*(.noinit .noinit.*)
|
|
. = ALIGN (4);
|
|
} > RWDATA
|
|
|
|
.rtc_fast.text ORIGIN(rtc_fast_iram_seg) :
|
|
AT(_text_size + SIZEOF(.header) + SIZEOF(.pre_header) + SIZEOF(.rodata) + SIZEOF(.rwtext) )
|
|
{
|
|
. = ALIGN(4);
|
|
_rtc_fast_text_start = ABSOLUTE(.);
|
|
*(.rtc_fast.literal .rtc_fast.text .rtc_fast.literal.* .rtc_fast.text.*)
|
|
. = ALIGN(4);
|
|
_rtc_fast_text_end = ABSOLUTE(.);
|
|
}
|
|
_irtc_fast_text = ORIGIN(RODATA) + _text_size + SIZEOF(.header) + SIZEOF(.pre_header) + SIZEOF(.rodata) + SIZEOF(.rwtext);
|
|
|
|
.rtc_fast.data ORIGIN(rtc_fast_dram_seg) + SIZEOF(.rtc_fast.text) :
|
|
AT(_text_size + SIZEOF(.header) + SIZEOF(.pre_header) + SIZEOF(.rodata) + SIZEOF(.rwtext) + SIZEOF(.rtc_fast.text) )
|
|
{
|
|
. = ALIGN(4);
|
|
_rtc_fast_data_start = ABSOLUTE(.);
|
|
*(.rtc_fast.data .rtc_fast.data.*)
|
|
. = ALIGN(4);
|
|
_rtc_fast_data_end = ABSOLUTE(.);
|
|
}
|
|
_irtc_fast_data = ORIGIN(RODATA) + _text_size + SIZEOF(.header) + SIZEOF(.pre_header) + SIZEOF(.rodata) + SIZEOF(.rwtext) + SIZEOF(.rtc_fast.text);
|
|
|
|
.rtc_fast.bss ORIGIN(rtc_fast_dram_seg) + SIZEOF(.rtc_fast.text) + SIZEOF(.rtc_fast.data) (NOLOAD) :
|
|
AT(_text_size + SIZEOF(.header) + SIZEOF(.pre_header) + SIZEOF(.rodata) +
|
|
SIZEOF(.rwtext) + SIZEOF(.rtc_fast.text) + SIZEOF(.rtc_fast.data))
|
|
{
|
|
. = ALIGN(4);
|
|
_rtc_fast_bss_start = ABSOLUTE(.);
|
|
*(.rtc_fast.bss .rtc_fast.bss.*)
|
|
. = ALIGN (4);
|
|
_rtc_fast_bss_end = ABSOLUTE(.);
|
|
}
|
|
|
|
.rtc_fast.noinit ORIGIN(rtc_fast_dram_seg) + SIZEOF(.rtc_fast.text) + SIZEOF(.rtc_fast.data) + SIZEOF(.rtc_fast.bss) (NOLOAD) :
|
|
{
|
|
. = ALIGN(4);
|
|
*(.rtc_fast.noinit .rtc_fast.noinit.*)
|
|
. = ALIGN (4);
|
|
}
|
|
|
|
.rtc_slow.text ORIGIN(rtc_slow_seg) :
|
|
AT(_text_size + SIZEOF(.header) + SIZEOF(.pre_header) + SIZEOF(.rodata) + SIZEOF(.rwtext) +
|
|
SIZEOF(.rtc_fast.text) + SIZEOF(.rtc_fast.data) + SIZEOF(.rtc_fast.bss))
|
|
{
|
|
. = ALIGN(4);
|
|
_rtc_slow_text_start = ABSOLUTE(.);
|
|
*(.rtc_slow.literal .rtc_slow.text .rtc_slow.literal.* .rtc_slow.text.*)
|
|
. = ALIGN(4);
|
|
_rtc_slow_text_end = ABSOLUTE(.);
|
|
}
|
|
_irtc_slow_text = ORIGIN(RODATA) + _text_size + SIZEOF(.header) + SIZEOF(.pre_header) + SIZEOF(.rodata) + SIZEOF(.rwtext) +
|
|
SIZEOF(.rtc_fast.text) + SIZEOF(.rtc_fast.data) + SIZEOF(.rtc_fast.bss);
|
|
|
|
.rtc_slow.data ORIGIN(rtc_slow_seg) + SIZEOF(.rtc_slow.text) :
|
|
AT(_text_size + SIZEOF(.header) + SIZEOF(.pre_header) + SIZEOF(.rodata) + SIZEOF(.rwtext) +
|
|
SIZEOF(.rtc_fast.text) + SIZEOF(.rtc_fast.data) + SIZEOF(.rtc_fast.bss) + SIZEOF(.rtc_slow.text))
|
|
{
|
|
. = ALIGN(4);
|
|
_rtc_slow_data_start = ABSOLUTE(.);
|
|
*(.rtc_slow.data .rtc_slow.data.*)
|
|
. = ALIGN(4);
|
|
_rtc_slow_data_end = ABSOLUTE(.);
|
|
}
|
|
_irtc_slow_data = ORIGIN(RODATA) + _text_size + SIZEOF(.header) + SIZEOF(.pre_header) + SIZEOF(.rodata) + SIZEOF(.rwtext) +
|
|
SIZEOF(.rtc_fast.text) + SIZEOF(.rtc_fast.data) + SIZEOF(.rtc_fast.bss) + SIZEOF(.rtc_slow.text);
|
|
|
|
.rtc_slow.bss ORIGIN(rtc_slow_seg) + SIZEOF(.rtc_slow.text) + SIZEOF(.rtc_slow.data) (NOLOAD) :
|
|
AT(_text_size + SIZEOF(.header) + SIZEOF(.pre_header) + SIZEOF(.rodata) + SIZEOF(.rwtext) +
|
|
SIZEOF(.rtc_fast.text) + SIZEOF(.rtc_fast.data) + SIZEOF(.rtc_fast.bss) + SIZEOF(.rtc_slow.text) + SIZEOF(.rtc_slow.data))
|
|
{
|
|
. = ALIGN(4);
|
|
_rtc_slow_bss_start = ABSOLUTE(.);
|
|
*(.rtc_slow.bss .rtc_slow.bss.*)
|
|
. = ALIGN (4);
|
|
_rtc_slow_bss_end = ABSOLUTE(.);
|
|
}
|
|
|
|
.rtc_slow.noinit ORIGIN(rtc_slow_seg) + SIZEOF(.rtc_slow.text) + SIZEOF(.rtc_slow.data) + SIZEOF(.rtc_slow.bss) (NOLOAD) :
|
|
{
|
|
. = ALIGN(4);
|
|
*(.rtc_slow.noinit .rtc_slow.noinit.*)
|
|
. = ALIGN (4);
|
|
}
|
|
|
|
.external.data :
|
|
{
|
|
_external_data_start = ABSOLUTE(.);
|
|
. = ALIGN(4);
|
|
*(.external.data .external.data.*)
|
|
. = ALIGN (4);
|
|
_external_data_end = ABSOLUTE(.);
|
|
} > psram_seg AT > RODATA
|
|
|
|
.external.bss (NOLOAD) :
|
|
{
|
|
_external_bss_start = ABSOLUTE(.);
|
|
. = ALIGN(4);
|
|
*(.external.bss .external.bss.*)
|
|
. = ALIGN (4);
|
|
_external_bss_end = ABSOLUTE(.);
|
|
} > psram_seg
|
|
|
|
.external.noinit (NOLOAD) :
|
|
{
|
|
. = ALIGN(4);
|
|
*(.external.noinit .external.noinit.*)
|
|
. = ALIGN (4);
|
|
} > psram_seg
|
|
|
|
/* must be last segment using psram_seg */
|
|
.external_heap_start (NOLOAD) :
|
|
{
|
|
. = ALIGN (4);
|
|
_external_heap_start = ABSOLUTE(.);
|
|
. = ALIGN (4);
|
|
} > psram_seg
|
|
}
|