1.1 --- a/stage2/irq.c Fri Feb 26 00:44:01 2016 +0100
1.2 +++ b/stage2/irq.c Fri Feb 26 01:09:43 2016 +0100
1.3 @@ -185,3 +185,52 @@
1.4
1.5 current_stack_pointer = stack_pointers[current_task];
1.6 }
1.7 +
1.8 +void invoke_task(unsigned short task)
1.9 +{
1.10 + current_task = task;
1.11 + current_stack_pointer = stack_pointers[current_task];
1.12 + map_page(stack_start - stack_size, stack_start + stack_size * current_task - stack_size, pagesize, 0x1e, current_task);
1.13 + set_task(current_task);
1.14 +
1.15 + asm volatile(
1.16 + ".set noat\n"
1.17 + "move $sp, %0\n"
1.18 + "addi $sp, $sp, 120\n"
1.19 + "lw $at, -4($sp)\n"
1.20 + "lw $v0, -8($sp)\n"
1.21 + "lw $v1, -12($sp)\n"
1.22 + "lw $a0, -16($sp)\n"
1.23 + "lw $a1, -20($sp)\n"
1.24 + "lw $a2, -24($sp)\n"
1.25 + "lw $a3, -28($sp)\n"
1.26 + "lw $t0, -32($sp)\n"
1.27 + "lw $t1, -36($sp)\n"
1.28 + "lw $t2, -40($sp)\n"
1.29 + "lw $t3, -44($sp)\n"
1.30 + "lw $t4, -48($sp)\n"
1.31 + "lw $t5, -52($sp)\n"
1.32 + "lw $t6, -56($sp)\n"
1.33 + "lw $t7, -60($sp)\n"
1.34 + "lw $s0, -64($sp)\n"
1.35 + "lw $s1, -68($sp)\n"
1.36 + "lw $s2, -72($sp)\n"
1.37 + "lw $s3, -76($sp)\n"
1.38 + "lw $s4, -80($sp)\n"
1.39 + "lw $s5, -84($sp)\n"
1.40 + "lw $s6, -88($sp)\n"
1.41 + "lw $s7, -92($sp)\n"
1.42 + "lw $t8, -96($sp)\n"
1.43 + "lw $t9, -100($sp)\n"
1.44 + "lw $gp, -104($sp)\n"
1.45 + "lw $fp, -108($sp)\n"
1.46 + "lw $ra, -112($sp)\n"
1.47 + "lw $k0, -116($sp)\n"
1.48 + "mtc0 $k0, $14\n" /* CP0_EPC */
1.49 + "nop\n"
1.50 + "jr $ra\n"
1.51 + "nop"
1.52 + :
1.53 + : "r" (current_stack_pointer)
1.54 + );
1.55 +}
2.1 --- a/stage2/stage2.c Fri Feb 26 00:44:01 2016 +0100
2.2 +++ b/stage2/stage2.c Fri Feb 26 01:09:43 2016 +0100
2.3 @@ -55,7 +55,7 @@
2.4 /* Now, wait for the tasks to be selected as interrupts occur. */
2.5
2.6 irq_init();
2.7 - plot_pattern(1, 0, 0);
2.8 + invoke_task(1);
2.9
2.10 while (1) asm volatile("wait");
2.11 }