Changeset 973be64e in mainline for arch/mips32/src/interrupt.c


Ignore:
Timestamp:
2005-12-10T00:19:57Z (19 years ago)
Author:
Ondrej Palkovsky <ondrap@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
fcfac420
Parents:
705b4149
Message:

Added generic exc_register/exc_dispatch functions,
copied from ia32 architecture. Currently only mips32 uses them.

The chardev_t can now be both input & output device (was
needed for serial driver).

Broken other architectures - ia64, sparc, powerpc will not compile.

Mips32 supports input on all msim, gxemul, indy(tested emulation
in gxemul, loses characters), simics. Simics serial line
is done using polling, I was unable to make it produce
an interrupt when the key was pressed.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • arch/mips32/src/interrupt.c

    r705b4149 r973be64e  
    2727 */
    2828
     29#include <interrupt.h>
    2930#include <arch/interrupt.h>
    3031#include <arch/types.h>
     
    3637#include <symtab.h>
    3738#include <arch/drivers/arc.h>
    38 #include <arch/drivers/keyboard.h>
    3939
    4040static void print_regdump(struct exception_regdump *pstate)
     
    9494}
    9595
     96static void unhandled_exception(int n, void *stack)
     97{
     98        struct exception_regdump *pstate = (struct exception_regdump *)stack;
     99
     100        print_regdump(pstate);
     101        panic("unhandled interrupt %d\n", n);
     102}
     103
     104static void timer_exception(int n, void *stack)
     105{
     106        cp0_compare_write(cp0_count_read() + cp0_compare_value);
     107        clock();
     108}
     109
     110static void swint0(int n, void *stack)
     111{
     112        cp0_cause_write(cp0_cause_read() & ~(1 << 8)); /* clear SW0 interrupt */
     113}
     114
     115static void swint1(int n, void *stack)
     116{
     117        cp0_cause_write(cp0_cause_read() & ~(1 << 9)); /* clear SW1 interrupt */
     118}
     119
     120/** Basic exception handler */
    96121void interrupt(struct exception_regdump *pstate)
    97122{
     
    102127        cause = (cp0_cause_read() >> 8) &0xff;
    103128       
    104         for (i = 0; i < 8; i++) {
    105                 if (cause & (1 << i)) {
    106                         switch (i) {
    107                                 case 0: /* SW0 - Software interrupt 0 */
    108                                         cp0_cause_write(cp0_cause_read() & ~(1 << 8)); /* clear SW0 interrupt */
    109                                         break;
    110                                 case 1: /* SW1 - Software interrupt 1 */
    111                                         cp0_cause_write(cp0_cause_read() & ~(1 << 9)); /* clear SW1 interrupt */
    112                                         break;
    113                                 case KEYBOARD_IRQ:
    114                                         keyboard();
    115                                         break;
    116                                 case 3:
    117                                 case 4: /* IRQ2 */
    118                                 case 5: /* IRQ3 */
    119                                 case 6: /* IRQ4 */
    120                                 default:
    121                                         print_regdump(pstate);
    122                                         panic("unhandled interrupt %d\n", i);
    123                                         break;
    124                                 case TIMER_IRQ:
    125                                         /* clear timer interrupt & set new */
    126                                         cp0_compare_write(cp0_count_read() + cp0_compare_value);
    127                                         clock();
    128                                         keyboard_poll();
    129                                         break;
    130                         }
    131                 }
    132         }
     129        for (i = 0; i < 8; i++)
     130                if (cause & (1 << i))
     131                        exc_dispatch(i, (void *)pstate);
     132}
    133133
     134/* Initialize basic tables for exception dispatching */
     135void interrupt_init(void)
     136{
     137        int i;
     138
     139        for (i=0;i < IVT_ITEMS; i++)
     140                exc_register(i, "undef", unhandled_exception);
     141
     142        exc_register(TIMER_IRQ, "timer", timer_exception);
     143        exc_register(0, "swint0", swint0);
     144        exc_register(1, "swint1", swint1);
    134145}
Note: See TracChangeset for help on using the changeset viewer.