1 /* 2 * 3 * Copyright 2013 Google Inc. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 3. The name of the author may not be used to endorse or promote products 14 * derived from this software without specific prior written permission. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 * SUCH DAMAGE. 27 */ 28 29 #ifndef _ARCH_EXCEPTION_H 30 #define _ARCH_EXCEPTION_H 31 32 #include <stddef.h> 33 #include <stdint.h> 34 35 void exception_init_asm(void); 36 void exception_dispatch(void); 37 void enable_interrupts(void); 38 void disable_interrupts(void); 39 /** Returns 1 if interrupts are enabled. */ 40 int interrupts_enabled(void); 41 42 #if CONFIG(LP_ARCH_X86_64) 43 struct exception_state { 44 /* Careful: x86/gdb.c currently relies on the size and order of regs. */ 45 struct { 46 size_t reg_ax; 47 size_t reg_bx; 48 size_t reg_cx; 49 size_t reg_dx; 50 size_t reg_si; 51 size_t reg_di; 52 size_t reg_bp; 53 size_t reg_sp; 54 size_t reg_r8; 55 size_t reg_r9; 56 size_t reg_r10; 57 size_t reg_r11; 58 size_t reg_r12; 59 size_t reg_r13; 60 size_t reg_r14; 61 size_t reg_r15; 62 size_t reg_ip; 63 size_t reg_flags; 64 u32 cs; 65 u32 ss; 66 u32 ds; 67 u32 es; 68 u32 fs; 69 u32 gs; 70 } regs; 71 size_t error_code; 72 size_t vector; 73 } __packed; 74 #else 75 struct exception_state { 76 /* Careful: x86/gdb.c currently relies on the size and order of regs. */ 77 struct { 78 size_t reg_ax; 79 size_t reg_cx; 80 size_t reg_dx; 81 size_t reg_bx; 82 size_t reg_sp; 83 size_t reg_bp; 84 size_t reg_si; 85 size_t reg_di; 86 size_t reg_ip; 87 size_t reg_flags; 88 u32 cs; 89 u32 ss; 90 u32 ds; 91 u32 es; 92 u32 fs; 93 u32 gs; 94 } regs; 95 size_t error_code; 96 size_t vector; 97 } __packed; 98 #endif 99 100 extern struct exception_state *exception_state; 101 102 extern u8 exception_stack[]; 103 extern u8 *exception_stack_end; 104 105 enum { 106 EXC_DE = 0, /* Divide by zero */ 107 EXC_DB = 1, /* Debug */ 108 EXC_NMI = 2, /* Non maskable interrupt */ 109 EXC_BP = 3, /* Breakpoint */ 110 EXC_OF = 4, /* Overflow */ 111 EXC_BR = 5, /* Bound range */ 112 EXC_UD = 6, /* Invalid opcode */ 113 EXC_NM = 7, /* Device not available */ 114 EXC_DF = 8, /* Double fault */ 115 EXC_TS = 10, /* Invalid TSS */ 116 EXC_NP = 11, /* Segment not present */ 117 EXC_SS = 12, /* Stack */ 118 EXC_GP = 13, /* General protection */ 119 EXC_PF = 14, /* Page fault */ 120 EXC_MF = 16, /* x87 floating point */ 121 EXC_AC = 17, /* Alignment check */ 122 EXC_MC = 18, /* Machine check */ 123 EXC_XF = 19, /* SIMD floating point */ 124 EXC_SX = 30, /* Security */ 125 EXC_COUNT 126 }; 127 128 #endif 129