source: rtems/c/src/exec/score/cpu/m68k/cpu.c @ 08311cc3

4.104.114.84.95
Last change on this file since 08311cc3 was 08311cc3, checked in by Joel Sherrill <joel.sherrill@…>, on 11/17/99 at 17:51:34

Updated copyright notice.

  • Property mode set to 100644
File size: 4.7 KB
Line 
1/*
2 *  Motorola MC68xxx Dependent Source
3 *
4 *  COPYRIGHT (c) 1989-1999.
5 *  On-Line Applications Research Corporation (OAR).
6 *
7 *  The license and distribution terms for this file may be
8 *  found in the file LICENSE in this distribution or at
9 *  http://www.OARcorp.com/rtems/license.html.
10 *
11 *  $Id$
12 */
13
14#include <rtems/system.h>
15#include <rtems/score/isr.h>
16
17/*  _CPU_Initialize
18 *
19 *  This routine performs processor dependent initialization.
20 *
21 *  INPUT PARAMETERS:
22 *    cpu_table       - CPU table to initialize
23 *    thread_dispatch - entry pointer to thread dispatcher
24 *
25 *  OUTPUT PARAMETERS: NONE
26 */
27
28void _CPU_Initialize(
29  rtems_cpu_table  *cpu_table,
30  void      (*thread_dispatch)      /* ignored on this CPU */
31)
32{
33#if ( M68K_HAS_VBR == 0 )
34  /* fill the isr redirect table with the code to place the format/id
35     onto the stack */
36
37  unsigned32 slot;
38
39  for (slot = 0; slot < CPU_INTERRUPT_NUMBER_OF_VECTORS; slot++)
40  {
41    _CPU_ISR_jump_table[slot].move_a7 = M68K_MOVE_A7;
42    _CPU_ISR_jump_table[slot].format_id = slot << 2;
43    _CPU_ISR_jump_table[slot].jmp = M68K_JMP;
44    _CPU_ISR_jump_table[slot].isr_handler = (unsigned32) 0xDEADDEAD;
45  }
46#endif /* M68K_HAS_VBR */
47
48  _CPU_Table = *cpu_table;
49}
50
51/*PAGE
52 *
53 *  _CPU_ISR_Get_level
54 */
55 
56unsigned32 _CPU_ISR_Get_level( void )
57{
58  unsigned32 level;
59
60  m68k_get_interrupt_level( level );
61
62  return level;
63}
64
65/*PAGE
66 *
67 *  _CPU_ISR_install_raw_handler
68 */
69 
70void _CPU_ISR_install_raw_handler(
71  unsigned32  vector,
72  proc_ptr    new_handler,
73  proc_ptr   *old_handler
74)
75{
76  proc_ptr *interrupt_table = NULL;
77
78#if (M68K_HAS_FPSP_PACKAGE == 1)
79  /*
80   *  If this vector being installed is one related to FP, then the
81   *  FPSP will install the handler itself and handle it completely
82   *  with no intervention from RTEMS.
83   */
84
85  if (*_FPSP_install_raw_handler &&
86      (*_FPSP_install_raw_handler)(vector, new_handler, *old_handler))
87        return;
88#endif
89
90
91  /*
92   *  On CPU models without a VBR, it is necessary for there to be some
93   *  header code for each ISR which saves a register, loads the vector
94   *  number, and jumps to _ISR_Handler.
95   */
96
97  m68k_get_vbr( interrupt_table );
98  *old_handler = interrupt_table[ vector ];
99#if ( M68K_HAS_VBR == 1 )
100  interrupt_table[ vector ] = new_handler;
101#else
102  _CPU_ISR_jump_table[vector].isr_handler = (unsigned32) new_handler;
103  interrupt_table[ vector ] = (proc_ptr) &_CPU_ISR_jump_table[vector];
104#endif /* M68K_HAS_VBR */
105}
106
107/*PAGE
108 *
109 *  _CPU_ISR_install_vector
110 *
111 *  This kernel routine installs the RTEMS handler for the
112 *  specified vector.
113 *
114 *  Input parameters:
115 *    vector      - interrupt vector number
116 *    new_handler - replacement ISR for this vector number
117 *    old_handler - former ISR for this vector number
118 *
119 *  Output parameters:  NONE
120 */
121
122void _CPU_ISR_install_vector(
123  unsigned32  vector,
124  proc_ptr    new_handler,
125  proc_ptr   *old_handler
126)
127{
128  proc_ptr ignored;
129
130  *old_handler = _ISR_Vector_table[ vector ];
131
132  _CPU_ISR_install_raw_handler( vector, _ISR_Handler, &ignored );
133
134  _ISR_Vector_table[ vector ] = new_handler;
135}
136
137
138/*PAGE
139 *
140 *  _CPU_Install_interrupt_stack
141 */
142
143void _CPU_Install_interrupt_stack( void )
144{
145#if ( M68K_HAS_SEPARATE_STACKS == 1 )
146  void *isp = _CPU_Interrupt_stack_high;
147
148  asm volatile ( "movec %0,%%isp" : "=r" (isp) : "0" (isp) );
149#endif
150}
151
152#if ( M68K_HAS_BFFFO != 1 )
153/*
154 * Returns table for duplication of the BFFFO instruction (16 bits only)
155 */
156const unsigned char __BFFFOtable[256] = {
157    8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4,
158    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
159    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
160    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
161    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
162    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
163    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
164    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
165    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
166    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
167    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
168    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
169    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
170    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
171    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
172    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
173};
174#endif
175
176/*PAGE
177 *
178 *  The following code context switches the software FPU emulation
179 *  code provided with GCC.
180 */
181
182#if (CPU_SOFTWARE_FP == TRUE)
183extern Context_Control_fp _fpCCR;
184
185void CPU_Context_save_fp (void **fp_context_ptr)
186{
187  Context_Control_fp *fp;
188
189  fp = (Context_Control_fp *) *fp_context_ptr;
190
191  *fp = _fpCCR;
192}
193
194void CPU_Context_restore_fp (void **fp_context_ptr)
195{
196  Context_Control_fp *fp;
197
198  fp = (Context_Control_fp *) *fp_context_ptr;
199
200  _fpCCR = *fp;
201}
202#endif
203
Note: See TracBrowser for help on using the repository browser.