OpenCores
URL https://opencores.org/ocsvn/openrisc_me/openrisc_me/trunk

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [rtos/] [rtems/] [c/] [src/] [exec/] [score/] [cpu/] [m68k/] [cpu.c] - Blame information for rev 389

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 30 unneback
/*
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: cpu.c,v 1.2 2001-09-27 11:59:28 chris Exp $
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
 
28
void _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
 
56
unsigned32 _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
 
70
void _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
 
122
void _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
 
143
void _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
 */
156
const 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)
183
extern Context_Control_fp _fpCCR;
184
 
185
void 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
 
194
void 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
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.