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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [rtos/] [rtems/] [c/] [src/] [exec/] [score/] [cpu/] [hppa1.1/] [cpu.c] - Blame information for rev 173

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 30 unneback
/*
2
 *  HP PA-RISC Dependent Source
3
 *
4
 *  COPYRIGHT (c) 1994 by Division Incorporated
5
 *
6
 *  The license and distribution terms for this file may be
7
 *  found in the file LICENSE in this distribution or at
8
 *  http://www.OARcorp.com/rtems/license.html.
9
 *
10
 *  $Id: cpu.c,v 1.2 2001-09-27 11:59:24 chris Exp $
11
 */
12
 
13
#include <rtems/system.h>
14
#include <rtems/score/isr.h>
15
void hppa_cpu_halt(unsigned32 the_error);
16
 
17
 
18
/*PAGE
19
 *
20
 *  _CPU_ISR_install_raw_handler
21
 */
22
 
23
void _CPU_ISR_install_raw_handler(
24
  unsigned32  vector,
25
  proc_ptr    new_handler,
26
  proc_ptr   *old_handler
27
)
28
{
29
  /*
30
   *  This is unsupported.  For HPPA this function is handled by BSP
31
   */
32
 
33
  _CPU_Fatal_halt( 0xdeaddead );
34
}
35
 
36
 
37
 
38
/*
39
 * This is the default handler which is called if
40
 * _CPU_ISR_install_vector() has not been called for the
41
 * specified vector.  It simply forwards onto the spurious
42
 * handler defined in the cpu-table.
43
 */
44
 
45
static ISR_Handler
46
hppa_interrupt_report_spurious(ISR_Vector_number vector,
47
                               void* rtems_isr_frame) /* HPPA extension */
48
{
49
 
50
    /*
51
     * If the CPU table defines a spurious_handler, then
52
     * call it.  If the handler returns halt.
53
     */
54
    if ( _CPU_Table.spurious_handler )
55
        _CPU_Table.spurious_handler(vector, rtems_isr_frame);
56
 
57
    hppa_cpu_halt(vector);
58
}
59
 
60
 
61
/*PAGE
62
 *
63
 *  _CPU_ISR_Get_level
64
 */
65
 
66
unsigned32 _CPU_ISR_Get_level(void)
67
{
68
    int level;
69
    HPPA_ASM_SSM(0, level);      /* change no bits; just get copy */
70
    if (level & HPPA_PSW_I)
71
        return 0;
72
    return 1;
73
}
74
 
75
/*PAGE
76
 *
77
 *  _CPU_ISR_install_vector
78
 *
79
 *  This kernel routine installs the RTEMS handler for the
80
 *  specified vector.  The handler is a C callable routine.
81
 *
82
 *  Input parameters:
83
 *    vector      - interrupt vector number
84
 *    old_handler - former ISR for this vector number
85
 *    new_handler - replacement ISR for this vector number
86
 *
87
 *  Output parameters:  NONE
88
 *
89
 */
90
 
91
void _CPU_ISR_install_vector(
92
  unsigned32  vector,
93
  proc_ptr    new_handler,
94
  proc_ptr   *old_handler
95
)
96
{
97
    *old_handler = _ISR_Vector_table[vector];
98
 
99
    _ISR_Vector_table[vector] = new_handler;
100
}
101
 
102
/*  _CPU_Initialize
103
 *
104
 *  This routine performs processor dependent initialization.
105
 *
106
 *  INPUT PARAMETERS:
107
 *    cpu_table       - CPU table to initialize
108
 *    thread_dispatch - address of disptaching routine
109
 *
110
 */
111
 
112
void _CPU_Initialize(
113
  rtems_cpu_table  *cpu_table,
114
  void      (*thread_dispatch)      /* ignored on this CPU */
115
)
116
{
117
    register unsigned8  *fp_context;
118
    unsigned32 i;
119
    proc_ptr   old_handler;
120
 
121
    /*
122
     * This is the default fp context for all tasks
123
     * Set it up so that denormalized results go to zero.
124
     */
125
 
126
    fp_context = (unsigned8*) &_CPU_Null_fp_context;
127
    for (i=0 ; i<sizeof(Context_Control_fp); i++)
128
        *fp_context++ = 0;
129
    *((unsigned32 *) &_CPU_Null_fp_context) = HPPA_FPSTATUS_D;
130
 
131
    /*
132
     *  Save r27 into _CPU_Default_gr27 so it will hopefully be the correct
133
     *  global data pointer for the entire system.
134
     */
135
 
136
    asm volatile( "stw   %%r27,%0" : "=m" (_CPU_Default_gr27): );
137
 
138
    /*
139
     * Init the 2nd level interrupt handlers
140
     */
141
 
142
    for (i=0; i < CPU_INTERRUPT_NUMBER_OF_VECTORS; i++)
143
        _CPU_ISR_install_vector(i,
144
                                hppa_interrupt_report_spurious,
145
                                &old_handler);
146
 
147
    _CPU_Table = *cpu_table;
148
 
149
}
150
 
151
 
152
/*
153
 * Halt the system.
154
 * Called by the _CPU_Fatal_halt macro
155
 *
156
 * XXX
157
 * Later on, this will allow us to return to the prom.
158
 * For now, we just ignore 'type_of_halt'
159
 *
160
 * XXX
161
 * NOTE: for gcc, this function must be at the bottom
162
 * of the file, that is because if it is at the top
163
 * of the file, gcc will inline it's calls.  Since
164
 * the function uses the HPPA_ASM_LABEL() macro, when
165
 * gcc inlines it, you get two definitions of the same
166
 * label name, which is an assembly error.
167
 */
168
 
169
 
170
void
171
hppa_cpu_halt(unsigned32 the_error)
172
{
173
    unsigned32 isrlevel;
174
 
175
    _CPU_ISR_Disable(isrlevel);
176
 
177
    /*
178
     * XXXXX NOTE: This label is only needed that that when
179
     * the simulator stops, it shows the label name specified
180
     */
181
    HPPA_ASM_LABEL("_hppa_cpu_halt");
182
    HPPA_ASM_BREAK(0, 0);
183
}
184
 

powered by: WebSVN 2.1.0

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