Subversion Repositories HelenOS

Rev

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

Rev 2071 Rev 2608
Line 124... Line 124...
124
char *vector_to_string(uint16_t vector)
124
char *vector_to_string(uint16_t vector)
125
{
125
{
126
    ASSERT(vector <= VECTOR_MAX);
126
    ASSERT(vector <= VECTOR_MAX);
127
   
127
   
128
    if (vector >= VECTORS_16_BUNDLE_START)
128
    if (vector >= VECTORS_16_BUNDLE_START)
-
 
129
        return vector_names_16_bundle[(vector -
129
        return vector_names_16_bundle[(vector-VECTORS_16_BUNDLE_START)/(16*BUNDLE_SIZE)];
130
            VECTORS_16_BUNDLE_START) / (16 * BUNDLE_SIZE)];
130
    else
131
    else
131
        return vector_names_64_bundle[vector/(64*BUNDLE_SIZE)];
132
        return vector_names_64_bundle[vector / (64 * BUNDLE_SIZE)];
132
}
133
}
133
 
134
 
134
void dump_interrupted_context(istate_t *istate)
135
void dump_interrupted_context(istate_t *istate)
135
{
136
{
136
    char *ifa, *iipa, *iip;
137
    char *ifa, *iipa, *iip;
Line 139... Line 140...
139
    iipa = get_symtab_entry(istate->cr_iipa);
140
    iipa = get_symtab_entry(istate->cr_iipa);
140
    iip = get_symtab_entry(istate->cr_iip);
141
    iip = get_symtab_entry(istate->cr_iip);
141
 
142
 
142
    putchar('\n');
143
    putchar('\n');
143
    printf("Interrupted context dump:\n");
144
    printf("Interrupted context dump:\n");
144
    printf("ar.bsp=%p\tar.bspstore=%p\n", istate->ar_bsp, istate->ar_bspstore);
145
    printf("ar.bsp=%p\tar.bspstore=%p\n", istate->ar_bsp,
-
 
146
        istate->ar_bspstore);
145
    printf("ar.rnat=%#018llx\tar.rsc=%#018llx\n", istate->ar_rnat, istate->ar_rsc);
147
    printf("ar.rnat=%#018llx\tar.rsc=%#018llx\n", istate->ar_rnat,
-
 
148
        istate->ar_rsc);
146
    printf("ar.ifs=%#018llx\tar.pfs=%#018llx\n", istate->ar_ifs, istate->ar_pfs);
149
    printf("ar.ifs=%#018llx\tar.pfs=%#018llx\n", istate->ar_ifs,
-
 
150
        istate->ar_pfs);
147
    printf("cr.isr=%#018llx\tcr.ipsr=%#018llx\t\n", istate->cr_isr.value, istate->cr_ipsr);
151
    printf("cr.isr=%#018llx\tcr.ipsr=%#018llx\t\n", istate->cr_isr.value,
-
 
152
        istate->cr_ipsr);
148
   
153
   
149
    printf("cr.iip=%#018llx, #%d\t(%s)\n", istate->cr_iip, istate->cr_isr.ei, iip);
154
    printf("cr.iip=%#018llx, #%d\t(%s)\n", istate->cr_iip,
-
 
155
        istate->cr_isr.ei, iip);
150
    printf("cr.iipa=%#018llx\t(%s)\n", istate->cr_iipa, iipa);
156
    printf("cr.iipa=%#018llx\t(%s)\n", istate->cr_iipa, iipa);
151
    printf("cr.ifa=%#018llx\t(%s)\n", istate->cr_ifa, ifa);
157
    printf("cr.ifa=%#018llx\t(%s)\n", istate->cr_ifa, ifa);
152
}
158
}
153
 
159
 
154
void general_exception(uint64_t vector, istate_t *istate)
160
void general_exception(uint64_t vector, istate_t *istate)
Line 188... Line 194...
188
void disabled_fp_register(uint64_t vector, istate_t *istate)
194
void disabled_fp_register(uint64_t vector, istate_t *istate)
189
{
195
{
190
#ifdef CONFIG_FPU_LAZY 
196
#ifdef CONFIG_FPU_LAZY 
191
    scheduler_fpu_lazy_request();  
197
    scheduler_fpu_lazy_request();  
192
#else
198
#else
193
    fault_if_from_uspace(istate, "Interruption: %#hx (%s)", (uint16_t) vector, vector_to_string(vector));
199
    fault_if_from_uspace(istate, "Interruption: %#hx (%s)",
-
 
200
        (uint16_t) vector, vector_to_string(vector));
194
    dump_interrupted_context(istate);
201
    dump_interrupted_context(istate);
195
    panic("Interruption: %#hx (%s)\n", (uint16_t) vector, vector_to_string(vector));
202
    panic("Interruption: %#hx (%s)\n", (uint16_t) vector,
-
 
203
        vector_to_string(vector));
196
#endif
204
#endif
197
}
205
}
198
 
206
 
199
void nop_handler(uint64_t vector, istate_t *istate)
207
void nop_handler(uint64_t vector, istate_t *istate)
200
{
208
{
Line 211... Line 219...
211
        istate->cr_iip += 16;
219
        istate->cr_iip += 16;
212
    } else {
220
    } else {
213
        istate->cr_ipsr.ri++;
221
        istate->cr_ipsr.ri++;
214
    }
222
    }
215
 
223
 
216
    return syscall_handler(istate->in0, istate->in1, istate->in2, istate->in3, istate->in4);
224
    return syscall_handler(istate->in0, istate->in1, istate->in2,
-
 
225
        istate->in3, istate->in4, istate->in5, istate->in6);
217
}
226
}
218
 
227
 
219
void universal_handler(uint64_t vector, istate_t *istate)
228
void universal_handler(uint64_t vector, istate_t *istate)
220
{
229
{
221
    fault_if_from_uspace(istate,"Interruption: %#hx (%s)\n",(uint16_t) vector, vector_to_string(vector));
230
    fault_if_from_uspace(istate, "Interruption: %#hx (%s)\n",
-
 
231
        (uint16_t) vector, vector_to_string(vector));
222
    dump_interrupted_context(istate);
232
    dump_interrupted_context(istate);
223
    panic("Interruption: %#hx (%s)\n", (uint16_t) vector, vector_to_string(vector));
233
    panic("Interruption: %#hx (%s)\n", (uint16_t) vector,
-
 
234
        vector_to_string(vector));
224
}
235
}
225
 
236
 
226
void external_interrupt(uint64_t vector, istate_t *istate)
237
void external_interrupt(uint64_t vector, istate_t *istate)
227
{
238
{
228
    irq_t *irq;
239
    irq_t *irq;
Line 242... Line 253...
242
            printf("cpu%d: spurious interrupt\n", CPU->id);
253
            printf("cpu%d: spurious interrupt\n", CPU->id);
243
#endif
254
#endif
244
            break;
255
            break;
245
 
256
 
246
        default:
257
        default:
247
            panic("\nUnhandled External Interrupt Vector %d\n", ivr.vector);
258
            panic("\nUnhandled External Interrupt Vector %d\n",
-
 
259
                ivr.vector);
248
            break;
260
            break;
249
        }
261
        }
250
    }
262
    }
251
}
263
}
252
 
264