Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/ia64/src/interrupt.c

    r7e752b2 rb60c582  
    4141#include <debug.h>
    4242#include <console/console.h>
    43 #include <typedefs.h>
     43#include <arch/types.h>
    4444#include <arch/asm.h>
    4545#include <arch/barrier.h>
     
    5757#include <putchar.h>
    5858
    59 #define VECTORS_64_BUNDLE        20
    60 #define VECTORS_16_BUNDLE        48
    61 #define VECTORS_16_BUNDLE_START  0x5000
    62 
    63 #define VECTOR_MAX  0x7f00
    64 
    65 #define BUNDLE_SIZE  16
    66 
    67 static const char *vector_names_64_bundle[VECTORS_64_BUNDLE] = {
     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
     66char *vector_names_64_bundle[VECTORS_64_BUNDLE] = {
    6867        "VHPT Translation vector",
    6968        "Instruction TLB vector",
     
    8887};
    8988
    90 static const char *vector_names_16_bundle[VECTORS_16_BUNDLE] = {
     89char *vector_names_16_bundle[VECTORS_16_BUNDLE] = {
    9190        "Page Not Present vector",
    9291        "Key Permission vector",
     
    122121};
    123122
    124 static const char *vector_to_string(uint16_t vector)
     123static char *vector_to_string(uint16_t vector);
     124static void dump_interrupted_context(istate_t *istate);
     125
     126char *vector_to_string(uint16_t vector)
    125127{
    126128        ASSERT(vector <= VECTOR_MAX);
     
    133135}
    134136
    135 void istate_decode(istate_t *istate)
    136 {
    137         printf("ar.bsp=%p\tar.bspstore=%p\n",
    138             (void *) istate->ar_bsp, (void *) istate->ar_bspstore);
    139         printf("ar.rnat=%#0" PRIx64 "\tar.rsc=%#0" PRIx64 "\n",
    140             istate->ar_rnat, istate->ar_rsc);
    141         printf("ar.ifs=%#0" PRIx64 "\tar.pfs=%#0" PRIx64 "\n",
    142             istate->ar_ifs, istate->ar_pfs);
    143         printf("cr.isr=%#0" PRIx64 "\tcr.ipsr=%#0" PRIx64 "\n",
    144             istate->cr_isr.value, istate->cr_ipsr.value);
     137void dump_interrupted_context(istate_t *istate)
     138{
     139        char *ifa, *iipa, *iip;
     140
     141        ifa = symtab_fmt_name_lookup(istate->cr_ifa);
     142        iipa = symtab_fmt_name_lookup(istate->cr_iipa);
     143        iip = symtab_fmt_name_lookup(istate->cr_iip);
     144
     145        putchar('\n');
     146        printf("Interrupted context dump:\n");
     147        printf("ar.bsp=%p\tar.bspstore=%p\n", istate->ar_bsp,
     148            istate->ar_bspstore);
     149        printf("ar.rnat=%#018llx\tar.rsc=%#018llx\n", istate->ar_rnat,
     150            istate->ar_rsc);
     151        printf("ar.ifs=%#018llx\tar.pfs=%#018llx\n", istate->ar_ifs,
     152            istate->ar_pfs);
     153        printf("cr.isr=%#018llx\tcr.ipsr=%#018llx\t\n", istate->cr_isr.value,
     154            istate->cr_ipsr);
    145155       
    146         printf("cr.iip=%#0" PRIx64 ", #%u\t(%s)\n",
    147             istate->cr_iip, istate->cr_isr.ei,
    148             symtab_fmt_name_lookup(istate->cr_iip));
    149         printf("cr.iipa=%#0" PRIx64 "\t(%s)\n", istate->cr_iipa,
    150             symtab_fmt_name_lookup(istate->cr_iipa));
    151         printf("cr.ifa=%#0" PRIx64 "\t(%s)\n", istate->cr_ifa,
    152             symtab_fmt_name_lookup(istate->cr_ifa));
     156        printf("cr.iip=%#018llx, #%d\t(%s)\n", istate->cr_iip,
     157            istate->cr_isr.ei, iip);
     158        printf("cr.iipa=%#018llx\t(%s)\n", istate->cr_iipa, iipa);
     159        printf("cr.ifa=%#018llx\t(%s)\n", istate->cr_ifa, ifa);
    153160}
    154161
    155162void general_exception(uint64_t vector, istate_t *istate)
    156163{
    157         const char *desc;
    158        
     164        char *desc = "";
     165
    159166        switch (istate->cr_isr.ge_code) {
    160167        case GE_ILLEGALOP:
     
    180187                break;
    181188        }
    182        
     189
    183190        fault_if_from_uspace(istate, "General Exception (%s).", desc);
    184         panic_badtrap(istate, vector, "General Exception (%s).", desc);
     191
     192        dump_interrupted_context(istate);
     193        panic("General Exception (%s).", desc);
    185194}
    186195
     
    192201        fault_if_from_uspace(istate, "Interruption: %#hx (%s).",
    193202            (uint16_t) vector, vector_to_string(vector));
    194         panic_badtrap(istate, vector, "Interruption: %#hx (%s).",
    195             (uint16_t) vector, vector_to_string(vector));
     203        dump_interrupted_context(istate);
     204        panic("Interruption: %#hx (%s).", (uint16_t) vector,
     205            vector_to_string(vector));
    196206#endif
    197207}
     
    213223                istate->cr_ipsr.ri++;
    214224        }
    215        
     225
    216226        return syscall_handler(istate->in0, istate->in1, istate->in2,
    217227            istate->in3, istate->in4, istate->in5, istate->in6);
     
    222232        fault_if_from_uspace(istate, "Interruption: %#hx (%s).",
    223233            (uint16_t) vector, vector_to_string(vector));
    224         panic_badtrap(istate, vector, "Interruption: %#hx (%s).",
    225             (uint16_t) vector, vector_to_string(vector));
     234        dump_interrupted_context(istate);
     235        panic("Interruption: %#hx (%s).", (uint16_t) vector,
     236            vector_to_string(vector));
    226237}
    227238
    228239static void end_of_local_irq(void)
    229240{
    230         asm volatile (
    231                 "mov cr.eoi=r0;;"
    232         );
    233 }
     241        asm volatile ("mov cr.eoi=r0;;");
     242}
     243
    234244
    235245void external_interrupt(uint64_t vector, istate_t *istate)
    236246{
    237247        cr_ivr_t ivr;
     248        irq_t *irq;
    238249       
    239250        ivr.value = ivr_read();
    240251        srlz_d();
    241        
    242         irq_t *irq;
    243        
     252
    244253        switch (ivr.vector) {
    245254        case INTERRUPT_SPURIOUS:
     
    248257#endif
    249258                break;
    250        
     259
    251260#ifdef CONFIG_SMP
    252261        case VECTOR_TLB_SHOOTDOWN_IPI:
     
    255264                break;
    256265#endif
    257        
     266
    258267        case INTERRUPT_TIMER:
    259268                irq = irq_dispatch_and_lock(ivr.vector);
    260269                if (irq) {
    261270                        irq->handler(irq);
    262                         irq_spinlock_unlock(&irq->lock, false);
     271                        spinlock_unlock(&irq->lock);
    263272                } else {
    264273                        panic("Unhandled Internal Timer Interrupt (%d).",
     
    279288                        if (!irq->preack)
    280289                                end_of_local_irq();
    281                         irq_spinlock_unlock(&irq->lock, false);
     290                        spinlock_unlock(&irq->lock);
    282291                } else {
    283292                        /*
Note: See TracChangeset for help on using the changeset viewer.