2 * Copyright (C) 2005 Jakub Jermar
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
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.
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.
29 /** @addtogroup sparc64interrupt
35 #include <arch/interrupt.h>
36 #include <arch/trap/interrupt.h>
37 #include <interrupt.h>
40 #include <arch/types.h>
42 #include <ipc/sysipc.h>
44 #include <arch/barrier.h>
51 * To be removed once we get rid of the dependency in ipc_irq_bind_arch().
53 #include <arch/drivers/kbd.h>
54 #include <genarch/kbd/z8530.h>
56 /** Register Interrupt Level Handler.
58 * @param n Interrupt Level (1 - 15).
59 * @param name Short descriptive string.
62 void interrupt_register(int n
, const char *name
, iroutine f
)
64 ASSERT(n
>= IVT_FIRST
&& n
<= IVT_ITEMS
);
66 exc_register(n
- 1, name
, f
);
69 /* Reregister irq to be IPC-ready */
70 void irq_ipc_bind_arch(unative_t irq
)
73 if (kbd_type
== KBD_Z8530
)
74 z8530_belongs_to_kernel
= false;
78 /** Process hardware interrupt.
81 * @param istate Ignored.
83 void interrupt(int n
, istate_t
*istate
)
88 intrcv
= asi_u64_read(ASI_INTR_RECEIVE
, 0);
89 data0
= asi_u64_read(ASI_UDB_INTR_R
, ASI_UDB_INTR_R_DATA_0
);
91 irq_t
*irq
= irq_dispatch(data0
);
94 * The IRQ handler was found.
96 irq
->handler(irq
, irq
->arg
);
97 } else if (data0
> config
.base
) {
99 * This is a cross-call.
100 * data0 contains address of kernel function.
101 * We call the function only after we verify
102 * it is on of the supported ones.
105 if (data0
== (uintptr_t) tlb_shootdown_ipi_recv
) {
106 tlb_shootdown_ipi_recv();
111 * Spurious interrupt.
114 printf("cpu%d: spurious interrupt (intrcv=%#llx, data0=%#llx)\n", CPU
->id
, intrcv
, data0
);
119 asi_u64_write(ASI_INTR_RECEIVE
, 0, 0);