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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [rtos/] [ecos-3.0/] [packages/] [hal/] [powerpc/] [arch/] [current/] [src/] [context.S] - Blame information for rev 786

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 786 skrzyp
##=============================================================================
2
##
3
##      context.S
4
##
5
##      PowerPC context switch code
6
##
7
##=============================================================================
8
## ####ECOSGPLCOPYRIGHTBEGIN####
9
## -------------------------------------------
10
## This file is part of eCos, the Embedded Configurable Operating System.
11
## Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
12
##
13
## eCos is free software; you can redistribute it and/or modify it under
14
## the terms of the GNU General Public License as published by the Free
15
## Software Foundation; either version 2 or (at your option) any later
16
## version.
17
##
18
## eCos is distributed in the hope that it will be useful, but WITHOUT
19
## ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
20
## FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
21
## for more details.
22
##
23
## You should have received a copy of the GNU General Public License
24
## along with eCos; if not, write to the Free Software Foundation, Inc.,
25
## 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
26
##
27
## As a special exception, if other files instantiate templates or use
28
## macros or inline functions from this file, or you compile this file
29
## and link it with other works to produce a work based on this file,
30
## this file does not by itself cause the resulting work to be covered by
31
## the GNU General Public License. However the source code for this file
32
## must still be made available in accordance with section (3) of the GNU
33
## General Public License v2.
34
##
35
## This exception does not invalidate any other reasons why a work based
36
## on this file might be covered by the GNU General Public License.
37
## -------------------------------------------
38
## ####ECOSGPLCOPYRIGHTEND####
39
##=============================================================================
40
#######DESCRIPTIONBEGIN####
41
##
42
## Author(s):   nickg
43
## Contributors:        nickg
44
## Date:        1998-04-27
45
## Purpose:     PowerPC context switch code
46
## Description: This file contains implementations of the thread context
47
##              switch routines. It also contains the longjmp() and setjmp()
48
##              routines.
49
##
50
######DESCRIPTIONEND####
51
##
52
##=============================================================================
53
 
54
#include 
55
 
56
#include 
57
#include 
58
 
59
#------------------------------------------------------------------------------
60
# Configure to use either a minimal or maximal thread state
61
 
62
#ifdef CYGDBG_HAL_COMMON_CONTEXT_SAVE_MINIMUM
63
 
64
#define MIN_SAVE_REG    13
65
#define MAX_SAVE_REG    31
66
 
67
        .macro  save_special
68
        .endm
69
 
70
        .macro  load_special
71
        .endm
72
#else
73
 
74
#define MIN_SAVE_REG     6
75
#define MAX_SAVE_REG    31
76
 
77
        .macro  save_special
78
        mfxer   r6
79
        mfctr   r7
80
        stw     r6,CYGARC_PPCREG_XER(sp)
81
        stw     r7,CYGARC_PPCREG_CTR(sp)
82
        .endm
83
 
84
        .macro  load_special
85
        lwz     r6,CYGARC_PPCREG_XER(sp)
86
        lwz     r7,CYGARC_PPCREG_CTR(sp)
87
        mtxer   r6
88
        mtctr   r7
89
        .endm
90
 
91
#endif
92
 
93
#ifdef CYGHWR_HAL_POWERPC_FPU
94
#ifdef CYGDBG_HAL_COMMON_CONTEXT_SAVE_MINIMUM
95
 
96
#define MIN_CONTEXT_SAVE_FREG   14
97
#define MAX_CONTEXT_SAVE_FREG   31
98
 
99
#else
100
 
101
#define MIN_CONTEXT_SAVE_FREG    0
102
#define MAX_CONTEXT_SAVE_FREG   31
103
 
104
#endif
105
#endif
106
 
107
#------------------------------------------------------------------------------
108
# hal_thread_switch_context
109
# Switch thread contexts
110
# R3 = address of sp of next thread to execute
111
# R4 = address of sp save location of current thread
112
 
113
 
114
FUNC_START(hal_thread_switch_context)
115
        mr      r5,sp                   # R5 = saved stack pointer
116
        subi    sp,sp,CYGARC_PPC_CONTEXT_SIZE  # space for state
117
 
118
        # Save registers MIN..MAX
119
        .set    _reg,MIN_SAVE_REG
120
        .rept   MAX_SAVE_REG+1-MIN_SAVE_REG
121
        stw     _reg,(CYGARC_PPCREG_REGS+_reg*4)(sp)
122
        .set    _reg,_reg+1
123
        .endr
124
 
125
#ifdef CYGHWR_HAL_POWERPC_FPU
126
        # Save floating point MIN..MAX
127
        .set    _freg, MIN_CONTEXT_SAVE_FREG
128
        .rept   MAX_CONTEXT_SAVE_FREG+1-MIN_CONTEXT_SAVE_FREG
129
        stfd    _freg,(CYGARC_PPCREG_FREGS+_freg*8)(sp)
130
        .set    _freg, _freg+1
131
        .endr
132
#endif
133
 
134
        stw     r0,CYGARC_PPCREG_REGS+0*4(sp)  # R0
135
        stw     r5,CYGARC_PPCREG_REGS+1*4(sp)  # R5 = real SP, save in R1 slot
136
        stw     r2,CYGARC_PPCREG_REGS+2*4(sp)  # R2 = TOC
137
 
138
        # CR cannot be treated as a special register since GCC will only
139
        # do partial restore of CR at function exit, depending on which
140
        # of CR2, CR3, and CR4 have been used in the given function.
141
        mfcr    r5                      # save CR.
142
        stw     r5,CYGARC_PPCREG_CR(sp)
143
 
144
#ifdef CYGDBG_HAL_DEBUG_GDB_THREAD_SUPPORT
145
        # Make the thread context look like an exception context if thread-
146
        # aware debugging is required. This state does not need restoring.
147
        mflr    r5
148
        stw     r5,CYGARC_PPCREG_PC(sp) # pc of caller
149
#endif
150
 
151
        mfmsr   r5
152
        stw     r5,CYGARC_PPCREG_MSR(sp)# msr (or PS)
153
 
154
        save_special                    # save special regs
155
 
156
        mflr    r5                      # save LR == return link for this fn
157
        stw     r5,CYGARC_PPCREG_LR(sp)
158
 
159
        stw     sp,0(r4)                # save SP into save location
160
 
161
        # Now load the destination thread by dropping through
162
        # to hal_thread_load_context
163
 
164
#------------------------------------------------------------------------------
165
# hal_thread_load_context
166
# Load thread context
167
# R3 = address of sp of next thread to execute
168
# Note that this function is also the second half of hal_thread_switch_context
169
# and is simply dropped into from it.
170
 
171
FUNC_START(hal_thread_load_context)
172
 
173
        lwz     sp,0(r3)                # load state directly into SP
174
 
175
        load_special                    # load special registers
176
 
177
        lwz     r5,CYGARC_PPCREG_CR(sp) # restore CR
178
        mtcr    r5
179
 
180
        lwz     r5,CYGARC_PPCREG_LR(sp) # get LR as set as return link
181
        mtlr    r5
182
 
183
        # Load registers MIN..MAX
184
        .set    _reg,MIN_SAVE_REG
185
        .rept   MAX_SAVE_REG+1-MIN_SAVE_REG
186
        lwz     _reg,(CYGARC_PPCREG_REGS+_reg*4)(sp)
187
        .set    _reg,_reg+1
188
        .endr
189
 
190
#ifdef CYGHWR_HAL_POWERPC_FPU
191
        # Load floating registers MIN..MAX
192
        .set    _freg, MIN_CONTEXT_SAVE_FREG
193
        .rept   MAX_CONTEXT_SAVE_FREG+1-MIN_CONTEXT_SAVE_FREG
194
        lfd     _freg,(CYGARC_PPCREG_FREGS+_freg*8)(sp)
195
        .set    _freg,_freg+1
196
        .endr
197
#endif
198
 
199
        lwz     r3,CYGARC_PPCREG_MSR(sp)       # merge interrupt state
200
        hal_cpu_int_merge r3,r2
201
 
202
        lwz     r0,CYGARC_PPCREG_REGS+0*4(sp)  # R0
203
        lwz     r2,CYGARC_PPCREG_REGS+2*4(sp)  # R2 = TOC
204
        lwz     r3,CYGARC_PPCREG_REGS+3*4(sp)  # load r3
205
 
206
        lwz     sp,CYGARC_PPCREG_REGS+1*4(sp)  # finally restore true SP
207
 
208
        blr                             # jump to LR
209
 
210
#------------------------------------------------------------------------------
211
# HAL longjmp, setjmp implementations
212
# hal_setjmp saves only to callee save registers 13-31, r1[sp],r2, cr[2-4]
213
# and lr into buffer supplied in r3[arg0]
214
 
215
FUNC_START(hal_setjmp)
216
        mfcr    r5
217
        stw     r5, CYGARC_JMPBUF_CR(r3)
218
        mflr    r5
219
        stw     r5, CYGARC_JMPBUF_LR(r3)
220
        stw     r31,CYGARC_JMPBUF_R31(r3)
221
        stw     r30,CYGARC_JMPBUF_R30(r3)
222
        stw     r29,CYGARC_JMPBUF_R29(r3)
223
        stw     r28,CYGARC_JMPBUF_R28(r3)
224
        stw     r27,CYGARC_JMPBUF_R27(r3)
225
        stw     r26,CYGARC_JMPBUF_R26(r3)
226
        stw     r25,CYGARC_JMPBUF_R25(r3)
227
        stw     r24,CYGARC_JMPBUF_R24(r3)
228
        stw     r23,CYGARC_JMPBUF_R23(r3)
229
        stw     r22,CYGARC_JMPBUF_R22(r3)
230
        stw     r21,CYGARC_JMPBUF_R21(r3)
231
        stw     r20,CYGARC_JMPBUF_R20(r3)
232
        stw     r19,CYGARC_JMPBUF_R19(r3)
233
        stw     r18,CYGARC_JMPBUF_R18(r3)
234
        stw     r17,CYGARC_JMPBUF_R17(r3)
235
        stw     r16,CYGARC_JMPBUF_R16(r3)
236
        stw     r15,CYGARC_JMPBUF_R15(r3)
237
        stw     r14,CYGARC_JMPBUF_R14(r3)
238
        stw     r13,CYGARC_JMPBUF_R13(r3)
239
#ifdef CYGHWR_HAL_POWERPC_FPU
240
        stfd    f31,CYGARC_JMPBUF_F31(r3)
241
        stfd    f30,CYGARC_JMPBUF_F30(r3)
242
        stfd    f29,CYGARC_JMPBUF_F29(r3)
243
        stfd    f28,CYGARC_JMPBUF_F28(r3)
244
        stfd    f27,CYGARC_JMPBUF_F27(r3)
245
        stfd    f26,CYGARC_JMPBUF_F26(r3)
246
        stfd    f25,CYGARC_JMPBUF_F25(r3)
247
        stfd    f24,CYGARC_JMPBUF_F24(r3)
248
        stfd    f23,CYGARC_JMPBUF_F23(r3)
249
        stfd    f22,CYGARC_JMPBUF_F22(r3)
250
        stfd    f21,CYGARC_JMPBUF_F21(r3)
251
        stfd    f20,CYGARC_JMPBUF_F20(r3)
252
        stfd    f19,CYGARC_JMPBUF_F19(r3)
253
        stfd    f18,CYGARC_JMPBUF_F18(r3)
254
        stfd    f17,CYGARC_JMPBUF_F17(r3)
255
        stfd    f16,CYGARC_JMPBUF_F16(r3)
256
        stfd    f15,CYGARC_JMPBUF_F15(r3)
257
        stfd    f14,CYGARC_JMPBUF_F14(r3)
258
#endif
259
        stw     r2, CYGARC_JMPBUF_R2(r3)        # TOC, optimize out?
260
        stw     sp, CYGARC_JMPBUF_SP(r3)
261
        li      r3,0            # return 0
262
        blr
263
 
264
# hal_longjmp loads state from r3[arg0] and returns
265
# to the setjmp caller with r4[arg1] as return value
266
 
267
FUNC_START(hal_longjmp)
268
        lwz     r5,CYGARC_JMPBUF_CR(r3)
269
        mtcr    r5
270
        lwz     r5,CYGARC_JMPBUF_LR(r3)
271
        mtlr    r5
272
        lwz     r31,CYGARC_JMPBUF_R31(r3)
273
        lwz     r30,CYGARC_JMPBUF_R30(r3)
274
        lwz     r29,CYGARC_JMPBUF_R29(r3)
275
        lwz     r28,CYGARC_JMPBUF_R28(r3)
276
        lwz     r27,CYGARC_JMPBUF_R27(r3)
277
        lwz     r26,CYGARC_JMPBUF_R26(r3)
278
        lwz     r25,CYGARC_JMPBUF_R25(r3)
279
        lwz     r24,CYGARC_JMPBUF_R24(r3)
280
        lwz     r23,CYGARC_JMPBUF_R23(r3)
281
        lwz     r22,CYGARC_JMPBUF_R22(r3)
282
        lwz     r21,CYGARC_JMPBUF_R21(r3)
283
        lwz     r20,CYGARC_JMPBUF_R20(r3)
284
        lwz     r19,CYGARC_JMPBUF_R19(r3)
285
        lwz     r18,CYGARC_JMPBUF_R18(r3)
286
        lwz     r17,CYGARC_JMPBUF_R17(r3)
287
        lwz     r16,CYGARC_JMPBUF_R16(r3)
288
        lwz     r15,CYGARC_JMPBUF_R15(r3)
289
        lwz     r14,CYGARC_JMPBUF_R14(r3)
290
        lwz     r13,CYGARC_JMPBUF_R13(r3)
291
#ifdef CYGHWR_HAL_POWERPC_FPU
292
        lfd     f31,CYGARC_JMPBUF_F31(r3)
293
        lfd     f30,CYGARC_JMPBUF_F30(r3)
294
        lfd     f29,CYGARC_JMPBUF_F29(r3)
295
        lfd     f28,CYGARC_JMPBUF_F28(r3)
296
        lfd     f27,CYGARC_JMPBUF_F27(r3)
297
        lfd     f26,CYGARC_JMPBUF_F26(r3)
298
        lfd     f25,CYGARC_JMPBUF_F25(r3)
299
        lfd     f24,CYGARC_JMPBUF_F24(r3)
300
        lfd     f23,CYGARC_JMPBUF_F23(r3)
301
        lfd     f22,CYGARC_JMPBUF_F22(r3)
302
        lfd     f21,CYGARC_JMPBUF_F21(r3)
303
        lfd     f20,CYGARC_JMPBUF_F20(r3)
304
        lfd     f19,CYGARC_JMPBUF_F19(r3)
305
        lfd     f18,CYGARC_JMPBUF_F18(r3)
306
        lfd     f17,CYGARC_JMPBUF_F17(r3)
307
        lfd     f16,CYGARC_JMPBUF_F16(r3)
308
        lfd     f15,CYGARC_JMPBUF_F15(r3)
309
        lfd     f14,CYGARC_JMPBUF_F14(r3)
310
#endif
311
        lwz     r2, CYGARC_JMPBUF_R2(r3)
312
        lwz     sp, CYGARC_JMPBUF_SP(r3)
313
        mr      r3,r4           # return r4[arg1]
314
        blr
315
 
316
#------------------------------------------------------------------------------
317
# end of context.S

powered by: WebSVN 2.1.0

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