1.1 --- a/stage2/cpu.c Sun Apr 24 22:41:55 2016 +0200
1.2 +++ b/stage2/cpu.c Sun Apr 24 22:54:15 2016 +0200
1.3 @@ -113,19 +113,6 @@
1.4 "nop\n");
1.5 }
1.6
1.7 -void set_task(u8 asid)
1.8 -{
1.9 - asm volatile(
1.10 -
1.11 - /* Set the ASID. */
1.12 -
1.13 - "mtc0 %0, $10\n" /* CP0_ENTRYHI */
1.14 - "nop"
1.15 - :
1.16 - : "r" (asid)
1.17 - );
1.18 -}
1.19 -
1.20 void init_registers(u32 *base, u32 got, void (*function)(), u32 args[], u8 nargs)
1.21 {
1.22 u8 i;
1.23 @@ -144,10 +131,12 @@
1.24 base[29] = (u32) function - 0x80000000; /* store the function address as EPC (for the handler) */
1.25 }
1.26
1.27 -void invoke_task(u32 *base)
1.28 +void invoke_task(u8 asid, u32 *base)
1.29 {
1.30 asm volatile(
1.31 - "move $t3, %0\n"
1.32 + "mtc0 %0, $10\n" /* CP0_ENTRYHI */
1.33 + "nop\n"
1.34 + "move $t3, %1\n"
1.35 "lw $a0, 16($t3)\n"
1.36 "lw $a1, 20($t3)\n"
1.37 "lw $a2, 24($t3)\n"
1.38 @@ -157,7 +146,7 @@
1.39 "jr $t9\n"
1.40 "nop"
1.41 :
1.42 - : "r" (base)
1.43 + : "r" (asid), "r" (base)
1.44 );
1.45 }
1.46
2.1 --- a/stage2/cpu.h Sun Apr 24 22:41:55 2016 +0200
2.2 +++ b/stage2/cpu.h Sun Apr 24 22:54:15 2016 +0200
2.3 @@ -3,15 +3,14 @@
2.4
2.5 #include "xburst_types.h"
2.6
2.7 -void flush_cache_all(void);
2.8 -void handle_error_level(void);
2.9 -void enter_user_mode(void);
2.10 -void set_task(u8);
2.11 +void flush_cache_all();
2.12 +void handle_error_level();
2.13 +void enter_user_mode();
2.14 void init_registers(u32 *, u32, void (*)(), u32[], u8);
2.15 -void invoke_task(u32 *);
2.16 -void enable_interrupts(void);
2.17 -void init_interrupts(void);
2.18 -void init_tlb(void);
2.19 +void invoke_task(u8, u32 *);
2.20 +void enable_interrupts();
2.21 +void init_interrupts();
2.22 +void init_tlb();
2.23 void map_page(u32, u32, u32, u8, u8);
2.24 void init_page_table(u32, u32, u32, u32, u8, u8);
2.25 void map_page_miss(u32, u32, u8);
3.1 --- a/stage2/tasks.c Sun Apr 24 22:41:55 2016 +0200
3.2 +++ b/stage2/tasks.c Sun Apr 24 22:54:15 2016 +0200
3.3 @@ -85,7 +85,7 @@
3.4
3.5 void start_task_now()
3.6 {
3.7 - invoke_task(current_registers);
3.8 + invoke_task(current_task, current_registers);
3.9 }
3.10
3.11 void switch_task()