1.1 --- a/stage2/cpu.c Sun Apr 24 18:06:32 2016 +0200
1.2 +++ b/stage2/cpu.c Sun Apr 24 18:07:05 2016 +0200
1.3 @@ -144,6 +144,23 @@
1.4 base[29] = (u32) function - 0x80000000; /* store the function address as EPC (for the handler) */
1.5 }
1.6
1.7 +void invoke_task(u32 *base)
1.8 +{
1.9 + asm volatile(
1.10 + "move $t3, %0\n"
1.11 + "lw $a0, 16($t3)\n"
1.12 + "lw $a1, 20($t3)\n"
1.13 + "lw $a2, 24($t3)\n"
1.14 + "lw $a3, 28($t3)\n"
1.15 + "lw $t9, 100($t3)\n"
1.16 + "lw $gp, 104($t3)\n"
1.17 + "jr $t9\n"
1.18 + "nop"
1.19 + :
1.20 + : "r" (base)
1.21 + );
1.22 +}
1.23 +
1.24 void enter_user_mode(void)
1.25 {
1.26 asm volatile(
2.1 --- a/stage2/cpu.h Sun Apr 24 18:06:32 2016 +0200
2.2 +++ b/stage2/cpu.h Sun Apr 24 18:07:05 2016 +0200
2.3 @@ -8,6 +8,7 @@
2.4 void enter_user_mode(void);
2.5 void set_task(u8);
2.6 void init_registers(u32 *, u32, void (*)(), u32[], u8);
2.7 +void invoke_task(u32 *);
2.8 void enable_interrupts(void);
2.9 void init_interrupts(void);
2.10 void init_tlb(void);
3.1 --- a/stage2/stage2.c Sun Apr 24 18:06:32 2016 +0200
3.2 +++ b/stage2/stage2.c Sun Apr 24 18:07:05 2016 +0200
3.3 @@ -50,11 +50,12 @@
3.4 /* Start the tasks. */
3.5
3.6 init_tasks();
3.7 + start_plot_pattern(0);
3.8 start_plot_pattern(1);
3.9 start_plot_pattern(2);
3.10
3.11 /* Now, wait for the tasks to be selected as interrupts occur. */
3.12
3.13 enable_interrupts();
3.14 - plot_pattern(3, 0, 120);
3.15 + start_task_now();
3.16 }
4.1 --- a/stage2/tasks.c Sun Apr 24 18:06:32 2016 +0200
4.2 +++ b/stage2/tasks.c Sun Apr 24 18:07:05 2016 +0200
4.3 @@ -83,6 +83,11 @@
4.4 init_registers(registers[task], _got_copy_start, function, args, nargs);
4.5 }
4.6
4.7 +void start_task_now()
4.8 +{
4.9 + invoke_task(current_registers);
4.10 +}
4.11 +
4.12 void switch_task()
4.13 {
4.14 /* Switch the current task. */
5.1 --- a/stage2/tasks.h Sun Apr 24 18:06:32 2016 +0200
5.2 +++ b/stage2/tasks.h Sun Apr 24 18:07:05 2016 +0200
5.3 @@ -7,9 +7,10 @@
5.4
5.5 /* Task management functions. */
5.6
5.7 -void init_tasks(void);
5.8 -void init_task(void);
5.9 +void init_tasks();
5.10 +void init_task();
5.11 void start_task(unsigned short, void (*)(), u32[], u8);
5.12 -void switch_task(void);
5.13 +void start_task_now();
5.14 +void switch_task();
5.15
5.16 #endif /* __TASKS_H__ */