1.1 --- a/stage2/entry.S Sat Feb 27 23:41:17 2016 +0100
1.2 +++ b/stage2/entry.S Sun Feb 28 01:18:09 2016 +0100
1.3 @@ -19,6 +19,8 @@
1.4
1.5 .text
1.6 .extern interrupt_handler
1.7 +.extern current_registers
1.8 +.extern current_stack_pointer
1.9 .globl _tlb_entry
1.10 .globl _exc_entry
1.11 .globl _irq_entry
1.12 @@ -111,14 +113,40 @@
1.13 nop
1.14
1.15 _irq_entry:
1.16 + /* Set the ASID. */
1.17 +
1.18 + mtc0 $zero, $10 /* CP0_ENTRYHI */
1.19 + nop
1.20 +
1.21 + /* Obtain the kernel global offset table. */
1.22 +
1.23 + move $k0, $gp
1.24 + lui $gp, %hi(_GLOBAL_OFFSET_TABLE_)
1.25 + ori $gp, $gp, %lo(_GLOBAL_OFFSET_TABLE_)
1.26 +
1.27 + /* Obtain a store of registers for the current task. */
1.28 +
1.29 + la $k1, current_registers
1.30 + lw $k1, 0($k1)
1.31 +
1.32 /* Save registers that the assembler wants to trash. */
1.33
1.34 - sw $t9, -100($sp)
1.35 - sw $gp, -104($sp)
1.36 - sw $ra, -112($sp)
1.37 + sw $t9, 100($k1)
1.38 + sw $k0, 104($k1) /* old gp */
1.39 + sw $ra, 112($k1)
1.40 +
1.41 + /* Record the stack pointer. */
1.42
1.43 - lui $gp, %hi(_GLOBAL_OFFSET_TABLE_)
1.44 - ori $gp, $gp, %lo(_GLOBAL_OFFSET_TABLE_)
1.45 + la $k1, current_stack_pointer
1.46 + lw $k1, 0($k1) /* &stack_pointers[current_task] */
1.47 + sw $sp, 0($k1)
1.48 +
1.49 + /* Switch to the kernel stack. */
1.50 +
1.51 + li $sp, 0x80070000
1.52 +
1.53 + /* Invoke the rest of the interrupt handling process. */
1.54 +
1.55 la $k0, interrupt_handler
1.56 jr $k0
1.57 nop