Subversion Repositories HelenOS-historic

Rev

Rev 574 | Rev 590 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 574 Rev 575
Line 24... Line 24...
24
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
 */
27
 */
28
 
28
 
-
 
29
#include <interrupt.h>
29
#include <arch/interrupt.h>
30
#include <arch/interrupt.h>
30
#include <arch/types.h>
31
#include <arch/types.h>
31
#include <arch.h>
32
#include <arch.h>
32
#include <arch/cp0.h>
33
#include <arch/cp0.h>
33
#include <time/clock.h>
34
#include <time/clock.h>
34
#include <panic.h>
35
#include <panic.h>
35
#include <print.h>
36
#include <print.h>
36
#include <symtab.h>
37
#include <symtab.h>
37
#include <arch/drivers/arc.h>
38
#include <arch/drivers/arc.h>
38
#include <arch/drivers/keyboard.h>
-
 
39
 
39
 
40
static void print_regdump(struct exception_regdump *pstate)
40
static void print_regdump(struct exception_regdump *pstate)
41
{
41
{
42
    char *pcsymbol = "";
42
    char *pcsymbol = "";
43
    char *rasymbol = "";
43
    char *rasymbol = "";
Line 91... Line 91...
91
ipl_t interrupts_read(void)
91
ipl_t interrupts_read(void)
92
{
92
{
93
    return cp0_status_read();
93
    return cp0_status_read();
94
}
94
}
95
 
95
 
-
 
96
static 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
 
-
 
104
static void timer_exception(int n, void *stack)
-
 
105
{
-
 
106
    cp0_compare_write(cp0_count_read() + cp0_compare_value);
-
 
107
    clock();
-
 
108
}
-
 
109
 
-
 
110
static void swint0(int n, void *stack)
-
 
111
{
-
 
112
    cp0_cause_write(cp0_cause_read() & ~(1 << 8)); /* clear SW0 interrupt */
-
 
113
}
-
 
114
 
-
 
115
static 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 */
96
void interrupt(struct exception_regdump *pstate)
121
void interrupt(struct exception_regdump *pstate)
97
{
122
{
98
    __u32 cause;
123
    __u32 cause;
99
    int i;
124
    int i;
100
   
125
   
101
    /* decode interrupt number and process the interrupt */
126
    /* decode interrupt number and process the interrupt */
102
    cause = (cp0_cause_read() >> 8) &0xff;
127
    cause = (cp0_cause_read() >> 8) &0xff;
103
   
128
   
104
    for (i = 0; i < 8; i++) {
129
    for (i = 0; i < 8; i++)
105
        if (cause & (1 << i)) {
130
        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);
131
            exc_dispatch(i, (void *)pstate);
122
                    panic("unhandled interrupt %d\n", i);
-
 
123
                    break;
132
}
124
                case TIMER_IRQ:
-
 
-
 
133
 
125
                    /* clear timer interrupt & set new */
134
/* Initialize basic tables for exception dispatching */
126
                    cp0_compare_write(cp0_count_read() + cp0_compare_value);
-
 
127
                    clock();
-
 
128
                    keyboard_poll();
135
void interrupt_init(void)
129
                    break;
-
 
130
            }
136
{
131
        }
137
    int i;
132
    }
138
 
-
 
139
    for (i=0;i < IVT_ITEMS; i++)
-
 
140
        exc_register(i, "undef", unhandled_exception);
133
 
141
 
-
 
142
    exc_register(TIMER_IRQ, "timer", timer_exception);
-
 
143
    exc_register(0, "swint0", swint0);
-
 
144
    exc_register(1, "swint1", swint1);
134
}
145
}