Subversion Repositories HelenOS

Rev

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

Rev Author Line No. Line
431 jermar 1
/*
2071 jermar 2
 * Copyright (c) 2005 Jakub 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>
1942 jermar 37
#include <interrupt.h>
38
#include <ddi/irq.h>
431 jermar 39
#include <panic.h>
433 jermar 40
#include <print.h>
1942 jermar 41
#include <symtab.h>
42
#include <debug.h>
583 jermar 43
#include <console/console.h>
431 jermar 44
#include <arch/types.h>
45
#include <arch/asm.h>
46
#include <arch/barrier.h>
432 jermar 47
#include <arch/register.h>
433 jermar 48
#include <arch.h>
921 jermar 49
#include <syscall/syscall.h>
50
#include <print.h>
1023 vana 51
#include <proc/scheduler.h>
1265 jermar 52
#include <ipc/sysipc.h>
1507 vana 53
#include <ipc/irq.h>
54
#include <ipc/ipc.h>
1942 jermar 55
#include <synch/spinlock.h>
431 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
 
64
char *vector_names_64_bundle[VECTORS_64_BUNDLE] = {
65
	"VHPT Translation vector",
66
	"Instruction TLB vector",
67
	"Data TLB vector",
68
	"Alternate Instruction TLB vector",
69
	"Alternate Data TLB vector",
70
	"Data Nested TLB vector",
71
	"Instruction Key Miss vector",
72
	"Data Key Miss vector",
73
	"Dirty-Bit vector",
74
	"Instruction Access-Bit vector",
75
	"Data Access-Bit vector"
76
	"Break Instruction vector",
77
	"External Interrupt vector"
78
	"Reserved",
79
	"Reserved",
80
	"Reserved",
81
	"Reserved",
82
	"Reserved",
83
	"Reserved",
84
	"Reserved"
85
};
86
 
87
char *vector_names_16_bundle[VECTORS_16_BUNDLE] = {
88
	"Page Not Present vector",
89
	"Key Permission vector",
90
	"Instruction Access rights vector",
91
	"Data Access Rights vector",
92
	"General Exception vector",
93
	"Disabled FP-Register vector",
94
	"NaT Consumption vector",
95
	"Speculation vector",
96
	"Reserved",
97
	"Debug vector",
98
	"Unaligned Reference vector",
99
	"Unsupported Data Reference vector",
100
	"Floating-point Fault vector",
101
	"Floating-point Trap vector",
102
	"Lower-Privilege Transfer Trap vector",
103
	"Taken Branch Trap vector",
2060 jermar 104
	"Single Step Trap vector",
470 jermar 105
	"Reserved",
106
	"Reserved",
107
	"Reserved",
108
	"Reserved",
109
	"Reserved",
110
	"Reserved",
111
	"Reserved",
112
	"Reserved",
113
	"IA-32 Exception vector",
114
	"IA-32 Intercept vector",
115
	"IA-32 Interrupt vector",
116
	"Reserved",
117
	"Reserved",
118
	"Reserved"
119
};
120
 
1780 jermar 121
static char *vector_to_string(uint16_t vector);
958 jermar 122
static void dump_interrupted_context(istate_t *istate);
470 jermar 123
 
1780 jermar 124
char *vector_to_string(uint16_t vector)
431 jermar 125
{
470 jermar 126
	ASSERT(vector <= VECTOR_MAX);
127
 
128
	if (vector >= VECTORS_16_BUNDLE_START)
2608 jermar 129
		return vector_names_16_bundle[(vector -
130
		    VECTORS_16_BUNDLE_START) / (16 * BUNDLE_SIZE)];
470 jermar 131
	else
2608 jermar 132
		return vector_names_64_bundle[vector / (64 * BUNDLE_SIZE)];
470 jermar 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");
2608 jermar 145
	printf("ar.bsp=%p\tar.bspstore=%p\n", istate->ar_bsp,
146
	    istate->ar_bspstore);
147
	printf("ar.rnat=%#018llx\tar.rsc=%#018llx\n", istate->ar_rnat,
148
	    istate->ar_rsc);
149
	printf("ar.ifs=%#018llx\tar.pfs=%#018llx\n", istate->ar_ifs,
150
	    istate->ar_pfs);
151
	printf("cr.isr=%#018llx\tcr.ipsr=%#018llx\t\n", istate->cr_isr.value,
152
	    istate->cr_ipsr);
470 jermar 153
 
2608 jermar 154
	printf("cr.iip=%#018llx, #%d\t(%s)\n", istate->cr_iip,
155
	    istate->cr_isr.ei, iip);
1507 vana 156
	printf("cr.iipa=%#018llx\t(%s)\n", istate->cr_iipa, iipa);
157
	printf("cr.ifa=%#018llx\t(%s)\n", istate->cr_ifa, ifa);
470 jermar 158
}
159
 
1780 jermar 160
void general_exception(uint64_t vector, istate_t *istate)
470 jermar 161
{
472 jermar 162
	char *desc = "";
163
 
958 jermar 164
	switch (istate->cr_isr.ge_code) {
1882 jermar 165
	case GE_ILLEGALOP:
472 jermar 166
		desc = "Illegal Operation fault";
167
		break;
1882 jermar 168
	case GE_PRIVOP:
472 jermar 169
		desc = "Privileged Operation fault";
170
		break;
1882 jermar 171
	case GE_PRIVREG:
472 jermar 172
		desc = "Privileged Register fault";
173
		break;
1882 jermar 174
	case GE_RESREGFLD:
472 jermar 175
		desc = "Reserved Register/Field fault";
176
		break;
1882 jermar 177
	case GE_DISBLDISTRAN:
472 jermar 178
		desc = "Disabled Instruction Set Transition fault";
179
		break;
1882 jermar 180
	case GE_ILLEGALDEP:
472 jermar 181
		desc = "Illegal Dependency fault";
182
		break;
1882 jermar 183
	default:
184
		desc = "unknown";
472 jermar 185
		break;
186
	}
187
 
1595 palkovsky 188
	fault_if_from_uspace(istate, "General Exception (%s)", desc);
189
 
190
	dump_interrupted_context(istate);
472 jermar 191
	panic("General Exception (%s)\n", desc);
470 jermar 192
}
193
 
1780 jermar 194
void disabled_fp_register(uint64_t vector, istate_t *istate)
1023 vana 195
{
1053 vana 196
#ifdef CONFIG_FPU_LAZY 
1023 vana 197
	scheduler_fpu_lazy_request();	
1053 vana 198
#else
2608 jermar 199
	fault_if_from_uspace(istate, "Interruption: %#hx (%s)",
200
	    (uint16_t) vector, vector_to_string(vector));
1053 vana 201
	dump_interrupted_context(istate);
2608 jermar 202
	panic("Interruption: %#hx (%s)\n", (uint16_t) vector,
203
	    vector_to_string(vector));
1023 vana 204
#endif
205
}
206
 
1780 jermar 207
void nop_handler(uint64_t vector, istate_t *istate)
1023 vana 208
{
209
}
210
 
921 jermar 211
/** Handle syscall. */
1780 jermar 212
int break_instruction(uint64_t 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
 
2608 jermar 224
	return syscall_handler(istate->in0, istate->in1, istate->in2,
225
	    istate->in3, istate->in4, istate->in5, istate->in6);
470 jermar 226
}
227
 
1780 jermar 228
void universal_handler(uint64_t vector, istate_t *istate)
470 jermar 229
{
2608 jermar 230
	fault_if_from_uspace(istate, "Interruption: %#hx (%s)\n",
231
	    (uint16_t) vector, vector_to_string(vector));
958 jermar 232
	dump_interrupted_context(istate);
2608 jermar 233
	panic("Interruption: %#hx (%s)\n", (uint16_t) vector,
234
	    vector_to_string(vector));
470 jermar 235
}
236
 
1780 jermar 237
void external_interrupt(uint64_t vector, istate_t *istate)
470 jermar 238
{
1942 jermar 239
	irq_t *irq;
433 jermar 240
	cr_ivr_t ivr;
431 jermar 241
 
433 jermar 242
	ivr.value = ivr_read();
431 jermar 243
	srlz_d();
444 vana 244
 
1942 jermar 245
	irq = irq_dispatch_and_lock(ivr.vector);
246
	if (irq) {
247
		irq->handler(irq, irq->arg);
248
		spinlock_unlock(&irq->lock);
249
	} else {
250
		switch (ivr.vector) {
251
		case INTERRUPT_SPURIOUS:
252
#ifdef CONFIG_DEBUG
253
	 		printf("cpu%d: spurious interrupt\n", CPU->id);
254
#endif
255
			break;
1265 jermar 256
 
1942 jermar 257
		default:
2608 jermar 258
			panic("\nUnhandled External Interrupt Vector %d\n",
259
			    ivr.vector);
1942 jermar 260
			break;
261
		}
1507 vana 262
	}
263
}
264
 
1703 jermar 265
/** @}
1702 cejka 266
 */