Subversion Repositories HelenOS-historic

Rev

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

Rev 68 Rev 123
Line 34... Line 34...
34
 
34
 
35
void exception(void)
35
void exception(void)
36
{
36
{
37
    int excno;
37
    int excno;
38
    __u32 epc;
38
    __u32 epc;
-
 
39
    __u32 epc_shift = 0;
39
    pri_t pri;
40
    pri_t pri;
40
   
41
   
41
    pri = cpu_priority_high();
42
    pri = cpu_priority_high();
42
    epc = cp0_epc_read();
43
    epc = cp0_epc_read();
43
    cp0_status_write(cp0_status_read() & ~ cp0_status_exl_exception_bit);
44
    cp0_status_write(cp0_status_read() & ~ cp0_status_exl_exception_bit);
Line 45... Line 46...
45
    if (THREAD) {
46
    if (THREAD) {
46
        THREAD->saved_pri = pri;
47
        THREAD->saved_pri = pri;
47
        THREAD->saved_epc = epc;
48
        THREAD->saved_epc = epc;
48
    }
49
    }
49
    /* decode exception number and process the exception */
50
    /* decode exception number and process the exception */
50
    switch(excno = (cp0_cause_read()>>2)&0x1f) {
51
    switch (excno = (cp0_cause_read() >> 2) & 0x1f) {
51
        case EXC_Int: interrupt(); break;
52
        case EXC_Int:
-
 
53
            interrupt();
-
 
54
            break;
52
        case EXC_TLBL:
55
        case EXC_TLBL:
-
 
56
        case EXC_TLBS:
53
        case EXC_TLBS: tlb_invalid(); break;
57
            tlb_invalid();
-
 
58
            break;
-
 
59
        case EXC_Mod:
-
 
60
            panic("unhandled TLB Modification Exception\n");
-
 
61
            break;
-
 
62
        case EXC_AdEL:
-
 
63
            panic("unhandled Address Error Exception - load or instruction fetch\n");
-
 
64
            break;
-
 
65
        case EXC_AdES:
-
 
66
            panic("unhandled Address Error Exception - store\n");
-
 
67
            break;
-
 
68
        case EXC_IBE:
-
 
69
            panic("unhandled Bus Error Exception - fetch instruction\n");
-
 
70
            break;
-
 
71
        case EXC_DBE:
-
 
72
            panic("unhandled Bus Error Exception - data reference: load or store\n");
-
 
73
            break;
-
 
74
        case EXC_Bp:
-
 
75
            /* it is necessary to not re-execute BREAK instruction after returning from Exception handler
-
 
76
               (see page 138 in R4000 Manual for more information) */
-
 
77
            epc_shift = 4;
-
 
78
            break;
-
 
79
        case EXC_RI:
-
 
80
            panic("unhandled Reserved Instruction Exception\n");
-
 
81
            break;
-
 
82
        case EXC_CpU:
-
 
83
            panic("unhandled Coprocessor Unusable Exception\n");
-
 
84
            break;
-
 
85
        case EXC_Ov:
-
 
86
            panic("unhandled Arithmetic Overflow Exception\n");
-
 
87
            break;
-
 
88
        case EXC_Tr:
-
 
89
            panic("unhandled Trap Exception\n");
-
 
90
            break;
-
 
91
        case EXC_VCEI:
-
 
92
            panic("unhandled Virtual Coherency Exception - instruction\n");
-
 
93
            break;
-
 
94
        case EXC_FPE:
-
 
95
            panic("unhandled Floating-Point Exception\n");
-
 
96
            break;
-
 
97
        case EXC_WATCH:
-
 
98
            panic("unhandled reference to WatchHi/WatchLo address\n");
-
 
99
            break;
-
 
100
        case EXC_VCED:
-
 
101
            panic("unhandled Virtual Coherency Exception - data\n");
-
 
102
            break;
-
 
103
        default:
54
        default: panic("unhandled exception %d\n", excno); break;
104
            panic("unhandled exception %d\n", excno);
55
    }
105
    }
56
   
106
   
57
    if (THREAD) {
107
    if (THREAD) {
58
        pri = THREAD->saved_pri;
108
        pri = THREAD->saved_pri;
59
        epc = THREAD->saved_epc;
109
        epc = THREAD->saved_epc;
60
    }
110
    }
61
 
111
 
62
    cp0_epc_write(epc);
112
    cp0_epc_write(epc + epc_shift);
63
    cp0_status_write(cp0_status_read() | cp0_status_exl_exception_bit);
113
    cp0_status_write(cp0_status_read() | cp0_status_exl_exception_bit);
64
    cpu_priority_restore(pri);
114
    cpu_priority_restore(pri);
65
}
115
}