Subversion Repositories HelenOS

Rev

Rev 1780 | Rev 1882 | 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
 
1705 cejka 30
/** @addtogroup ia64interrupt
1702 cejka 31
 * @{
32
 */
33
/** @file
431 jermar 34
 */
35
 
36
#include <arch/interrupt.h>
37
#include <panic.h>
433 jermar 38
#include <print.h>
583 jermar 39
#include <console/console.h>
431 jermar 40
#include <arch/types.h>
41
#include <arch/asm.h>
42
#include <arch/barrier.h>
432 jermar 43
#include <arch/register.h>
435 jermar 44
#include <arch/drivers/it.h>
433 jermar 45
#include <arch.h>
470 jermar 46
#include <symtab.h>
47
#include <debug.h>
921 jermar 48
#include <syscall/syscall.h>
49
#include <print.h>
1023 vana 50
#include <proc/scheduler.h>
1265 jermar 51
#include <ipc/sysipc.h>
1507 vana 52
#include <ipc/irq.h>
53
#include <ipc/ipc.h>
1595 palkovsky 54
#include <interrupt.h>
431 jermar 55
 
1265 jermar 56
 
470 jermar 57
#define VECTORS_64_BUNDLE	20
58
#define VECTORS_16_BUNDLE	48
59
#define VECTORS_16_BUNDLE_START	0x5000
60
#define VECTOR_MAX		0x7f00
61
 
62
#define BUNDLE_SIZE		16
63
 
1507 vana 64
 
470 jermar 65
char *vector_names_64_bundle[VECTORS_64_BUNDLE] = {
66
	"VHPT Translation vector",
67
	"Instruction TLB vector",
68
	"Data TLB vector",
69
	"Alternate Instruction TLB vector",
70
	"Alternate Data TLB vector",
71
	"Data Nested TLB vector",
72
	"Instruction Key Miss vector",
73
	"Data Key Miss vector",
74
	"Dirty-Bit vector",
75
	"Instruction Access-Bit vector",
76
	"Data Access-Bit vector"
77
	"Break Instruction vector",
78
	"External Interrupt vector"
79
	"Reserved",
80
	"Reserved",
81
	"Reserved",
82
	"Reserved",
83
	"Reserved",
84
	"Reserved",
85
	"Reserved"
86
};
87
 
88
char *vector_names_16_bundle[VECTORS_16_BUNDLE] = {
89
	"Page Not Present vector",
90
	"Key Permission vector",
91
	"Instruction Access rights vector",
92
	"Data Access Rights vector",
93
	"General Exception vector",
94
	"Disabled FP-Register vector",
95
	"NaT Consumption vector",
96
	"Speculation vector",
97
	"Reserved",
98
	"Debug vector",
99
	"Unaligned Reference vector",
100
	"Unsupported Data Reference vector",
101
	"Floating-point Fault vector",
102
	"Floating-point Trap vector",
103
	"Lower-Privilege Transfer Trap vector",
104
	"Taken Branch Trap vector",
105
	"Single STep Trap vector",
106
	"Reserved",
107
	"Reserved",
108
	"Reserved",
109
	"Reserved",
110
	"Reserved",
111
	"Reserved",
112
	"Reserved",
113
	"Reserved",
114
	"IA-32 Exception vector",
115
	"IA-32 Intercept vector",
116
	"IA-32 Interrupt vector",
117
	"Reserved",
118
	"Reserved",
119
	"Reserved"
120
};
121
 
1780 jermar 122
static char *vector_to_string(uint16_t vector);
958 jermar 123
static void dump_interrupted_context(istate_t *istate);
470 jermar 124
 
1780 jermar 125
char *vector_to_string(uint16_t vector)
431 jermar 126
{
470 jermar 127
	ASSERT(vector <= VECTOR_MAX);
128
 
129
	if (vector >= VECTORS_16_BUNDLE_START)
130
		return vector_names_16_bundle[(vector-VECTORS_16_BUNDLE_START)/(16*BUNDLE_SIZE)];
131
	else
132
		return vector_names_64_bundle[vector/(64*BUNDLE_SIZE)];
133
}
134
 
958 jermar 135
void dump_interrupted_context(istate_t *istate)
470 jermar 136
{
137
	char *ifa, *iipa, *iip;
138
 
958 jermar 139
	ifa = get_symtab_entry(istate->cr_ifa);
140
	iipa = get_symtab_entry(istate->cr_iipa);
141
	iip = get_symtab_entry(istate->cr_iip);
470 jermar 142
 
143
	putchar('\n');
472 jermar 144
	printf("Interrupted context dump:\n");
1221 decky 145
	printf("ar.bsp=%p\tar.bspstore=%p\n", istate->ar_bsp, istate->ar_bspstore);
1507 vana 146
	printf("ar.rnat=%#018llx\tar.rsc=%#018llx\n", istate->ar_rnat, istate->ar_rsc);
147
	printf("ar.ifs=%#018llx\tar.pfs=%#018llx\n", istate->ar_ifs, istate->ar_pfs);
148
	printf("cr.isr=%#018llx\tcr.ipsr=%#018llx\t\n", istate->cr_isr.value, istate->cr_ipsr);
470 jermar 149
 
1507 vana 150
	printf("cr.iip=%#018llx, #%d\t(%s)\n", istate->cr_iip, istate->cr_isr.ei, iip);
151
	printf("cr.iipa=%#018llx\t(%s)\n", istate->cr_iipa, iipa);
152
	printf("cr.ifa=%#018llx\t(%s)\n", istate->cr_ifa, ifa);
470 jermar 153
}
154
 
1780 jermar 155
void general_exception(uint64_t vector, istate_t *istate)
470 jermar 156
{
472 jermar 157
	char *desc = "";
158
 
958 jermar 159
	switch (istate->cr_isr.ge_code) {
472 jermar 160
	    case GE_ILLEGALOP:
161
		desc = "Illegal Operation fault";
162
		break;
163
	    case GE_PRIVOP:
164
		desc = "Privileged Operation fault";
165
		break;
166
	    case GE_PRIVREG:
167
		desc = "Privileged Register fault";
168
		break;
169
	    case GE_RESREGFLD:
170
		desc = "Reserved Register/Field fault";
171
		break;
172
	    case GE_DISBLDISTRAN:
173
		desc = "Disabled Instruction Set Transition fault";
174
		break;
175
	    case GE_ILLEGALDEP:
176
		desc = "Illegal Dependency fault";
177
		break;
178
	    default:
179
	    	desc = "unknown";
180
		break;
181
	}
182
 
1595 palkovsky 183
	fault_if_from_uspace(istate, "General Exception (%s)", desc);
184
 
185
	dump_interrupted_context(istate);
472 jermar 186
	panic("General Exception (%s)\n", desc);
470 jermar 187
}
188
 
1053 vana 189
void fpu_enable(void);
1023 vana 190
 
1780 jermar 191
void disabled_fp_register(uint64_t vector, istate_t *istate)
1023 vana 192
{
1053 vana 193
#ifdef CONFIG_FPU_LAZY 
1023 vana 194
	scheduler_fpu_lazy_request();	
1053 vana 195
#else
1780 jermar 196
	fault_if_from_uspace(istate, "Interruption: %#hx (%s)", (uint16_t) vector, vector_to_string(vector));
1053 vana 197
	dump_interrupted_context(istate);
1780 jermar 198
	panic("Interruption: %#hx (%s)\n", (uint16_t) vector, vector_to_string(vector));
1023 vana 199
#endif
200
}
201
 
202
 
1780 jermar 203
void nop_handler(uint64_t vector, istate_t *istate)
1023 vana 204
{
205
}
206
 
207
 
208
 
921 jermar 209
/** Handle syscall. */
1780 jermar 210
int break_instruction(uint64_t vector, istate_t *istate)
470 jermar 211
{
921 jermar 212
	/*
213
	 * Move to next instruction after BREAK.
214
	 */
958 jermar 215
	if (istate->cr_ipsr.ri == 2) {
216
		istate->cr_ipsr.ri = 0;
217
		istate->cr_iip += 16;
921 jermar 218
	} else {
958 jermar 219
		istate->cr_ipsr.ri++;
921 jermar 220
	}
221
 
962 jermar 222
	if (istate->in4 < SYSCALL_END)
223
		return syscall_table[istate->in4](istate->in0, istate->in1, istate->in2, istate->in3);
921 jermar 224
	else
962 jermar 225
		panic("Undefined syscall %d", istate->in4);
921 jermar 226
 
227
	return -1;
470 jermar 228
}
229
 
1780 jermar 230
void universal_handler(uint64_t vector, istate_t *istate)
470 jermar 231
{
1780 jermar 232
	fault_if_from_uspace(istate,"Interruption: %#hx (%s)\n",(uint16_t) vector, vector_to_string(vector));
958 jermar 233
	dump_interrupted_context(istate);
1780 jermar 234
	panic("Interruption: %#hx (%s)\n", (uint16_t) vector, vector_to_string(vector));
470 jermar 235
}
236
 
1780 jermar 237
void external_interrupt(uint64_t vector, istate_t *istate)
470 jermar 238
{
433 jermar 239
	cr_ivr_t ivr;
431 jermar 240
 
433 jermar 241
	ivr.value = ivr_read();
431 jermar 242
	srlz_d();
444 vana 243
 
434 jermar 244
	switch(ivr.vector) {
433 jermar 245
	    case INTERRUPT_TIMER:
435 jermar 246
		it_interrupt();
433 jermar 247
	    	break;
248
	    case INTERRUPT_SPURIOUS:
249
	    	printf("cpu%d: spurious interrupt\n", CPU->id);
250
		break;
431 jermar 251
	    default:
433 jermar 252
		panic("\nUnhandled External Interrupt Vector %d\n", ivr.vector);
253
		break;
431 jermar 254
	}
255
}
1265 jermar 256
 
1780 jermar 257
void virtual_interrupt(uint64_t irq,void *param)
1507 vana 258
{
259
	switch(irq) {
260
		case IRQ_KBD:
261
			if(kbd_uspace) ipc_irq_send_notif(irq);
262
			break;
263
		default:
264
			panic("\nUnhandled Virtual Interrupt request %d\n", irq);
265
		break;
266
	}
267
}
268
 
1265 jermar 269
/* Reregister irq to be IPC-ready */
1780 jermar 270
void irq_ipc_bind_arch(unative_t irq)
1265 jermar 271
{
1507 vana 272
	if(irq==IRQ_KBD) {
273
		kbd_uspace=1;
274
		return;
275
	}
1621 vana 276
	return;
1265 jermar 277
	panic("not implemented\n");
278
	/* TODO */
279
}
1702 cejka 280
 
1703 jermar 281
/** @}
1702 cejka 282
 */
283