Subversion Repositories HelenOS

Rev

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