Subversion Repositories HelenOS

Rev

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