void connect_rdbg_exception() { interrupt_gate_descriptor *currentIdtEntry; unsigned limit; unsigned level; /* * Connect the Exception used to debug */ i386_get_info_from_IDTR (¤tIdtEntry, &limit); _CPU_ISR_Disable(level); create_interrupt_gate_descriptor (¤tIdtEntry[50], rtems_exception_prologue_50); _CPU_ISR_Enable(level); old_currentExcHandler = _currentExcHandler; _currentExcHandler = BreakPointExcHdl ; }
void rtems_irq_mngt_init(void) { int i; interrupt_gate_descriptor* idt_entry_tbl; unsigned int limit; rtems_interrupt_level level; i386_get_info_from_IDTR(&idt_entry_tbl, &limit); /* Convert into number of entries */ limit = (limit + 1)/sizeof(interrupt_gate_descriptor); if(limit != IDT_SIZE) { printk("IDT table size mismatch !!! System locked\n"); while(1); } rtems_interrupt_disable(level); /* * Init the complete IDT vector table with defaultRawIrq value */ for (i = 0; i < IDT_SIZE ; i++) { idtHdl[i] = defaultRawIrq; idtHdl[i].idtIndex = i; } raw_initial_config.idtSize = IDT_SIZE; raw_initial_config.defaultRawEntry = defaultRawIrq; raw_initial_config.rawIrqHdlTbl = idtHdl; if (!i386_init_idt (&raw_initial_config)) { /* * put something here that will show the failure... */ printk("Unable to initialize IDT!!! System locked\n"); while (1); } /* * Patch the entry that will be used by RTEMS for interrupt management * with RTEMS prologue. */ for (i = 0; i < BSP_IRQ_LINES_NUMBER; i++) { create_interrupt_gate_descriptor(&idtEntry, rtemsIrq[i]); idt_entry_tbl[i + BSP_ASM_IRQ_VECTOR_BASE] = idtEntry; } /* * At this point we have completed the initialization of IDT * with raw handlers. We must now initialize the higher level * interrupt management. */ /* * Init initial Interrupt management config */ bsp_interrupt_initialize(); /* * #define DEBUG */ #ifdef DEBUG { /* * following adresses should be the same */ unsigned tmp; printk("idt_entry_tbl = %x Interrupt_descriptor_table addr = %x\n", idt_entry_tbl, &Interrupt_descriptor_table); tmp = (unsigned) get_hdl_from_vector (BSP_ASM_IRQ_VECTOR_BASE + BSP_PERIODIC_TIMER); printk("clock isr address from idt = %x should be %x\n", tmp, (unsigned) rtems_irq_prologue_0); } printk("i8259s_cache = %x\n", * (unsigned short*) &i8259s_cache); BSP_wait_polled_input(); #endif }