# HG changeset patch # User Paul Boddie # Date 1449359736 -3600 # Node ID f2ef4ea010d57ac3ae677a416e7a43f8222757f6 # Parent 430ab64882a15b0856e0747f03167efd852d0775 Reverted to the simpler ci20-os (CI20 bare-metal project) handling of interrupts, enabling interrupts and handling them successfully in a very basic fashion. Discarded the separate kernel stack for now. diff -r 430ab64882a1 -r f2ef4ea010d5 stage2/entry.S --- a/stage2/entry.S Sat Dec 05 19:42:12 2015 +0100 +++ b/stage2/entry.S Sun Dec 06 00:55:36 2015 +0100 @@ -18,35 +18,14 @@ */ .text -.extern real_exception_handler -.globl _tlb_entry -.globl _cache_entry -.globl _exc_entry +.extern interrupt_handler .globl _irq_entry .globl _end_entries .set noreorder -_tlb_entry: - lui $k0, %hi(real_exception_handler) - ori $k0, $k0, %lo(real_exception_handler) - jr $k0 - nop - -_cache_entry: - lui $k0, %hi(real_exception_handler) - ori $k0, $k0, %lo(real_exception_handler) - jr $k0 - nop - -_exc_entry: - lui $k0, %hi(real_exception_handler) - ori $k0, $k0, %lo(real_exception_handler) - jr $k0 - nop - _irq_entry: - lui $k0, %hi(real_exception_handler) - ori $k0, $k0, %lo(real_exception_handler) + lui $k0, %hi(interrupt_handler) + ori $k0, $k0, %lo(interrupt_handler) jr $k0 nop diff -r 430ab64882a1 -r f2ef4ea010d5 stage2/handlers.S --- a/stage2/handlers.S Sat Dec 05 19:42:12 2015 +0100 +++ b/stage2/handlers.S Sun Dec 06 00:55:36 2015 +0100 @@ -1,7 +1,7 @@ /* * Handler routines. * - * Copyright (C) 2008 by Maurus Cuelenaere + * Copyright (C) 2015 nfd * Copyright (C) 2015 Paul Boddie * * This program is free software: you can redistribute it and/or modify @@ -20,183 +20,80 @@ .text .extern irq_handle -.extern irq_counter -.globl _exc_stack -.globl real_exception_handler +.globl interrupt_handler .set noreorder .set noat -#define C0_STATUS $12 -#define C0_CAUSE $13 -#define C0_EPC $14 -#define C0_CONFIG $16 -#define C0_ERROREPC $30 -#define S_CauseExcCode 2 -#define M_CauseExcCode (0x1f << S_CauseExcCode) - -_exc_stack: - .word 0 +interrupt_handler: + sw $at, -4($sp) + sw $v0, -8($sp) + sw $v1, -12($sp) + sw $a0, -16($sp) + sw $a1, -20($sp) + sw $a2, -24($sp) + sw $a3, -28($sp) + sw $t0, -32($sp) + sw $t1, -36($sp) + sw $t2, -40($sp) + sw $t3, -44($sp) + sw $t4, -48($sp) + sw $t5, -52($sp) + sw $t6, -56($sp) + sw $t7, -60($sp) + sw $s0, -64($sp) + sw $s1, -68($sp) + sw $s2, -72($sp) + sw $s3, -76($sp) + sw $s4, -80($sp) + sw $s5, -84($sp) + sw $s6, -88($sp) + sw $s7, -92($sp) + sw $t8, -96($sp) + sw $t9, -100($sp) + sw $gp, -104($sp) + sw $fp, -108($sp) + sw $ra, -112($sp) -real_exception_handler: - addiu $sp, -0x88 /* multiple of 8 */ - sw $ra, 0($sp) - sw $fp, 4($sp) - sw $gp, 8($sp) - sw $t9, 0xC($sp) - sw $t8, 0x10($sp) - sw $s7, 0x14($sp) - sw $s6, 0x18($sp) - sw $s5, 0x1C($sp) - sw $s4, 0x20($sp) - sw $s3, 0x24($sp) - sw $s2, 0x28($sp) - sw $s1, 0x2C($sp) - sw $s0, 0x30($sp) - sw $t7, 0x34($sp) - sw $t6, 0x38($sp) - sw $t5, 0x3C($sp) - sw $t4, 0x40($sp) - sw $t3, 0x44($sp) - sw $t2, 0x48($sp) - sw $t1, 0x4C($sp) - sw $t0, 0x50($sp) - sw $a3, 0x54($sp) - sw $a2, 0x58($sp) - sw $a1, 0x5C($sp) - sw $a0, 0x60($sp) - sw $v1, 0x64($sp) - sw $v0, 0x68($sp) - sw $1, 0x6C($sp) - mflo $k0 - nop - sw $k0, 0x70($sp) - mfhi $k0 - nop - sw $k0, 0x74($sp) - mfc0 $k0, C0_STATUS - sll $zero, 1 - sll $zero, 1 - sll $zero, 1 - sll $zero, 1 - sw $k0, 0x78($sp) - mfc0 $k0, C0_EPC - sll $zero, 1 - sll $zero, 1 - sll $zero, 1 - sll $zero, 1 - sw $k0, 0x7C($sp) - mfc0 $k0, C0_ERROREPC - sll $zero, 1 - sll $zero, 1 - sll $zero, 1 - sll $zero, 1 - sw $k0, 0x80($sp) - - li $k1, M_CauseExcCode - mfc0 $k0, C0_CAUSE - and $k0, $k1 - beq $zero, $k0, _int - nop - j _exception - nop - -_int: - /* Initialise the kernel stack. */ + addi $sp, $sp, -112 - la $k1, _exc_stack - lw $k0, 0($k1) - sw $sp, 0($k0) - addiu $k0, -4 - move $sp, $k0 - - /* Initialise the globals pointer. */ + /* Invoke the handler. */ - lui $gp, %hi(_GLOBAL_OFFSET_TABLE_) - ori $gp, $gp, %lo(_GLOBAL_OFFSET_TABLE_) - - /* Test with counter. */ - - la $t0, irq_counter - lw $t1, 0($t0) - addiu $t1, $t1, 1 - sw $t1, 0($t0) - - /* Invoke the handler. */ + jal irq_handle + nop - jal irq_handle - nop - - /* Restore the user stack. */ - - addiu $sp, 4 - lw $sp, 0($sp) - - j _exception_return - nop - -_exception: - j _exception_return - nop + addi $sp, $sp, 112 -_exception_return: - lw $ra, 0($sp) - lw $fp, 4($sp) - lw $gp, 8($sp) - lw $t9, 0xC($sp) - lw $t8, 0x10($sp) - lw $s7, 0x14($sp) - lw $s6, 0x18($sp) - lw $s5, 0x1C($sp) - lw $s4, 0x20($sp) - lw $s3, 0x24($sp) - lw $s2, 0x28($sp) - lw $s1, 0x2C($sp) - lw $s0, 0x30($sp) - lw $t7, 0x34($sp) - lw $t6, 0x38($sp) - lw $t5, 0x3C($sp) - lw $t4, 0x40($sp) - lw $t3, 0x44($sp) - lw $t2, 0x48($sp) - lw $t1, 0x4C($sp) - lw $t0, 0x50($sp) - lw $a3, 0x54($sp) - lw $a2, 0x58($sp) - lw $a1, 0x5C($sp) - lw $a0, 0x60($sp) - lw $v1, 0x64($sp) - lw $v0, 0x68($sp) - lw $1, 0x6C($sp) - lw $k0, 0x70($sp) - mtlo $k0 - nop - lw $k0, 0x74($sp) - mthi $k0 - nop - lw $k0, 0x78($sp) - mtc0 $k0, C0_STATUS - nop - sll $zero, 1 - sll $zero, 1 - sll $zero, 1 - sll $zero, 1 - lw $k0, 0x7C($sp) - mtc0 $k0, C0_EPC - nop - sll $zero, 1 - sll $zero, 1 - sll $zero, 1 - sll $zero, 1 - lw $k0, 0x80($sp) - mtc0 $k0, C0_ERROREPC - nop - sll $zero, 1 - sll $zero, 1 - sll $zero, 1 - sll $zero, 1 - addiu $sp, 0x88 /* multiple of 8 */ - eret - nop + lw $at, -4($sp) + lw $v0, -8($sp) + lw $v1, -12($sp) + lw $a0, -16($sp) + lw $a1, -20($sp) + lw $a2, -24($sp) + lw $a3, -28($sp) + lw $t0, -32($sp) + lw $t1, -36($sp) + lw $t2, -40($sp) + lw $t3, -44($sp) + lw $t4, -48($sp) + lw $t5, -52($sp) + lw $t6, -56($sp) + lw $t7, -60($sp) + lw $s0, -64($sp) + lw $s1, -68($sp) + lw $s2, -72($sp) + lw $s3, -76($sp) + lw $s4, -80($sp) + lw $s5, -84($sp) + lw $s6, -88($sp) + lw $s7, -92($sp) + lw $t8, -96($sp) + lw $t9, -100($sp) + lw $gp, -104($sp) + lw $fp, -108($sp) + lw $ra, -112($sp) + + eret + nop .set reorder .set at diff -r 430ab64882a1 -r f2ef4ea010d5 stage2/head2.S --- a/stage2/head2.S Sat Dec 05 19:42:12 2015 +0100 +++ b/stage2/head2.S Sun Dec 06 00:55:36 2015 +0100 @@ -24,21 +24,15 @@ .text .extern c_main -.extern _tlb_entry -.extern _exc_entry .extern _irq_entry .extern _end_entries -.extern _exc_stack .globl _start .set noreorder _start: - /* Initialise the stacks. */ + /* Initialise the stack. */ la $sp, 0x80080000 - la $k0, 0x80090000 - la $k1, _exc_stack - sw $k0, 0($k1) /* Initialise the globals pointer. */ @@ -47,33 +41,9 @@ move $k0, $ra - /* Copy TLB handling instructions. */ - - la $t0, _tlb_entry /* start */ - li $t1, 0x80000000 - la $t2, _cache_entry /* end */ - jal _copy - nop - - /* Copy cache handling instructions. */ - - move $t0, $t2 /* start */ - li $t1, 0x80000100 - la $t2, _exc_entry /* end */ - jal _copy - nop - - /* Copy exception handling instructions. */ - - move $t0, $t2 /* start */ - li $t1, 0x80000180 - la $t2, _irq_entry /* end */ - jal _copy - nop - /* Copy IRQ handling instructions. */ - move $t0, $t2 /* start */ + la $t0, _irq_entry /* start */ li $t1, 0x80000200 la $t2, _end_entries /* end */ jal _copy diff -r 430ab64882a1 -r f2ef4ea010d5 stage2/irq.c --- a/stage2/irq.c Sat Dec 05 19:42:12 2015 +0100 +++ b/stage2/irq.c Sun Dec 06 00:55:36 2015 +0100 @@ -61,7 +61,7 @@ x = 0; y = 0; pixel_type = 1; handle_error_level(); init_interrupts(); - /* enable_interrupts(); */ + enable_interrupts(); } void irq_handle()