Rev 3123 | Rev 3424 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 3123 | Rev 3125 | ||
|---|---|---|---|
| Line 290... | Line 290... | ||
| 290 | { |
290 | { |
| 291 | istate->r0 = syscall_handler(istate->r0, istate->r1, istate->r2, |
291 | istate->r0 = syscall_handler(istate->r0, istate->r1, istate->r2, |
| 292 | istate->r3, istate->r4, istate->r5, istate->r6); |
292 | istate->r3, istate->r4, istate->r5, istate->r6); |
| 293 | } |
293 | } |
| 294 | 294 | ||
| 295 | /** Data abort exception handler. |
- | |
| 296 | * |
- | |
| 297 | * Determines whether the exception was caused by a breakpoint |
- | |
| 298 | * instruction or a page fault. |
- | |
| 299 | */ |
- | |
| 300 | static void data_abort_exception(int exc_no, istate_t *istate) |
- | |
| 301 | { |
- | |
| 302 | uint32_t *instr_addr = (uint32_t *) istate->pc; |
- | |
| 303 | uint32_t opcode = *instr_addr; |
- | |
| 304 | - | ||
| 305 | if ((opcode & 0xfff000f0) == 0xe1200070) { |
- | |
| 306 | /* Bkpt */ |
- | |
| 307 | if (istate_from_uspace(istate)) { |
- | |
| 308 | udebug_breakpoint_event(0); |
- | |
| 309 | } else { |
- | |
| 310 | panic("Unexpected BKPT instruction at 0x%x", |
- | |
| 311 | istate->pc); |
- | |
| 312 | } |
- | |
| 313 | } else { |
- | |
| 314 | /* Page fault */ |
- | |
| 315 | data_abort(exc_no, istate); |
- | |
| 316 | } |
- | |
| 317 | } |
- | |
| 318 | - | ||
| 319 | /** Interrupt Exception handler. |
295 | /** Interrupt Exception handler. |
| 320 | * |
296 | * |
| 321 | * Determines the sources of interrupt and calls their handlers. |
297 | * Determines the sources of interrupt and calls their handlers. |
| 322 | */ |
298 | */ |
| 323 | static void irq_exception(int exc_no, istate_t *istate) |
299 | static void irq_exception(int exc_no, istate_t *istate) |
| Line 378... | Line 354... | ||
| 378 | install_exception_handlers(); |
354 | install_exception_handlers(); |
| 379 | 355 | ||
| 380 | exc_register(EXC_IRQ, "interrupt", (iroutine) irq_exception); |
356 | exc_register(EXC_IRQ, "interrupt", (iroutine) irq_exception); |
| 381 | exc_register(EXC_PREFETCH_ABORT, "prefetch abort", |
357 | exc_register(EXC_PREFETCH_ABORT, "prefetch abort", |
| 382 | (iroutine) prefetch_abort); |
358 | (iroutine) prefetch_abort); |
| 383 | exc_register(EXC_DATA_ABORT, "data abort", |
359 | exc_register(EXC_DATA_ABORT, "data abort", (iroutine) data_abort); |
| 384 | (iroutine) data_abort_exception); |
- | |
| 385 | exc_register(EXC_SWI, "software interrupt", (iroutine) swi_exception); |
360 | exc_register(EXC_SWI, "software interrupt", (iroutine) swi_exception); |
| 386 | } |
361 | } |
| 387 | 362 | ||
| 388 | /** Prints #istate_t structure content. |
363 | /** Prints #istate_t structure content. |
| 389 | * |
364 | * |