Rev 534 | Rev 703 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 534 | Rev 576 | ||
---|---|---|---|
Line 55... | Line 55... | ||
55 | stack++; |
55 | stack++; |
56 | } |
56 | } |
57 | printf("\n"); |
57 | printf("\n"); |
58 | } |
58 | } |
59 | 59 | ||
60 | static void print_info_errcode(__u8 n, __native x[]) |
60 | static void print_info_errcode(int n, void *st) |
61 | { |
61 | { |
62 | char *symbol; |
62 | char *symbol; |
- | 63 | __native *x = (__native *) st; |
|
63 | 64 | ||
64 | if (!(symbol=get_symtab_entry(x[1]))) |
65 | if (!(symbol=get_symtab_entry(x[1]))) |
65 | symbol = ""; |
66 | symbol = ""; |
66 | 67 | ||
67 | printf("-----EXCEPTION(%d) OCCURED----- ( %s )\n",n,__FUNCTION__); |
68 | printf("-----EXCEPTION(%d) OCCURED----- ( %s )\n",n,__FUNCTION__); |
Line 86... | Line 87... | ||
86 | 87 | ||
87 | /* |
88 | /* |
88 | * Interrupt and exception dispatching. |
89 | * Interrupt and exception dispatching. |
89 | */ |
90 | */ |
90 | 91 | ||
91 | static iroutine ivt[IVT_ITEMS]; |
- | |
92 | - | ||
93 | void (* disable_irqs_function)(__u16 irqmask) = NULL; |
92 | void (* disable_irqs_function)(__u16 irqmask) = NULL; |
94 | void (* enable_irqs_function)(__u16 irqmask) = NULL; |
93 | void (* enable_irqs_function)(__u16 irqmask) = NULL; |
95 | void (* eoi_function)(void) = NULL; |
94 | void (* eoi_function)(void) = NULL; |
96 | 95 | ||
97 | iroutine trap_register(__u8 n, iroutine f) |
- | |
98 | { |
- | |
99 | ASSERT(n < IVT_ITEMS); |
- | |
100 | - | ||
101 | iroutine old; |
- | |
102 | - | ||
103 | old = ivt[n]; |
- | |
104 | ivt[n] = f; |
- | |
105 | - | ||
106 | return old; |
- | |
107 | } |
- | |
108 | - | ||
109 | /* |
- | |
110 | * Called directly from the assembler code. |
- | |
111 | * CPU is interrupts_disable()'d. |
- | |
112 | */ |
- | |
113 | void trap_dispatcher(__u8 n, __native stack[]) |
96 | void null_interrupt(int n, void *st) |
114 | { |
97 | { |
115 | ASSERT(n < IVT_ITEMS); |
98 | __native *stack = (__native *) st; |
116 | - | ||
117 | ivt[n](n, stack); |
- | |
118 | } |
- | |
119 | 99 | ||
120 | void null_interrupt(__u8 n, __native stack[]) |
- | |
121 | { |
- | |
122 | printf("-----EXCEPTION(%d) OCCURED----- ( %s )\n",n,__FUNCTION__); \ |
100 | printf("-----EXCEPTION(%d) OCCURED----- ( %s )\n",n,__FUNCTION__); \ |
123 | printf("stack: %L, %L, %L, %L\n", stack[0], stack[1], stack[2], stack[3]); |
101 | printf("stack: %L, %L, %L, %L\n", stack[0], stack[1], stack[2], stack[3]); |
124 | panic("unserviced interrupt\n"); |
102 | panic("unserviced interrupt\n"); |
125 | } |
103 | } |
126 | 104 | ||
127 | void gp_fault(__u8 n, __native stack[]) |
105 | void gp_fault(int n, void *stack) |
128 | { |
106 | { |
129 | print_info_errcode(n,stack); |
107 | print_info_errcode(n,stack); |
130 | panic("general protection fault\n"); |
108 | panic("general protection fault\n"); |
131 | } |
109 | } |
132 | 110 | ||
133 | void ss_fault(__u8 n, __native stack[]) |
111 | void ss_fault(int n, void *stack) |
134 | { |
112 | { |
135 | print_info_errcode(n,stack); |
113 | print_info_errcode(n,stack); |
136 | panic("stack fault\n"); |
114 | panic("stack fault\n"); |
137 | } |
115 | } |
138 | 116 | ||
139 | 117 | ||
140 | void nm_fault(__u8 n, __native stack[]) |
118 | void nm_fault(int n, void *stack) |
141 | { |
119 | { |
142 | #ifdef CONFIG_FPU_LAZY |
120 | #ifdef CONFIG_FPU_LAZY |
143 | scheduler_fpu_lazy_request(); |
121 | scheduler_fpu_lazy_request(); |
144 | #else |
122 | #else |
145 | panic("fpu fault"); |
123 | panic("fpu fault"); |
146 | #endif |
124 | #endif |
147 | } |
125 | } |
148 | 126 | ||
149 | 127 | ||
150 | 128 | ||
151 | void page_fault(__u8 n, __native stack[]) |
129 | void page_fault(int n, void *stack) |
152 | { |
130 | { |
153 | print_info_errcode(n,stack); |
131 | print_info_errcode(n,stack); |
154 | printf("Page fault address: %Q\n", read_cr2()); |
132 | printf("Page fault address: %Q\n", read_cr2()); |
155 | panic("page fault\n"); |
133 | panic("page fault\n"); |
156 | } |
134 | } |
157 | 135 | ||
158 | void syscall(__u8 n, __native stack[]) |
136 | void syscall(int n, void *stack) |
159 | { |
137 | { |
160 | printf("cpu%d: syscall\n", CPU->id); |
138 | printf("cpu%d: syscall\n", CPU->id); |
161 | thread_usleep(1000); |
139 | thread_usleep(1000); |
162 | } |
140 | } |
163 | 141 | ||
164 | void tlb_shootdown_ipi(__u8 n, __native stack[]) |
142 | void tlb_shootdown_ipi(int n, void *stack) |
165 | { |
143 | { |
166 | trap_virtual_eoi(); |
144 | trap_virtual_eoi(); |
167 | tlb_shootdown_ipi_recv(); |
145 | tlb_shootdown_ipi_recv(); |
168 | } |
146 | } |
169 | 147 | ||
170 | void wakeup_ipi(__u8 n, __native stack[]) |
148 | void wakeup_ipi(int n, void *stack) |
171 | { |
149 | { |
172 | trap_virtual_eoi(); |
150 | trap_virtual_eoi(); |
173 | } |
151 | } |
174 | 152 | ||
175 | void trap_virtual_enable_irqs(__u16 irqmask) |
153 | void trap_virtual_enable_irqs(__u16 irqmask) |