Subversion Repositories HelenOS-historic

Compare Revisions

Ignore whitespace Rev 575 → Rev 576

/kernel/trunk/arch/amd64/src/amd64.c
44,6 → 44,7
#include <arch/cpuid.h>
#include <genarch/acpi/acpi.h>
#include <panic.h>
#include <interrupt.h>
 
void arch_pre_mm_init(void)
{
72,11 → 73,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/amd64/src/pm.c
31,6 → 31,7
#include <arch/types.h>
#include <arch/interrupt.h>
#include <arch/asm.h>
#include <interrupt.h>
 
#include <config.h>
 
174,11 → 175,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/amd64/src/asm_utils.S
159,7 → 159,7
# vectors starting at vector i.
#
# The handlers setup data segment registers
# and call trap_dispatcher().
# and call exc_dispatch().
#
.macro handler i n
pushq %rbp
170,7 → 170,7
movq $(\i),%rdi # %rdi - first parameter
movq %rbp, %rsi
addq $8, %rsi # %rsi - second parameter - original stack
call trap_dispatcher # trap_dispatcher(i, stack)
call exc_dispatch # exc_dispatch(i, stack)
 
# Test if this is interrupt with error word or not
mov $\i,%cl;
/kernel/trunk/arch/amd64/src/mm/page.c
34,6 → 34,7
#include <arch/asm.h>
#include <config.h>
#include <memstr.h>
#include <interrupt.h>
 
static __address bootstrap_dba;
 
55,7 → 56,7
page_mapping_insert(PA2KA(cur), cur, PAGE_CACHEABLE | PAGE_EXEC, KA2PA(dba));
}
 
trap_register(14, page_fault);
exc_register(14, "page_fault", page_fault);
write_cr3(KA2PA(dba));
}
else {
/kernel/trunk/arch/amd64/src/interrupt.c
57,9 → 57,10
printf("\n");
}
 
static void print_info_errcode(__u8 n, __native x[])
static void print_info_errcode(int n, void *st)
{
char *symbol;
__native *x = (__native *) st;
 
if (!(symbol=get_symtab_entry(x[1])))
symbol = "";
88,49 → 89,26
* 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;
 
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("-----EXCEPTION(%d) OCCURED----- ( %s )\n",n,__FUNCTION__); \
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(n,stack);
panic("general protection fault\n");
}
 
void ss_fault(__u8 n, __native stack[])
void ss_fault(int n, void *stack)
{
print_info_errcode(n,stack);
panic("stack fault\n");
137,7 → 115,7
}
 
 
void nm_fault(__u8 n, __native stack[])
void nm_fault(int n, void *stack)
{
#ifdef CONFIG_FPU_LAZY
scheduler_fpu_lazy_request();
148,7 → 126,7
 
 
 
void page_fault(__u8 n, __native stack[])
void page_fault(int n, void *stack)
{
print_info_errcode(n,stack);
printf("Page fault address: %Q\n", read_cr2());
155,19 → 133,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/include/interrupt.h
26,8 → 26,8
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
 
#ifndef __INTERRUPT_H__
#define __INTERRUPT_H__
#ifndef __ia32_INTERRUPT_H__
#define __ia32_INTERRUPT_H__
 
#include <arch/types.h>
#include <arch/pm.h>
61,25 → 61,19
#define VECTOR_TLB_SHOOTDOWN_IPI (IVT_FREEBASE+1)
#define VECTOR_WAKEUP_IPI (IVT_FREEBASE+2)
 
typedef void (* iroutine)(__u8 n, __native stack[]);
 
extern void (* disable_irqs_function)(__u16 irqmask);
extern void (* enable_irqs_function)(__u16 irqmask);
extern void (* eoi_function)(void);
 
extern iroutine trap_register(__u8 n, iroutine f);
extern void null_interrupt(int n, void *stack);
extern void gp_fault(int n, void *stack);
extern void nm_fault(int n, void *stack);
extern void ss_fault(int n, void *stack);
extern void page_fault(int n, void *stack);
extern void syscall(int n, void *stack);
extern void tlb_shootdown_ipi(int n, void *stack);
extern void wakeup_ipi(int n, void *stack);
 
extern void trap_dispatcher(__u8 n, __native stack[]);
 
extern void null_interrupt(__u8 n, __native stack[]);
extern void gp_fault(__u8 n, __native stack[]);
extern void nm_fault(__u8 n, __native stack[]);
extern void ss_fault(__u8 n, __native stack[]);
extern void page_fault(__u8 n, __native stack[]);
extern void syscall(__u8 n, __native stack[]);
extern void tlb_shootdown_ipi(__u8 n, __native stack[]);
extern void wakeup_ipi(__u8 n, __native stack[]);
 
extern void trap_virtual_enable_irqs(__u16 irqmask);
extern void trap_virtual_disable_irqs(__u16 irqmask);
extern void trap_virtual_eoi(void);
/kernel/trunk/arch/ia32/include/i8042.h
39,6 → 39,5
#define SC_CAPSLOCK 0x3a
 
extern void i8042_init(void);
extern void i8042_interrupt(__u8 n, __native stack[]);
 
#endif
/kernel/trunk/arch/ia32/include/smp/apic.h
311,7 → 311,6
extern __u32 apic_id_mask;
 
extern void apic_init(void);
extern void apic_spurious(__u8 n, __native stack[]);
 
extern void l_apic_init(void);
extern void l_apic_eoi(void);
318,7 → 317,6
extern int l_apic_broadcast_custom_ipi(__u8 vector);
extern int l_apic_send_init_ipi(__u8 apicid);
extern void l_apic_debug(void);
extern void l_apic_timer_interrupt(__u8 n, __native stack[]);
extern __u8 l_apic_id(void);
 
extern __u32 io_apic_read(__u8 address);
/kernel/trunk/arch/ia32/include/i8254.h
32,7 → 32,6
#include <arch/types.h>
 
extern void i8254_init(void);
extern void i8254_interrupt(__u8 n, __native stack[]);
extern void i8254_calibrate_delay_loop(void);
extern void i8254_normal_operation(void);
 
/kernel/trunk/arch/ia32/include/i8259.h
44,6 → 44,5
extern void pic_enable_irqs(__u16 irqmask);
extern void pic_disable_irqs(__u16 irqmask);
extern void pic_eoi(void);
extern void pic_spurious(__u8 n, __native stack[]);
 
#endif
/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();