Changeset aecf79f in mainline for kernel/arch/xen32/src/interrupt.c
- Timestamp:
- 2006-07-24T16:07:15Z (18 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- c59dd1a2
- Parents:
- 7b0599b
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/xen32/src/interrupt.c
-
Property mode
changed from
120000
to100644
r7b0599b raecf79f 1 ../../ia32/src/interrupt.c 1 /* 2 * Copyright (C) 2006 Martin Decky 3 * All rights reserved. 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 * 9 * - Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * - Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * - The name of the author may not be used to endorse or promote products 15 * derived from this software without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29 /** @addtogroup xen32interrupt 30 * @{ 31 */ 32 /** @file 33 */ 34 35 #include <arch/interrupt.h> 36 #include <syscall/syscall.h> 37 #include <print.h> 38 #include <debug.h> 39 #include <panic.h> 40 #include <func.h> 41 #include <cpu.h> 42 #include <arch/asm.h> 43 #include <mm/tlb.h> 44 #include <mm/as.h> 45 #include <arch.h> 46 #include <symtab.h> 47 #include <proc/thread.h> 48 #include <proc/task.h> 49 #include <synch/spinlock.h> 50 #include <arch/ddi/ddi.h> 51 #include <ipc/sysipc.h> 52 #include <interrupt.h> 53 54 /* 55 * Interrupt and exception dispatching. 56 */ 57 58 void (* disable_irqs_function)(uint16_t irqmask) = NULL; 59 void (* enable_irqs_function)(uint16_t irqmask) = NULL; 60 void (* eoi_function)(void) = NULL; 61 62 void PRINT_INFO_ERRCODE(istate_t *istate) 63 { 64 char *symbol = get_symtab_entry(istate->eip); 65 66 if (!symbol) 67 symbol = ""; 68 69 if (CPU) 70 printf("----------------EXCEPTION OCCURED (cpu%d)----------------\n", CPU->id); 71 else 72 printf("----------------EXCEPTION OCCURED----------------\n"); 73 74 printf("%%eip: %#x (%s)\n",istate->eip,symbol); 75 printf("ERROR_WORD=%#x\n", istate->error_word); 76 printf("%%cs=%#x,flags=%#x\n", istate->cs, istate->eflags); 77 printf("%%eax=%#x, %%ecx=%#x, %%edx=%#x, %%esp=%#x\n", istate->eax,istate->ecx,istate->edx,&istate->stack[0]); 78 #ifdef CONFIG_DEBUG_ALLREGS 79 printf("%%esi=%#x, %%edi=%#x, %%ebp=%#x, %%ebx=%#x\n", istate->esi,istate->edi,istate->ebp,istate->ebx); 80 #endif 81 printf("stack: %#x, %#x, %#x, %#x\n", istate->stack[0], istate->stack[1], istate->stack[2], istate->stack[3]); 82 printf(" %#x, %#x, %#x, %#x\n", istate->stack[4], istate->stack[5], istate->stack[6], istate->stack[7]); 83 } 84 85 void null_interrupt(int n, istate_t *istate) 86 { 87 fault_if_from_uspace(istate, "unserviced interrupt: %d", n); 88 89 PRINT_INFO_ERRCODE(istate); 90 panic("unserviced interrupt: %d\n", n); 91 } 92 93 /** General Protection Fault. */ 94 void gp_fault(int n, istate_t *istate) 95 { 96 if (TASK) { 97 count_t ver; 98 99 spinlock_lock(&TASK->lock); 100 ver = TASK->arch.iomapver; 101 spinlock_unlock(&TASK->lock); 102 103 if (CPU->arch.iomapver_copy != ver) { 104 /* 105 * This fault can be caused by an early access 106 * to I/O port because of an out-dated 107 * I/O Permission bitmap installed on CPU. 108 * Install the fresh copy and restart 109 * the instruction. 110 */ 111 io_perm_bitmap_install(); 112 return; 113 } 114 fault_if_from_uspace(istate, "general protection fault"); 115 } 116 117 PRINT_INFO_ERRCODE(istate); 118 panic("general protection fault\n"); 119 } 120 121 void ss_fault(int n, istate_t *istate) 122 { 123 fault_if_from_uspace(istate, "stack fault"); 124 125 PRINT_INFO_ERRCODE(istate); 126 panic("stack fault\n"); 127 } 128 129 void simd_fp_exception(int n, istate_t *istate) 130 { 131 uint32_t mxcsr; 132 asm 133 ( 134 "stmxcsr %0;\n" 135 :"=m"(mxcsr) 136 ); 137 fault_if_from_uspace(istate, "SIMD FP exception(19), MXCSR: %#zx", 138 (unative_t)mxcsr); 139 140 PRINT_INFO_ERRCODE(istate); 141 printf("MXCSR: %#zx\n",(unative_t)(mxcsr)); 142 panic("SIMD FP exception(19)\n"); 143 } 144 145 void nm_fault(int n, istate_t *istate) 146 { 147 #ifdef CONFIG_FPU_LAZY 148 scheduler_fpu_lazy_request(); 149 #else 150 fault_if_from_uspace(istate, "fpu fault"); 151 panic("fpu fault"); 152 #endif 153 } 154 155 void syscall(int n, istate_t *istate) 156 { 157 panic("Obsolete syscall handler."); 158 } 159 160 void tlb_shootdown_ipi(int n, istate_t *istate) 161 { 162 trap_virtual_eoi(); 163 tlb_shootdown_ipi_recv(); 164 } 165 166 void trap_virtual_enable_irqs(uint16_t irqmask) 167 { 168 if (enable_irqs_function) 169 enable_irqs_function(irqmask); 170 else 171 panic("no enable_irqs_function\n"); 172 } 173 174 void trap_virtual_disable_irqs(uint16_t irqmask) 175 { 176 if (disable_irqs_function) 177 disable_irqs_function(irqmask); 178 else 179 panic("no disable_irqs_function\n"); 180 } 181 182 void trap_virtual_eoi(void) 183 { 184 if (eoi_function) 185 eoi_function(); 186 else 187 panic("no eoi_function\n"); 188 189 } 190 191 static void ipc_int(int n, istate_t *istate) 192 { 193 ipc_irq_send_notif(n-IVT_IRQBASE); 194 trap_virtual_eoi(); 195 } 196 197 198 /* Reregister irq to be IPC-ready */ 199 void irq_ipc_bind_arch(unative_t irq) 200 { 201 if (irq == IRQ_CLK) 202 return; 203 exc_register(IVT_IRQBASE+irq, "ipc_int", ipc_int); 204 trap_virtual_enable_irqs(1 << irq); 205 } 206 207 /** @} 208 */ 209 -
Property mode
changed from
Note:
See TracChangeset
for help on using the changeset viewer.