summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/i386/pc386
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--c/src/lib/libbsp/i386/pc386/clock/ckinit.c66
-rw-r--r--c/src/lib/libbsp/i386/pc386/console/console.c46
-rw-r--r--c/src/lib/libbsp/i386/pc386/console/inch.c31
-rw-r--r--c/src/lib/libbsp/i386/pc386/include/Makefile.in4
-rw-r--r--c/src/lib/libbsp/i386/pc386/include/bsp.h10
-rw-r--r--c/src/lib/libbsp/i386/pc386/start/start.s3
-rw-r--r--c/src/lib/libbsp/i386/pc386/startup/Makefile.in10
-rw-r--r--c/src/lib/libbsp/i386/pc386/startup/bspstart.c8
-rw-r--r--c/src/lib/libbsp/i386/pc386/startup/ldsegs.s30
-rw-r--r--c/src/lib/libbsp/i386/pc386/timer/timer.c72
10 files changed, 167 insertions, 113 deletions
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
@@ -39,11 +39,6 @@
#include <rtems/libio.h>
/*-------------------------------------------------------------------------+
-| Constants
-+--------------------------------------------------------------------------*/
-#define CLOCK_IRQ 0x00 /* Clock IRQ. */
-
-/*-------------------------------------------------------------------------+
| Macros
+--------------------------------------------------------------------------*/
#if 0
@@ -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
@@ -46,16 +46,19 @@ 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 <iosupp.h>
#include <console.h>
#include <clockdrv.h>
-
+#include <libcpu/cpu.h>
+
/*-------------------------------------------------------------------------+
| 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
@@ -129,6 +130,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. */
@@ -54,6 +53,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.
+--------------------------------------------------------------------------*/
#if defined(pentium)
@@ -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;