Subversion Repositories HelenOS

Rev

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