Changeset 58775d30 in mainline for kernel/arch/ia64/src/interrupt.c


Ignore:
Timestamp:
2015-03-16T16:07:21Z (10 years ago)
Author:
Jan Vesely <jano.vesely@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
2003739
Parents:
6069061 (diff), 795e2bf (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Mainline changes

File:
1 edited

Legend:

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

    r6069061 r58775d30  
    5454#include <synch/spinlock.h>
    5555#include <mm/tlb.h>
     56#include <arch/mm/tlb.h>
    5657#include <symtab.h>
    5758#include <putchar.h>
     
    5960#define VECTORS_64_BUNDLE        20
    6061#define VECTORS_16_BUNDLE        48
    61 #define VECTORS_16_BUNDLE_START  0x5000
    62 
    63 #define VECTOR_MAX  0x7f00
    64 
    65 #define BUNDLE_SIZE  16
     62#define VECTORS_16_BUNDLE_START  0x50
     63
     64#define VECTOR_MAX  0x7f
    6665
    6766static const char *vector_names_64_bundle[VECTORS_64_BUNDLE] = {
     
    122121};
    123122
    124 static const char *vector_to_string(uint16_t vector)
    125 {
    126         ASSERT(vector <= VECTOR_MAX);
    127        
    128         if (vector >= VECTORS_16_BUNDLE_START)
    129                 return vector_names_16_bundle[(vector -
    130                     VECTORS_16_BUNDLE_START) / (16 * BUNDLE_SIZE)];
     123static const char *vector_to_string(unsigned int n)
     124{
     125        ASSERT(n <= VECTOR_MAX);
     126       
     127        if (n >= VECTORS_16_BUNDLE_START)
     128                return vector_names_16_bundle[n - VECTORS_16_BUNDLE_START];
    131129        else
    132                 return vector_names_64_bundle[vector / (64 * BUNDLE_SIZE)];
     130                return vector_names_64_bundle[n / 4];
    133131}
    134132
     
    153151}
    154152
    155 void general_exception(uint64_t vector, istate_t *istate)
     153void general_exception(unsigned int n, istate_t *istate)
    156154{
    157155        const char *desc;
     
    182180       
    183181        fault_if_from_uspace(istate, "General Exception (%s).", desc);
    184         panic_badtrap(istate, vector, "General Exception (%s).", desc);
    185 }
    186 
    187 void disabled_fp_register(uint64_t vector, istate_t *istate)
     182        panic_badtrap(istate, n, "General Exception (%s).", desc);
     183}
     184
     185void disabled_fp_register(unsigned int n, istate_t *istate)
    188186{
    189187#ifdef CONFIG_FPU_LAZY
     
    191189#else
    192190        fault_if_from_uspace(istate, "Interruption: %#hx (%s).",
    193             (uint16_t) vector, vector_to_string(vector));
     191            (uint16_t) n, vector_to_string(n));
    194192        panic_badtrap(istate, vector, "Interruption: %#hx (%s).",
    195             (uint16_t) vector, vector_to_string(vector));
     193            (uint16_t) n, vector_to_string(n));
    196194#endif
    197195}
    198196
    199 void nop_handler(uint64_t vector, istate_t *istate)
    200 {
    201 }
    202 
    203197/** Handle syscall. */
    204 int break_instruction(uint64_t vector, istate_t *istate)
    205 {
     198sysarg_t break_instruction(unsigned int n, istate_t *istate)
     199{
     200        sysarg_t ret;
     201
    206202        /*
    207203         * Move to next instruction after BREAK.
     
    214210        }
    215211       
    216         return syscall_handler(istate->in0, istate->in1, istate->in2,
     212        interrupts_enable();
     213        ret = syscall_handler(istate->in0, istate->in1, istate->in2,
    217214            istate->in3, istate->in4, istate->in5, istate->in6);
    218 }
    219 
    220 void universal_handler(uint64_t vector, istate_t *istate)
     215        interrupts_disable();
     216
     217        return ret;
     218}
     219
     220void universal_handler(unsigned int n, istate_t *istate)
    221221{
    222222        fault_if_from_uspace(istate, "Interruption: %#hx (%s).",
    223             (uint16_t) vector, vector_to_string(vector));
    224         panic_badtrap(istate, vector, "Interruption: %#hx (%s).",
    225             (uint16_t) vector, vector_to_string(vector));
     223            n, vector_to_string(n));
     224        panic_badtrap(istate, n, "Interruption: %#hx (%s).",
     225            n, vector_to_string(n));
    226226}
    227227
     
    229229{
    230230        asm volatile (
    231                 "mov cr.eoi=r0;;"
     231                "mov cr.eoi = r0 ;;"
    232232        );
    233233}
    234234
    235 void external_interrupt(uint64_t vector, istate_t *istate)
     235void external_interrupt(unsigned int n, istate_t *istate)
    236236{
    237237        cr_ivr_t ivr;
     
    298298}
    299299
     300void exception_init(void)
     301{
     302        unsigned int i;
     303
     304        for (i = 0; i < IVT_ITEMS; i++)
     305                exc_register(i, "universal_handler", false, universal_handler);
     306
     307        exc_register(EXC_ALT_ITLB_FAULT,
     308            vector_to_string(EXC_ALT_ITLB_FAULT), true,
     309            alternate_instruction_tlb_fault);
     310        exc_register(EXC_ALT_DTLB_FAULT,
     311            vector_to_string(EXC_ALT_DTLB_FAULT), true,
     312            alternate_data_tlb_fault);
     313        exc_register(EXC_NESTED_TLB_FAULT,
     314            vector_to_string(EXC_NESTED_TLB_FAULT), false,
     315            data_nested_tlb_fault);
     316        exc_register(EXC_DATA_D_BIT_FAULT,
     317            vector_to_string(EXC_DATA_D_BIT_FAULT), true,
     318            data_dirty_bit_fault);
     319        exc_register(EXC_INST_A_BIT_FAULT,
     320            vector_to_string(EXC_INST_A_BIT_FAULT), true,
     321            instruction_access_bit_fault);
     322        exc_register(EXC_DATA_A_BIT_FAULT,
     323            vector_to_string(EXC_DATA_A_BIT_FAULT), true,
     324            data_access_bit_fault);
     325        exc_register(EXC_EXT_INTERRUPT,
     326            vector_to_string(EXC_EXT_INTERRUPT), true,
     327            external_interrupt);
     328
     329        exc_register(EXC_PAGE_NOT_PRESENT,
     330            vector_to_string(EXC_PAGE_NOT_PRESENT), true,
     331            page_not_present);
     332        exc_register(EXC_DATA_AR_FAULT,
     333            vector_to_string(EXC_DATA_AR_FAULT), true,
     334            data_access_rights_fault);
     335        exc_register(EXC_GENERAL_EXCEPTION,
     336            vector_to_string(EXC_GENERAL_EXCEPTION), false,
     337            general_exception);
     338        exc_register(EXC_DISABLED_FP_REG,
     339            vector_to_string(EXC_DISABLED_FP_REG), true,
     340            disabled_fp_register);
     341}
     342
    300343/** @}
    301344 */
Note: See TracChangeset for help on using the changeset viewer.