Rev 2787 | Rev 3125 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 2787 | Rev 3123 | ||
|---|---|---|---|
| Line 40... | Line 40... | ||
| 40 | #include <interrupt.h> |
40 | #include <interrupt.h> |
| 41 | #include <arch/machine.h> |
41 | #include <arch/machine.h> |
| 42 | #include <arch/mm/page_fault.h> |
42 | #include <arch/mm/page_fault.h> |
| 43 | #include <print.h> |
43 | #include <print.h> |
| 44 | #include <syscall/syscall.h> |
44 | #include <syscall/syscall.h> |
| - | 45 | #include <udebug/udebug.h> |
|
| 45 | 46 | ||
| 46 | /** Offset used in calculation of exception handler's relative address. |
47 | /** Offset used in calculation of exception handler's relative address. |
| 47 | * |
48 | * |
| 48 | * @see install_handler() |
49 | * @see install_handler() |
| 49 | */ |
50 | */ |
| Line 289... | Line 290... | ||
| 289 | { |
290 | { |
| 290 | istate->r0 = syscall_handler(istate->r0, istate->r1, istate->r2, |
291 | istate->r0 = syscall_handler(istate->r0, istate->r1, istate->r2, |
| 291 | istate->r3, istate->r4, istate->r5, istate->r6); |
292 | istate->r3, istate->r4, istate->r5, istate->r6); |
| 292 | } |
293 | } |
| 293 | 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 | ||
| 294 | /** Interrupt Exception handler. |
319 | /** Interrupt Exception handler. |
| 295 | * |
320 | * |
| 296 | * Determines the sources of interrupt and calls their handlers. |
321 | * Determines the sources of interrupt and calls their handlers. |
| 297 | */ |
322 | */ |
| 298 | static void irq_exception(int exc_no, istate_t *istate) |
323 | static void irq_exception(int exc_no, istate_t *istate) |
| Line 353... | Line 378... | ||
| 353 | install_exception_handlers(); |
378 | install_exception_handlers(); |
| 354 | 379 | ||
| 355 | exc_register(EXC_IRQ, "interrupt", (iroutine) irq_exception); |
380 | exc_register(EXC_IRQ, "interrupt", (iroutine) irq_exception); |
| 356 | exc_register(EXC_PREFETCH_ABORT, "prefetch abort", |
381 | exc_register(EXC_PREFETCH_ABORT, "prefetch abort", |
| 357 | (iroutine) prefetch_abort); |
382 | (iroutine) prefetch_abort); |
| 358 | exc_register(EXC_DATA_ABORT, "data abort", (iroutine) data_abort); |
383 | exc_register(EXC_DATA_ABORT, "data abort", |
| - | 384 | (iroutine) data_abort_exception); |
|
| 359 | exc_register(EXC_SWI, "software interrupt", (iroutine) swi_exception); |
385 | exc_register(EXC_SWI, "software interrupt", (iroutine) swi_exception); |
| 360 | } |
386 | } |
| 361 | 387 | ||
| 362 | /** Prints #istate_t structure content. |
388 | /** Prints #istate_t structure content. |
| 363 | * |
389 | * |