source: rtems/c/src/lib/libcpu/powerpc/old-exceptions/irq_stub.S @ d3d9ef37

4.104.114.84.95
Last change on this file since d3d9ef37 was 3e5a93cc, checked in by Ralf Corsepius <ralf.corsepius@…>, on Feb 14, 2005 at 4:44:17 AM

2005-02-14 Ralf Corsepius <ralf.corsepius@…>

  • cpu.c, cpu_asm.S, irq_stub.S: #include <rtems/powerpc/powerpc.h>.
  • Property mode set to 100644
File size: 5.3 KB
Line 
1/*
2 *  This file contains the interrupt handler assembly code for the PowerPC
3 *  implementation of RTEMS.  It is #included from cpu_asm.s.
4 *
5 *  Author:     Andrew Bray <andy@i-cubed.co.uk>
6 *
7 *  COPYRIGHT (c) 1995 by i-cubed ltd.
8 *
9 *  To anyone who acknowledges that this file is provided "AS IS"
10 *  without any express or implied warranty:
11 *      permission to use, copy, modify, and distribute this file
12 *      for any purpose is hereby granted without fee, provided that
13 *      the above copyright notice and this notice appears in all
14 *      copies, and that the name of i-cubed limited not be used in
15 *      advertising or publicity pertaining to distribution of the
16 *      software without specific, written prior permission.
17 *      i-cubed limited makes no representations about the suitability
18 *      of this software for any purpose.
19 *
20 *  $Id$
21 */
22
23/*
24 * FIXME: this file is bsp dependent.
25 */
26#include <bspopts.h>
27#include <rtems/powerpc/powerpc.h>
28
29/*  void __ISR_Handler()
30 *
31 *  This routine provides the RTEMS interrupt management.
32 *  The vector number is in r0. R0 has already been stacked.
33 *
34 */
35        PUBLIC_VAR (_CPU_IRQ_info )
36
37        /* Finish off the interrupt frame */
38        stw     r2, IP_2(r1)
39        stw     r3, IP_3(r1)
40        stw     r4, IP_4(r1)
41        stw     r5, IP_5(r1)
42        stw     r6, IP_6(r1)
43        stw     r7, IP_7(r1)
44        stw     r8, IP_8(r1)
45        stw     r9, IP_9(r1)
46        stw     r10, IP_10(r1)
47        stw     r11, IP_11(r1)
48        stw     r12, IP_12(r1)
49        stw     r13, IP_13(r1)
50        stmw    r28, IP_28(r1)
51        mfcr    r5
52        mfctr   r6
53        mfxer   r7
54        mflr    r8
55        MFPC    (r9)
56        MFMSR   (r10)
57        /* Establish addressing */
58#if (PPC_USE_SPRG)
59        mfspr   r11, sprg3
60#else
61        lis     r11,_CPU_IRQ_info@ha
62        addi    r11,r11,_CPU_IRQ_info@l
63#endif
64#if ( PPC_USE_DATA_CACHE )
65        dcbt    r0, r11
66#endif
67        stw     r5, IP_CR(r1)
68        stw     r6, IP_CTR(r1)
69        stw     r7, IP_XER(r1)
70        stw     r8, IP_LR(r1)
71        stw     r9, IP_PC(r1)
72        stw     r10, IP_MSR(r1)
73
74        lwz     r30, Vector_table(r11)
75        slwi    r4,r0,2
76        lwz     r28, Nest_level(r11)
77        add     r4, r4, r30
78
79        lwz     r30, 0(r28)
80        mr      r3, r0
81        lwz     r31, Stack(r11)
82  /*
83   *  #if ( CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE )
84   *    if ( _ISR_Nest_level == 0 )
85   *      switch to software interrupt stack
86   *  #endif
87   */
88        /* Switch stacks, here we must prevent ALL interrupts */
89#if (PPC_USE_SPRG)
90        mfmsr   r5
91        mfspr   r6, sprg2
92#else
93        lwz     r6,msr_initial(r11)
94        lis     r5,~PPC_MSR_DISABLE_MASK@ha
95        ori     r5,r5,~PPC_MSR_DISABLE_MASK@l
96        and     r6,r6,r5
97        mfmsr   r5
98#endif
99        mtmsr   r6
100        cmpwi   r30, 0
101        lwz     r29, Disable_level(r11)
102        subf    r31,r1,r31
103        bne     LABEL (nested)
104        stwux   r1,r1,r31
105LABEL (nested):
106  /*
107   *  _ISR_Nest_level++;
108   */
109        lwz     r31, 0(r29)
110        addi    r30,r30,1
111        stw     r30,0(r28)
112        /* From here on out, interrupts can be re-enabled. RTEMS
113         * convention says not.
114         */
115        lwz     r4,0(r4)
116  /*
117   *  _Thread_Dispatch_disable_level++;
118   */
119        addi    r31,r31,1
120        stw     r31, 0(r29)
121/* SCE 980217
122 *
123 * We need address translation ON when we call our ISR routine
124
125        mtmsr   r5
126
127 */
128
129  /*
130   *  (*_ISR_Vector_table[ vector ])( vector );
131   */
132#if (PPC_ABI == PPC_ABI_SVR4 || PPC_ABI == PPC_ABI_EABI)
133        mtlr    r4
134        lwz     r2, Default_r2(r11)
135        lwz     r13, Default_r13(r11)
136        #lwz    r2, 0(r2)
137        #lwz    r13, 0(r13)
138#endif
139        mr      r4,r1
140        blrl
141        /* NOP marker for debuggers */
142        or      r6,r6,r6
143
144        /*      We must re-disable the interrupts */
145#if (PPC_USE_SPRG)
146        mfspr   r11, sprg3
147        mfspr   r0, sprg2
148#else
149        lis     r11,_CPU_IRQ_info@ha
150        addi    r11,r11,_CPU_IRQ_info@l
151        lwz     r0,msr_initial(r11)
152        lis     r30,~PPC_MSR_DISABLE_MASK@ha
153        ori     r30,r30,~PPC_MSR_DISABLE_MASK@l
154        and     r0,r0,r30
155#endif
156        mtmsr   r0
157        lwz     r30, 0(r28)
158        lwz     r31, 0(r29)
159
160  /*
161   *  if (--Thread_Dispatch_disable,--_ISR_Nest_level)
162   *    goto easy_exit;
163   */
164        addi    r30, r30, -1
165        cmpwi   r30, 0
166        addi    r31, r31, -1
167        stw     r30, 0(r28)
168        stw     r31, 0(r29)
169        bne     LABEL (easy_exit)
170        cmpwi   r31, 0
171
172        lwz     r30, Switch_necessary(r11)
173
174  /*
175   *  #if ( CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE )
176   *    restore stack
177   *  #endif
178   */
179        lwz     r1,0(r1)
180        bne     LABEL (easy_exit)
181        lwz     r30, 0(r30)
182        lwz     r31, Signal(r11)
183
184  /*
185   *  if ( _Context_Switch_necessary )
186   *    goto switch
187   */
188        cmpwi   r30, 0
189        lwz     r28, 0(r31)
190        li      r6,0
191        bne     LABEL (switch)
192  /*
193   *  if ( !_ISR_Signals_to_thread_executing )
194   *    goto easy_exit
195   *  _ISR_Signals_to_thread_executing = 0;
196   */
197        cmpwi   r28, 0
198        beq     LABEL (easy_exit)
199
200  /*
201   * switch:
202   *  call _Thread_Dispatch() or prepare to return to _ISR_Dispatch
203   */
204LABEL (switch):
205        stw     r6, 0(r31)
206        /* Re-enable interrupts */
207        lwz     r0, IP_MSR(r1)
208        /* R2 and R13 still hold their values from the last call */
209        mtmsr   r0
210        bl      SYM (_Thread_Dispatch)
211        /* NOP marker for debuggers */
212        or      r6,r6,r6
213  /*
214   *  prepare to get out of interrupt
215   */
216        /* Re-disable IRQs */
217#if (PPC_USE_SPRG)
218        mfspr   r0, sprg2
219#else
220        lis     r11,_CPU_IRQ_info@ha
221        addi    r11,r11,_CPU_IRQ_info@l
222        lwz     r0,msr_initial(r11)
223        lis     r5,~PPC_MSR_DISABLE_MASK@ha
224        ori     r5,r5,~PPC_MSR_DISABLE_MASK@l
225        and     r0,r0,r5
226#endif
227        mtmsr   r0
228
229  /*
230   *  easy_exit:
231   *  prepare to get out of interrupt
232   *  return from interrupt
233   */
234LABEL (easy_exit):
235        lwz     r5, IP_CR(r1)
236        lwz     r6, IP_CTR(r1)
237        lwz     r7, IP_XER(r1)
238        lwz     r8, IP_LR(r1)
239        lwz     r9, IP_PC(r1)
240        lwz     r10, IP_MSR(r1)
241        mtcrf   255,r5
242        mtctr   r6
243        mtxer   r7
244        mtlr    r8
245        MTPC    (r9)
246        MTMSR   (r10)
247        lwz     r0, IP_0(r1)
248        lwz     r2, IP_2(r1)
249        lwz     r3, IP_3(r1)
250        lwz     r4, IP_4(r1)
251        lwz     r5, IP_5(r1)
252        lwz     r6, IP_6(r1)
253        lwz     r7, IP_7(r1)
254        lwz     r8, IP_8(r1)
255        lwz     r9, IP_9(r1)
256        lwz     r10, IP_10(r1)
257        lwz     r11, IP_11(r1)
258        lwz     r12, IP_12(r1)
259        lwz     r13, IP_13(r1)
260        lmw     r28, IP_28(r1)
261        lwz     r1, 0(r1)
Note: See TracBrowser for help on using the repository browser.