Subversion Repositories HelenOS-historic

Compare Revisions

Ignore whitespace Rev 575 → Rev 576

/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);
iroutine old;
old = ivt[n];
ivt[n] = f;
return old;
}
__native *stack = (__native *) st;
 
/*
* 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();