Subversion Repositories HelenOS-historic

Compare Revisions

Ignore whitespace Rev 957 → Rev 958

/kernel/trunk/arch/ia32/src/interrupt.c
49,46 → 49,41
void (* enable_irqs_function)(__u16 irqmask) = NULL;
void (* eoi_function)(void) = NULL;
 
#define PRINT_INFO_ERRCODE(st) { \
__native *x = (__native *) st; \
char *symbol = get_symtab_entry(x[1]); \
#define PRINT_INFO_ERRCODE(istate) do { \
char *symbol = get_symtab_entry(istate->eip); \
if (!symbol) \
symbol = ""; \
printf("----------------EXCEPTION OCCURED----------------\n"); \
printf("%%eip: %X (%s)\n",x[1],symbol); \
printf("ERROR_WORD=%X\n", x[0]); \
printf("%%cs=%X,flags=%X\n", x[2], x[3]); \
printf("%%eip: %X (%s)\n",istate->eip,symbol); \
printf("ERROR_WORD=%X\n", istate->error_word); \
printf("%%cs=%X,flags=%X\n", istate->cs, istate->eflags); \
printf("%%eax=%X, %%ebx=%X, %%ecx=%X, %%edx=%X\n",\
x[-2],x[-5],x[-3],x[-4]); \
istate->eax,istate->ebx,istate->ecx,istate->edx); \
printf("%%esi=%X, %%edi=%X, %%ebp=%X, %%esp=%X\n",\
x[-8],x[-9],x[-1],x); \
printf("stack: %X, %X, %X, %X\n", x[4], x[5], x[6], x[7]); \
printf(" %X, %X, %X, %X\n", x[8], x[9], x[10], x[11]); \
}
istate->esi,istate->edi,istate->ebp,istate->esp); \
printf("stack: %X, %X, %X, %X\n", istate->stack[0], istate->stack[1], istate->stack[2], istate->stack[3]); \
printf(" %X, %X, %X, %X\n", istate->stack[4], istate->stack[5], istate->stack[6], istate->stack[7]); \
} while(0)
 
void null_interrupt(int n, void *st)
void null_interrupt(int n, istate_t *istate)
{
__native *stack = (__native *) st;
 
printf("int %d: null_interrupt\n", n);
printf("stack: %L, %L, %L, %L\n", stack[0], stack[1], stack[2], stack[3]);
panic("unserviced interrupt\n");
PRINT_INFO_ERRCODE(istate);
panic("unserviced interrupt: %d\n", n);
}
 
void gp_fault(int n, void *stack)
void gp_fault(int n, istate_t *istate)
{
PRINT_INFO_ERRCODE(stack);
PRINT_INFO_ERRCODE(istate);
panic("general protection fault\n");
}
 
void ss_fault(int n, void *stack)
void ss_fault(int n, istate_t *istate)
{
PRINT_INFO_ERRCODE(stack);
PRINT_INFO_ERRCODE(istate);
panic("stack fault\n");
}
 
 
void nm_fault(int n, void *stack)
void nm_fault(int n, istate_t *istate)
{
#ifdef CONFIG_FPU_LAZY
scheduler_fpu_lazy_request();
97,33 → 92,29
#endif
}
 
 
 
void page_fault(int n, void *stack)
void page_fault(int n, istate_t *istate)
{
__address page;
 
page = read_cr2();
if (!as_page_fault(page)) {
PRINT_INFO_ERRCODE(stack);
PRINT_INFO_ERRCODE(istate);
printf("page fault address: %X\n", page);
panic("page fault\n");
}
}
 
void syscall(int n, void *st)
void syscall(int n, istate_t *istate)
{
__native *stack = (__native *) st;
 
interrupts_enable();
if (stack[-2] < SYSCALL_END)
stack[-2] = syscall_table[stack[-2]](stack[-5], stack[-3], stack[-4]);
if (istate->edx < SYSCALL_END)
istate->eax = syscall_table[istate->edx](istate->eax, istate->ebx, istate->ecx);
else
panic("Undefined syscall %d", stack[-2]);
panic("Undefined syscall %d", istate->edx);
interrupts_disable();
}
 
void tlb_shootdown_ipi(int n, void *stack)
void tlb_shootdown_ipi(int n, istate_t *istate)
{
trap_virtual_eoi();
tlb_shootdown_ipi_recv();