source: rtems/c/src/lib/libcpu/powerpc/new-exceptions/bspsupport/ppc_exc_categories.c @ 610d92c

4.115
Last change on this file since 610d92c was 610d92c, checked in by Sebastian Huber <sebastian.huber@…>, on 01/27/11 at 13:32:53

2011-01-27 Sebastian Huber <sebastian.huber@…>

  • new-exceptions/bspsupport/ppc_exc_categories.c: Fixed e500 categories.
  • Property mode set to 100644
File size: 9.7 KB
Line 
1/**
2 * @file
3 *
4 * @ingroup ppc_exc
5 *
6 * @brief PowerPC Exceptions implementation.
7 */
8
9/*
10 * Copyright (C) 1999 Eric Valette (valette@crf.canon.fr)
11 *                    Canon Centre Recherche France.
12 *
13 * Copyright (C) 2009-2011 embedded brains GmbH.
14 *
15 * Enhanced by Jay Kulpinski <jskulpin@eng01.gdds.com>
16 * to support 603, 603e, 604, 604e exceptions
17 *
18 * Moved to "libcpu/powerpc/new-exceptions" and consolidated
19 * by Thomas Doerfler <Thomas.Doerfler@embedded-brains.de>
20 * to be common for all PPCs with new exceptions.
21 *
22 * Derived from file "libcpu/powerpc/new-exceptions/raw_exception.c".
23 *
24 * The license and distribution terms for this file may be
25 * found in found in the file LICENSE in this distribution or at
26 * http://www.rtems.com/license/LICENSE.
27 *
28 * $Id$
29 */
30
31#include <bsp/vectors.h>
32
33#define PPC_BASIC_VECS_WO_SYS \
34  [ASM_RESET_VECTOR] = PPC_EXC_CLASSIC, \
35  [ASM_MACH_VECTOR] = PPC_EXC_CLASSIC, \
36  [ASM_PROT_VECTOR] = PPC_EXC_CLASSIC, \
37  [ASM_ISI_VECTOR] = PPC_EXC_CLASSIC, \
38  [ASM_EXT_VECTOR] = PPC_EXC_CLASSIC | PPC_EXC_ASYNC, \
39  [ASM_ALIGN_VECTOR] = PPC_EXC_CLASSIC, \
40  [ASM_PROG_VECTOR] = PPC_EXC_CLASSIC, \
41  [ASM_FLOAT_VECTOR] = PPC_EXC_CLASSIC, \
42  [ASM_DEC_VECTOR] = PPC_EXC_CLASSIC | PPC_EXC_ASYNC, \
43  [ASM_TRACE_VECTOR] = PPC_EXC_CLASSIC
44
45#define PPC_BASIC_VECS \
46        PPC_BASIC_VECS_WO_SYS, \
47        [ASM_SYS_VECTOR] = PPC_EXC_CLASSIC
48
49static const ppc_exc_categories ppc_405_category_table = {
50  [ASM_BOOKE_CRIT_VECTOR] = PPC_EXC_405_CRITICAL | PPC_EXC_ASYNC,
51  [ASM_MACH_VECTOR] = PPC_EXC_405_CRITICAL,
52  [ASM_PROT_VECTOR] = PPC_EXC_CLASSIC,
53  [ASM_ISI_VECTOR] = PPC_EXC_CLASSIC,
54  [ASM_EXT_VECTOR] = PPC_EXC_CLASSIC | PPC_EXC_ASYNC,
55  [ASM_ALIGN_VECTOR] = PPC_EXC_CLASSIC,
56  [ASM_PROG_VECTOR] = PPC_EXC_CLASSIC,
57  [ASM_FLOAT_VECTOR] = PPC_EXC_CLASSIC,
58
59  [ASM_PPC405_APU_UNAVAIL_VECTOR] = PPC_EXC_CLASSIC,
60
61  [ASM_SYS_VECTOR] = PPC_EXC_CLASSIC,
62
63  [ASM_BOOKE_DEC_VECTOR] = PPC_EXC_CLASSIC | PPC_EXC_ASYNC,
64  [ASM_BOOKE_FIT_VECTOR] = PPC_EXC_CLASSIC | PPC_EXC_ASYNC,
65  [ASM_BOOKE_WDOG_VECTOR] = PPC_EXC_405_CRITICAL | PPC_EXC_ASYNC,
66  [ASM_BOOKE_DTLBMISS_VECTOR] = PPC_EXC_CLASSIC,
67  [ASM_BOOKE_ITLBMISS_VECTOR] = PPC_EXC_CLASSIC,
68  [ASM_TRACE_VECTOR] = PPC_EXC_405_CRITICAL,
69};
70
71static const ppc_exc_categories mpc_5xx_category_table = {
72  [ASM_RESET_VECTOR] = PPC_EXC_CLASSIC,
73  [ASM_MACH_VECTOR] = PPC_EXC_CLASSIC,
74  [ASM_EXT_VECTOR] = PPC_EXC_CLASSIC | PPC_EXC_ASYNC,
75  [ASM_ALIGN_VECTOR] = PPC_EXC_CLASSIC,
76  [ASM_PROG_VECTOR] = PPC_EXC_CLASSIC,
77  [ASM_FLOAT_VECTOR] = PPC_EXC_CLASSIC,
78  [ASM_DEC_VECTOR] = PPC_EXC_CLASSIC | PPC_EXC_ASYNC,
79  [ASM_SYS_VECTOR] = PPC_EXC_CLASSIC,
80  [ASM_TRACE_VECTOR] = PPC_EXC_CLASSIC,
81
82  [ASM_5XX_FLOATASSIST_VECTOR] = PPC_EXC_CLASSIC,
83  [ASM_5XX_SOFTEMUL_VECTOR] = PPC_EXC_CLASSIC,
84  [ASM_5XX_IPROT_VECTOR] = PPC_EXC_CLASSIC,
85  [ASM_5XX_DPROT_VECTOR] = PPC_EXC_CLASSIC,
86  [ASM_5XX_DBREAK_VECTOR] = PPC_EXC_CLASSIC,
87  [ASM_5XX_IBREAK_VECTOR] = PPC_EXC_CLASSIC,
88  [ASM_5XX_MEBREAK_VECTOR] = PPC_EXC_CLASSIC,
89  [ASM_5XX_NMEBREAK_VECTOR] = PPC_EXC_CLASSIC,
90};
91
92static const ppc_exc_categories mpc_603_category_table = {
93  PPC_BASIC_VECS,
94
95  [ASM_60X_SYSMGMT_VECTOR] = PPC_EXC_CLASSIC | PPC_EXC_ASYNC,
96  [ASM_60X_IMISS_VECTOR] = PPC_EXC_CLASSIC,
97  [ASM_60X_DLMISS_VECTOR] = PPC_EXC_CLASSIC,
98  [ASM_60X_DSMISS_VECTOR] = PPC_EXC_CLASSIC,
99  [ASM_60X_ADDR_VECTOR] = PPC_EXC_CLASSIC,
100};
101
102static const ppc_exc_categories mpc_604_category_table = {
103  PPC_BASIC_VECS,
104
105  [ASM_60X_PERFMON_VECTOR] = PPC_EXC_CLASSIC,
106  [ASM_60X_SYSMGMT_VECTOR] = PPC_EXC_CLASSIC | PPC_EXC_ASYNC,
107  [ASM_60X_ADDR_VECTOR] = PPC_EXC_CLASSIC,
108};
109
110static const ppc_exc_categories mpc_604_altivec_category_table = {
111  PPC_BASIC_VECS,
112
113  [ASM_60X_PERFMON_VECTOR] = PPC_EXC_CLASSIC,
114  [ASM_60X_SYSMGMT_VECTOR] = PPC_EXC_CLASSIC | PPC_EXC_ASYNC,
115  [ASM_60X_ADDR_VECTOR] = PPC_EXC_CLASSIC,
116  [ASM_60X_VEC_VECTOR] = PPC_EXC_CLASSIC,
117  [ASM_60X_VEC_ASSIST_VECTOR] = PPC_EXC_CLASSIC,
118};
119
120static const ppc_exc_categories mpc_750_category_table = {
121  PPC_BASIC_VECS,
122
123  [ASM_60X_SYSMGMT_VECTOR] = PPC_EXC_CLASSIC | PPC_EXC_ASYNC,
124  [ASM_60X_ADDR_VECTOR] = PPC_EXC_CLASSIC,
125  [ASM_60X_ITM_VECTOR] = PPC_EXC_CLASSIC,
126};
127
128static const ppc_exc_categories mpc_750_altivec_category_table = {
129  PPC_BASIC_VECS,
130
131  [ASM_60X_SYSMGMT_VECTOR] = PPC_EXC_CLASSIC | PPC_EXC_ASYNC,
132  [ASM_60X_ADDR_VECTOR] = PPC_EXC_CLASSIC,
133  [ASM_60X_ITM_VECTOR] = PPC_EXC_CLASSIC,
134  [ASM_60X_VEC_VECTOR] = PPC_EXC_CLASSIC,
135  [ASM_60X_VEC_ASSIST_VECTOR] = PPC_EXC_CLASSIC,
136};
137
138static const ppc_exc_categories mpc_860_category_table = {
139  PPC_BASIC_VECS,
140
141  [ASM_8XX_FLOATASSIST_VECTOR] = PPC_EXC_CLASSIC,
142  [ASM_8XX_SOFTEMUL_VECTOR] = PPC_EXC_CLASSIC,
143  [ASM_8XX_ITLBMISS_VECTOR] = PPC_EXC_CLASSIC,
144  [ASM_8XX_DTLBMISS_VECTOR] = PPC_EXC_CLASSIC,
145  [ASM_8XX_ITLBERROR_VECTOR] = PPC_EXC_CLASSIC,
146  [ASM_8XX_DTLBERROR_VECTOR] = PPC_EXC_CLASSIC,
147  [ASM_8XX_DBREAK_VECTOR] = PPC_EXC_CLASSIC,
148  [ASM_8XX_IBREAK_VECTOR] = PPC_EXC_CLASSIC,
149  [ASM_8XX_PERIFBREAK_VECTOR] = PPC_EXC_CLASSIC,
150  [ASM_8XX_DEVPORT_VECTOR] = PPC_EXC_CLASSIC,
151};
152
153static const ppc_exc_categories e300_category_table = {
154  [ASM_RESET_VECTOR] = PPC_EXC_CLASSIC,
155  [ASM_MACH_VECTOR] = PPC_EXC_CLASSIC,
156  [ASM_PROT_VECTOR] = PPC_EXC_CLASSIC,
157  [ASM_ISI_VECTOR] = PPC_EXC_CLASSIC,
158  [ASM_EXT_VECTOR] = PPC_EXC_CLASSIC | PPC_EXC_ASYNC,
159  [ASM_ALIGN_VECTOR] = PPC_EXC_CLASSIC,
160  [ASM_PROG_VECTOR] = PPC_EXC_CLASSIC,
161  [ASM_FLOAT_VECTOR] = PPC_EXC_NAKED,
162  [ASM_DEC_VECTOR] = PPC_EXC_CLASSIC | PPC_EXC_ASYNC,
163  [ASM_SYS_VECTOR] = PPC_EXC_CLASSIC,
164  [ASM_TRACE_VECTOR] = PPC_EXC_CLASSIC,
165
166  [ASM_E300_CRIT_VECTOR] = PPC_EXC_BOOKE_CRITICAL | PPC_EXC_ASYNC,
167  [ASM_E300_PERFMON_VECTOR] = PPC_EXC_CLASSIC,
168  [ASM_E300_IMISS_VECTOR] = PPC_EXC_CLASSIC,
169  [ASM_E300_DLMISS_VECTOR] = PPC_EXC_CLASSIC,
170  [ASM_E300_DSMISS_VECTOR] = PPC_EXC_CLASSIC,
171  [ASM_E300_ADDR_VECTOR] = PPC_EXC_CLASSIC,
172  [ASM_E300_SYSMGMT_VECTOR] = PPC_EXC_CLASSIC | PPC_EXC_ASYNC,
173};
174
175static const ppc_exc_categories e200_category_table = {
176  [ASM_BOOKE_CRIT_VECTOR] = PPC_EXC_BOOKE_CRITICAL | PPC_EXC_ASYNC,
177  [ASM_MACH_VECTOR] = PPC_EXC_BOOKE_CRITICAL,
178  [ASM_PROT_VECTOR] = PPC_EXC_CLASSIC,
179  [ASM_ISI_VECTOR] = PPC_EXC_CLASSIC,
180  [ASM_EXT_VECTOR] = PPC_EXC_CLASSIC | PPC_EXC_ASYNC,
181  [ASM_ALIGN_VECTOR] = PPC_EXC_CLASSIC,
182  [ASM_PROG_VECTOR] = PPC_EXC_CLASSIC,
183  [ASM_FLOAT_VECTOR] = PPC_EXC_CLASSIC,
184  [ASM_SYS_VECTOR] = PPC_EXC_CLASSIC,
185  [ASM_BOOKE_DEC_VECTOR] = PPC_EXC_CLASSIC | PPC_EXC_ASYNC,
186  [ASM_BOOKE_FIT_VECTOR] = PPC_EXC_CLASSIC | PPC_EXC_ASYNC,
187  [ASM_BOOKE_WDOG_VECTOR] = PPC_EXC_BOOKE_CRITICAL | PPC_EXC_ASYNC,
188  [ASM_BOOKE_DTLBMISS_VECTOR] = PPC_EXC_CLASSIC,
189  [ASM_BOOKE_ITLBMISS_VECTOR] = PPC_EXC_CLASSIC,
190
191  /* FIXME: Depending on HDI0 [DAPUEN] this is a critical or debug exception */
192  [ASM_BOOKE_DEBUG_VECTOR] = PPC_EXC_BOOKE_CRITICAL,
193
194  [ASM_E500_SPE_UNAVAILABLE_VECTOR] = PPC_EXC_CLASSIC,
195  [ASM_E500_EMB_FP_DATA_VECTOR] = PPC_EXC_CLASSIC,
196  [ASM_E500_EMB_FP_ROUND_VECTOR] = PPC_EXC_CLASSIC
197};
198
199static const ppc_exc_categories e500_category_table = {
200  [ASM_BOOKE_CRIT_VECTOR] = PPC_EXC_BOOKE_CRITICAL | PPC_EXC_ASYNC,
201  [ASM_MACH_VECTOR] = PPC_EXC_E500_MACHCHK,
202  [ASM_PROT_VECTOR] = PPC_EXC_CLASSIC,
203  [ASM_ISI_VECTOR] = PPC_EXC_CLASSIC,
204  [ASM_EXT_VECTOR] = PPC_EXC_CLASSIC | PPC_EXC_ASYNC,
205  [ASM_ALIGN_VECTOR] = PPC_EXC_CLASSIC,
206  [ASM_PROG_VECTOR] = PPC_EXC_CLASSIC,
207  [ASM_FLOAT_VECTOR] = PPC_EXC_CLASSIC,
208  [ASM_SYS_VECTOR] = PPC_EXC_CLASSIC,
209  [ASM_BOOKE_APU_VECTOR] = PPC_EXC_CLASSIC,
210  [ASM_BOOKE_DEC_VECTOR] = PPC_EXC_CLASSIC | PPC_EXC_ASYNC,
211  [ASM_BOOKE_FIT_VECTOR] = PPC_EXC_CLASSIC | PPC_EXC_ASYNC,
212  [ASM_BOOKE_WDOG_VECTOR] = PPC_EXC_BOOKE_CRITICAL | PPC_EXC_ASYNC,
213  [ASM_BOOKE_DTLBMISS_VECTOR] = PPC_EXC_CLASSIC,
214  [ASM_BOOKE_ITLBMISS_VECTOR] = PPC_EXC_CLASSIC,
215  [ASM_BOOKE_DEBUG_VECTOR] = PPC_EXC_BOOKE_CRITICAL,
216  [ASM_E500_SPE_UNAVAILABLE_VECTOR] = PPC_EXC_CLASSIC,
217  [ASM_E500_EMB_FP_DATA_VECTOR] = PPC_EXC_CLASSIC,
218  [ASM_E500_EMB_FP_ROUND_VECTOR] = PPC_EXC_CLASSIC,
219  [ASM_E500_PERFMON_VECTOR] = PPC_EXC_CLASSIC
220};
221
222static const ppc_exc_categories psim_category_table = {
223  PPC_BASIC_VECS_WO_SYS,
224
225  [ASM_60X_SYSMGMT_VECTOR] = PPC_EXC_CLASSIC | PPC_EXC_ASYNC,
226  [ASM_60X_IMISS_VECTOR] = PPC_EXC_CLASSIC,
227  [ASM_60X_DLMISS_VECTOR] = PPC_EXC_CLASSIC,
228  [ASM_60X_DSMISS_VECTOR] = PPC_EXC_CLASSIC,
229  [ASM_60X_ADDR_VECTOR] = PPC_EXC_CLASSIC,
230  [ASM_60X_VEC_VECTOR] = PPC_EXC_CLASSIC,
231  [ASM_60X_VEC_ASSIST_VECTOR] = PPC_EXC_CLASSIC,
232};
233
234const ppc_exc_categories *ppc_exc_categories_for_cpu(ppc_cpu_id_t cpu)
235{
236  if (ppc_cpu_has_altivec()) {
237    switch (cpu) {
238      case PPC_7400:
239        return &mpc_750_altivec_category_table;
240      case PPC_7455:
241      case PPC_7457:
242        return &mpc_604_altivec_category_table;
243      default:
244        break;
245    }
246  }
247
248  switch (cpu) {
249    case PPC_7400:
250    case PPC_750:
251      return &mpc_750_category_table;
252    case PPC_7455:
253    case PPC_7457:
254    case PPC_604:
255    case PPC_604e:
256    case PPC_604r:
257      return &mpc_604_category_table;
258    case PPC_603:
259    case PPC_603e:
260    case PPC_603le:
261    case PPC_603ev:
262    /* case PPC_8240: same value as 8260 */
263    case PPC_8260:
264    case PPC_8245:
265      return &mpc_603_category_table;
266    case PPC_e300c1:
267    case PPC_e300c2:
268    case PPC_e300c3:
269      return &e300_category_table;
270    case PPC_PSIM:
271      return &psim_category_table;
272    case PPC_8540:
273    case PPC_e500v2:
274      return &e500_category_table;
275    case PPC_e200z0:
276    case PPC_e200z1:
277    case PPC_e200z6:
278      return &e200_category_table;
279    case PPC_5XX:
280      return &mpc_5xx_category_table;
281    case PPC_860:
282      return &mpc_860_category_table;
283    case PPC_405:
284    case PPC_405GP:
285    case PPC_405EX:
286      return &ppc_405_category_table;
287    default:
288      break;
289  }
290
291  return NULL;
292}
293
294ppc_exc_category ppc_exc_category_for_vector(const ppc_exc_categories *categories, unsigned vector)
295{
296  if (vector <= LAST_VALID_EXC) {
297    return (*categories) [vector];
298  } else {
299    return PPC_EXC_INVALID;
300  }
301}
Note: See TracBrowser for help on using the repository browser.