# HG changeset patch # User Paul Boddie # Date 1461531255 -7200 # Node ID 02abb23dd68ec383f1e6a330646ec62178a889b8 # Parent ea7d1e467f746120d0d12179202df222c2cb114a Merged set_task into invoke_task, making sure that the ASID becomes set. diff -r ea7d1e467f74 -r 02abb23dd68e stage2/cpu.c --- a/stage2/cpu.c Sun Apr 24 22:41:55 2016 +0200 +++ b/stage2/cpu.c Sun Apr 24 22:54:15 2016 +0200 @@ -113,19 +113,6 @@ "nop\n"); } -void set_task(u8 asid) -{ - asm volatile( - - /* Set the ASID. */ - - "mtc0 %0, $10\n" /* CP0_ENTRYHI */ - "nop" - : - : "r" (asid) - ); -} - void init_registers(u32 *base, u32 got, void (*function)(), u32 args[], u8 nargs) { u8 i; @@ -144,10 +131,12 @@ base[29] = (u32) function - 0x80000000; /* store the function address as EPC (for the handler) */ } -void invoke_task(u32 *base) +void invoke_task(u8 asid, u32 *base) { asm volatile( - "move $t3, %0\n" + "mtc0 %0, $10\n" /* CP0_ENTRYHI */ + "nop\n" + "move $t3, %1\n" "lw $a0, 16($t3)\n" "lw $a1, 20($t3)\n" "lw $a2, 24($t3)\n" @@ -157,7 +146,7 @@ "jr $t9\n" "nop" : - : "r" (base) + : "r" (asid), "r" (base) ); } diff -r ea7d1e467f74 -r 02abb23dd68e stage2/cpu.h --- a/stage2/cpu.h Sun Apr 24 22:41:55 2016 +0200 +++ b/stage2/cpu.h Sun Apr 24 22:54:15 2016 +0200 @@ -3,15 +3,14 @@ #include "xburst_types.h" -void flush_cache_all(void); -void handle_error_level(void); -void enter_user_mode(void); -void set_task(u8); +void flush_cache_all(); +void handle_error_level(); +void enter_user_mode(); void init_registers(u32 *, u32, void (*)(), u32[], u8); -void invoke_task(u32 *); -void enable_interrupts(void); -void init_interrupts(void); -void init_tlb(void); +void invoke_task(u8, u32 *); +void enable_interrupts(); +void init_interrupts(); +void init_tlb(); void map_page(u32, u32, u32, u8, u8); void init_page_table(u32, u32, u32, u32, u8, u8); void map_page_miss(u32, u32, u8); diff -r ea7d1e467f74 -r 02abb23dd68e stage2/tasks.c --- a/stage2/tasks.c Sun Apr 24 22:41:55 2016 +0200 +++ b/stage2/tasks.c Sun Apr 24 22:54:15 2016 +0200 @@ -85,7 +85,7 @@ void start_task_now() { - invoke_task(current_registers); + invoke_task(current_task, current_registers); } void switch_task()