Mercurial > ecos
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 |
