void exceptionHandler(int vector, void (*handler)(void)) { rtems_raw_irq_connect_data excep_raw_irq_data; excep_raw_irq_data.idtIndex = vector; if(!i386_get_current_idt_entry(&excep_raw_irq_data)) { printk("cannot get idt entry\n"); rtems_fatal_error_occurred(1); } if(!i386_delete_idt_entry(&excep_raw_irq_data)) { printk("cannot delete idt entry\n"); rtems_fatal_error_occurred(1); } excep_raw_irq_data.on = nop; excep_raw_irq_data.off = nop; excep_raw_irq_data.isOn = isOn; excep_raw_irq_data.hdl = handler; if (!i386_set_idt_entry (&excep_raw_irq_data)) { printk("raw exception handler connection failed\n"); rtems_fatal_error_occurred(1); } return; }
void l4rtems_timerInit( void ) { printk( "Timer init called\n"); if( !init ) { init = true; rtems_raw_irq_connect_data raw_irq_data = { BSP_PERIODIC_TIMER + BSP_IRQ_VECTOR_BASE, rtems_irq_prologue_0, NULL, NULL, NULL }; i386_delete_idt_entry (&raw_irq_data); atexit(l4rtems_timer_exit); /* Try not to hose the system at exit. */ if (!i386_set_idt_entry (&timer_raw_irq_data)) { printk("raw handler connection failed\n"); rtems_fatal_error_occurred(1); } } /* wait for ISR to be called at least once */ Ttimer_val = 0; while(Ttimer_val == 0) continue; printk( "Timer initialized!" ); Ttimer_val = 0; }
/* * In order to have a possibility to break into * running program, one has to call this function */ void i386_stub_glue_init_breakin(void) { rtems_raw_irq_connect_data uart_raw_irq_data; assert(uart_current == BSP_UART_COM1 || uart_current == BSP_UART_COM2); if(uart_current == BSP_UART_COM1) { uart_raw_irq_data.idtIndex = BSP_UART_COM1_IRQ + BSP_IRQ_VECTOR_BASE; } else { uart_raw_irq_data.idtIndex = BSP_UART_COM2_IRQ + BSP_IRQ_VECTOR_BASE; } if(!i386_get_current_idt_entry(&uart_raw_irq_data)) { printk("cannot get idt entry\n"); rtems_fatal_error_occurred(1); } if(!i386_delete_idt_entry(&uart_raw_irq_data)) { printk("cannot delete idt entry\n"); rtems_fatal_error_occurred(1); } uart_raw_irq_data.on = BSP_uart_on; uart_raw_irq_data.off = BSP_uart_off; uart_raw_irq_data.isOn= BSP_uart_isOn; /* Install ISR */ if(uart_current == BSP_UART_COM1) { uart_raw_irq_data.idtIndex = BSP_UART_COM1_IRQ + BSP_IRQ_VECTOR_BASE; uart_raw_irq_data.hdl = BSP_uart_dbgisr_com1; } else { uart_raw_irq_data.idtIndex = BSP_UART_COM2_IRQ + BSP_IRQ_VECTOR_BASE; uart_raw_irq_data.hdl = BSP_uart_dbgisr_com2; } if (!i386_set_idt_entry (&uart_raw_irq_data)) { printk("raw exception handler connection failed\n"); rtems_fatal_error_occurred(1); } /* Enable interrupts */ BSP_uart_intr_ctrl(uart_current, BSP_UART_INTR_CTRL_GDB); return; }
/* * In order to have a possibility to break into * running program, one has to call this function */ void i386_stub_glue_init_breakin(void) { rtems_raw_irq_connect_data uart_raw_irq_data; if (port_current == NULL) { printk("GDB: no port initialised\n"); return; } if ((port_current->ulIntVector == 0) || (port_current->ulIntVector > 16)) { printk("GDB: no UART interrupt support\n"); } else { uart_vector = port_current->ulIntVector; uart_raw_irq_data.idtIndex = port_current->ulIntVector + BSP_IRQ_VECTOR_BASE; if (!i386_get_current_idt_entry(&uart_raw_irq_data)) { printk("GBD: cannot get idt entry\n"); rtems_fatal_error_occurred(1); } if (!i386_delete_idt_entry(&uart_raw_irq_data)) { printk("GDB: cannot delete idt entry\n"); rtems_fatal_error_occurred(1); } uart_raw_irq_data.on = BSP_uart_on; uart_raw_irq_data.off = BSP_uart_off; uart_raw_irq_data.isOn= BSP_uart_isOn; /* Install ISR */ uart_raw_irq_data.idtIndex = port_current->ulIntVector + BSP_IRQ_VECTOR_BASE; uart_raw_irq_data.hdl = i386_gdb_uart_isr; if (!i386_set_idt_entry (&uart_raw_irq_data)) { printk("GDB: raw exception handler connection failed\n"); rtems_fatal_error_occurred(1); } /* Enable interrupts, this is a bit of a hack because we * have to know the device but there is no other call. */ (*port_current->setRegister)(port_current->ulCtrlPort1, 1, 0x01); } }
void Timer_initialize() { static rtems_boolean First = TRUE; if (First) { First = FALSE; atexit(Timer_exit); /* Try not to hose the system at exit. */ if (!i386_set_idt_entry (&timer_raw_irq_data)) { printk("Timer_initialize: raw handler installation failed\n"); rtems_fatal_error_occurred(1); } } /* wait for ISR to be called at least once */ Ttimer_val = 0; while (Ttimer_val == 0) continue; Ttimer_val = 0; }