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