Subversion Repositories HelenOS-historic

Rev

Rev 1702 | Rev 1705 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
431 jermar 1
/*
2
 * Copyright (C) 2005 Jakub Jermar
470 jermar 3
 * Copyright (C) 2005 Jakub Vana
431 jermar 4
 * All rights reserved.
5
 *
6
 * Redistribution and use in source and binary forms, with or without
7
 * modification, are permitted provided that the following conditions
8
 * are met:
9
 *
10
 * - Redistributions of source code must retain the above copyright
11
 *   notice, this list of conditions and the following disclaimer.
12
 * - Redistributions in binary form must reproduce the above copyright
13
 *   notice, this list of conditions and the following disclaimer in the
14
 *   documentation and/or other materials provided with the distribution.
15
 * - The name of the author may not be used to endorse or promote products
16
 *   derived from this software without specific prior written permission.
17
 *
18
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1702 cejka 28
 */
29
 
1703 jermar 30
/** @addtogroup ia64interrupt ia64
1702 cejka 31
 * @ingroup interrupt
32
 * @{
33
 */
34
/** @file
431 jermar 35
 *
36
 */
37
 
38
#include <arch/interrupt.h>
39
#include <panic.h>
433 jermar 40
#include <print.h>
583 jermar 41
#include <console/console.h>
431 jermar 42
#include <arch/types.h>
43
#include <arch/asm.h>
44
#include <arch/barrier.h>
432 jermar 45
#include <arch/register.h>
435 jermar 46
#include <arch/drivers/it.h>
433 jermar 47
#include <arch.h>
470 jermar 48
#include <symtab.h>
49
#include <debug.h>
921 jermar 50
#include <syscall/syscall.h>
51
#include <print.h>
1023 vana 52
#include <proc/scheduler.h>
1265 jermar 53
#include <ipc/sysipc.h>
1507 vana 54
#include <ipc/irq.h>
55
#include <ipc/ipc.h>
1595 palkovsky 56
#include <interrupt.h>
431 jermar 57
 
1265 jermar 58
 
470 jermar 59
#define VECTORS_64_BUNDLE	20
60
#define VECTORS_16_BUNDLE	48
61
#define VECTORS_16_BUNDLE_START	0x5000
62
#define VECTOR_MAX		0x7f00
63
 
64
#define BUNDLE_SIZE		16
65
 
1507 vana 66
 
470 jermar 67
char *vector_names_64_bundle[VECTORS_64_BUNDLE] = {
68
	"VHPT Translation vector",
69
	"Instruction TLB vector",
70
	"Data TLB vector",
71
	"Alternate Instruction TLB vector",
72
	"Alternate Data TLB vector",
73
	"Data Nested TLB vector",
74
	"Instruction Key Miss vector",
75
	"Data Key Miss vector",
76
	"Dirty-Bit vector",
77
	"Instruction Access-Bit vector",
78
	"Data Access-Bit vector"
79
	"Break Instruction vector",
80
	"External Interrupt vector"
81
	"Reserved",
82
	"Reserved",
83
	"Reserved",
84
	"Reserved",
85
	"Reserved",
86
	"Reserved",
87
	"Reserved"
88
};
89
 
90
char *vector_names_16_bundle[VECTORS_16_BUNDLE] = {
91
	"Page Not Present vector",
92
	"Key Permission vector",
93
	"Instruction Access rights vector",
94
	"Data Access Rights vector",
95
	"General Exception vector",
96
	"Disabled FP-Register vector",
97
	"NaT Consumption vector",
98
	"Speculation vector",
99
	"Reserved",
100
	"Debug vector",
101
	"Unaligned Reference vector",
102
	"Unsupported Data Reference vector",
103
	"Floating-point Fault vector",
104
	"Floating-point Trap vector",
105
	"Lower-Privilege Transfer Trap vector",
106
	"Taken Branch Trap vector",
107
	"Single STep Trap vector",
108
	"Reserved",
109
	"Reserved",
110
	"Reserved",
111
	"Reserved",
112
	"Reserved",
113
	"Reserved",
114
	"Reserved",
115
	"Reserved",
116
	"IA-32 Exception vector",
117
	"IA-32 Intercept vector",
118
	"IA-32 Interrupt vector",
119
	"Reserved",
120
	"Reserved",
121
	"Reserved"
122
};
123
 
124
static char *vector_to_string(__u16 vector);
958 jermar 125
static void dump_interrupted_context(istate_t *istate);
470 jermar 126
 
127
char *vector_to_string(__u16 vector)
431 jermar 128
{
470 jermar 129
	ASSERT(vector <= VECTOR_MAX);
130
 
131
	if (vector >= VECTORS_16_BUNDLE_START)
132
		return vector_names_16_bundle[(vector-VECTORS_16_BUNDLE_START)/(16*BUNDLE_SIZE)];
133
	else
134
		return vector_names_64_bundle[vector/(64*BUNDLE_SIZE)];
135
}
136
 
958 jermar 137
void dump_interrupted_context(istate_t *istate)
470 jermar 138
{
139
	char *ifa, *iipa, *iip;
140
 
958 jermar 141
	ifa = get_symtab_entry(istate->cr_ifa);
142
	iipa = get_symtab_entry(istate->cr_iipa);
143
	iip = get_symtab_entry(istate->cr_iip);
470 jermar 144
 
145
	putchar('\n');
472 jermar 146
	printf("Interrupted context dump:\n");
1221 decky 147
	printf("ar.bsp=%p\tar.bspstore=%p\n", istate->ar_bsp, istate->ar_bspstore);
1507 vana 148
	printf("ar.rnat=%#018llx\tar.rsc=%#018llx\n", istate->ar_rnat, istate->ar_rsc);
149
	printf("ar.ifs=%#018llx\tar.pfs=%#018llx\n", istate->ar_ifs, istate->ar_pfs);
150
	printf("cr.isr=%#018llx\tcr.ipsr=%#018llx\t\n", istate->cr_isr.value, istate->cr_ipsr);
470 jermar 151
 
1507 vana 152
	printf("cr.iip=%#018llx, #%d\t(%s)\n", istate->cr_iip, istate->cr_isr.ei, iip);
153
	printf("cr.iipa=%#018llx\t(%s)\n", istate->cr_iipa, iipa);
154
	printf("cr.ifa=%#018llx\t(%s)\n", istate->cr_ifa, ifa);
470 jermar 155
}
156
 
958 jermar 157
void general_exception(__u64 vector, istate_t *istate)
470 jermar 158
{
472 jermar 159
	char *desc = "";
160
 
958 jermar 161
	switch (istate->cr_isr.ge_code) {
472 jermar 162
	    case GE_ILLEGALOP:
163
		desc = "Illegal Operation fault";
164
		break;
165
	    case GE_PRIVOP:
166
		desc = "Privileged Operation fault";
167
		break;
168
	    case GE_PRIVREG:
169
		desc = "Privileged Register fault";
170
		break;
171
	    case GE_RESREGFLD:
172
		desc = "Reserved Register/Field fault";
173
		break;
174
	    case GE_DISBLDISTRAN:
175
		desc = "Disabled Instruction Set Transition fault";
176
		break;
177
	    case GE_ILLEGALDEP:
178
		desc = "Illegal Dependency fault";
179
		break;
180
	    default:
181
	    	desc = "unknown";
182
		break;
183
	}
184
 
1595 palkovsky 185
	fault_if_from_uspace(istate, "General Exception (%s)", desc);
186
 
187
	dump_interrupted_context(istate);
472 jermar 188
	panic("General Exception (%s)\n", desc);
470 jermar 189
}
190
 
1053 vana 191
void fpu_enable(void);
1023 vana 192
 
193
void disabled_fp_register(__u64 vector, istate_t *istate)
194
{
1053 vana 195
#ifdef CONFIG_FPU_LAZY 
1023 vana 196
	scheduler_fpu_lazy_request();	
1053 vana 197
#else
1595 palkovsky 198
	fault_if_from_uspace(istate, "Interruption: %#hx (%s)", (__u16) vector, vector_to_string(vector));
1053 vana 199
	dump_interrupted_context(istate);
1221 decky 200
	panic("Interruption: %#hx (%s)\n", (__u16) vector, vector_to_string(vector));
1023 vana 201
#endif
202
}
203
 
204
 
205
void nop_handler(__u64 vector, istate_t *istate)
206
{
207
}
208
 
209
 
210
 
921 jermar 211
/** Handle syscall. */
958 jermar 212
int break_instruction(__u64 vector, istate_t *istate)
470 jermar 213
{
921 jermar 214
	/*
215
	 * Move to next instruction after BREAK.
216
	 */
958 jermar 217
	if (istate->cr_ipsr.ri == 2) {
218
		istate->cr_ipsr.ri = 0;
219
		istate->cr_iip += 16;
921 jermar 220
	} else {
958 jermar 221
		istate->cr_ipsr.ri++;
921 jermar 222
	}
223
 
962 jermar 224
	if (istate->in4 < SYSCALL_END)
225
		return syscall_table[istate->in4](istate->in0, istate->in1, istate->in2, istate->in3);
921 jermar 226
	else
962 jermar 227
		panic("Undefined syscall %d", istate->in4);
921 jermar 228
 
229
	return -1;
470 jermar 230
}
231
 
958 jermar 232
void universal_handler(__u64 vector, istate_t *istate)
470 jermar 233
{
1621 vana 234
	fault_if_from_uspace(istate,"Interruption: %#hx (%s)\n",(__u16) vector, vector_to_string(vector));
958 jermar 235
	dump_interrupted_context(istate);
1221 decky 236
	panic("Interruption: %#hx (%s)\n", (__u16) vector, vector_to_string(vector));
470 jermar 237
}
238
 
958 jermar 239
void external_interrupt(__u64 vector, istate_t *istate)
470 jermar 240
{
433 jermar 241
	cr_ivr_t ivr;
431 jermar 242
 
433 jermar 243
	ivr.value = ivr_read();
431 jermar 244
	srlz_d();
444 vana 245
 
434 jermar 246
	switch(ivr.vector) {
433 jermar 247
	    case INTERRUPT_TIMER:
435 jermar 248
		it_interrupt();
433 jermar 249
	    	break;
250
	    case INTERRUPT_SPURIOUS:
251
	    	printf("cpu%d: spurious interrupt\n", CPU->id);
252
		break;
431 jermar 253
	    default:
433 jermar 254
		panic("\nUnhandled External Interrupt Vector %d\n", ivr.vector);
255
		break;
431 jermar 256
	}
257
}
1265 jermar 258
 
1507 vana 259
void virtual_interrupt(__u64 irq,void *param)
260
{
261
	switch(irq) {
262
		case IRQ_KBD:
263
			if(kbd_uspace) ipc_irq_send_notif(irq);
264
			break;
265
		default:
266
			panic("\nUnhandled Virtual Interrupt request %d\n", irq);
267
		break;
268
	}
269
}
270
 
1265 jermar 271
/* Reregister irq to be IPC-ready */
272
void irq_ipc_bind_arch(__native irq)
273
{
1507 vana 274
	if(irq==IRQ_KBD) {
275
		kbd_uspace=1;
276
		return;
277
	}
1621 vana 278
	return;
1265 jermar 279
	panic("not implemented\n");
280
	/* TODO */
281
}
1702 cejka 282
 
1703 jermar 283
/** @}
1702 cejka 284
 */
285