source: mainline/generic/src/interrupt/interrupt.c@ 0132630

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 0132630 was 0132630, checked in by Jakub Jermar <jakub@…>, 19 years ago

Add 'version' and 'cpus' kconsole commands.
Remove leading p from names of p* commands.

  • Property mode set to 100644
File size: 3.5 KB
Line 
1/*
2 * Copyright (C) 2005 Ondrej Palkovsky
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#include <interrupt.h>
30#include <debug.h>
31#include <console/kconsole.h>
32#include <console/console.h>
33#include <console/chardev.h>
34#include <console/cmd.h>
35#include <panic.h>
36#include <print.h>
37#include <symtab.h>
38
39static struct {
40 const char *name;
41 iroutine f;
42} exc_table[IVT_ITEMS];
43
44SPINLOCK_INITIALIZE(exctbl_lock);
45
46/** Register exception handler
47 *
48 * @param n Exception number
49 * @param name Description
50 * @param f Exception handler
51 */
52iroutine exc_register(int n, const char *name, iroutine f)
53{
54 ASSERT(n < IVT_ITEMS);
55
56 iroutine old;
57
58 spinlock_lock(&exctbl_lock);
59
60 old = exc_table[n].f;
61 exc_table[n].f = f;
62 exc_table[n].name = name;
63
64 spinlock_unlock(&exctbl_lock);
65
66 return old;
67}
68
69/** Dispatch exception according to exception table
70 *
71 * Called directly from the assembler code.
72 * CPU is interrupts_disable()'d.
73 */
74void exc_dispatch(int n, void *stack)
75{
76 ASSERT(n < IVT_ITEMS);
77
78 exc_table[n].f(n + IVT_FIRST, stack);
79}
80
81/** Default 'null' exception handler */
82static void exc_undef(int n, void *stack)
83{
84 panic("Unhandled exception %d.", n);
85}
86
87/** kconsole cmd - print all exceptions */
88static int exc_print_cmd(cmd_arg_t *argv)
89{
90 int i;
91 char *symbol;
92
93 spinlock_lock(&exctbl_lock);
94 printf("Exc Description Handler\n");
95 for (i=0; i < IVT_ITEMS; i++) {
96 symbol = get_symtab_entry((__native)exc_table[i].f);
97 if (!symbol)
98 symbol = "not found";
99 printf("%d %s 0x%p(%s)\n", i + IVT_FIRST, exc_table[i].name,
100 exc_table[i].f,symbol);
101 if (!((i+1) % 20)) {
102 printf("Press any key to continue.");
103 spinlock_unlock(&exctbl_lock);
104 getc(stdin);
105 spinlock_lock(&exctbl_lock);
106 printf("\n");
107 }
108 }
109 spinlock_unlock(&exctbl_lock);
110
111 return 1;
112}
113
114static cmd_info_t exc_info = {
115 .name = "exc",
116 .description = "Print exception table.",
117 .func = exc_print_cmd,
118 .help = NULL,
119 .argc = 0,
120 .argv = NULL
121};
122
123/** Initialize generic exception handling support */
124void exc_init(void)
125{
126 int i;
127
128 for (i=0;i < IVT_ITEMS; i++)
129 exc_register(i, "undef", exc_undef);
130
131 cmd_initialize(&exc_info);
132 if (!cmd_register(&exc_info))
133 panic("could not register command %s\n", exc_info.name);
134}
135
Note: See TracBrowser for help on using the repository browser.