Subversion Repositories HelenOS

Rev

Rev 534 | Rev 921 | 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.
28
 *
29
 */
30
 
31
#include <arch/interrupt.h>
32
#include <panic.h>
433 jermar 33
#include <print.h>
583 jermar 34
#include <console/console.h>
431 jermar 35
#include <arch/types.h>
36
#include <arch/asm.h>
37
#include <arch/barrier.h>
432 jermar 38
#include <arch/register.h>
435 jermar 39
#include <arch/drivers/it.h>
433 jermar 40
#include <arch.h>
470 jermar 41
#include <symtab.h>
42
#include <debug.h>
431 jermar 43
 
470 jermar 44
#define VECTORS_64_BUNDLE	20
45
#define VECTORS_16_BUNDLE	48
46
#define VECTORS_16_BUNDLE_START	0x5000
47
#define VECTOR_MAX		0x7f00
48
 
49
#define BUNDLE_SIZE		16
50
 
51
char *vector_names_64_bundle[VECTORS_64_BUNDLE] = {
52
	"VHPT Translation vector",
53
	"Instruction TLB vector",
54
	"Data TLB vector",
55
	"Alternate Instruction TLB vector",
56
	"Alternate Data TLB vector",
57
	"Data Nested TLB vector",
58
	"Instruction Key Miss vector",
59
	"Data Key Miss vector",
60
	"Dirty-Bit vector",
61
	"Instruction Access-Bit vector",
62
	"Data Access-Bit vector"
63
	"Break Instruction vector",
64
	"External Interrupt vector"
65
	"Reserved",
66
	"Reserved",
67
	"Reserved",
68
	"Reserved",
69
	"Reserved",
70
	"Reserved",
71
	"Reserved"
72
};
73
 
74
char *vector_names_16_bundle[VECTORS_16_BUNDLE] = {
75
	"Page Not Present vector",
76
	"Key Permission vector",
77
	"Instruction Access rights vector",
78
	"Data Access Rights vector",
79
	"General Exception vector",
80
	"Disabled FP-Register vector",
81
	"NaT Consumption vector",
82
	"Speculation vector",
83
	"Reserved",
84
	"Debug vector",
85
	"Unaligned Reference vector",
86
	"Unsupported Data Reference vector",
87
	"Floating-point Fault vector",
88
	"Floating-point Trap vector",
89
	"Lower-Privilege Transfer Trap vector",
90
	"Taken Branch Trap vector",
91
	"Single STep Trap vector",
92
	"Reserved",
93
	"Reserved",
94
	"Reserved",
95
	"Reserved",
96
	"Reserved",
97
	"Reserved",
98
	"Reserved",
99
	"Reserved",
100
	"IA-32 Exception vector",
101
	"IA-32 Intercept vector",
102
	"IA-32 Interrupt vector",
103
	"Reserved",
104
	"Reserved",
105
	"Reserved"
106
};
107
 
108
static char *vector_to_string(__u16 vector);
472 jermar 109
static void dump_interrupted_context(struct exception_regdump *pstate);
470 jermar 110
 
111
char *vector_to_string(__u16 vector)
431 jermar 112
{
470 jermar 113
	ASSERT(vector <= VECTOR_MAX);
114
 
115
	if (vector >= VECTORS_16_BUNDLE_START)
116
		return vector_names_16_bundle[(vector-VECTORS_16_BUNDLE_START)/(16*BUNDLE_SIZE)];
117
	else
118
		return vector_names_64_bundle[vector/(64*BUNDLE_SIZE)];
119
}
120
 
472 jermar 121
void dump_interrupted_context(struct exception_regdump *pstate)
470 jermar 122
{
123
	char *ifa, *iipa, *iip;
124
 
125
	ifa = get_symtab_entry(pstate->cr_ifa);
126
	iipa = get_symtab_entry(pstate->cr_iipa);
127
	iip = get_symtab_entry(pstate->cr_iip);
128
 
129
	putchar('\n');
472 jermar 130
	printf("Interrupted context dump:\n");
470 jermar 131
	printf("ar.bsp=%P\tar.bspstore=%P\n", pstate->ar_bsp, pstate->ar_bspstore);
132
	printf("ar.rnat=%Q\tar.rsc=%Q\n", pstate->ar_rnat, pstate->ar_rsc);
133
	printf("ar.ifs=%Q\tar.pfs=%Q\n", pstate->ar_ifs, pstate->ar_pfs);
472 jermar 134
	printf("cr.isr=%Q\tcr.ips=%Q\t\n", pstate->cr_isr.value, pstate->cr_ips);
470 jermar 135
 
472 jermar 136
	printf("cr.iip=%Q, #%d\t(%s)\n", pstate->cr_iip, pstate->cr_isr.ei ,iip ? iip : "?");
137
	printf("cr.iipa=%Q\t(%s)\n", pstate->cr_iipa, iipa ? iipa : "?");
138
	printf("cr.ifa=%Q\t(%s)\n", pstate->cr_ifa, ifa ? ifa : "?");
470 jermar 139
}
140
 
141
void general_exception(__u64 vector, struct exception_regdump *pstate)
142
{
472 jermar 143
	char *desc = "";
144
 
145
	dump_interrupted_context(pstate);
146
 
147
	switch (pstate->cr_isr.ge_code) {
148
	    case GE_ILLEGALOP:
149
		desc = "Illegal Operation fault";
150
		break;
151
	    case GE_PRIVOP:
152
		desc = "Privileged Operation fault";
153
		break;
154
	    case GE_PRIVREG:
155
		desc = "Privileged Register fault";
156
		break;
157
	    case GE_RESREGFLD:
158
		desc = "Reserved Register/Field fault";
159
		break;
160
	    case GE_DISBLDISTRAN:
161
		desc = "Disabled Instruction Set Transition fault";
162
		break;
163
	    case GE_ILLEGALDEP:
164
		desc = "Illegal Dependency fault";
165
		break;
166
	    default:
167
	    	desc = "unknown";
168
		break;
169
	}
170
 
171
	panic("General Exception (%s)\n", desc);
470 jermar 172
}
173
 
174
void break_instruction(__u64 vector, struct exception_regdump *pstate)
175
{
472 jermar 176
	dump_interrupted_context(pstate);
470 jermar 177
	panic("Break Instruction\n");
178
}
179
 
180
void universal_handler(__u64 vector, struct exception_regdump *pstate)
181
{
472 jermar 182
	dump_interrupted_context(pstate);
470 jermar 183
	panic("Interruption: %W (%s)\n", (__u16) vector, vector_to_string(vector));
184
}
185
 
186
void external_interrupt(__u64 vector, struct exception_regdump *pstate)
187
{
433 jermar 188
	cr_ivr_t ivr;
431 jermar 189
 
433 jermar 190
	ivr.value = ivr_read();
431 jermar 191
	srlz_d();
444 vana 192
 
434 jermar 193
	switch(ivr.vector) {
433 jermar 194
	    case INTERRUPT_TIMER:
435 jermar 195
		it_interrupt();
433 jermar 196
	    	break;
197
	    case INTERRUPT_SPURIOUS:
198
	    	printf("cpu%d: spurious interrupt\n", CPU->id);
199
		break;
431 jermar 200
	    default:
433 jermar 201
		panic("\nUnhandled External Interrupt Vector %d\n", ivr.vector);
202
		break;
431 jermar 203
	}
204
}