1/*
2 * Copyright (c) 2007, 2008, 2009, ETH Zurich.
3 * All rights reserved.
4 *
5 * This file is distributed under the terms in the attached LICENSE file.
6 * If you do not find this file, copies can be found by writing to:
7 * ETH Zurich D-INFK, Universitaetstrasse 6, CH-8092 Zurich. Attn: Systems Group.
8 */
9
10#ifndef __EXCEPTIONS_H__
11#define __EXCEPTIONS_H__
12
13#define ARM_EVECTOR_RESET 0x00
14#define ARM_EVECTOR_UNDEF 0x04
15#define ARM_EVECTOR_SWI   0x08
16#define ARM_EVECTOR_PABT  0x0c
17#define ARM_EVECTOR_DABT  0x10
18#define ARM_EVECTOR_IRQ   0x18
19#define ARM_EVECTOR_FIQ   0x1c
20
21#define CACHE_LINE_BYTES 32
22
23#if !defined(__ASSEMBLER__)
24
25#include <barrelfish_kpi/dispatcher_shared_arch.h>
26
27/* This is the exception jump table, defined in armv7/exceptions.S. */
28extern uint32_t exception_vectors[8];
29
30/**
31 * Handle page fault in user-mode process.
32 *
33 * This function should be called in SVC mode with interrupts disabled.
34 */
35void handle_user_page_fault(lvaddr_t                fault_address,
36                            arch_registers_state_t* saved_context,
37			    struct dispatcher_shared_arm *disp)
38    __attribute__((noreturn));
39
40/**
41 * Handle undefined instruction fault in user-mode process.
42 *
43 * This function should be called in SVC mode with interrupts disabled.
44 */
45void handle_user_undef(lvaddr_t                fault_address,
46                       arch_registers_state_t* saved_context,
47		       struct dispatcher_shared_arm *disp)
48    __attribute__((noreturn));
49
50/**
51 * Handle faults in occuring in a priviledged mode.
52 *
53 * This function should be called in SVC mode with interrupts disabled.
54 */
55void fatal_kernel_fault(uint32_t   evector,
56                        lvaddr_t   fault_address,
57                        arch_registers_state_t* saved_context)
58    __attribute__((noreturn));
59
60/**
61 * Handle IRQs in occuring in SYS mode.
62 *
63 * This panics - we should never take an interrupt in SYS mode.
64 */
65void handle_irq_kernel(arch_registers_state_t* save_area, uintptr_t fault_pc)
66    __attribute__((noreturn));
67
68/**
69 * Handle IRQs in occuring in USR mode.
70 *
71 * This function should be called in SVC mode with interrupts disabled.
72 */
73struct dispatcher_shared_generic;
74void handle_irq(arch_registers_state_t* save_area,
75		uintptr_t fault_pc,
76		struct dispatcher_shared_arm *disp)
77    __attribute__((noreturn));
78
79/**
80 * Handle FIQs in occuring in SYS mode.
81 *
82 * This panics - we should never take an interrupt in SYS mode.
83 */
84void handle_fiq_kernel(arch_registers_state_t* save_area, uintptr_t fault_pc)
85    __attribute__((noreturn));
86
87/**
88 * Handle FIQs in occuring in USR mode.
89 *
90 * This function should be called in SVC mode with interrupts disabled.
91 */
92struct dispatcher_shared_generic;
93void handle_fiq(arch_registers_state_t* save_area,
94		uintptr_t fault_pc,
95		struct dispatcher_shared_generic *disp)
96    __attribute__((noreturn));
97
98#endif // !defined(__ASSEMBLER__)
99
100#endif // __EXCEPTIONS_H__
101
102