1.1 --- a/stage2/cpu.c Mon Feb 22 23:23:52 2016 +0100
1.2 +++ b/stage2/cpu.c Tue Feb 23 15:31:58 2016 +0100
1.3 @@ -87,6 +87,16 @@
1.4 "nop\n");
1.5 }
1.6
1.7 +void enter_user_mode(void)
1.8 +{
1.9 + asm volatile(
1.10 + "mfc0 $t3, $12\n" /* CP0_STATUS */
1.11 + "li $t4, 0xffffffef\n" /* KSU = 2 (UM = 1) */
1.12 + "and $t3, $t3, $t4\n"
1.13 + "mtc0 $t3, $12\n"
1.14 + "nop\n");
1.15 +}
1.16 +
1.17 void enable_interrupts(void)
1.18 {
1.19 asm volatile(
2.1 --- a/stage2/cpu.h Mon Feb 22 23:23:52 2016 +0100
2.2 +++ b/stage2/cpu.h Tue Feb 23 15:31:58 2016 +0100
2.3 @@ -5,6 +5,7 @@
2.4
2.5 void flush_cache_all(void);
2.6 void handle_error_level(void);
2.7 +void enter_user_mode(void);
2.8 void enable_interrupts(void);
2.9 void init_interrupts(void);
2.10 void init_tlb(void);
3.1 --- a/stage2/irq.c Mon Feb 22 23:23:52 2016 +0100
3.2 +++ b/stage2/irq.c Tue Feb 23 15:31:58 2016 +0100
3.3 @@ -99,5 +99,6 @@
3.4
3.5 void start_task()
3.6 {
3.7 + enter_user_mode();
3.8 plot_pattern();
3.9 }