Subversion Repositories HelenOS

Rev

Rev 2071 | Details | Compare with Previous | Last modification | View Log | RSS feed

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