# HG changeset patch # User Paul Boddie # Date 1461534275 -7200 # Node ID 152e64b6487407d04a4c492c4dcb53adf90640f1 # Parent c345cbe0559740fbae39e53695cf1340c3f58db9 Added missing stack pointer initialisation to invoke_task. diff -r c345cbe05597 -r 152e64b64874 stage2/cpu.c --- a/stage2/cpu.c Sun Apr 24 23:26:46 2016 +0200 +++ b/stage2/cpu.c Sun Apr 24 23:44:35 2016 +0200 @@ -131,12 +131,14 @@ base[29] = (u32) function - 0x80000000; /* store the function address as EPC (for the handler) */ } -void invoke_task(u8 asid, u32 *base) +void invoke_task(u8 asid, u32 *base, u32 *stack_pointer) { asm volatile( "mtc0 %0, $10\n" /* CP0_ENTRYHI */ "nop\n" - "move $t3, %1\n" + "move $t4, %1\n" /* use arguments before they are overwritten */ + "lw $sp, 0($t4)\n" /* set the stack pointer */ + "move $t3, %2\n" /* load parameters from the stored registers */ "lw $a0, 16($t3)\n" "lw $a1, 20($t3)\n" "lw $a2, 24($t3)\n" @@ -146,7 +148,7 @@ "jr $t9\n" "nop" : - : "r" (asid), "r" (base) + : "r" (asid), "r" (stack_pointer), "r" (base) ); } diff -r c345cbe05597 -r 152e64b64874 stage2/cpu.h --- a/stage2/cpu.h Sun Apr 24 23:26:46 2016 +0200 +++ b/stage2/cpu.h Sun Apr 24 23:44:35 2016 +0200 @@ -7,7 +7,7 @@ void handle_error_level(); void enter_user_mode(); void init_registers(u32 *, u32, void (*)(), u32[], u8); -void invoke_task(u8, u32 *); +void invoke_task(u8, u32 *, u32 *); void enable_interrupts(); void init_interrupts(); void init_tlb(); diff -r c345cbe05597 -r 152e64b64874 stage2/tasks.c --- a/stage2/tasks.c Sun Apr 24 23:26:46 2016 +0200 +++ b/stage2/tasks.c Sun Apr 24 23:44:35 2016 +0200 @@ -85,7 +85,7 @@ void start_task_now() { - invoke_task(current_task, current_registers); + invoke_task(current_task, current_registers, current_stack_pointer); } void switch_task()