Changes in kernel/arch/sparc64/src/trap/interrupt.c [214ec25c:6cd9aa6] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified kernel/arch/sparc64/src/trap/interrupt.c ¶
r214ec25c r6cd9aa6 1 1 /* 2 2 * Copyright (c) 2005 Jakub Jermar 3 * Copyright (c) 2009 Pavel Rimsky4 3 * All rights reserved. 5 4 * … … 35 34 36 35 #include <arch/interrupt.h> 36 #include <arch/sparc64.h> 37 37 #include <arch/trap/interrupt.h> 38 #include <arch/sparc64.h>39 38 #include <interrupt.h> 40 39 #include <ddi/irq.h> 41 #include < typedefs.h>40 #include <arch/types.h> 42 41 #include <debug.h> 43 42 #include <arch/asm.h> … … 51 50 /** Register Interrupt Level Handler. 52 51 * 53 * @param n Interrupt Level (1 - 15). 54 * @param name Short descriptive string. 55 * @param handler Handler. 52 * @param n Interrupt Level (1 - 15). 53 * @param name Short descriptive string. 54 * @param f Handler. 55 */ 56 void interrupt_register(int n, const char *name, iroutine f) 57 { 58 ASSERT(n >= IVT_FIRST && n <= IVT_ITEMS); 59 60 exc_register(n - 1, name, f); 61 } 62 63 /** Process hardware interrupt. 56 64 * 65 * @param n Ignored. 66 * @param istate Ignored. 57 67 */ 58 void interrupt _register(unsigned int n, const char *name, iroutine_t handler)68 void interrupt(int n, istate_t *istate) 59 69 { 60 ASSERT(n >= IVT_FIRST); 61 ASSERT(n <= IVT_ITEMS); 62 63 exc_register(n - IVT_FIRST, name, true, handler); 70 uint64_t status; 71 uint64_t intrcv; 72 uint64_t data0; 73 status = asi_u64_read(ASI_INTR_DISPATCH_STATUS, 0); 74 if (status & (!INTR_DISPATCH_STATUS_BUSY)) 75 panic("Interrupt Dispatch Status busy bit not set."); 76 77 intrcv = asi_u64_read(ASI_INTR_RECEIVE, 0); 78 #if defined (US) 79 data0 = asi_u64_read(ASI_INTR_R, ASI_UDB_INTR_R_DATA_0); 80 #elif defined (US3) 81 data0 = asi_u64_read(ASI_INTR_R, VA_INTR_R_DATA_0); 82 #endif 83 84 irq_t *irq = irq_dispatch_and_lock(data0); 85 if (irq) { 86 /* 87 * The IRQ handler was found. 88 */ 89 irq->handler(irq); 90 /* 91 * See if there is a clear-interrupt-routine and call it. 92 */ 93 if (irq->cir) { 94 irq->cir(irq->cir_arg, irq->inr); 95 } 96 spinlock_unlock(&irq->lock); 97 } else if (data0 > config.base) { 98 /* 99 * This is a cross-call. 100 * data0 contains address of the kernel function. 101 * We call the function only after we verify 102 * it is one of the supported ones. 103 */ 104 #ifdef CONFIG_SMP 105 if (data0 == (uintptr_t) tlb_shootdown_ipi_recv) { 106 tlb_shootdown_ipi_recv(); 107 } 108 #endif 109 } else { 110 /* 111 * Spurious interrupt. 112 */ 113 #ifdef CONFIG_DEBUG 114 printf("cpu%u: spurious interrupt (intrcv=%#" PRIx64 115 ", data0=%#" PRIx64 ")\n", CPU->id, intrcv, data0); 116 #endif 117 } 118 119 membar(); 120 asi_u64_write(ASI_INTR_RECEIVE, 0, 0); 64 121 } 65 122
Note:
See TracChangeset
for help on using the changeset viewer.