Subversion Repositories HelenOS-historic

Rev

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