diff options
Diffstat (limited to 'asm')
-rw-r--r-- | asm/asm-offsets.c | 4 | ||||
-rw-r--r-- | asm/head.S | 8 | ||||
-rw-r--r-- | asm/misc.S | 9 |
3 files changed, 20 insertions, 1 deletions
diff --git a/asm/asm-offsets.c b/asm/asm-offsets.c index e33c181..4fb2344 100644 --- a/asm/asm-offsets.c +++ b/asm/asm-offsets.c @@ -36,6 +36,10 @@ int main(void) OFFSET(CPUTHREAD_SAVE_R1, cpu_thread, save_r1); OFFSET(CPUTHREAD_STATE, cpu_thread, state); OFFSET(CPUTHREAD_CUR_TOKEN, cpu_thread, current_token); + DEFINE(CPUTHREAD_GAP, sizeof(struct cpu_thread) + STACK_SAFETY_GAP); + OFFSET(CPUTHREAD_STACK_BOT_MARK, cpu_thread, stack_bot_mark); + OFFSET(CPUTHREAD_STACK_BOT_PC, cpu_thread, stack_bot_pc); + OFFSET(CPUTHREAD_STACK_BOT_TOK, cpu_thread, stack_bot_tok); OFFSET(STACK_TYPE, stack_frame, type); OFFSET(STACK_LOCALS, stack_frame, locals); @@ -308,8 +308,14 @@ boot_entry: addi %r3,%r3,8 bdnz 1b - /* Jump to C */ + /* Get our per-cpu pointer into r13 */ GET_CPU() + + /* Initialize stack bottom mark to 0, it will be updated in C code */ + li %r0,0 + std %r0,CPUTHREAD_STACK_BOT_MARK(%r13) + + /* Jump to C */ mr %r3,%r27 mr %r4,%r25 bl main_cpu_entry @@ -17,6 +17,7 @@ #include <asm-utils.h> #include <asm-offsets.h> #include <processor.h> +#include <stack.h> .section ".text","ax" .balign 0x10 @@ -41,3 +42,11 @@ trigger_attn: isync attn blr + +#ifdef STACK_CHECK_ENABLED +.global _mcount +_mcount: + mr %r3,%r1 + mflr %r4 + b __mcount_stack_check +#endif |