summaryrefslogtreecommitdiffstats
path: root/cpukit/score/cpu/i386
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>1995-07-12 19:47:25 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>1995-07-12 19:47:25 +0000
commit637df35f96d8023056369fcf2c9943419f1a1b74 (patch)
treea12bd461bf892ccaff6c67571432f0535eb03e96 /cpukit/score/cpu/i386
parentadded David Glessner's 68302 work. (diff)
downloadrtems-637df35f96d8023056369fcf2c9943419f1a1b74.tar.bz2
Ada95, gnat, go32
Diffstat (limited to 'cpukit/score/cpu/i386')
-rw-r--r--cpukit/score/cpu/i386/asm.h9
-rw-r--r--cpukit/score/cpu/i386/cpu.c75
-rw-r--r--cpukit/score/cpu/i386/rtems/asm.h9
3 files changed, 76 insertions, 17 deletions
diff --git a/cpukit/score/cpu/i386/asm.h b/cpukit/score/cpu/i386/asm.h
index 16cf6c3235..adf92f935a 100644
--- a/cpukit/score/cpu/i386/asm.h
+++ b/cpukit/score/cpu/i386/asm.h
@@ -40,6 +40,15 @@
* have to define these as appropriate.
*/
+/*
+ * Go32 suffers the same bug as __REGISTER_PREFIX__
+ */
+
+#if __GO32__
+#undef __USER_LABEL_PREFIX__
+#define __USER_LABEL_PREFIX__ _
+#endif
+
#ifndef __USER_LABEL_PREFIX__
#define __USER_LABEL_PREFIX__ _
#endif
diff --git a/cpukit/score/cpu/i386/cpu.c b/cpukit/score/cpu/i386/cpu.c
index 05a836f7e3..f2859230e2 100644
--- a/cpukit/score/cpu/i386/cpu.c
+++ b/cpukit/score/cpu/i386/cpu.c
@@ -67,7 +67,60 @@ void _CPU_Initialize(
}
}
-/* _CPU_ISR_install_vector
+/*PAGE
+ *
+ * _CPU_ISR_install_raw_handler
+ */
+
+#if __GO32__
+#include <cpu.h>
+#include <go32.h>
+#include <dpmi.h>
+#endif /* __GO32__ */
+
+void _CPU_ISR_install_raw_handler(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+)
+{
+#if __GO32__
+ _go32_dpmi_seginfo handler_info;
+
+ *old_handler = 0; /* XXX not supported */
+
+ handler_info.pm_offset = new_handler;
+ handler_info.pm_selector = _go32_my_cs();
+
+ /* install the IDT entry */
+ _go32_dpmi_set_protected_mode_interrupt_vector( vector, &handler_info );
+#else
+ i386_IDT_slot idt;
+ unsigned32 handler;
+
+ *old_handler = 0; /* XXX not supported */
+
+ handler = (unsigned32) new_handler;
+
+ /* build the IDT entry */
+ idt.offset_0_15 = handler & 0xffff;
+ idt.segment_selector = i386_get_cs();
+ idt.reserved = 0x00;
+ idt.p_dpl = 0x8e; /* present, ISR */
+ idt.offset_16_31 = handler >> 16;
+
+ /* install the IDT entry */
+ i386_Install_idt(
+ (unsigned32) &idt,
+ _CPU_Table.interrupt_table_segment,
+ (unsigned32) _CPU_Table.interrupt_table_offset + (8 * vector)
+ );
+#endif
+}
+
+/*PAGE
+ *
+ * _CPU_ISR_install_vector
*
* This kernel routine installs the RTEMS handler for the
* specified vector.
@@ -95,27 +148,15 @@ void _CPU_ISR_install_vector(
proc_ptr *old_handler
)
{
- i386_IDT_slot idt;
+ proc_ptr ignored;
unsigned32 unique_handler;
+ *old_handler = _ISR_Vector_table[ vector ];
+
/* calculate the unique entry point for this vector */
unique_handler = _Interrupt_Handler_entry( vector );
- /* build the IDT entry */
- idt.offset_0_15 = ((unsigned32) unique_handler) & 0xffff;
- idt.segment_selector = i386_get_cs();
- idt.reserved = 0x00;
- idt.p_dpl = 0x8e; /* present, ISR */
- idt.offset_16_31 = ((unsigned32) unique_handler) >> 16;
-
- /* install the IDT entry */
- i386_Install_idt(
- (unsigned32) &idt,
- _CPU_Table.interrupt_table_segment,
- (unsigned32) _CPU_Table.interrupt_table_offset + (8 * vector)
- );
+ _CPU_ISR_install_raw_handler( vector, (void *)unique_handler, &ignored );
- /* "portable" part */
- *old_handler = _ISR_Vector_table[ vector ];
_ISR_Vector_table[ vector ] = new_handler;
}
diff --git a/cpukit/score/cpu/i386/rtems/asm.h b/cpukit/score/cpu/i386/rtems/asm.h
index 16cf6c3235..adf92f935a 100644
--- a/cpukit/score/cpu/i386/rtems/asm.h
+++ b/cpukit/score/cpu/i386/rtems/asm.h
@@ -40,6 +40,15 @@
* have to define these as appropriate.
*/
+/*
+ * Go32 suffers the same bug as __REGISTER_PREFIX__
+ */
+
+#if __GO32__
+#undef __USER_LABEL_PREFIX__
+#define __USER_LABEL_PREFIX__ _
+#endif
+
#ifndef __USER_LABEL_PREFIX__
#define __USER_LABEL_PREFIX__ _
#endif