1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2025-01-31 01:41:18 +00:00

refactor(core): rename stack related linker script symbols

[no changelog]
This commit is contained in:
cepetr 2025-01-29 21:34:20 +01:00 committed by cepetr
parent bdb3d486e3
commit 2671404e44
23 changed files with 67 additions and 69 deletions

View File

@ -41,6 +41,10 @@
#include "zkp_context.h" #include "zkp_context.h"
#endif #endif
// symbols defined in the linker script
extern uint8_t _stack_section_start;
extern uint8_t _stack_section_end;
int main(uint32_t cmd, void *arg) { int main(uint32_t cmd, void *arg) {
if (cmd == 1) { if (cmd == 1) {
systask_postmortem_t *info = (systask_postmortem_t *)arg; systask_postmortem_t *info = (systask_postmortem_t *)arg;
@ -57,8 +61,9 @@ int main(uint32_t cmd, void *arg) {
printf("CORE: Preparing stack\n"); printf("CORE: Preparing stack\n");
// Stack limit should be less than real stack size, so we have a chance // Stack limit should be less than real stack size, so we have a chance
// to recover from limit hit. // to recover from limit hit.
mp_stack_set_top(&_estack); mp_stack_set_top(&_stack_section_end);
mp_stack_set_limit((char *)&_estack - (char *)&_sstack - 1024); mp_stack_set_limit((char *)&_stack_section_end -
(char *)&_stack_section_start - 1024);
#if MICROPY_ENABLE_PYSTACK #if MICROPY_ENABLE_PYSTACK
static mp_obj_t pystack[1024]; static mp_obj_t pystack[1024];

View File

@ -11,9 +11,8 @@ MEMORY {
AUX1_RAM (wal) : ORIGIN = AUX1_RAM_START, LENGTH = AUX1_RAM_SIZE AUX1_RAM (wal) : ORIGIN = AUX1_RAM_START, LENGTH = AUX1_RAM_SIZE
} }
main_stack_base = ADDR(.stack) + SIZEOF(.stack); /* 8-byte aligned full descending stack */ _stack_section_start = ADDR(.stack);
_sstack = ADDR(.stack); _stack_section_end = ADDR(.stack) + SIZEOF(.stack);
_estack = main_stack_base;
/* used by the startup code to populate variables used by the C code */ /* used by the startup code to populate variables used by the C code */
data_lma = LOADADDR(.data); data_lma = LOADADDR(.data);

View File

@ -11,9 +11,8 @@ MEMORY {
AUX1_RAM (wal) : ORIGIN = AUX1_RAM_START, LENGTH = AUX1_RAM_SIZE AUX1_RAM (wal) : ORIGIN = AUX1_RAM_START, LENGTH = AUX1_RAM_SIZE
} }
main_stack_base = ADDR(.stack) + SIZEOF(.stack); /* 8-byte aligned full descending stack */ _stack_section_start = ADDR(.stack);
_sstack = ADDR(.stack); _stack_section_end = ADDR(.stack) + SIZEOF(.stack);
_estack = main_stack_base;
/* used by the startup code to populate variables used by the C code */ /* used by the startup code to populate variables used by the C code */
data_lma = LOADADDR(.data); data_lma = LOADADDR(.data);

View File

@ -9,10 +9,9 @@ MEMORY {
AUX2_RAM (wal) : ORIGIN = K_AUX2_RAM_START, LENGTH = K_AUX2_RAM_SIZE AUX2_RAM (wal) : ORIGIN = K_AUX2_RAM_START, LENGTH = K_AUX2_RAM_SIZE
} }
main_stack_base = ADDR(.stack) + SIZEOF(.stack); /* 8-byte aligned full descending stack */ _stack_section_start = ADDR(.stack);
_sstack = ADDR(.stack); _stack_section_end = ADDR(.stack) + SIZEOF(.stack);
_estack = main_stack_base; _stack_section_size = SIZEOF(.stack);
_stack_size = SIZEOF(.stack);
/* used by the startup code to populate variables used by the C code */ /* used by the startup code to populate variables used by the C code */
data_lma = LOADADDR(.data); data_lma = LOADADDR(.data);

View File

@ -11,9 +11,8 @@ MEMORY {
DMABUF (wal) : ORIGIN = DMABUF_RAM_START, LENGTH = DMABUF_RAM_SIZE DMABUF (wal) : ORIGIN = DMABUF_RAM_START, LENGTH = DMABUF_RAM_SIZE
} }
main_stack_base = ADDR(.stack) + SIZEOF(.stack); /* 8-byte aligned full descending stack */ _stack_section_start = ADDR(.stack);
_sstack = ADDR(.stack); _stack_section_end = ADDR(.stack) + SIZEOF(.stack);
_estack = main_stack_base;
/* used by the startup code to populate variables used by the C code */ /* used by the startup code to populate variables used by the C code */
data_lma = LOADADDR(.data); data_lma = LOADADDR(.data);

View File

@ -11,9 +11,8 @@ MEMORY {
AUX1_RAM (wal) : ORIGIN = AUX1_RAM_START, LENGTH = AUX1_RAM_SIZE AUX1_RAM (wal) : ORIGIN = AUX1_RAM_START, LENGTH = AUX1_RAM_SIZE
} }
main_stack_base = ADDR(.stack) + SIZEOF(.stack); /* 8-byte aligned full descending stack */ _stack_section_start = ADDR(.stack);
_sstack = ADDR(.stack); _stack_section_end = ADDR(.stack) + SIZEOF(.stack);
_estack = main_stack_base;
/* used by the startup code to populate variables used by the C code */ /* used by the startup code to populate variables used by the C code */
data_lma = LOADADDR(.data); data_lma = LOADADDR(.data);

View File

@ -14,9 +14,8 @@ MEMORY {
FB2_RAM (wal) : ORIGIN = FB2_RAM_START, LENGTH = FB2_RAM_SIZE FB2_RAM (wal) : ORIGIN = FB2_RAM_START, LENGTH = FB2_RAM_SIZE
} }
main_stack_base = ADDR(.stack) + SIZEOF(.stack); /* 8-byte aligned full descending stack */ _stack_section_start = ADDR(.stack);
_sstack = ADDR(.stack); _stack_section_end = ADDR(.stack) + SIZEOF(.stack);
_estack = main_stack_base;
/* used by the startup code to populate variables used by the C code */ /* used by the startup code to populate variables used by the C code */
data_lma = LOADADDR(.data); data_lma = LOADADDR(.data);

View File

@ -13,9 +13,8 @@ MEMORY {
FB2_RAM (wal) : ORIGIN = FB2_RAM_START, LENGTH = FB2_RAM_SIZE FB2_RAM (wal) : ORIGIN = FB2_RAM_START, LENGTH = FB2_RAM_SIZE
} }
main_stack_base = ADDR(.stack) + SIZEOF(.stack); /* 8-byte aligned full descending stack */ _stack_section_start = ADDR(.stack);
_sstack = ADDR(.stack); _stack_section_end = ADDR(.stack) + SIZEOF(.stack);
_estack = main_stack_base;
/* used by the startup code to populate variables used by the C code */ /* used by the startup code to populate variables used by the C code */
data_lma = LOADADDR(.data); data_lma = LOADADDR(.data);

View File

@ -8,10 +8,9 @@ MEMORY {
AUX2_RAM (wal) : ORIGIN = AUX2_RAM_START, LENGTH = AUX2_RAM_SIZE AUX2_RAM (wal) : ORIGIN = AUX2_RAM_START, LENGTH = AUX2_RAM_SIZE
} }
main_stack_base = ADDR(.stack) + SIZEOF(.stack); /* 8-byte aligned full descending stack */ _stack_section_start = ADDR(.stack);
_sstack = ADDR(.stack); _stack_section_end = ADDR(.stack) + SIZEOF(.stack);
_estack = main_stack_base; _stack_section_size = SIZEOF(.stack);
_stack_size = SIZEOF(.stack);
/* used by the startup code to populate variables used by the C code */ /* used by the startup code to populate variables used by the C code */
data_lma = LOADADDR(.data); data_lma = LOADADDR(.data);

View File

@ -12,9 +12,8 @@ MEMORY {
FB2_RAM (wal) : ORIGIN = FB2_RAM_START, LENGTH = FB2_RAM_SIZE FB2_RAM (wal) : ORIGIN = FB2_RAM_START, LENGTH = FB2_RAM_SIZE
} }
main_stack_base = ADDR(.stack) + SIZEOF(.stack); /* 8-byte aligned full descending stack */ _stack_section_start = ADDR(.stack);
_sstack = ADDR(.stack); _stack_section_end = ADDR(.stack) + SIZEOF(.stack);
_estack = main_stack_base;
ustack_base = ADDR(.udata) + 512; ustack_base = ADDR(.udata) + 512;
_sustack = ADDR(.udata) + 256; _sustack = ADDR(.udata) + 256;

View File

@ -13,9 +13,8 @@ MEMORY {
FB2_RAM (wal) : ORIGIN = FB2_RAM_START, LENGTH = FB2_RAM_SIZE FB2_RAM (wal) : ORIGIN = FB2_RAM_START, LENGTH = FB2_RAM_SIZE
} }
main_stack_base = ADDR(.stack) + SIZEOF(.stack); /* 8-byte aligned full descending stack */ _stack_section_start = ADDR(.stack);
_sstack = ADDR(.stack); _stack_section_end = ADDR(.stack) + SIZEOF(.stack);
_estack = main_stack_base;
/* used by the startup code to populate variables used by the C code */ /* used by the startup code to populate variables used by the C code */
data_lma = LOADADDR(.data); data_lma = LOADADDR(.data);

View File

@ -14,9 +14,8 @@ MEMORY {
FB2_RAM (wal) : ORIGIN = FB2_RAM_START, LENGTH = FB2_RAM_SIZE FB2_RAM (wal) : ORIGIN = FB2_RAM_START, LENGTH = FB2_RAM_SIZE
} }
main_stack_base = ADDR(.stack) + SIZEOF(.stack); /* 8-byte aligned full descending stack */ _stack_section_start = ADDR(.stack);
_sstack = ADDR(.stack); _stack_section_end = ADDR(.stack) + SIZEOF(.stack);
_estack = main_stack_base;
/* used by the startup code to populate variables used by the C code */ /* used by the startup code to populate variables used by the C code */
data_lma = LOADADDR(.data); data_lma = LOADADDR(.data);

View File

@ -13,9 +13,8 @@ MEMORY {
FB2_RAM (wal) : ORIGIN = FB2_RAM_START, LENGTH = FB2_RAM_SIZE FB2_RAM (wal) : ORIGIN = FB2_RAM_START, LENGTH = FB2_RAM_SIZE
} }
main_stack_base = ADDR(.stack) + SIZEOF(.stack); /* 8-byte aligned full descending stack */ _stack_section_start = ADDR(.stack);
_sstack = ADDR(.stack); _stack_section_end = ADDR(.stack) + SIZEOF(.stack);
_estack = main_stack_base;
/* used by the startup code to populate variables used by the C code */ /* used by the startup code to populate variables used by the C code */
data_lma = LOADADDR(.data); data_lma = LOADADDR(.data);

View File

@ -7,10 +7,9 @@ MEMORY {
AUX1_RAM (wal) : ORIGIN = AUX1_RAM_START, LENGTH = AUX1_RAM_SIZE AUX1_RAM (wal) : ORIGIN = AUX1_RAM_START, LENGTH = AUX1_RAM_SIZE
} }
main_stack_base = ADDR(.stack) + SIZEOF(.stack); /* 8-byte aligned full descending stack */ _stack_section_start = ADDR(.stack);
_sstack = ADDR(.stack); _stack_section_end = ADDR(.stack) + SIZEOF(.stack);
_estack = main_stack_base; _stack_section_size = SIZEOF(.stack);
_stack_size = SIZEOF(.stack);
/* used by the startup code to populate variables used by the C code */ /* used by the startup code to populate variables used by the C code */
data_lma = LOADADDR(.data); data_lma = LOADADDR(.data);

View File

@ -12,9 +12,9 @@ MEMORY {
FB2_RAM (wal) : ORIGIN = FB2_RAM_START, LENGTH = FB2_RAM_SIZE FB2_RAM (wal) : ORIGIN = FB2_RAM_START, LENGTH = FB2_RAM_SIZE
} }
main_stack_base = ADDR(.stack) + SIZEOF(.stack); /* 8-byte aligned full descending stack */ _stack_section_start = ADDR(.stack);
_sstack = ADDR(.stack); _stack_section_end = ADDR(.stack) + SIZEOF(.stack);
_estack = main_stack_base;
ustack_base = ADDR(.udata) + 512; ustack_base = ADDR(.udata) + 512;
_sustack = ADDR(.udata) + 256; _sustack = ADDR(.udata) + 256;

View File

@ -13,9 +13,8 @@ MEMORY {
FB2_RAM (wal) : ORIGIN = FB2_RAM_START, LENGTH = FB2_RAM_SIZE FB2_RAM (wal) : ORIGIN = FB2_RAM_START, LENGTH = FB2_RAM_SIZE
} }
main_stack_base = ADDR(.stack) + SIZEOF(.stack); /* 8-byte aligned full descending stack */ _stack_section_start = ADDR(.stack);
_sstack = ADDR(.stack); _stack_section_end = ADDR(.stack) + SIZEOF(.stack);
_estack = main_stack_base;
/* used by the startup code to populate variables used by the C code */ /* used by the startup code to populate variables used by the C code */
data_lma = LOADADDR(.data); data_lma = LOADADDR(.data);

View File

@ -20,7 +20,7 @@ default_handler:
// Section B1.5 - ARMv7-M Architecture Reference Manual // Section B1.5 - ARMv7-M Architecture Reference Manual
.section .vector_table, "a" .section .vector_table, "a"
vector_table: vector_table:
.word main_stack_base // defined in linker script .word _stack_section_end // defined in linker script
add_handler reset_handler add_handler reset_handler
add_handler NMI_Handler add_handler NMI_Handler
add_handler HardFault_Handler add_handler HardFault_Handler
@ -132,8 +132,8 @@ vector_table:
.section .vector_table, "a" .section .vector_table, "a"
vector_table: vector_table:
.word _sstack .word _stack_section_start
.word _stack_size .word _stack_section_size
.word reset_handler .word reset_handler

View File

@ -6,7 +6,7 @@
.type reset_handler, STT_FUNC .type reset_handler, STT_FUNC
reset_handler: reset_handler:
// set the stack protection // set the stack protection
ldr r0, =_sstack ldr r0, =_stack_section_start
add r0, r0, #128 // safety margin for the exception frame add r0, r0, #128 // safety margin for the exception frame
msr MSPLIM, r0 msr MSPLIM, r0

View File

@ -6,7 +6,7 @@
.type reset_handler, STT_FUNC .type reset_handler, STT_FUNC
reset_handler: reset_handler:
// set the stack protection // set the stack protection
ldr r0, =_sstack ldr r0, =_stack_section_start
add r0, r0, #128 // safety margin for the exception frame add r0, r0, #128 // safety margin for the exception frame
msr MSPLIM, r0 msr MSPLIM, r0

View File

@ -6,7 +6,7 @@
.type reset_handler, STT_FUNC .type reset_handler, STT_FUNC
reset_handler: reset_handler:
// set the stack protection // set the stack protection
ldr r0, =_sstack ldr r0, =_stack_section_start
add r0, r0, #128 // safety margin for the exception frame add r0, r0, #128 // safety margin for the exception frame
msr MSPLIM, r0 msr MSPLIM, r0

View File

@ -20,7 +20,7 @@ default_handler:
// Section B1.5 - ARMv7-M Architecture Reference Manual // Section B1.5 - ARMv7-M Architecture Reference Manual
.section .vector_table, "a" .section .vector_table, "a"
vector_table: vector_table:
.word main_stack_base // defined in linker script .word _stack_section_end // defined in linker script
add_handler reset_handler add_handler reset_handler
add_handler NMI_Handler add_handler NMI_Handler
add_handler HardFault_Handler add_handler HardFault_Handler
@ -180,8 +180,8 @@ vector_table:
.section .vector_table, "a" .section .vector_table, "a"
vector_table: vector_table:
.word _sstack .word _stack_section_start
.word _stack_size .word _stack_section_size
.word reset_handler .word reset_handler
#endif #endif

View File

@ -55,8 +55,8 @@ typedef struct {
} systask_scheduler_t; } systask_scheduler_t;
// Kernel stack base pointer defined in linker script // Kernel stack base pointer defined in linker script
extern uint8_t _sstack; extern uint8_t _stack_section_start;
extern uint8_t _estack; extern uint8_t _stack_section_end;
// Global task manager state // Global task manager state
static systask_scheduler_t g_systask_scheduler = { static systask_scheduler_t g_systask_scheduler = {
@ -65,7 +65,7 @@ static systask_scheduler_t g_systask_scheduler = {
.active_task = &g_systask_scheduler.kernel_task, .active_task = &g_systask_scheduler.kernel_task,
.waiting_task = &g_systask_scheduler.kernel_task, .waiting_task = &g_systask_scheduler.kernel_task,
.kernel_task = { .kernel_task = {
.sp_lim = (uint32_t)&_sstack, .sp_lim = (uint32_t)&_stack_section_start,
}}; }};
void systask_scheduler_init(systask_error_handler_t error_handler) { void systask_scheduler_init(systask_error_handler_t error_handler) {
@ -77,7 +77,7 @@ void systask_scheduler_init(systask_error_handler_t error_handler) {
scheduler->active_task = &scheduler->kernel_task; scheduler->active_task = &scheduler->kernel_task;
scheduler->waiting_task = scheduler->active_task; scheduler->waiting_task = scheduler->active_task;
scheduler->kernel_task.sp_lim = (uint32_t)&_sstack; scheduler->kernel_task.sp_lim = (uint32_t)&_stack_section_start;
// SVCall priority should be the lowest since it is // SVCall priority should be the lowest since it is
// generally a blocking operation // generally a blocking operation
@ -541,7 +541,7 @@ __attribute__((naked, no_stack_protector)) void HardFault_Handler(void) {
"MOV R0, #1 \n" // R0 = 1 (Privileged) "MOV R0, #1 \n" // R0 = 1 (Privileged)
"B systask_exit_fault \n" // Exit task with fault "B systask_exit_fault \n" // Exit task with fault
: :
: [estack] "i"(&_estack) : [estack] "i"(&_stack_section_end)
: "memory"); : "memory");
} }
@ -565,7 +565,9 @@ __attribute__((naked, no_stack_protector)) void MemManage_Handler(void) {
#endif #endif
"B systask_exit_fault \n" // Exit task with fault "B systask_exit_fault \n" // Exit task with fault
: :
: [estack] "i"(&_estack), [sstack] "i"((uint32_t)&_sstack + 256) : [estack] "i"(&_stack_section_end), [sstack] "i"(
(uint32_t)&_stack_section_start +
256)
: "memory"); : "memory");
} }
@ -600,7 +602,7 @@ __attribute__((naked, no_stack_protector)) void UsageFault_Handler(void) {
"MOV R0, #1 \n" // R0 = 1 (Privileged) "MOV R0, #1 \n" // R0 = 1 (Privileged)
"B systask_exit_fault \n" // Exit task with fault "B systask_exit_fault \n" // Exit task with fault
: :
: [estack] "i"(&_estack) : [estack] "i"(&_stack_section_end)
: "memory"); : "memory");
} }

View File

@ -41,6 +41,10 @@
#ifdef KERNEL_MODE #ifdef KERNEL_MODE
// Kernel stack base pointer defined in linker script
extern uint8_t _stack_section_start;
extern uint8_t _stack_section_end;
void system_init(systask_error_handler_t error_handler) { void system_init(systask_error_handler_t error_handler) {
#if defined(TREZOR_MODEL_T2T1) && (!defined(BOARDLOADER)) #if defined(TREZOR_MODEL_T2T1) && (!defined(BOARDLOADER))
// Early boardloader versions on Model T initialized the CPU clock to 168MHz. // Early boardloader versions on Model T initialized the CPU clock to 168MHz.
@ -198,10 +202,10 @@ __attribute((naked, no_stack_protector)) void system_emergency_rescue(
// Setup new stack // Setup new stack
// -------------------------------------------------------------- // --------------------------------------------------------------
"LDR R0, =_estack \n" // Setup new stack "LDR R0, =%[estack] \n" // Setup new stack
"MSR MSP, R0 \n" // Set MSP "MSR MSP, R0 \n" // Set MSP
#if defined(__ARM_ARCH_8M_MAIN__) || defined(__ARM_ARCH_8M_BASE__) #if defined(__ARM_ARCH_8M_MAIN__) || defined(__ARM_ARCH_8M_BASE__)
"LDR R0, =_sstack \n" "LDR R0, =%[sstack] \n"
"ADD R0, R0, #256 \n" // Add safety margin "ADD R0, R0, #256 \n" // Add safety margin
"MSR MSPLIM, R0 \n" // Set MSPLIM "MSR MSPLIM, R0 \n" // Set MSPLIM
#endif #endif
@ -331,7 +335,8 @@ __attribute((naked, no_stack_protector)) void system_emergency_rescue(
"BX LR \n" "BX LR \n"
: // no output : // no output
: [PMINFO_SIZE] "i"(sizeof(systask_postmortem_t)), : [PMINFO_SIZE] "i"(sizeof(systask_postmortem_t)),
[STK_GUARD] "i"(&__stack_chk_guard) [STK_GUARD] "i"(&__stack_chk_guard), [estack] "i"(&_stack_section_end),
[sstack] "i"((uint32_t)&_stack_section_start)
: // no clobber : // no clobber
); );
} }