/kernel/trunk/arch/ia32/src/ia32.c |
---|
49,6 → 49,7 |
#include <arch/bios/bios.h> |
#include <arch/mm/memory_init.h> |
#include <interrupt.h> |
void arch_pre_mm_init(void) |
{ |
59,11 → 60,12 |
i8259_init(); /* PIC */ |
i8254_init(); /* hard clock */ |
trap_register(VECTOR_SYSCALL, syscall); |
exc_register(VECTOR_SYSCALL, "syscall", syscall); |
#ifdef CONFIG_SMP |
trap_register(VECTOR_TLB_SHOOTDOWN_IPI, tlb_shootdown_ipi); |
trap_register(VECTOR_WAKEUP_IPI, wakeup_ipi); |
exc_register(VECTOR_TLB_SHOOTDOWN_IPI, "tlb_shootdown", |
tlb_shootdown_ipi); |
exc_register(VECTOR_WAKEUP_IPI, "wakeup_ipi", wakeup_ipi); |
#endif /* CONFIG_SMP */ |
} |
} |
/kernel/trunk/arch/ia32/src/asm.S |
---|
75,7 → 75,7 |
# vectors starting at vector i. |
# |
# The handlers setup data segment registers |
# and call trap_dispatcher(). |
# and call exc_dispatch(). |
# |
.macro handler i n |
push %ebp |
94,7 → 94,7 |
pushl %ebp |
addl $4,(%esp) |
pushl %edi |
call trap_dispatcher |
call exc_dispatch |
addl $8,%esp |
pop %es |
/kernel/trunk/arch/ia32/src/pm.c |
---|
38,6 → 38,7 |
#include <mm/heap.h> |
#include <memstr.h> |
#include <arch/boot/boot.h> |
#include <interrupt.h> |
/* |
* Early ia32 configuration functions and data structures. |
124,11 → 125,11 |
} |
idt_setoffset(d, ((__address) interrupt_handlers) + i*interrupt_handler_size); |
trap_register(i, null_interrupt); |
exc_register(i, "undef", null_interrupt); |
} |
trap_register(13, gp_fault); |
trap_register( 7, nm_fault); |
trap_register(12, ss_fault); |
exc_register(13, "gp_fault", gp_fault); |
exc_register( 7, "nm_fault", nm_fault); |
exc_register(12, "ss_fault", ss_fault); |
} |
/kernel/trunk/arch/ia32/src/smp/apic.c |
---|
32,6 → 32,7 |
#include <arch/smp/mps.h> |
#include <mm/page.h> |
#include <time/delay.h> |
#include <interrupt.h> |
#include <arch/interrupt.h> |
#include <print.h> |
#include <arch/asm.h> |
108,6 → 109,10 |
}; |
#endif /* LAPIC_VERBOSE */ |
static void apic_spurious(int n, void *stack); |
static void l_apic_timer_interrupt(int n, void *stack); |
/** Initialize APIC on BSP. */ |
void apic_init(void) |
{ |
114,7 → 119,7 |
io_apic_id_t idreg; |
int i; |
trap_register(VECTOR_APIC_SPUR, apic_spurious); |
exc_register(VECTOR_APIC_SPUR, "apic_spurious", apic_spurious); |
enable_irqs_function = io_apic_enable_irqs; |
disable_irqs_function = io_apic_disable_irqs; |
126,7 → 131,7 |
* Other interrupts will be forwarded to the lowest priority CPU. |
*/ |
io_apic_disable_irqs(0xffff); |
trap_register(VECTOR_CLK, l_apic_timer_interrupt); |
exc_register(VECTOR_CLK, "l_apic_timer", l_apic_timer_interrupt); |
for (i = 0; i < IRQ_COUNT; i++) { |
int pin; |
162,7 → 167,7 |
* @param n Interrupt vector. |
* @param stack Interrupted stack. |
*/ |
void apic_spurious(__u8 n, __native stack[]) |
void apic_spurious(int n, void *stack) |
{ |
printf("cpu%d: APIC spurious interrupt\n", CPU->id); |
} |
401,7 → 406,7 |
* @param n Interrupt vector number. |
* @param stack Interrupted stack. |
*/ |
void l_apic_timer_interrupt(__u8 n, __native stack[]) |
void l_apic_timer_interrupt(int n, void *stack) |
{ |
l_apic_eoi(); |
clock(); |
/kernel/trunk/arch/ia32/src/mm/page.c |
---|
39,6 → 39,7 |
#include <debug.h> |
#include <memstr.h> |
#include <print.h> |
#include <interrupt.h> |
static __address bootstrap_dba; |
59,7 → 60,7 |
for (cur = 0; cur < last_frame; cur += FRAME_SIZE) |
page_mapping_insert(PA2KA(cur), cur, PAGE_CACHEABLE, KA2PA(dba)); |
trap_register(14, page_fault); |
exc_register(14, "page_fault", page_fault); |
write_cr3(KA2PA(dba)); |
} |
else { |
/kernel/trunk/arch/ia32/src/interrupt.c |
---|
43,14 → 43,13 |
* Interrupt and exception dispatching. |
*/ |
static iroutine ivt[IVT_ITEMS]; |
void (* disable_irqs_function)(__u16 irqmask) = NULL; |
void (* enable_irqs_function)(__u16 irqmask) = NULL; |
void (* eoi_function)(void) = NULL; |
#define PRINT_INFO_ERRCODE(x) { \ |
char *symbol = get_symtab_entry(stack[1]); \ |
#define PRINT_INFO_ERRCODE(st) { \ |
__native *x = (__native *) st; \ |
char *symbol = get_symtab_entry(x[1]); \ |
if (!symbol) \ |
symbol = ""; \ |
printf("----------------EXCEPTION OCCURED----------------\n"); \ |
65,43 → 64,22 |
printf(" %X, %X, %X, %X\n", x[8], x[9], x[10], x[11]); \ |
} |
iroutine trap_register(__u8 n, iroutine f) |
void null_interrupt(int n, void *st) |
{ |
ASSERT(n < IVT_ITEMS); |
__native *stack = (__native *) st; |
iroutine old; |
old = ivt[n]; |
ivt[n] = f; |
return old; |
} |
/* |
* Called directly from the assembler code. |
* CPU is interrupts_disable()'d. |
*/ |
void trap_dispatcher(__u8 n, __native stack[]) |
{ |
ASSERT(n < IVT_ITEMS); |
ivt[n](n, stack); |
} |
void null_interrupt(__u8 n, __native stack[]) |
{ |
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"); |
} |
void gp_fault(__u8 n, __native stack[]) |
void gp_fault(int n, void *stack) |
{ |
PRINT_INFO_ERRCODE(stack); |
panic("general protection fault\n"); |
} |
void ss_fault(__u8 n, __native stack[]) |
void ss_fault(int n, void *stack) |
{ |
PRINT_INFO_ERRCODE(stack); |
panic("stack fault\n"); |
108,7 → 86,7 |
} |
void nm_fault(__u8 n, __native stack[]) |
void nm_fault(int n, void *stack) |
{ |
#ifdef CONFIG_FPU_LAZY |
scheduler_fpu_lazy_request(); |
119,7 → 97,7 |
void page_fault(__u8 n, __native stack[]) |
void page_fault(int n, void *stack) |
{ |
PRINT_INFO_ERRCODE(stack); |
printf("page fault address: %X\n", read_cr2()); |
126,19 → 104,19 |
panic("page fault\n"); |
} |
void syscall(__u8 n, __native stack[]) |
void syscall(int n, void *stack) |
{ |
printf("cpu%d: syscall\n", CPU->id); |
thread_usleep(1000); |
} |
void tlb_shootdown_ipi(__u8 n, __native stack[]) |
void tlb_shootdown_ipi(int n, void *stack) |
{ |
trap_virtual_eoi(); |
tlb_shootdown_ipi_recv(); |
} |
void wakeup_ipi(__u8 n, __native stack[]) |
void wakeup_ipi(int n, void *stack) |
{ |
trap_virtual_eoi(); |
} |
/kernel/trunk/arch/ia32/src/drivers/i8259.c |
---|
32,6 → 32,7 |
#include <arch/asm.h> |
#include <arch.h> |
#include <print.h> |
#include <interrupt.h> |
/* |
* This is the PIC driver. |
38,6 → 39,8 |
* Programmable Interrupt Controller for UP systems. |
*/ |
static void pic_spurious(int n, void *stack); |
void i8259_init(void) |
{ |
/* ICW1: this is ICW1, ICW4 to follow */ |
67,7 → 70,7 |
/* |
* Register interrupt handler for the PIC spurious interrupt. |
*/ |
trap_register(VECTOR_PIC_SPUR, pic_spurious); |
exc_register(VECTOR_PIC_SPUR, "pic_spurious", pic_spurious); |
/* |
* Set the enable/disable IRQs handlers. |
115,7 → 118,7 |
outb(0xa0,0x20); |
} |
void pic_spurious(__u8 n, __native stack[]) |
void pic_spurious(int n, void *stack) |
{ |
printf("cpu%d: PIC spurious interrupt\n", CPU->id); |
} |
/kernel/trunk/arch/ia32/src/drivers/i8042.c |
---|
38,6 → 38,7 |
#include <console/chardev.h> |
#include <console/console.h> |
#include <macros.h> |
#include <interrupt.h> |
/** |
* i8042 processor driver. |
235,10 → 236,12 |
SPECIAL, /* 0x7f */ |
}; |
static void i8042_interrupt(int n, void *stack); |
/** Initialize i8042. */ |
void i8042_init(void) |
{ |
trap_register(VECTOR_KBD, i8042_interrupt); |
exc_register(VECTOR_KBD, "i8042_interrupt", i8042_interrupt); |
trap_virtual_enable_irqs(1<<IRQ_KBD); |
spinlock_initialize(&keylock, "i8042_lock"); |
chardev_initialize("i8042_kbd", &kbrd, &ops); |
250,7 → 253,7 |
* @param n Interrupt vector. |
* @param stack Interrupted stack. |
*/ |
void i8042_interrupt(__u8 n, __native stack[]) |
void i8042_interrupt(int n, void *stack) |
{ |
__u8 x; |
/kernel/trunk/arch/ia32/src/drivers/i8254.c |
---|
39,6 → 39,7 |
#include <arch/cpuid.h> |
#include <arch.h> |
#include <time/delay.h> |
#include <interrupt.h> |
/* |
* i8254 chip driver. |
52,6 → 53,8 |
#define CLK_CONST 1193180 |
#define MAGIC_NUMBER 1194 |
static void i8254_interrupt(int n, void *stack); |
void i8254_init(void) |
{ |
i8254_normal_operation(); |
64,7 → 67,7 |
outb(CLK_PORT1, (CLK_CONST/HZ) & 0xf); |
outb(CLK_PORT1, (CLK_CONST/HZ) >> 8); |
pic_enable_irqs(1<<IRQ_CLK); |
trap_register(VECTOR_CLK, i8254_interrupt); |
exc_register(VECTOR_CLK, "i8254_clock", i8254_interrupt); |
} |
#define LOOPS 150000 |
122,7 → 125,7 |
return; |
} |
void i8254_interrupt(__u8 n, __native stack[]) |
void i8254_interrupt(int n, void *stack) |
{ |
trap_virtual_eoi(); |
clock(); |