# HG changeset patch # User Paul Boddie # Date 1462443564 -7200 # Node ID 739db6eca61a4a7f7462318fae8b74c10dfb83ac # Parent 174153b3fcbc9ec2775d5f29a52e74ec868caffa Permit entry into user mode by avoiding calling udelay which needs access to a timer in a privileged address space. diff -r 174153b3fcbc -r 739db6eca61a stage2/cpu_op.S --- a/stage2/cpu_op.S Wed May 04 23:59:04 2016 +0200 +++ b/stage2/cpu_op.S Thu May 05 12:19:24 2016 +0200 @@ -35,6 +35,7 @@ .globl enable_interrupts .globl init_interrupts .globl invoke_task +.globl enter_task .globl configure_tlb .globl map_page_set_index .globl map_page_index_op @@ -126,8 +127,10 @@ lw $t9, 100($t3) lw $gp, 104($t3) mtc0 $t9, CP0_EPC + +enter_task: mfc0 $t3, CP0_STATUS - ori $t3, $t3, STATUS_EXL + ori $t3, $t3, STATUS_EXL | STATUS_UM mtc0 $t3, CP0_STATUS eret nop diff -r 174153b3fcbc -r 739db6eca61a stage2/example.c --- a/stage2/example.c Wed May 04 23:59:04 2016 +0200 +++ b/stage2/example.c Thu May 05 12:19:24 2016 +0200 @@ -55,10 +55,12 @@ void plot_pattern(unsigned short pixel_type, unsigned short x, unsigned short y) { + int i; + while (1) { test_pixel(x, y, pixel_type); next_pixel(&x, &y); - udelay(100); + for (i = 0; i < 10000; i++); } } diff -r 174153b3fcbc -r 739db6eca61a stage2/handlers.S --- a/stage2/handlers.S Wed May 04 23:59:04 2016 +0200 +++ b/stage2/handlers.S Thu May 05 12:19:24 2016 +0200 @@ -25,8 +25,8 @@ .extern current_registers .extern current_stack_pointer .extern current_task +.extern enter_task .globl interrupt_handler -.globl enter_task .set noreorder .set noat @@ -150,8 +150,7 @@ lw $k0, 124($k1) mthi $k0 -enter_task: - eret + j enter_task nop .set reorder