Subversion Repositories HelenOS-historic

Rev

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