comparison packages/kernel/current/tests/except1.cxx @ 126:518f42066aba ecos-sw-2000-09-19

Merge from eCos master repository on 2000-09-19-06:25:26-BST
author jlarmour
date Tue, 19 Sep 2000 05:53:51 +0000
parents 59d97b6ba612
children eb9fd8c04db3
comparison
equal deleted inserted replaced
125:b4407dc7f59d 126:518f42066aba
91 #ifdef CYGNUM_HAL_EXCEPTION_DATA_ACCESS 91 #ifdef CYGNUM_HAL_EXCEPTION_DATA_ACCESS
92 // The following function attempts to cause an exception in various 92 // The following function attempts to cause an exception in various
93 // hacky ways. It is machine dependent what exception is generated. 93 // hacky ways. It is machine dependent what exception is generated.
94 // It does reads rather than writes hoping not to corrupt anything 94 // It does reads rather than writes hoping not to corrupt anything
95 // important. 95 // important.
96 static int
97 cause_fpe(int num)
98 {
99 double a;
100
101 a = 1.0/num; // Depending on FPU emulation and/or
102 // the FPU architecture, this may
103 // cause an exception.
104 // (float division by zero)
105
106 return ((int)a)/num; // This may cause an exception if
107 // the architecture supports it.
108 // (integer division by zero).
109 } // cause_fpe()
110
96 void cause_exception(void) 111 void cause_exception(void)
97 { 112 {
98 int x; 113 int x;
99 unsigned int p=0; 114 unsigned int p=0;
100 115
116 // First try for an address exception (unaligned access exception
117 // or SEGV/BUS exceptions)
101 do { 118 do {
102 x=*(volatile int *)(p-1)/p; 119 x=*(volatile int *)(p-1);
103 p+=0x100000; 120 p+=0x100000;
104 } while(p != 0); 121 } while(p != 0);
122
123 // Next try an integer or floating point divide-by-zero exception.
124 cause_fpe(0);
105 } 125 }
106 #endif 126 #endif
107 127
108 static void entry0( CYG_ADDRWORD data ) 128 static void entry0( CYG_ADDRWORD data )
109 { 129 {
184 void except0_main( void ) 204 void except0_main( void )
185 { 205 {
186 // Use CYG_TEST_GDBCMD _before_ CYG_TEST_INIT() 206 // Use CYG_TEST_GDBCMD _before_ CYG_TEST_INIT()
187 CYG_TEST_GDBCMD("handle SIGBUS nostop"); 207 CYG_TEST_GDBCMD("handle SIGBUS nostop");
188 CYG_TEST_GDBCMD("handle SIGSEGV nostop"); 208 CYG_TEST_GDBCMD("handle SIGSEGV nostop");
209 CYG_TEST_GDBCMD("handle SIGFPE nostop");
189 210
190 CYG_TEST_INIT(); 211 CYG_TEST_INIT();
191 212
192 #ifdef HAL_VSR_SET_TO_ECOS_HANDLER 213 #ifdef HAL_VSR_SET_TO_ECOS_HANDLER
193 // Reclaim the VSR off CygMon possibly 214 // Reclaim the VSR off CygMon possibly
200 #ifdef CYGNUM_HAL_EXCEPTION_DATA_UNALIGNED_ACCESS 221 #ifdef CYGNUM_HAL_EXCEPTION_DATA_UNALIGNED_ACCESS
201 HAL_VSR_SET_TO_ECOS_HANDLER( CYGNUM_HAL_EXCEPTION_DATA_UNALIGNED_ACCESS, NULL ); 222 HAL_VSR_SET_TO_ECOS_HANDLER( CYGNUM_HAL_EXCEPTION_DATA_UNALIGNED_ACCESS, NULL );
202 #endif 223 #endif
203 #ifdef CYGNUM_HAL_EXCEPTION_ILLEGAL_INSTRUCTION 224 #ifdef CYGNUM_HAL_EXCEPTION_ILLEGAL_INSTRUCTION
204 HAL_VSR_SET_TO_ECOS_HANDLER( CYGNUM_HAL_EXCEPTION_ILLEGAL_INSTRUCTION, NULL ); 225 HAL_VSR_SET_TO_ECOS_HANDLER( CYGNUM_HAL_EXCEPTION_ILLEGAL_INSTRUCTION, NULL );
226 #endif
227 #ifdef CYGNUM_HAL_EXCEPTION_DIV_BY_ZERO
228 HAL_VSR_SET_TO_ECOS_HANDLER( CYGNUM_HAL_EXCEPTION_DIV_BY_ZERO, NULL );
229 #endif
230 #ifdef CYGNUM_HAL_EXCEPTION_FPU
231 HAL_VSR_SET_TO_ECOS_HANDLER( CYGNUM_HAL_EXCEPTION_FPU, NULL );
232 #endif
233 #ifdef CYGNUM_HAL_EXCEPTION_FPU_DIV_BY_ZERO
234 HAL_VSR_SET_TO_ECOS_HANDLER( CYGNUM_HAL_EXCEPTION_FPU_DIV_BY_ZERO, NULL );
205 #endif 235 #endif
206 #endif 236 #endif
207 237
208 new_thread(entry0, 0); 238 new_thread(entry0, 0);
209 239