source: rtems/c/src/lib/libbsp/i960/rxgen960/startup/flttbl.c @ 129daf3

4.104.114.84.95
Last change on this file since 129daf3 was 2ea8df3, checked in by Joel Sherrill <joel.sherrill@…>, on 10/27/99 at 16:27:34

Added CVS Ids and a basic header. More header cleanup needed.

  • Property mode set to 100644
File size: 3.1 KB
Line 
1/*-------------------------------------*/
2/* flttbl.c                            */
3/* Last change :  3.11.94              */
4/*-------------------------------------*/ 
5/*
6 *  $Id$
7 */
8
9#include "i960.h"
10#include "string.h"
11#include "sctns.h"
12#include "fault.h"
13#include "asmfault.h"
14#include "flttbl.h"
15/*-------------------------------------*/
16  /* Fault Table. It (as well as all the rest of the
17   * code of this file will always stay in ROM, so
18   * that it wouldn't be destroyed by silly user code.
19   * Thus, at least faults will be always caugth,
20   */
21FaultTblEntry faultTbl[] = {
22  {faultHndlEntry + LOCAL_FH, LOCAL_FW},            /* Parallel */
23  {faultHndlEntry + LOCAL_FH, LOCAL_FW},            /* Trace */
24  {faultHndlEntry + LOCAL_FH, LOCAL_FW},            /* Operation */
25  {faultHndlEntry + LOCAL_FH, LOCAL_FW},            /* Arithmetic */
26  {0, 0},                                                 /* Reserved */
27  {faultHndlEntry + LOCAL_FH, LOCAL_FW},            /* Constraint */
28  {0, 0},                                           /* Reserved */
29  {faultHndlEntry + LOCAL_FH, LOCAL_FW},            /* Protection */
30  {0, 0},                                           /* Reserved */
31  {faultHndlEntry + LOCAL_FH, LOCAL_FW}            /* Type */
32};
33
34void fltTblInit(void)
35{
36  static unsigned int fltTblCheckSum(void);
37
38  faultCheckSum = fltTblCheckSum();
39}
40static unsigned int fltTblCheckSum(void)
41{
42  unsigned int * f = faultStart;
43  unsigned int * l = faultEnd;
44  unsigned int sum;
45 
46  for (sum = 0; f < l; f ++)  {
47    sum += * f;
48  }
49  return sum;
50}
51void faultTblHandler(unsigned int * fp, unsigned int * faultBuffer)
52{
53  unsigned int * ip;
54  struct typeWord {
55    unsigned int sbtp : 8;
56    unsigned int : 8;
57    unsigned int type : 8;
58    unsigned int : 8;
59  } tw;
60  unsigned int type;
61  unsigned int sbtp;
62  unsigned int ac;
63  unsigned int pc;
64  unsigned int inst;
65
66  char nib;
67  unsigned int i;
68
69    /* Address of faulting instruction.
70     */
71  ip = (unsigned int *) fp[-1];
72    /* Type/Subtype word.
73     */
74
75  /* put address of faulting instruction to console */
76  kkprintf("Fault: %x\n", ip);
77 
78  tw = * (struct typeWord *) & fp[-2]; 
79    /* Type and subtype.
80     */
81  type = tw.type;
82  sbtp = tw.sbtp;
83    /* Arithmetic controls.
84     */
85  ac = fp[-3];
86    /* Process controls.
87     */
88  pc = fp[-4];   
89    /* Global and local registers are in faultBuffer
90     * already. Save the rest. Change RIP to IP.
91     */
92  faultBuffer[IP_REGNUM] = (unsigned int) ip;
93  faultBuffer[ACW_REGNUM] = ac;
94  faultBuffer[PCW_REGNUM] = pc; 
95    /* Bad instruction itself. We do
96     * this here since it may be repaired (by copying from PROM).
97     */
98  inst = * ip;
99    /* Now, to handling.
100     */
101  if (faultCheckSum != fltTblCheckSum())  {
102      /* RAM-based fault repair stuff
103       * is broken. No chance to recover.
104       * Repair RAM memory which is
105       * destroyed by silly user.
106       */
107    copyCodeToRom();
108      /* And call RAM-based fault handler.
109       */
110    faultBad(1, inst, faultBuffer, type, sbtp);
111  }
112  else  {
113      /* There exist a chance to recover.
114       */
115    faultGood(inst, faultBuffer, type, sbtp); 
116  }
117}
118/*-------------*/
119/* End of file */
120/*-------------*/
121
Note: See TracBrowser for help on using the repository browser.