From 67a2288991ce3662a588ee83c0bea9c9efae5f1e Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Thu, 23 Jul 1998 22:02:34 +0000 Subject: Patch from Eric VALETTE : Here is a enhanced version of my previous patch. This patch enables to potentially share the new interrupt management code for all Intel targets (pc386, go32 and force386) bsp. Note : this patch is complete only for pc386. It still needs to be completed for go32 and force386. I carrefully checked that anything needed is in for force386 (only some function name changes for IDT manipulation and GDT segment manipulation). But anyway I will not be able to test any of theses targets... --- c/src/lib/libbsp/i386/pc386/clock/ckinit.c | 66 +++++++++++------------ c/src/lib/libbsp/i386/pc386/console/console.c | 46 +++++++++------- c/src/lib/libbsp/i386/pc386/console/inch.c | 31 +++++++++-- c/src/lib/libbsp/i386/pc386/include/Makefile.in | 4 +- c/src/lib/libbsp/i386/pc386/include/bsp.h | 10 ++-- c/src/lib/libbsp/i386/pc386/start/start.s | 3 +- c/src/lib/libbsp/i386/pc386/startup/Makefile.in | 10 +++- c/src/lib/libbsp/i386/pc386/startup/bspstart.c | 8 ++- c/src/lib/libbsp/i386/pc386/startup/ldsegs.s | 30 ++--------- c/src/lib/libbsp/i386/pc386/timer/timer.c | 72 ++++++++++++++++++------- 10 files changed, 167 insertions(+), 113 deletions(-) (limited to 'c/src/lib/libbsp/i386/pc386') diff --git a/c/src/lib/libbsp/i386/pc386/clock/ckinit.c b/c/src/lib/libbsp/i386/pc386/clock/ckinit.c index 956d453747..f3687d1e66 100644 --- a/c/src/lib/libbsp/i386/pc386/clock/ckinit.c +++ b/c/src/lib/libbsp/i386/pc386/clock/ckinit.c @@ -38,11 +38,6 @@ #include #include -/*-------------------------------------------------------------------------+ -| Constants -+--------------------------------------------------------------------------*/ -#define CLOCK_IRQ 0x00 /* Clock IRQ. */ - /*-------------------------------------------------------------------------+ | Macros +--------------------------------------------------------------------------*/ @@ -67,13 +62,12 @@ rtems_device_minor_number rtems_clock_minor; /*-------------------------------------------------------------------------+ | Function: clockIsr -| Description: Interrupt Service Routine for clock (08h) interruption. +| Description: Interrupt Service Routine for clock (0h) interruption. | Global Variables: Clock_driver_ticks, Clock_isrs. | Arguments: vector - standard RTEMS argument - see documentation. | Returns: standard return value - see documentation. +--------------------------------------------------------------------------*/ -static rtems_isr -clockIsr(rtems_vector_number vector) +static void clockIsr() { /*-------------------------------------------------------------------------+ | PLEASE NOTE: The following is directly transcribed from the go32 BSP for @@ -98,10 +92,8 @@ clockIsr(rtems_vector_number vector) else Clock_isrs--; - PC386_ackIrq(vector - PC386_IRQ_VECTOR_BASE); } /* clockIsr */ - /*-------------------------------------------------------------------------+ | Function: Clock_exit | Description: Clock cleanup routine at RTEMS exit. NOTE: This routine is @@ -110,7 +102,7 @@ clockIsr(rtems_vector_number vector) | Arguments: None. | Returns: Nothing. +--------------------------------------------------------------------------*/ -void Clock_exit(void) +void clockOff(const rtems_irq_connect_data* unused) { if (BSP_Configuration.ticks_per_timeslice) { @@ -129,13 +121,10 @@ void Clock_exit(void) | Arguments: None. | Returns: Nothing. +--------------------------------------------------------------------------*/ -void -Install_clock(rtems_isr_entry isr) +static void clockOn(const rtems_irq_connect_data* unused) { rtems_unsigned32 microseconds_per_isr; - rtems_status_code status; - #if 0 /* Initialize clock from on-board real time clock. This breaks the */ /* test code which assumes which assumes the application will do it. */ @@ -175,22 +164,25 @@ Install_clock(rtems_isr_entry isr) /* 105/88 approximates TIMER_TICK * 1e-6 */ rtems_unsigned32 count = US_TO_TICK(microseconds_per_isr); - status = PC386_installRtemsIrqHandler(CLOCK_IRQ, isr); - - if (status != RTEMS_SUCCESSFUL) - { - printk("Error installing clock interrupt handler!\n"); - rtems_fatal_error_occurred(status); - } - outport_byte(TIMER_MODE, TIMER_SEL0|TIMER_16BIT|TIMER_RATEGEN); outport_byte(TIMER_CNTR0, count >> 0 & 0xff); outport_byte(TIMER_CNTR0, count >> 8 & 0xff); } - atexit(Clock_exit); -} /* Install_clock */ +} +int clockIsOn(const rtems_irq_connect_data* unused) +{ + return ((i8259s_cache & 0x1) == 0); +} + +static rtems_irq_connect_data clockIrqData = {PC_386_PERIODIC_TIMER, + clockIsr, + clockOn, + clockOff, + clockIsOn}; + + /*-------------------------------------------------------------------------+ | Clock device driver INITIALIZE entry point. @@ -202,8 +194,11 @@ Clock_initialize(rtems_device_major_number major, rtems_device_minor_number minor, void *pargp) { - Install_clock(clockIsr); /* Install the interrupt handler */ - + + if (!pc386_install_rtems_irq_handler (&clockIrqData)) { + printk("Unable to initialize system clock\n"); + rtems_fatal_error_occurred(1); + } /* make major/minor avail to others such as shared memory driver */ rtems_clock_major = major; @@ -212,7 +207,7 @@ Clock_initialize(rtems_device_major_number major, return RTEMS_SUCCESSFUL; } /* Clock_initialize */ - + /*-------------------------------------------------------------------------+ | Console device driver CONTROL entry point +--------------------------------------------------------------------------*/ @@ -231,17 +226,12 @@ Clock_control(rtems_device_major_number major, +-------------------------------------------------------------------------*/ if (args->command == rtems_build_name('I', 'S', 'R', ' ')) - clockIsr(PC386_IRQ_VECTOR_BASE + CLOCK_IRQ); + clockIsr(); else if (args->command == rtems_build_name('N', 'E', 'W', ' ')) { - rtems_status_code status; - - status = PC386_installRtemsIrqHandler(CLOCK_IRQ, clockIsr); - - if (status != RTEMS_SUCCESSFUL) - { + if (!pc386_install_rtems_irq_handler (&clockIrqData)) { printk("Error installing clock interrupt handler!\n"); - rtems_fatal_error_occurred(status); + rtems_fatal_error_occurred(1); } } } @@ -249,6 +239,10 @@ Clock_control(rtems_device_major_number major, return RTEMS_SUCCESSFUL; } /* Clock_control */ +void Clock_exit() +{ + pc386_remove_rtems_irq_handler (&clockIrqData); +} /*-------------------------------------------------------------------------+ | PLEASE NOTE: The following is directly transcribed from the go32 BSP for diff --git a/c/src/lib/libbsp/i386/pc386/console/console.c b/c/src/lib/libbsp/i386/pc386/console/console.c index 29ec37ec56..c8d9a2c4f4 100644 --- a/c/src/lib/libbsp/i386/pc386/console/console.c +++ b/c/src/lib/libbsp/i386/pc386/console/console.c @@ -45,17 +45,20 @@ int PC386ConsolePort = PC386_CONSOLE_PORT_CONSOLE; static int conSetAttr(int minor, const struct termios *); -/*-------------------------------------------------------------------------+ -| Constants -+--------------------------------------------------------------------------*/ -#define KEYBOARD_IRQ 0x01 /* Keyboard IRQ. */ - - /*-------------------------------------------------------------------------+ | External Prototypes +--------------------------------------------------------------------------*/ -extern rtems_isr _IBMPC_keyboard_isr(rtems_vector_number); - /* keyboard (IRQ 0x01) Interrupt Service Routine (defined in 'inch.c') */ +extern void _IBMPC_keyboard_isr(void); +extern void _IBMPC_keyboard_isr_on(const rtems_irq_connect_data*); +extern void _IBMPC_keyboard_isr_off(const rtems_irq_connect_data*); +extern int _IBMPC_keyboard_isr_is_on(const rtems_irq_connect_data*); + +static rtems_irq_connect_data console_isr_data = {PC_386_KEYBOARD, + _IBMPC_keyboard_isr, + _IBMPC_keyboard_isr_on, + _IBMPC_keyboard_isr_off, + _IBMPC_keyboard_isr_is_on}; + extern rtems_boolean _IBMPC_scankey(char *); /* defined in 'inch.c' */ @@ -164,9 +167,9 @@ console_initialize(rtems_device_major_number major, { /* Install keyboard interrupt handler */ - status = PC386_installRtemsIrqHandler(KEYBOARD_IRQ, _IBMPC_keyboard_isr); - - if (status != RTEMS_SUCCESSFUL) + status = pc386_install_rtems_irq_handler(&console_isr_data); + + if (!status) { printk("Error installing keyboard interrupt handler!\n"); rtems_fatal_error_occurred(status); @@ -198,16 +201,18 @@ console_initialize(rtems_device_major_number major, /* Set interrupt handler */ if(PC386ConsolePort == PC386_UART_COM1) { - status = PC386_installRtemsIrqHandler(PC386_UART_COM1_IRQ, - PC386_uart_termios_isr_com1); + console_isr_data.name = PC386_UART_COM1_IRQ; + console_isr_data.hdl = PC386_uart_termios_isr_com1; + } else { assert(PC386ConsolePort == PC386_UART_COM2); - - status = PC386_installRtemsIrqHandler(PC386_UART_COM2_IRQ, - PC386_uart_termios_isr_com2); + console_isr_data.name = PC386_UART_COM2_IRQ; + console_isr_data.hdl = PC386_uart_termios_isr_com2; } + + status =pc386_install_rtems_irq_handler(&console_isr_data); /* * Register the device */ @@ -291,12 +296,15 @@ console_close(rtems_device_major_number major, rtems_device_minor_number minor, void *arg) { + rtems_device_driver res = RTEMS_SUCCESSFUL; + if(PC386ConsolePort != PC386_CONSOLE_PORT_CONSOLE) { - return rtems_termios_close (arg); + res = rtems_termios_close (arg); } - - return RTEMS_SUCCESSFUL; + pc386_remove_rtems_irq_handler (&console_isr_data); + + return res; } /* console_close */ diff --git a/c/src/lib/libbsp/i386/pc386/console/inch.c b/c/src/lib/libbsp/i386/pc386/console/inch.c index 9159e62ab4..39c29f93e0 100644 --- a/c/src/lib/libbsp/i386/pc386/console/inch.c +++ b/c/src/lib/libbsp/i386/pc386/console/inch.c @@ -210,6 +210,17 @@ _IBMPC_scankey(char *outChar) return TRUE; } /* _IBMPC_scankey */ +void _IBMPC_keyboard_isr_on(const rtems_irq_connect_data* unused) +{} +void _IBMPC_keyboard_isr_off(const rtems_irq_connect_data* unused) +{} + +int _IBMPC_keyboard_isr_is_on(const rtems_irq_connect_data* irq) +{ + return pc386_irq_enabled_at_i8259s (irq->name); +} + + /*-------------------------------------------------------------------------+ | Function: _IBMPC_keyboard_isr @@ -218,8 +229,7 @@ _IBMPC_scankey(char *outChar) | Arguments: vector - standard RTEMS argument - see documentation. | Returns: standard return value - see documentation. +--------------------------------------------------------------------------*/ -rtems_isr -_IBMPC_keyboard_isr(rtems_vector_number vector) +void _IBMPC_keyboard_isr() { if (_IBMPC_scankey(&kbd_buffer[kbd_last])) { @@ -231,8 +241,6 @@ _IBMPC_keyboard_isr(rtems_vector_number vector) kbd_last = next; } } - - PC386_ackIrq(vector - PC386_IRQ_VECTOR_BASE); /* Mark interrupt as handled. */ } /* _IBMPC_keyboard_isr */ @@ -281,6 +289,21 @@ _IBMPC_inch(void) return c; } /* _IBMPC_inch */ + + /* + * Routine that can be used before interrupt management is initialized. + */ + +char +debugPollingGetChar(void) +{ + char c; + while (!_IBMPC_scankey(&c)) + continue; + + return c; +} + /*-------------------------------------------------------------------------+ | Function: _IBMPC_inch_sleep | Description: If charcter is ready return it, otherwise sleep until diff --git a/c/src/lib/libbsp/i386/pc386/include/Makefile.in b/c/src/lib/libbsp/i386/pc386/include/Makefile.in index 49e4168eca..10cf41f1a3 100644 --- a/c/src/lib/libbsp/i386/pc386/include/Makefile.in +++ b/c/src/lib/libbsp/i386/pc386/include/Makefile.in @@ -8,8 +8,8 @@ VPATH = @srcdir@ RTEMS_ROOT = @top_srcdir@ PROJECT_ROOT = @PROJECT_ROOT@ -H_FILES = $(srcdir)/bsp.h $(srcdir)/coverhd.h $(srcdir)/irq.h \ - $(srcdir)/crt.h $(srcdir)/pc386uart.h $(srcdir)/pcibios.h +H_FILES = $(srcdir)/bsp.h $(srcdir)/coverhd.h $(srcdir)/crt.h \ + $(srcdir)/pc386uart.h $(srcdir)/pcibios.h # # Equate files are for including from assembly preprocessed by diff --git a/c/src/lib/libbsp/i386/pc386/include/bsp.h b/c/src/lib/libbsp/i386/pc386/include/bsp.h index c7920f385b..1e7a4a6506 100644 --- a/c/src/lib/libbsp/i386/pc386/include/bsp.h +++ b/c/src/lib/libbsp/i386/pc386/include/bsp.h @@ -51,7 +51,8 @@ extern "C" { #include #include #include - +#include + /*-------------------------------------------------------------------------+ | Constants +--------------------------------------------------------------------------*/ @@ -133,8 +134,11 @@ extern "C" { /*-------------------------------------------------------------------------+ | External Variables. +--------------------------------------------------------------------------*/ -extern i386_IDT_slot Interrupt_descriptor_table[]; -extern i386_GDT_slot Global_descriptor_table []; +#define IDT_SIZE 256 +#define GDT_SIZE 3 + +extern interrupt_gate_descriptor Interrupt_descriptor_table[IDT_SIZE]; +extern segment_descriptors Global_descriptor_table [GDT_SIZE]; extern rtems_configuration_table BSP_Configuration; /* User provided BSP configuration table. */ diff --git a/c/src/lib/libbsp/i386/pc386/start/start.s b/c/src/lib/libbsp/i386/pc386/start/start.s index fae56137e5..36fad8153c 100644 --- a/c/src/lib/libbsp/i386/pc386/start/start.s +++ b/c/src/lib/libbsp/i386/pc386/start/start.s @@ -104,7 +104,8 @@ speakl: jmp speakl # and SPIN!!! call printk addl $4, esp - /*call debugPollingGetChar */ + call debugPollingGetChar + #endif /*----------------------------------------------------------------------------+ diff --git a/c/src/lib/libbsp/i386/pc386/startup/Makefile.in b/c/src/lib/libbsp/i386/pc386/startup/Makefile.in index 1c8f298249..a4fe0e4cb2 100644 --- a/c/src/lib/libbsp/i386/pc386/startup/Makefile.in +++ b/c/src/lib/libbsp/i386/pc386/startup/Makefile.in @@ -11,14 +11,14 @@ PROJECT_ROOT = @PROJECT_ROOT@ PGM=${ARCH}/startup.rel # C source names, if any, go here -- minus the .c -C_PIECES=bspclean bsplibc bsppost bspstart exit irq main sbrk +C_PIECES=bspclean bsplibc bsppost bspstart exit irq irq_init main sbrk C_FILES=$(C_PIECES:%=%.c) C_O_FILES=$(C_PIECES:%=${ARCH}/%.o) H_FILES= # Assembly source names, if any, go here -- minus the .s -S_PIECES=ldsegs +S_PIECES=ldsegs irq_asm S_FILES=$(S_PIECES:%=%.s) S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o) @@ -50,6 +50,12 @@ LDFLAGS += CLEAN_ADDITIONS += CLOBBER_ADDITIONS += +IMPORT_SRC=$(srcdir)/../../shared/irq/irq.c \ + $(srcdir)/../../shared/irq/irq_init.c $(srcdir)/../../shared/irq/irq_asm.s + +preinstall: + ${CP} ${IMPORT_SRC} . + ${PGM}: ${SRCS} ${OBJS} $(make-rel) all: ${ARCH} $(SRCS) $(PGM) diff --git a/c/src/lib/libbsp/i386/pc386/startup/bspstart.c b/c/src/lib/libbsp/i386/pc386/startup/bspstart.c index 607e816d6d..744808b3be 100644 --- a/c/src/lib/libbsp/i386/pc386/startup/bspstart.c +++ b/c/src/lib/libbsp/i386/pc386/startup/bspstart.c @@ -65,7 +65,8 @@ char *rtems_progname; /* Program name - from main(). */ extern void _exit(int); /* define in exit.c */ void bsp_libc_init( void *, unsigned32, int ); void bsp_postdriver_hook(void); - +extern void rtems_irq_mngt_init(); + /*-------------------------------------------------------------------------+ | Function: bsp_pretasking_hook | Description: BSP pretasking hook. Called just before drivers are @@ -128,6 +129,11 @@ void bsp_start( void ) console_reserve_resources(&BSP_Configuration); + /* + * Init trems_interrupt_management + */ + rtems_irq_mngt_init(); + /* * The following information is very useful when debugging. */ diff --git a/c/src/lib/libbsp/i386/pc386/startup/ldsegs.s b/c/src/lib/libbsp/i386/pc386/startup/ldsegs.s index f2171575ce..8805128e69 100644 --- a/c/src/lib/libbsp/i386/pc386/startup/ldsegs.s +++ b/c/src/lib/libbsp/i386/pc386/startup/ldsegs.s @@ -45,12 +45,13 @@ /*----------------------------------------------------------------------------+ | CODE section +----------------------------------------------------------------------------*/ - +EXTERN (rtems_i8259_masks) + BEGIN_CODE EXTERN (_establish_stack) EXTERN (Timer_exit) - EXTERN (Clock_exit) + EXTERN (clockOff) .p2align 4 /*----------------------------------------------------------------------------+ @@ -95,25 +96,6 @@ next_step: movw ax, fs movw ax, gs - /* Set default interrupt handler */ - movl $0, ecx - movl $Interrupt_descriptor_table, eax - movl $_default_int_handler, ebx - movl ebx, edx - sarl $16, edx -loop: - movw bx, (eax) - movw $0x8, 2(eax) - movw $0x8e00, 4(eax) - movw dx, 8(eax) - addl $8, eax - addl $1, ecx - cmpl $255, ecx - jle loop - - - - /*---------------------------------------------------------------------+ | Now we have to reprogram the interrupts :-(. We put them right after | the intel-reserved hardware interrupts, at int 0x20-0x2F. There they @@ -157,6 +139,8 @@ loop: outb al, $0x21 /* is cascaded */ call SYM(delay) + movw $0xFFFB, SYM(i8259s_cache) /* set up same values in cache */ + jmp SYM (_establish_stack) # return to the bsp entry code /*-------------------------------------------------------------------------+ @@ -185,10 +169,6 @@ SYM (_return_to_monitor): +--------------------------------------------------------------------------*/ .p2align 4 - PUBLIC (_default_int_handler) -SYM (_default_int_handler): - iret - /*---------------------------------------------------------------------------+ | GDT itself +--------------------------------------------------------------------------*/ diff --git a/c/src/lib/libbsp/i386/pc386/timer/timer.c b/c/src/lib/libbsp/i386/pc386/timer/timer.c index ea7b5c5219..650c6a5a5e 100644 --- a/c/src/lib/libbsp/i386/pc386/timer/timer.c +++ b/c/src/lib/libbsp/i386/pc386/timer/timer.c @@ -43,7 +43,6 @@ /*-------------------------------------------------------------------------+ | Constants +--------------------------------------------------------------------------*/ -#define TIMER_IRQ 0x00 /* Timer IRQ. */ #define AVG_OVERHEAD 0 /* 0.1 microseconds to start/stop timer. */ #define LEAST_VALID 1 /* Don't trust a value lower than this. */ @@ -53,6 +52,13 @@ volatile rtems_unsigned32 Ttimer_val; rtems_boolean Timer_driver_Find_average_overhead = TRUE; +/*-------------------------------------------------------------------------+ +| External Prototypes ++--------------------------------------------------------------------------*/ +extern void timerisr(); + /* timer (int 08h) Interrupt Service Routine (defined in 'timerisr.s') */ +extern int clockIsOn(const rtems_irq_connect_data*); + /*-------------------------------------------------------------------------+ | Pentium optimized timer handling. +--------------------------------------------------------------------------*/ @@ -86,7 +92,6 @@ rdtsc(void) void Timer_exit(void) { - PC386_disableIrq(TIMER_IRQ); } /* Timer_exit */ @@ -107,8 +112,6 @@ Timer_initialize(void) First = FALSE; atexit(Timer_exit); /* Try not to hose the system at exit. */ - PC386_enableIrq(TIMER_IRQ); - /* Disable the programmable timer so ticks don't interfere. */ } Ttimer_val = rdtsc(); /* read starting time */ } /* Timer_initialize */ @@ -143,11 +146,48 @@ Read_timer(void) +--------------------------------------------------------------------------*/ #define US_PER_ISR 250 /* Number of micro-seconds per timer interruption */ + /*-------------------------------------------------------------------------+ -| External Prototypes +| Function: Timer_exit +| Description: Timer cleanup routine at RTEMS exit. NOTE: This routine is +| not really necessary, since there will be a reset at exit. +| Global Variables: None. +| Arguments: None. +| Returns: Nothing. +--------------------------------------------------------------------------*/ -extern rtems_isr timerisr(rtems_vector_number); - /* timer (int 08h) Interrupt Service Routine (defined in 'timerisr.s') */ +void +timerOff(const rtems_raw_irq_connect_data* used) +{ + /* + * disable interrrupt at i8259 level + */ + pc386_irq_disable_at_i8259s(used->idtIndex - PC386_IRQ_VECTOR_BASE); + /* reset timer mode to standard (DOS) value */ + outport_byte(TIMER_MODE, TIMER_SEL0|TIMER_16BIT|TIMER_RATEGEN); + outport_byte(TIMER_CNTR0, 0); + outport_byte(TIMER_CNTR0, 0); +} /* Timer_exit */ + + +void timerOn(const rtems_raw_irq_connect_data* used) +{ + /* load timer for US_PER_ISR microsecond period */ + outport_byte(TIMER_MODE, TIMER_SEL0|TIMER_16BIT|TIMER_RATEGEN); + outport_byte(TIMER_CNTR0, US_TO_TICK(US_PER_ISR) >> 0 & 0xff); + outport_byte(TIMER_CNTR0, US_TO_TICK(US_PER_ISR) >> 8 & 0xff); + /* + * disable interrrupt at i8259 level + */ + pc386_irq_enable_at_i8259s(used->idtIndex - PC386_IRQ_VECTOR_BASE); +} + +static rtems_raw_irq_connect_data timer_raw_irq_data = { + PC_386_PERIODIC_TIMER + PC386_IRQ_VECTOR_BASE, + timerisr, + timerOn, + timerOff, + clockIsOn +}; /*-------------------------------------------------------------------------+ | Function: Timer_exit @@ -160,13 +200,9 @@ extern rtems_isr timerisr(rtems_vector_number); void Timer_exit(void) { - /* reset timer mode to standard (DOS) value */ - outport_byte(TIMER_MODE, TIMER_SEL0|TIMER_16BIT|TIMER_RATEGEN); - outport_byte(TIMER_CNTR0, 0); - outport_byte(TIMER_CNTR0, 0); + i386_delete_idt_entry (&timer_raw_irq_data); } /* Timer_exit */ - /*-------------------------------------------------------------------------+ | Function: Timer_initialize | Description: Timer initialization routine. @@ -184,14 +220,10 @@ Timer_initialize(void) First = FALSE; atexit(Timer_exit); /* Try not to hose the system at exit. */ - - /* install a raw interrupt handler for timer */ - PC386_installRawIrqHandler(TIMER_IRQ, timerisr); - - /* load timer for US_PER_ISR microsecond period */ - outport_byte(TIMER_MODE, TIMER_SEL0|TIMER_16BIT|TIMER_RATEGEN); - outport_byte(TIMER_CNTR0, US_TO_TICK(US_PER_ISR) >> 0 & 0xff); - outport_byte(TIMER_CNTR0, US_TO_TICK(US_PER_ISR) >> 8 & 0xff); + if (!i386_set_idt_entry (&timer_raw_irq_data)) { + printk("raw handler connexion failed\n"); + rtems_fatal_error_occurred(1); + } } /* wait for ISR to be called at least once */ Ttimer_val = 0; -- cgit v1.2.3