source: rtems/c/src/lib/libcpu/powerpc/mpc6xx/exceptions/raw_exception.c @ 21e1c44

4.104.114.84.95
Last change on this file since 21e1c44 was 21e1c44, checked in by Joel Sherrill <joel.sherrill@…>, on 09/04/03 at 18:53:10

2003-09-04 Joel Sherrill <joel@…>

  • mpc6xx/clock/c_clock.c, mpc6xx/clock/c_clock.h, mpc6xx/exceptions/raw_exception.c, mpc6xx/exceptions/raw_exception.h, mpc6xx/mmu/bat.c, mpc6xx/mmu/bat.h, mpc6xx/mmu/mmuAsm.S, mpc6xx/timer/timer.c, mpc8260/clock/clock.c, mpc8260/console-generic/console-generic.c, mpc8260/cpm/brg.c, mpc8260/exceptions/raw_exception.c, mpc8260/exceptions/raw_exception.h, mpc8260/include/cpm.h, mpc8260/include/mmu.h, mpc8260/mmu/mmu.c, mpc8260/timer/timer.c, mpc8xx/clock/clock.c, mpc8xx/console-generic/console-generic.c, mpc8xx/exceptions/raw_exception.c, mpc8xx/exceptions/raw_exception.h, mpc8xx/include/cpm.h, mpc8xx/include/mmu.h, mpc8xx/mmu/mmu.c, mpc8xx/timer/timer.c, ppc403/clock/clock.c, ppc403/console/console.c.polled, ppc403/timer/timer.c, rtems/powerpc/debugmod.h, shared/include/byteorder.h, shared/include/cpuIdent.c, shared/include/cpuIdent.h, shared/include/io.h, shared/include/mmu.h, shared/include/page.h, shared/include/pgtable.h, shared/include/spr.h: URL for license changed.
  • Property mode set to 100644
File size: 6.9 KB
RevLine 
[acc25ee]1/*
2 * raw_exception.c  - This file contains implementation of C function to
3 *                    Instanciate 60x ppc primary exception entries.
4 *                    More detailled information can be found on motorola
5 *                    site and more precisely in the following book :
6 *
7 *                    MPC750
8 *                    Risc Microporcessor User's Manual
9 *                    Motorola REF : MPC750UM/AD 8/97
10 *
11 * Copyright (C) 1999  Eric Valette (valette@crf.canon.fr)
12 *                     Canon Centre Recherche France.
13 *
[95273a6]14 * Enhanced by Jay Kulpinski <jskulpin@eng01.gdds.com>
15 * to support 603, 603e, 604, 604e exceptions
16 *
[acc25ee]17 *  The license and distribution terms for this file may be
18 *  found in found in the file LICENSE in this distribution or at
[21e1c44]19 *  http://www.rtems.com/license/LICENSE.
[acc25ee]20 *
21 * $Id$
22 */
[a73a977]23#include <rtems/system.h>
[acc25ee]24#include <rtems/score/ppc.h>
[c0af822e]25#include <rtems/bspIo.h>
[acc25ee]26#include <libcpu/raw_exception.h>
[e05f4315]27#include <libcpu/cpuIdent.h>
[acc25ee]28
[cebb89b]29#include <string.h>
30
[acc25ee]31static rtems_raw_except_connect_data*           raw_except_table;
32static rtems_raw_except_connect_data            default_raw_except_entry;
33static rtems_raw_except_global_settings*        local_settings;
34
[cebb89b]35void * codemove(void *, const void *, unsigned int, unsigned long);
[acc25ee]36int mpc750_vector_is_valid(rtems_vector vector)
[cebb89b]37
[acc25ee]38{
39  switch(vector) {
40  case ASM_RESET_VECTOR: /* fall through */
41  case ASM_MACH_VECTOR:
42  case ASM_PROT_VECTOR:
43  case ASM_ISI_VECTOR:
44  case ASM_EXT_VECTOR:
45  case ASM_ALIGN_VECTOR:
46  case ASM_PROG_VECTOR:
47  case ASM_FLOAT_VECTOR:
48  case ASM_DEC_VECTOR:
49  case ASM_SYS_VECTOR:
50  case ASM_TRACE_VECTOR:
51  case ASM_ADDR_VECTOR:
52  case ASM_SYSMGMT_VECTOR:
53  case ASM_ITM_VECTOR:
54    return 1;
55  default: return 0;
56  }
57}
58
[95273a6]59int mpc603_vector_is_valid(rtems_vector vector)
60{
61  switch(vector) {
62  case ASM_RESET_VECTOR: /* fall through */
63  case ASM_MACH_VECTOR:
64  case ASM_PROT_VECTOR:
65  case ASM_ISI_VECTOR:
66  case ASM_EXT_VECTOR:
67  case ASM_ALIGN_VECTOR:
68  case ASM_PROG_VECTOR:
69  case ASM_FLOAT_VECTOR:
70  case ASM_DEC_VECTOR:
71  case ASM_SYS_VECTOR:
72  case ASM_TRACE_VECTOR:
73    return 1;
74  case ASM_PERFMON_VECTOR:
75    return 0;
76  case ASM_IMISS_VECTOR: /* fall through */
77  case ASM_DLMISS_VECTOR:
78  case ASM_DSMISS_VECTOR:
79  case ASM_ADDR_VECTOR:
80  case ASM_SYSMGMT_VECTOR:
81    return 1;
82  case ASM_ITM_VECTOR:
83    return 0;
84  }
85  return 0;
86}
87
[acc25ee]88int mpc604_vector_is_valid(rtems_vector vector)
89{
[95273a6]90  switch(vector) {
91  case ASM_RESET_VECTOR: /* fall through */
92  case ASM_MACH_VECTOR:
93  case ASM_PROT_VECTOR:
94  case ASM_ISI_VECTOR:
95  case ASM_EXT_VECTOR:
96  case ASM_ALIGN_VECTOR:
97  case ASM_PROG_VECTOR:
98  case ASM_FLOAT_VECTOR:
99  case ASM_DEC_VECTOR:
100  case ASM_SYS_VECTOR:
101  case ASM_TRACE_VECTOR:
102  case ASM_PERFMON_VECTOR:
103    return 1;
104  case ASM_IMISS_VECTOR: /* fall through */
105  case ASM_DLMISS_VECTOR:
106  case ASM_DSMISS_VECTOR:
107    return 0;
108  case ASM_ADDR_VECTOR: /* fall through */
109  case ASM_SYSMGMT_VECTOR:
110    return 1;
111  case ASM_ITM_VECTOR:
112    return 0;
113  }
[acc25ee]114  return 0;
115}
116
[55e4dcf3]117int mpc60x_vector_is_valid(rtems_vector vector)
[acc25ee]118{
[55e4dcf3]119     switch (current_ppc_cpu) {
[0d776cd2]120        case PPC_7400:
[95273a6]121        case PPC_750:
[55e4dcf3]122            if (!mpc750_vector_is_valid(vector)) {
[95273a6]123                return 0;
124            }
125            break;
126        case PPC_604:
127        case PPC_604e:
[d49389a]128        case PPC_604r:
[55e4dcf3]129            if (!mpc604_vector_is_valid(vector)) {
[95273a6]130                return 0;
131            }
132            break;
133        case PPC_603:
134        case PPC_603e:
[83795347]135        case PPC_603ev:
[55e4dcf3]136            if (!mpc603_vector_is_valid(vector)) {
[95273a6]137                return 0;
138            }
139            break;
140        default:
[d49389a]141            printk("Please complete libcpu/powerpc/mpc6xx/exceptions/raw_exception.c\n");
[95273a6]142            printk("current_ppc_cpu = %x\n", current_ppc_cpu);
143            return 0;
[55e4dcf3]144     }
145     return 1;
146}
[95273a6]147
[55e4dcf3]148int mpc60x_set_exception  (const rtems_raw_except_connect_data* except)
149{
150    unsigned int level;
151
152    if (!mpc60x_vector_is_valid(except->exceptIndex)) {
153      return 0;
154    }
[acc25ee]155    /*
156     * Check if default handler is actually connected. If not issue an error.
157     * You must first get the current handler via mpc60x_get_current_exception
158     * and then disconnect it using mpc60x_delete_exception.
159     * RATIONALE : to always have the same transition by forcing the user
160     * to get the previous handler before accepting to disconnect.
161     */
162    if (memcmp(mpc60x_get_vector_addr(except->exceptIndex), (void*)default_raw_except_entry.hdl.raw_hdl,default_raw_except_entry.hdl.raw_hdl_size)) {
163      return 0;
164    }
165
166    _CPU_ISR_Disable(level);
167   
168    raw_except_table [except->exceptIndex] = *except;
169    codemove((void*)mpc60x_get_vector_addr(except->exceptIndex),
170             except->hdl.raw_hdl,
171             except->hdl.raw_hdl_size,
172             PPC_CACHE_ALIGNMENT);
173    except->on(except);
174   
175    _CPU_ISR_Enable(level);
176    return 1;
177}
178
179int mpc60x_get_current_exception (rtems_raw_except_connect_data* except)
180{
[55e4dcf3]181  if (!mpc60x_vector_is_valid(except->exceptIndex)){
[acc25ee]182    return 0;
183  }
184   
185  *except = raw_except_table [except->exceptIndex];
186   
187  return 1;
188}
189
190int mpc60x_delete_exception (const rtems_raw_except_connect_data* except)
191{
192  unsigned int level;
193 
[55e4dcf3]194  if (!mpc60x_vector_is_valid(except->exceptIndex)){
[acc25ee]195    return 0;
196  }
197  /*
198   * Check if handler passed is actually connected. If not issue an error.
199   * You must first get the current handler via mpc60x_get_current_exception
200   * and then disconnect it using mpc60x_delete_exception.
201   * RATIONALE : to always have the same transition by forcing the user
202   * to get the previous handler before accepting to disconnect.
203   */
204  if (memcmp(mpc60x_get_vector_addr(except->exceptIndex),
205             (void*)except->hdl.raw_hdl,
206             except->hdl.raw_hdl_size)) {
207      return 0;
208  }
209  _CPU_ISR_Disable(level);
210
211  except->off(except);
212  codemove((void*)mpc60x_get_vector_addr(except->exceptIndex),
213           default_raw_except_entry.hdl.raw_hdl,
214           default_raw_except_entry.hdl.raw_hdl_size,
215           PPC_CACHE_ALIGNMENT);
216
217   
218  raw_except_table[except->exceptIndex] = default_raw_except_entry;
219  raw_except_table[except->exceptIndex].exceptIndex = except->exceptIndex;
220
221  _CPU_ISR_Enable(level);
222   
223  return 1;
224}
225
226/*
227 * Exception global init.
228 */
229int mpc60x_init_exceptions (rtems_raw_except_global_settings* config)
230{
231    unsigned                    i;
232    unsigned int level;
233   
234    /*
235     * store various accelerators
236     */
237    raw_except_table            = config->rawExceptHdlTbl;
238    local_settings              = config;
239    default_raw_except_entry    = config->defaultRawEntry;
240
241    _CPU_ISR_Disable(level);
242
243    for (i=0; i <= LAST_VALID_EXC; i++) {
[55e4dcf3]244      if (!mpc60x_vector_is_valid(i)){
[acc25ee]245        continue;
246      }
247      codemove((void*)mpc60x_get_vector_addr(i),
248             raw_except_table[i].hdl.raw_hdl,
249             raw_except_table[i].hdl.raw_hdl_size,
250             PPC_CACHE_ALIGNMENT);
251      if (raw_except_table[i].hdl.raw_hdl != default_raw_except_entry.hdl.raw_hdl) {
252        raw_except_table[i].on(&raw_except_table[i]);
253      }
254      else {
255        raw_except_table[i].off(&raw_except_table[i]);
256      }
257    }
258    _CPU_ISR_Enable(level);
259
260    return 1;
261}
262
263int mpc60x_get_exception_config (rtems_raw_except_global_settings** config)
264{
265  *config = local_settings;
266  return 1;
267}
268
Note: See TracBrowser for help on using the repository browser.