Subversion Repositories HelenOS

Rev

Rev 1882 | Rev 1937 | 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
 
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) {
1882 jermar 160
    case GE_ILLEGALOP:
472 jermar 161
        desc = "Illegal Operation fault";
162
        break;
1882 jermar 163
    case GE_PRIVOP:
472 jermar 164
        desc = "Privileged Operation fault";
165
        break;
1882 jermar 166
    case GE_PRIVREG:
472 jermar 167
        desc = "Privileged Register fault";
168
        break;
1882 jermar 169
    case GE_RESREGFLD:
472 jermar 170
        desc = "Reserved Register/Field fault";
171
        break;
1882 jermar 172
    case GE_DISBLDISTRAN:
472 jermar 173
        desc = "Disabled Instruction Set Transition fault";
174
        break;
1882 jermar 175
    case GE_ILLEGALDEP:
472 jermar 176
        desc = "Illegal Dependency fault";
177
        break;
1882 jermar 178
    default:
179
        desc = "unknown";
472 jermar 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
 
1780 jermar 189
void disabled_fp_register(uint64_t vector, istate_t *istate)
1023 vana 190
{
1053 vana 191
#ifdef CONFIG_FPU_LAZY 
1023 vana 192
    scheduler_fpu_lazy_request();  
1053 vana 193
#else
1780 jermar 194
    fault_if_from_uspace(istate, "Interruption: %#hx (%s)", (uint16_t) vector, vector_to_string(vector));
1053 vana 195
    dump_interrupted_context(istate);
1780 jermar 196
    panic("Interruption: %#hx (%s)\n", (uint16_t) vector, vector_to_string(vector));
1023 vana 197
#endif
198
}
199
 
200
 
1780 jermar 201
void nop_handler(uint64_t vector, istate_t *istate)
1023 vana 202
{
203
}
204
 
205
 
921 jermar 206
/** Handle syscall. */
1780 jermar 207
int break_instruction(uint64_t vector, istate_t *istate)
470 jermar 208
{
921 jermar 209
    /*
210
     * Move to next instruction after BREAK.
211
     */
958 jermar 212
    if (istate->cr_ipsr.ri == 2) {
213
        istate->cr_ipsr.ri = 0;
214
        istate->cr_iip += 16;
921 jermar 215
    } else {
958 jermar 216
        istate->cr_ipsr.ri++;
921 jermar 217
    }
218
 
1888 jermar 219
    return syscall_handler(istate->in0, istate->in1, istate->in2, istate->in3, istate->in4);
470 jermar 220
}
221
 
1780 jermar 222
void universal_handler(uint64_t vector, istate_t *istate)
470 jermar 223
{
1780 jermar 224
    fault_if_from_uspace(istate,"Interruption: %#hx (%s)\n",(uint16_t) vector, vector_to_string(vector));
958 jermar 225
    dump_interrupted_context(istate);
1780 jermar 226
    panic("Interruption: %#hx (%s)\n", (uint16_t) vector, vector_to_string(vector));
470 jermar 227
}
228
 
1780 jermar 229
void external_interrupt(uint64_t vector, istate_t *istate)
470 jermar 230
{
433 jermar 231
    cr_ivr_t ivr;
431 jermar 232
 
433 jermar 233
    ivr.value = ivr_read();
431 jermar 234
    srlz_d();
444 vana 235
 
434 jermar 236
    switch(ivr.vector) {
1882 jermar 237
    case INTERRUPT_TIMER:
435 jermar 238
        it_interrupt();
1882 jermar 239
        break;
240
    case INTERRUPT_SPURIOUS:
433 jermar 241
            printf("cpu%d: spurious interrupt\n", CPU->id);
242
        break;
1882 jermar 243
    default:
433 jermar 244
        panic("\nUnhandled External Interrupt Vector %d\n", ivr.vector);
245
        break;
431 jermar 246
    }
247
}
1265 jermar 248
 
1882 jermar 249
void virtual_interrupt(uint64_t irq, void *param)
1507 vana 250
{
251
    switch(irq) {
1882 jermar 252
    case IRQ_KBD:
253
        if (kbd_uspace)
254
            ipc_irq_send_notif(irq);
1507 vana 255
        break;
1882 jermar 256
    default:
257
        panic("\nUnhandled Virtual Interrupt request %d\n", irq);
258
        break;
1507 vana 259
    }
260
}
261
 
1265 jermar 262
/* Reregister irq to be IPC-ready */
1780 jermar 263
void irq_ipc_bind_arch(unative_t irq)
1265 jermar 264
{
1882 jermar 265
    if(irq == IRQ_KBD) {
266
        kbd_uspace = 1;
1507 vana 267
        return;
268
    }
1621 vana 269
    return;
1265 jermar 270
    panic("not implemented\n");
271
    /* TODO */
272
}
1702 cejka 273
 
1703 jermar 274
/** @}
1702 cejka 275
 */