00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00035 #include <interrupt.h>
00036 #include <arch/interrupt.h>
00037 #include <arch/types.h>
00038 #include <arch.h>
00039 #include <time/clock.h>
00040 #include <ipc/sysipc.h>
00041 #include <arch/drivers/pic.h>
00042 #include <arch/mm/tlb.h>
00043
00044
00045 void start_decrementer(void)
00046 {
00047 asm volatile (
00048 "mtdec %0\n"
00049 :
00050 : "r" (1000)
00051 );
00052 }
00053
00054
00056 static void exception_external(int n, istate_t *istate)
00057 {
00058 int inum;
00059
00060 while ((inum = pic_get_pending()) != -1) {
00061 exc_dispatch(inum + INT_OFFSET, istate);
00062 pic_ack_interrupt(inum);
00063 }
00064 }
00065
00066
00067 static void exception_decrementer(int n, istate_t *istate)
00068 {
00069 clock();
00070 start_decrementer();
00071 }
00072
00073
00074
00075 void interrupt_init(void)
00076 {
00077 exc_register(VECTOR_DATA_STORAGE, "data_storage", pht_refill);
00078 exc_register(VECTOR_INSTRUCTION_STORAGE, "instruction_storage", pht_refill);
00079 exc_register(VECTOR_EXTERNAL, "external", exception_external);
00080 exc_register(VECTOR_DECREMENTER, "timer", exception_decrementer);
00081 }
00082
00083
00084 static void ipc_int(int n, istate_t *istate)
00085 {
00086 ipc_irq_send_notif(n - INT_OFFSET);
00087 }
00088
00089
00090
00091 void irq_ipc_bind_arch(__native irq)
00092 {
00093 int_register(irq, "ipc_int", ipc_int);
00094 }
00095