Subversion Repositories HelenOS-historic

Rev

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