Changeset 25d7709 in mainline for arch/ia32/src/interrupt.c


Ignore:
Timestamp:
2006-03-13T20:08:16Z (19 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
631ca4d
Parents:
45d6add
Message:

Nicer ia32 interrupt handlers and structures holding interrupted context data.
Unify the name holding interrupted context data on all architectures to be istate.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • arch/ia32/src/interrupt.c

    r45d6add r25d7709  
    5050void (* eoi_function)(void) = NULL;
    5151
    52 #define PRINT_INFO_ERRCODE(st) { \
    53         __native *x = (__native *) st; \
    54         char *symbol = get_symtab_entry(x[1]); \
     52#define PRINT_INFO_ERRCODE(istate) do { \
     53        char *symbol = get_symtab_entry(istate->eip); \
    5554        if (!symbol) \
    5655                symbol = ""; \
    5756        printf("----------------EXCEPTION OCCURED----------------\n"); \
    58         printf("%%eip: %X (%s)\n",x[1],symbol); \
    59         printf("ERROR_WORD=%X\n", x[0]); \
    60         printf("%%cs=%X,flags=%X\n", x[2], x[3]); \
     57        printf("%%eip: %X (%s)\n",istate->eip,symbol); \
     58        printf("ERROR_WORD=%X\n", istate->error_word); \
     59        printf("%%cs=%X,flags=%X\n", istate->cs, istate->eflags); \
    6160        printf("%%eax=%X, %%ebx=%X, %%ecx=%X, %%edx=%X\n",\
    62                x[-2],x[-5],x[-3],x[-4]); \
     61               istate->eax,istate->ebx,istate->ecx,istate->edx); \
    6362        printf("%%esi=%X, %%edi=%X, %%ebp=%X, %%esp=%X\n",\
    64                x[-8],x[-9],x[-1],x); \
    65         printf("stack: %X, %X, %X, %X\n", x[4], x[5], x[6], x[7]); \
    66         printf("       %X, %X, %X, %X\n", x[8], x[9], x[10], x[11]); \
    67         }
     63               istate->esi,istate->edi,istate->ebp,istate->esp); \
     64        printf("stack: %X, %X, %X, %X\n", istate->stack[0], istate->stack[1], istate->stack[2], istate->stack[3]); \
     65        printf("       %X, %X, %X, %X\n", istate->stack[4], istate->stack[5], istate->stack[6], istate->stack[7]); \
     66} while(0)
    6867
    69 void null_interrupt(int n, void *st)
     68void null_interrupt(int n, istate_t *istate)
    7069{
    71         __native *stack = (__native *) st;
    72 
    73         printf("int %d: null_interrupt\n", n);
    74         printf("stack: %L, %L, %L, %L\n", stack[0], stack[1], stack[2], stack[3]);
    75         panic("unserviced interrupt\n");
     70        PRINT_INFO_ERRCODE(istate);
     71        panic("unserviced interrupt: %d\n", n);
    7672}
    7773
    78 void gp_fault(int n, void *stack)
     74void gp_fault(int n, istate_t *istate)
    7975{
    80         PRINT_INFO_ERRCODE(stack);
     76        PRINT_INFO_ERRCODE(istate);
    8177        panic("general protection fault\n");
    8278}
    8379
    84 void ss_fault(int n, void *stack)
     80void ss_fault(int n, istate_t *istate)
    8581{
    86         PRINT_INFO_ERRCODE(stack);
     82        PRINT_INFO_ERRCODE(istate);
    8783        panic("stack fault\n");
    8884}
    8985
    90 
    91 void nm_fault(int n, void *stack)
     86void nm_fault(int n, istate_t *istate)
    9287{
    9388#ifdef CONFIG_FPU_LAZY     
     
    9893}
    9994
    100 
    101 
    102 void page_fault(int n, void *stack)
     95void page_fault(int n, istate_t *istate)
    10396{
    10497        __address page;
     
    10699        page = read_cr2();
    107100        if (!as_page_fault(page)) {
    108                 PRINT_INFO_ERRCODE(stack);
     101                PRINT_INFO_ERRCODE(istate);
    109102                printf("page fault address: %X\n", page);
    110103                panic("page fault\n");
     
    112105}
    113106
    114 void syscall(int n, void *st)
     107void syscall(int n, istate_t *istate)
    115108{
    116         __native *stack = (__native *) st;
    117 
    118109        interrupts_enable();
    119         if (stack[-2] < SYSCALL_END)
    120                 stack[-2] = syscall_table[stack[-2]](stack[-5], stack[-3], stack[-4]);
     110        if (istate->edx < SYSCALL_END)
     111                istate->eax = syscall_table[istate->edx](istate->eax, istate->ebx, istate->ecx);
    121112        else
    122                 panic("Undefined syscall %d", stack[-2]);
     113                panic("Undefined syscall %d", istate->edx);
    123114        interrupts_disable();
    124115}
    125116
    126 void tlb_shootdown_ipi(int n, void *stack)
     117void tlb_shootdown_ipi(int n, istate_t *istate)
    127118{
    128119        trap_virtual_eoi();
Note: See TracChangeset for help on using the changeset viewer.