Back to home page

LXR

 
 

    


File indexing completed on 2025-05-11 08:23:48

0001 #include <rtems/score/cpu.h>
0002 
0003 /*
0004  * User exception handlers
0005  */
0006 CPU_ISR_raw_handler M68040FPSPUserExceptionHandlers[9];
0007 
0008 /*
0009  * Intercept requests to install an exception handler.
0010  * FPSP exceptions get special treatment.
0011  */
0012 static int
0013 FPSP_install_raw_handler(
0014   uint32_t vector,
0015   CPU_ISR_raw_handler new_handler,
0016   CPU_ISR_raw_handler *old_handler
0017 )
0018 {
0019   int fpspVector;
0020 
0021   switch (vector) {
0022   default:  return 0;   /* Non-FPSP vector */
0023   case 11:  fpspVector = 0; break;  /* F-line */
0024   case 48:  fpspVector = 1; break;  /* BSUN */
0025   case 49:  fpspVector = 2; break;  /* INEXACT */
0026   case 50:  fpspVector = 3; break;  /* DIVIDE-BY-ZERO */
0027   case 51:  fpspVector = 4; break;  /* UNDERFLOW */
0028   case 52:  fpspVector = 5; break;  /* OPERAND ERROR */
0029   case 53:  fpspVector = 6; break;  /* OVERFLOW */
0030   case 54:  fpspVector = 7; break;  /* SIGNALLING NAN */
0031   case 55:  fpspVector = 8; break;  /* UNIMPLEMENTED DATA TYPE */
0032   }
0033   *old_handler = M68040FPSPUserExceptionHandlers[fpspVector];
0034   M68040FPSPUserExceptionHandlers[fpspVector] = new_handler;
0035   return 1;
0036 }
0037 
0038 /*
0039  *  Exception handlers provided by FPSP package.
0040  */
0041 extern void _fpspEntry_fline(void);
0042 extern void _fpspEntry_bsun(void);
0043 extern void _fpspEntry_inex(void);
0044 extern void _fpspEntry_dz(void);
0045 extern void _fpspEntry_unfl(void);
0046 extern void _fpspEntry_ovfl(void);
0047 extern void _fpspEntry_operr(void);
0048 extern void _fpspEntry_snan(void);
0049 extern void _fpspEntry_unsupp(void);
0050 
0051 /*
0052  * Attach floating point exception vectors to M68040FPSP entry points
0053  *
0054  *  NOTE: Uses M68K rather than M68040 in the name so all CPUs having
0055  *        an FPSP can share the same code in RTEMS proper.
0056  */
0057 void
0058 M68KFPSPInstallExceptionHandlers (void)
0059 {
0060   static struct {
0061     int  vector_number;
0062     void  (*handler)(void);
0063   } fpspHandlers[] = {
0064     { 11,  _fpspEntry_fline },
0065     { 48,  _fpspEntry_bsun },
0066     { 49,  _fpspEntry_inex },
0067     { 50,  _fpspEntry_dz },
0068     { 51,  _fpspEntry_unfl },
0069     { 52,  _fpspEntry_operr },
0070     { 53,  _fpspEntry_ovfl },
0071     { 54,  _fpspEntry_snan },
0072     { 55,  _fpspEntry_unsupp },
0073   };
0074   int i;
0075   CPU_ISR_raw_handler oldHandler;
0076 
0077   for (i = 0 ; i < sizeof fpspHandlers / sizeof fpspHandlers[0] ; i++) {
0078     _CPU_ISR_install_raw_handler(fpspHandlers[i].vector_number, fpspHandlers[i].handler, &oldHandler);
0079       M68040FPSPUserExceptionHandlers[i] = oldHandler;
0080   }
0081   _FPSP_install_raw_handler = FPSP_install_raw_handler;
0082 }