changeset 90:70190fa0fe10 ecos-sw-2000-05-19

Merge from eCos master repository on 2000-05-19-07:47:03-BST
author jlarmour
date Fri, 19 May 2000 12:47:51 +0000
parents fb6e7cf186a5
children 86f6a8b98920
files host/libcdl/ChangeLog host/libcdl/transact.cxx host/libcdl/value.cxx host/tools/ecostest/common/eCosTestDownloadFilter.cpp host/tools/ecostest/common/eCosTestMonitorFilter.cpp host/tools/ecostest/common/eCosTestSerialFilter.cpp packages/compat/uitron/current/ChangeLog packages/compat/uitron/current/include/uit_ifnc.h packages/compat/uitron/current/src/uit_ifnc.cxx packages/devs/eth/arm/ebsa285/current/ChangeLog packages/devs/eth/arm/ebsa285/current/tests/test_net_realtime.h packages/hal/mips/arch/current/ChangeLog packages/hal/mips/arch/current/include/hal_intr.h packages/hal/mips/arch/current/include/hal_io.h packages/hal/mips/arch/current/src/vectors.S packages/kernel/current/ChangeLog packages/kernel/current/cdl/counters.cdl packages/language/c/libc/current/ChangeLog packages/language/c/libc/current/tests/signal/signal2.c
diffstat 19 files changed, 224 insertions(+), 30 deletions(-) [+]
line wrap: on
line diff
--- a/host/libcdl/ChangeLog
+++ b/host/libcdl/ChangeLog
@@ -1,3 +1,13 @@
+2000-05-11  Bart Veer  <bartv@redhat.com>
+
+	* value.cxx (implements_update_handler):
+	Cope gracefully with implements properties where the destination
+	is not an interface.
+
+	* transact.cxx (clear_structural_conflicts):
+	Prevent a structural conflict from being destroyed twice (only
+	likely to happen during a major delete operation).
+
 2000-04-14  Bart Veer  <bartv@redhat.com>
 
 	* infer.cxx (infer_set_valuable_value):
--- a/host/libcdl/transact.cxx
+++ b/host/libcdl/transact.cxx
@@ -1389,7 +1389,8 @@ CdlTransactionBody::clear_structural_con
     CYG_ASSERT_CLASSC(toplevel);
     for (conf_i = toplevel->structural_conflicts.begin(); conf_i != toplevel->structural_conflicts.end(); ) {
         CdlConflict conflict = *conf_i++;
-        if ((node == conflict->get_node()) && (prop == conflict->get_property()) && (*pFn)(conflict)) {
+        if ((node == conflict->get_node()) && (prop == conflict->get_property()) &&
+            !(this->has_conflict_been_cleared(conflict)) && (*pFn)(conflict)) {
             this->clear_conflict(conflict);
         }
     }
--- a/host/libcdl/value.cxx
+++ b/host/libcdl/value.cxx
@@ -2148,17 +2148,49 @@ CdlValuableBody::implements_update_handl
     // change to the implementors. Currently no attempt is made to
     // optimise interface updates, although this may have to change in
     // future.
+
+    // Any changes to the interface itself can be ignored.
+    if ((CdlUpdate_ValueChange == change) || (CdlUpdate_ActiveChange == change)) {
+        CYG_REPORT_RETURN();
+        return;
+    }
+
+    // The second stage init is irrelevant
+    if (CdlUpdate_Init == change) {
+        CYG_REPORT_RETURN();
+        return;
+    }
+
+    // Possibilities:
+    // 1) source is being loaded, dest valid
+    // 2) source is being loaded, dest unknown
+    // 3) source is being unloaded, dest valid
+    // 4) source is being unloaded, dest unknown
+    // 5) dest has been created
+    // 6) dest is going away
     //
-    // As far as this code is concerned, any time that an implementor
-    // is loaded or unloaded the interface needs to be recalculated.
-    // Also if the destination is created then it needs to be
-    // recalculated, although that should really be the responsibility
-    // of the interface itself. In due course interfaces should be
-    // auto-generated if not explicitly defined.
-    if ((CdlUpdate_Loaded == change) || (CdlUpdate_Unloading == change) || (CdlUpdate_Created == change)) {
-        if (0 != dest) {
-            CdlInterface interface = dynamic_cast<CdlInterface>(dest);
-            CYG_ASSERT_CLASSC(interface);
+    // If we have a valid dest, it needs to be updated and any structural
+    // conflicts have to be cleared.
+    //
+    // If there is no dest, the implements property remains unbound.
+    // A suitable conflict is created in the base class.
+    //
+    // If the dest is invalid, a structural conflict has to be created.
+    if (CdlUpdate_Destroyed == change) {
+        // There is no need to do any clean-ups in the dest.
+        dest = 0;
+    }
+    if (0 == dest) {
+        transaction->clear_structural_conflicts(source, prop, &CdlConflict_DataBody::test);
+    } else {
+        CdlInterface interface = dynamic_cast<CdlInterface>(dest);
+
+        if (0 == interface) {
+            std::string msg = source->get_class_name() + " " + source->get_name() + " cannot implement " +
+                dest->get_name() + "\n    The latter is not an interface.";
+            CdlConflict_DataBody::make(transaction, source, prop, msg);
+        } else {
+            transaction->clear_structural_conflicts(source, prop, &CdlConflict_DataBody::test);
             interface->recalculate(transaction);
         }
     }
--- a/host/tools/ecostest/common/eCosTestDownloadFilter.cpp
+++ b/host/tools/ecostest/common/eCosTestDownloadFilter.cpp
@@ -53,7 +53,7 @@
 #include "eCosStd.h"
 #include "eCosTrace.h"
 
-#define DL_FILTER_VER "$Id: eCosTestDownloadFilter.cpp,v 1.7 2000/05/12 17:53:32 jlarmour Exp $"
+#define DL_FILTER_VER "$Id: eCosTestDownloadFilter.cpp,v 1.8 2000/05/19 12:47:51 jlarmour Exp $"
 #include "eCosTestDownloadFilter.h"
 
 CeCosTestDownloadFilter::CeCosTestDownloadFilter():
--- a/host/tools/ecostest/common/eCosTestMonitorFilter.cpp
+++ b/host/tools/ecostest/common/eCosTestMonitorFilter.cpp
@@ -45,7 +45,7 @@
 
 #include "eCosStd.h"
 
-#define SER_FILTER_VER "$Id: eCosTestMonitorFilter.cpp,v 1.6 2000/05/12 17:53:32 jlarmour Exp $"
+#define SER_FILTER_VER "$Id: eCosTestMonitorFilter.cpp,v 1.7 2000/05/19 12:47:51 jlarmour Exp $"
 #include "eCosTestMonitorFilter.h"
 
 CeCosTestMonitorFilter::CeCosTestMonitorFilter():
--- a/host/tools/ecostest/common/eCosTestSerialFilter.cpp
+++ b/host/tools/ecostest/common/eCosTestSerialFilter.cpp
@@ -51,7 +51,7 @@
 
 #include "eCosStd.h"
 
-#define SER_FILTER_VER "$Id: eCosTestSerialFilter.cpp,v 1.7 2000/05/12 17:53:32 jlarmour Exp $"
+#define SER_FILTER_VER "$Id: eCosTestSerialFilter.cpp,v 1.8 2000/05/19 12:47:51 jlarmour Exp $"
 #include "eCosTestSerialFilter.h"
 #include "eCosThreadUtils.h"
 
--- a/packages/compat/uitron/current/ChangeLog
+++ b/packages/compat/uitron/current/ChangeLog
@@ -1,3 +1,11 @@
+2000-05-15  Hugo Tyson  <hmt@cygnus.co.uk>
+
+	* include/uit_ifnc.h (cyg_uitron_dsr): make this be extern "C"
+	always; it went wrong when uitron funcs are inline or C++.
+
+	* src/uit_ifnc.cxx (CYGIMP_UITRON_INLINE_FUNCS): When [re]defining
+	this, match what CDL defined.  Warnings--;
+
 2000-05-08  Jesper Skov  <jskov@redhat.com>
 
 	* tests/testintr.cxx (attach_isr, detach_isr): Don't check for
--- a/packages/compat/uitron/current/include/uit_ifnc.h
+++ b/packages/compat/uitron/current/include/uit_ifnc.h
@@ -69,6 +69,7 @@
 //         u I T R O N   F U N C T I O N S
 // The function declarations themselves:
 
+// ------------------- These functions can be inline if so configured
 CYG_UIT_FUNC_EXTERN_BEGIN
 
 // ******************************************************
@@ -142,13 +143,19 @@ ER      isnd_msg ( ID mbxid, T_MSG *pk_m
         
 // (None)
         
+CYG_UIT_FUNC_EXTERN_END
+// ------------------- End of functions that can be inlined
+
+
 // ========================================================================
 // DSR: use this DSR with the uITRON-type ISR that uses the functions above
 // to get delayed/safe execution of the wakeup-type functions above.
 
+#ifdef __cplusplus
+extern "C"
+#endif
 void cyg_uitron_dsr( unsigned int vector, unsigned int count, unsigned int data );
 
-CYG_UIT_FUNC_EXTERN_END
 
 // ========================================================================
 
--- a/packages/compat/uitron/current/src/uit_ifnc.cxx
+++ b/packages/compat/uitron/current/src/uit_ifnc.cxx
@@ -48,7 +48,7 @@
 
 // invoke the inline function definition to create static C linkage
 // functions here:
-#define CYGIMP_UITRON_INLINE_FUNCS
+#define CYGIMP_UITRON_INLINE_FUNCS 1
 #include <cyg/compat/uitron/uit_func.h>
 
 // Now ensure that we create *outline* funcs for the ixxx_yyy() functions
--- a/packages/devs/eth/arm/ebsa285/current/ChangeLog
+++ b/packages/devs/eth/arm/ebsa285/current/ChangeLog
@@ -1,3 +1,8 @@
+2000-05-12  Hugo Tyson  <hmt@cygnus.co.uk>
+
+	* tests/test_net_realtime.h (tnr_print_activity): New routine to
+	check the system is working, tidied up the API.  It works!
+
 2000-05-11  Hugo Tyson  <hmt@cygnus.co.uk>
 
 	* cdl/ebsa285_eth_drivers.cdl: Added export of the test header
--- a/packages/devs/eth/arm/ebsa285/current/tests/test_net_realtime.h
+++ b/packages/devs/eth/arm/ebsa285/current/tests/test_net_realtime.h
@@ -1,6 +1,5 @@
 #ifndef CYGONCE_DEVS_ETH_ARM_EBSA285_TESTS_TEST_NET_REALTIME_H
 #define CYGONCE_DEVS_ETH_ARM_EBSA285_TESTS_TEST_NET_REALTIME_H
-
 /*==========================================================================
 //
 //        test_net_realtime.h
@@ -44,9 +43,28 @@
 //####DESCRIPTIONEND####
 */
 
+// This is the API to this file:
+
+#define TNR_OFF() tnr_active = 0
+#define TNR_ON()  tnr_active = 1
+#define TNR_INIT() tnr_init()
+#define TNR_PRINT_ACTIVITY() tnr_print_activity() 
+
+// Tests should use these if they are defined to test that the realtime
+// characteristics of the world are preserved during a test.
+//
+// It is accepted that printing stuff via diag_printf() (and the test
+// infra) disables interrupts for a long time.  So invoke TNR_OFF/ON()
+// either side of diagnostic prints, to prevent boguf firings of the
+// realtime test.
+
+// ------------------------------------------------------------------------
+
 // This file rather assumes that the network is in use, and that therefore
 // there is also a kernel, and so on....
 
+#include <cyg/infra/testcase.h>         // CYG_TEST_FAIL et al
+#include <cyg/infra/diag.h>             // diag_printf()
 #include <cyg/kernel/kapi.h>            // Thread API
 
 #include <cyg/hal/hal_arch.h>           // CYGNUM_HAL_STACK_SIZE_TYPICAL
@@ -100,12 +118,22 @@ static cyg_handle_t tnr_thread_handle;
 static cyg_interrupt tnr_t1_intr, tnr_t2_intr;
 static cyg_handle_t tnr_t1_inth, tnr_t2_inth;
 
-
+struct {
+    int timer1_isr;
+    int timer2_isr;
+    int timer2_isr_active;
+    int timer2_dsr;
+    int timer2_thd;
+    int timer2_thd_active;
+} tnr_activity_counts = { 0,0,0,0,0,0 };
+        
 
 static cyg_uint32 tnr_timer1_isr(cyg_vector_t vector, cyg_addrword_t data)
 {
+    tnr_activity_counts.timer1_isr++;
+
     if ( tnr_active )
-        CYG_TEST_FAIL( "test_net_realtime: Timer1 fired" );
+        CYG_TEST_FAIL_EXIT( "test_net_realtime: Timer1 fired" );
 
     *SA110_TIMER1_CLEAR = 0; // Clear any pending interrupt (Data: don't care)
     HAL_INTERRUPT_ACKNOWLEDGE( CYGNUM_HAL_INTERRUPT_TIMER_1 );
@@ -115,13 +143,16 @@ static cyg_uint32 tnr_timer1_isr(cyg_vec
 
 static cyg_uint32 tnr_timer2_isr(cyg_vector_t vector, cyg_addrword_t data)
 {
+    tnr_activity_counts.timer2_isr++;
+
     *SA110_TIMER2_CLEAR = 0; // Clear any pending interrupt (Data: don't care)
     HAL_INTERRUPT_ACKNOWLEDGE( CYGNUM_HAL_INTERRUPT_TIMER_2 );
 
     if ( tnr_active ) {
+        tnr_activity_counts.timer2_isr_active++;
         if ( (*SA110_TIMER1_VALUE) > (4 * TNR_TIMER1_PERIOD_1mS) ) {
             // Then it has wrapped around, bad bad bad
-            CYG_TEST_FAIL( "tnr_timer2_isr: Timer1 wrapped" );
+            CYG_TEST_FAIL_EXIT( "tnr_timer2_isr: Timer1 wrapped" );
         }
     }
     tnr_t2_counter++;
@@ -144,8 +175,10 @@ static cyg_uint32 tnr_timer2_isr(cyg_vec
     
 static void tnr_timer2_dsr(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data)
 {
+    tnr_activity_counts.timer2_dsr++;
+
     if ( CYGNUM_HAL_INTERRUPT_TIMER_2 != vector )
-        CYG_TEST_FAIL( "tnr_timer2_dsr: Bad vector" );
+        CYG_TEST_FAIL_EXIT( "tnr_timer2_dsr: Bad vector" );
 
     cyg_semaphore_post( &tnr_sema );
 }
@@ -154,10 +187,12 @@ static void tnr_timer2_service_thread( c
 {
     while (1) {
         cyg_semaphore_wait( &tnr_sema );
+        tnr_activity_counts.timer2_thd++;
         if ( tnr_active ) {
+            tnr_activity_counts.timer2_thd_active++;
             if ( (*SA110_TIMER1_VALUE) > (4 * TNR_TIMER1_PERIOD_1mS) ) {
                 // Then it has wrapped around, bad bad bad
-                CYG_TEST_FAIL( "tnr_timer2_service_thread: Timer1 wrapped" );
+                CYG_TEST_FAIL_EXIT( "tnr_timer2_service_thread: Timer1 wrapped" );
             }
         }
         // Reset timer1 again.  By doing this in time every time it should
@@ -224,6 +259,20 @@ static void tnr_init( void )
     cyg_interrupt_unmask( CYGNUM_HAL_INTERRUPT_TIMER_1 );
 }
 
+static void tnr_print_activity( void )
+{
+    int tmp = tnr_active;
+    tnr_active = 0;
+    diag_printf( "Test-net-realtime: interrupt activity log:\n" );
+    diag_printf( "    timer1_isr %10d\n", tnr_activity_counts.timer1_isr );
+    diag_printf( "    timer2_isr %10d\n", tnr_activity_counts.timer2_isr );
+    diag_printf( "      (active) %10d\n", tnr_activity_counts.timer2_isr_active );
+    diag_printf( "    timer2_dsr %10d\n", tnr_activity_counts.timer2_dsr );
+    diag_printf( "    timer2_thd %10d\n", tnr_activity_counts.timer2_thd );
+    diag_printf( "      (active) %10d\n", tnr_activity_counts.timer2_thd_active );
+    tnr_active = tmp;
+}
+
 #endif /* ifndef CYGONCE_DEVS_ETH_ARM_EBSA285_TESTS_TEST_NET_REALTIME_H */
 
 /* EOF test_net_realtime.h */
--- a/packages/hal/mips/arch/current/ChangeLog
+++ b/packages/hal/mips/arch/current/ChangeLog
@@ -1,3 +1,21 @@
+2000-05-18  Jesper Skov  <jskov@redhat.com>
+
+	* include/hal_io.h: Allow platforms to override IO macro
+	definitions.
+
+2000-05-16  Jesper Skov  <jskov@redhat.com>
+
+	* include/hal_intr.h:
+	* src/vectors.S:
+	Filter 'break 0x7' (GCC division-by-zero) exceptions out into a
+	new vector.
+	Fix typo.
+	
+2000-05-15  Jesper Skov  <jskov@redhat.com>
+
+	* src/vectors.S: Allow warm-start to be treated like cold-start if
+	platform requires it.
+
 2000-05-10  Jesper Skov  <jskov@redhat.com>
 
 	* include/arch.inc: Force assembler into MIPS3 mode before using
--- a/packages/hal/mips/arch/current/include/hal_intr.h
+++ b/packages/hal/mips/arch/current/include/hal_intr.h
@@ -92,6 +92,11 @@
 #define CYGNUM_HAL_VECTOR_OVERFLOW             12
 // Reserved
 #define CYGNUM_HAL_VECTOR_RESERVED_13          13
+// Division-by-zero [reserved vector]
+// This is caused by 'trap 0x7' which GCC puts in the code to check
+// for division by zero. The break_vsr_springboard in vectors.S is the
+// only caller of this vector.
+#define CYGNUM_HAL_VECTOR_DIV_BY_ZERO          14
 // Floating point exception
 #ifdef  CYGHWR_HAL_MIPS_FPU
 #define CYGNUM_HAL_VECTOR_FPE                  15
@@ -121,6 +126,7 @@
           CYGNUM_HAL_VECTOR_RESERVED_INSTRUCTION
 #define CYGNUM_HAL_EXCEPTION_COPROCESSOR    CYGNUM_HAL_VECTOR_COPROCESSOR
 #define CYGNUM_HAL_EXCEPTION_OVERFLOW       CYGNUM_HAL_VECTOR_OVERFLOW
+#define CYGNUM_HAL_EXCEPTION_DIV_BY_ZERO    CYGNUM_HAL_VECTOR_DIV_BY_ZERO
 
 // Min/Max exception numbers and how many there are
 #define CYGNUM_HAL_EXCEPTION_MIN                1
@@ -336,11 +342,14 @@ CYG_MACRO_END
 
 externC void __default_exception_vsr(void);
 externC void __default_interrupt_vsr(void);
+externC void __break_vsr_springboard(void);
 
 #define HAL_VSR_SET_TO_ECOS_HANDLER( _vector_, _poldvsr_ ) CYG_MACRO_START  \
     HAL_VSR_SET( _vector_, _vector_ == CYGNUM_HAL_VECTOR_INTERRUPT          \
                               ? (CYG_ADDRESS)__default_interrupt_vsr        \
-                              : (CYG_ADDRESS)__default_exception_vsr,       \
+                              : _vector_ == CYGNUM_HAL_VECTOR_BREAKPOINT    \
+                                ? (CYG_ADDRESS)__break_vsr_springboard      \
+                                : (CYG_ADDRESS)__default_exception_vsr,     \
                  _poldvsr_ );                                               \
 CYG_MACRO_END
 
--- a/packages/hal/mips/arch/current/include/hal_io.h
+++ b/packages/hal/mips/arch/current/include/hal_io.h
@@ -63,6 +63,10 @@
 typedef volatile CYG_ADDRWORD HAL_IO_REGISTER;
 
 //-----------------------------------------------------------------------------
+// HAL IO macros.
+#ifndef HAL_IO_MACROS_DEFINED
+
+//-----------------------------------------------------------------------------
 // BYTE Register access.
 // Individual and vectorized access to 8 bit registers.
 
@@ -135,6 +139,11 @@ typedef volatile CYG_ADDRWORD HAL_IO_REG
         ((volatile CYG_WORD32 *)(_register_))[_j_] = (_buf_)[_i_];      \
 }
 
+#define HAL_IO_MACROS_DEFINED
+
+#endif
+
+
 //-----------------------------------------------------------------------------
 #endif // ifndef CYGONCE_HAL_HAL_IO_H
 // End of hal_io.h
--- a/packages/hal/mips/arch/current/src/vectors.S
+++ b/packages/hal/mips/arch/current/src/vectors.S
@@ -63,7 +63,7 @@
 	.section ".reset_vector","ax"
 
 	# Reset vector at 0xBFC00000
-	
+
 FUNC_START(reset_vector)
 
 #ifndef CYG_HAL_STARTUP_RAM
@@ -236,11 +236,18 @@ 1:
 	b	1b
 	nop
 #endif
-	
-	# At present we treat this like an NMI. 
+
+	# Treat a warm-start either as a cold-start or an NMI
+#if defined(CYGHWR_HAL_MIPS_WARMSTART_COLDSTART)
+	lar	v0,_start		# jump to start
+	jr	v0
+	nop				# (delay slot)
+#else
+        # Defaults to NMI
 	b	__nmi_entry
 	nop
-	
+#endif        
+
 FUNC_END(__warm_start)		
 
 ##-----------------------------------------------------------------------------
@@ -730,14 +737,42 @@ FUNC_START(hal_interrupt_stack_call_pend
 FUNC_END(hal_interrupt_stack_call_pending_DSRs)	
 #endif		
 
-##-----------------------------------------------------------------------------	
+##-----------------------------------------------------------------------------
 ## Short circuit in case any code tries to use "__gccmain()"
 
 FUNC_START(__gccmain)
 	jr	ra
 	nop
 FUNC_END(__gccmain)
+
+##-----------------------------------------------------------------------------
+## VSR springboard for break instruction exceptions
+## Both GCC and GDB use break instructions. GCC for division-by-zero
+## notification and GDB for program-flow breakpoints. This springboard
+## looks for the d-b-z kind and directs them to another vector so libc
+## can handle these without affecting the debugger.
 	
+FUNC_START(__break_vsr_springboard)
+	mfc0	k0,epc
+	mfc0	k1,cause
+	bltzl   k1,1f
+	addi    k0,k0,4                 # delay slot (only executed if BD set)
+1:	lw      k1,0(k0)                # get break instruction
+	la      k0,0x0007000d           # break 0x7 used by GCC for d-b-z
+	bne     k0,k1,2f
+	nop
+	ori     k0,$0,14*4              # CYGNUM_HAL_VECTOR_DIV_BY_ZERO
+	la	k1,hal_vsr_table	# address of VSR table
+	add	k1,k1,k0		# offset of VSR entry
+	lw	k1,0(k1)		# k1 = pointer to VSR
+	jr	k1			# go there
+	nop				# (delay slot)
+2:	ori     k0,$0,9*4               # CYGNUM_HAL_VECTOR_BREAKPOINT
+	j       __default_exception_vsr
+	nop				# (delay slot)
+FUNC_END(__break_vsr_springboard)
+
+
 ##-----------------------------------------------------------------------------
 ## Interrupt Stack.
 ## Used during intialization and for executing ISRs.
--- a/packages/kernel/current/ChangeLog
+++ b/packages/kernel/current/ChangeLog
@@ -1,3 +1,8 @@
+2000-05-15  Jonathan Larmour  <jlarmour@redhat.co.uk>
+
+	* cdl/counters.cdl (CYGVAR_KERNEL_COUNTERS_CLOCK_DSR_LATENCY): 
+	Default to CYGVAR_KERNEL_COUNTERS_CLOCK_LATENCY
+
 2000-05-04  Jonathan Larmour  <jlarmour@redhat.co.uk>
 
 	* include/instrmnt.h: Remove all CYG_UNUSED_PARAMs as they could
--- a/packages/kernel/current/cdl/counters.cdl
+++ b/packages/kernel/current/cdl/counters.cdl
@@ -203,9 +203,8 @@ cdl_option CYGVAR_KERNEL_COUNTERS_CLOCK_
 
 cdl_option CYGVAR_KERNEL_COUNTERS_CLOCK_DSR_LATENCY {
     display       "Measure real-time \[clock\] DSR latency"
-    requires      CYGVAR_KERNEL_COUNTERS_CLOCK
     requires      CYGVAR_KERNEL_COUNTERS_CLOCK_LATENCY
-    default_value 0
+    default_value CYGVAR_KERNEL_COUNTERS_CLOCK_LATENCY
     description   "
           Measure the DSR latency as seen by the real-time clock
           timer interrupt.  This requires hardware support, defined by
--- a/packages/language/c/libc/current/ChangeLog
+++ b/packages/language/c/libc/current/ChangeLog
@@ -1,3 +1,7 @@
+2000-05-16  Jesper Skov  <jskov@redhat.com>
+
+	* tests/signal/signal2.c: Also reset DIV_BY_ZERO vector.
+	
 2000-04-05  Jesper Skov  <jskov@redhat.com>
 
 	* src/time/settime.cxx: 
--- a/packages/language/c/libc/current/tests/signal/signal2.c
+++ b/packages/language/c/libc/current/tests/signal/signal2.c
@@ -176,6 +176,9 @@ main( int argc, char *argv[] )
 #ifdef CYGNUM_HAL_EXCEPTION_ILLEGAL_INSTRUCTION
     HAL_VSR_SET_TO_ECOS_HANDLER( CYGNUM_HAL_EXCEPTION_ILLEGAL_INSTRUCTION, NULL );
 #endif
+#ifdef CYGNUM_HAL_EXCEPTION_DIV_BY_ZERO
+    HAL_VSR_SET_TO_ECOS_HANDLER( CYGNUM_HAL_EXCEPTION_DIV_BY_ZERO, NULL );
+#endif
 #endif
 
 #ifdef CYGSEM_LIBC_SIGNALS_HWEXCEPTIONS