Subversion Repositories HelenOS

Rev

Rev 1888 | Rev 1942 | 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) {
1882 jermar 160
	case GE_ILLEGALOP:
472 jermar 161
		desc = "Illegal Operation fault";
162
		break;
1882 jermar 163
	case GE_PRIVOP:
472 jermar 164
		desc = "Privileged Operation fault";
165
		break;
1882 jermar 166
	case GE_PRIVREG:
472 jermar 167
		desc = "Privileged Register fault";
168
		break;
1882 jermar 169
	case GE_RESREGFLD:
472 jermar 170
		desc = "Reserved Register/Field fault";
171
		break;
1882 jermar 172
	case GE_DISBLDISTRAN:
472 jermar 173
		desc = "Disabled Instruction Set Transition fault";
174
		break;
1882 jermar 175
	case GE_ILLEGALDEP:
472 jermar 176
		desc = "Illegal Dependency fault";
177
		break;
1882 jermar 178
	default:
179
		desc = "unknown";
472 jermar 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
 
1780 jermar 189
void disabled_fp_register(uint64_t vector, istate_t *istate)
1023 vana 190
{
1053 vana 191
#ifdef CONFIG_FPU_LAZY 
1023 vana 192
	scheduler_fpu_lazy_request();	
1053 vana 193
#else
1780 jermar 194
	fault_if_from_uspace(istate, "Interruption: %#hx (%s)", (uint16_t) vector, vector_to_string(vector));
1053 vana 195
	dump_interrupted_context(istate);
1780 jermar 196
	panic("Interruption: %#hx (%s)\n", (uint16_t) vector, vector_to_string(vector));
1023 vana 197
#endif
198
}
199
 
200
 
1780 jermar 201
void nop_handler(uint64_t vector, istate_t *istate)
1023 vana 202
{
203
}
204
 
205
 
921 jermar 206
/** Handle syscall. */
1780 jermar 207
int break_instruction(uint64_t vector, istate_t *istate)
470 jermar 208
{
921 jermar 209
	/*
210
	 * Move to next instruction after BREAK.
211
	 */
958 jermar 212
	if (istate->cr_ipsr.ri == 2) {
213
		istate->cr_ipsr.ri = 0;
214
		istate->cr_iip += 16;
921 jermar 215
	} else {
958 jermar 216
		istate->cr_ipsr.ri++;
921 jermar 217
	}
218
 
1888 jermar 219
	return syscall_handler(istate->in0, istate->in1, istate->in2, istate->in3, istate->in4);
470 jermar 220
}
221
 
1780 jermar 222
void universal_handler(uint64_t vector, istate_t *istate)
470 jermar 223
{
1780 jermar 224
	fault_if_from_uspace(istate,"Interruption: %#hx (%s)\n",(uint16_t) vector, vector_to_string(vector));
958 jermar 225
	dump_interrupted_context(istate);
1780 jermar 226
	panic("Interruption: %#hx (%s)\n", (uint16_t) vector, vector_to_string(vector));
470 jermar 227
}
228
 
1780 jermar 229
void external_interrupt(uint64_t vector, istate_t *istate)
470 jermar 230
{
433 jermar 231
	cr_ivr_t ivr;
431 jermar 232
 
433 jermar 233
	ivr.value = ivr_read();
431 jermar 234
	srlz_d();
444 vana 235
 
434 jermar 236
	switch(ivr.vector) {
1882 jermar 237
	case INTERRUPT_TIMER:
435 jermar 238
		it_interrupt();
1882 jermar 239
		break;
240
	case INTERRUPT_SPURIOUS:
433 jermar 241
	    	printf("cpu%d: spurious interrupt\n", CPU->id);
242
		break;
1882 jermar 243
	default:
433 jermar 244
		panic("\nUnhandled External Interrupt Vector %d\n", ivr.vector);
245
		break;
431 jermar 246
	}
247
}
1265 jermar 248
 
1882 jermar 249
void virtual_interrupt(uint64_t irq, void *param)
1507 vana 250
{
251
	switch(irq) {
1882 jermar 252
	case IRQ_KBD:
253
		if (kbd_uspace)
254
			ipc_irq_send_notif(irq);
1507 vana 255
		break;
1882 jermar 256
	default:
257
		panic("\nUnhandled Virtual Interrupt request %d\n", irq);
258
		break;
1507 vana 259
	}
260
}
261
 
1703 jermar 262
/** @}
1702 cejka 263
 */