1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
/*
* $Id$
*/
#include <rtems/system.h>
/*
#include <rtems/score/isr.h>
*/
/*
* User exception handlers
*/
proc_ptr M68040FPSPUserExceptionHandlers[9];
/*
* Intercept requests to install an exception handler.
* FPSP exceptions get special treatment.
*/
static int
FPSP_install_raw_handler (unsigned32 vector, proc_ptr new_handler, proc_ptr *old_handler)
{
int fpspVector;
switch (vector) {
default: return 0; /* Non-FPSP vector */
case 11: fpspVector = 0; break; /* F-line */
case 48: fpspVector = 1; break; /* BSUN */
case 49: fpspVector = 2; break; /* INEXACT */
case 50: fpspVector = 3; break; /* DIVIDE-BY-ZERO */
case 51: fpspVector = 4; break; /* UNDERFLOW */
case 52: fpspVector = 5; break; /* OPERAND ERROR */
case 53: fpspVector = 6; break; /* OVERFLOW */
case 54: fpspVector = 7; break; /* SIGNALLING NAN */
case 55: fpspVector = 8; break; /* UNIMPLEMENTED DATA TYPE */
}
*old_handler = M68040FPSPUserExceptionHandlers[fpspVector];
M68040FPSPUserExceptionHandlers[fpspVector] = new_handler;
return 1;
}
/*
* Attach floating point exception vectors to M68040FPSP entry points
*
* NOTE: Uses M68K rather than M68040 in the name so all CPUs having
* an FPSP can share the same code in RTEMS proper.
*/
void
M68KFPSPInstallExceptionHandlers (void)
{
extern void _fpspEntry_fline();
extern void _fpspEntry_bsun();
extern void _fpspEntry_inex();
extern void _fpspEntry_dz();
extern void _fpspEntry_unfl();
extern void _fpspEntry_ovfl();
extern void _fpspEntry_operr();
extern void _fpspEntry_snan();
extern void _fpspEntry_unsupp();
static struct {
int vector_number;
void (*handler)();
} fpspHandlers[] = {
{ 11, _fpspEntry_fline },
{ 48, _fpspEntry_bsun },
{ 49, _fpspEntry_inex },
{ 50, _fpspEntry_dz },
{ 51, _fpspEntry_unfl },
{ 52, _fpspEntry_operr },
{ 53, _fpspEntry_ovfl },
{ 54, _fpspEntry_snan },
{ 55, _fpspEntry_unsupp },
};
int i;
proc_ptr oldHandler;
for (i = 0 ; i < sizeof fpspHandlers / sizeof fpspHandlers[0] ; i++) {
_CPU_ISR_install_raw_handler(fpspHandlers[i].vector_number, fpspHandlers[i].handler, &oldHandler);
M68040FPSPUserExceptionHandlers[i] = oldHandler;
}
_FPSP_install_raw_handler = FPSP_install_raw_handler;
}
|