Mercurial > ecos-v3_0-branch
annotate packages/hal/powerpc/arch/current/src/context.S @ 66:bf00f99aec69 ecos-sw-2000-02-02
Merge from eCos master repository on 2000-02-02-19:16:44-GMT
| author | jlarmour |
|---|---|
| date | Wed, 02 Feb 2000 19:57:02 +0000 |
| parents | c38311975d4f |
| children | 435cced73e2f |
| rev | line source |
|---|---|
| 0 | 1 ##============================================================================= |
| 2 ## | |
| 3 ## context.S | |
| 4 ## | |
| 5 ## PowerPC context switch code | |
| 6 ## | |
| 7 ##============================================================================= | |
| 8 #####COPYRIGHTBEGIN#### | |
|
64
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
2
diff
changeset
|
9 # |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
2
diff
changeset
|
10 # ------------------------------------------- |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
2
diff
changeset
|
11 # The contents of this file are subject to the Red Hat eCos Public License |
|
66
bf00f99aec69
Merge from eCos master repository on 2000-02-02-19:16:44-GMT
jlarmour
parents:
64
diff
changeset
|
12 # Version 1.1 (the "License"); you may not use this file except in |
|
64
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
2
diff
changeset
|
13 # compliance with the License. You may obtain a copy of the License at |
|
66
bf00f99aec69
Merge from eCos master repository on 2000-02-02-19:16:44-GMT
jlarmour
parents:
64
diff
changeset
|
14 # http://www.redhat.com/ |
|
64
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
2
diff
changeset
|
15 # |
|
66
bf00f99aec69
Merge from eCos master repository on 2000-02-02-19:16:44-GMT
jlarmour
parents:
64
diff
changeset
|
16 # Software distributed under the License is distributed on an "AS IS" |
|
64
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
2
diff
changeset
|
17 # basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
2
diff
changeset
|
18 # License for the specific language governing rights and limitations under |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
2
diff
changeset
|
19 # the License. |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
2
diff
changeset
|
20 # |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
2
diff
changeset
|
21 # The Original Code is eCos - Embedded Configurable Operating System, |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
2
diff
changeset
|
22 # released September 30, 1998. |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
2
diff
changeset
|
23 # |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
2
diff
changeset
|
24 # The Initial Developer of the Original Code is Red Hat. |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
2
diff
changeset
|
25 # Portions created by Red Hat are |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
2
diff
changeset
|
26 # Copyright (C) 1998, 1999, 2000 Red Hat, Inc. |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
2
diff
changeset
|
27 # All Rights Reserved. |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
2
diff
changeset
|
28 # ------------------------------------------- |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
2
diff
changeset
|
29 # |
| 0 | 30 #####COPYRIGHTEND#### |
| 31 ##============================================================================= | |
| 32 #######DESCRIPTIONBEGIN#### | |
| 33 ## | |
| 34 ## Author(s): nickg | |
| 35 ## Contributors: nickg | |
| 36 ## Date: 1998-04-27 | |
| 37 ## Purpose: PowerPC context switch code | |
| 38 ## Description: This file contains implementations of the thread context | |
| 39 ## switch routines. It also contains the longjmp() and setjmp() | |
| 40 ## routines. | |
| 41 ## | |
| 42 ######DESCRIPTIONEND#### | |
| 43 ## | |
| 44 ##============================================================================= | |
| 45 | |
| 46 #include <pkgconf/hal.h> | |
| 47 | |
| 48 #include "cyg/hal/ppc.inc" | |
| 49 | |
| 50 #------------------------------------------------------------------------------ | |
| 51 # function declaration macro | |
| 52 | |
| 53 #define FUNC_START(name) \ | |
| 54 .type name,@function; \ | |
| 55 .globl name; \ | |
| 56 name: | |
| 57 | |
| 58 #------------------------------------------------------------------------------ | |
| 59 # Configure to use either a minimal or maximal thread state | |
| 60 | |
| 61 #ifdef CYGDBG_HAL_COMMON_CONTEXT_SAVE_MINIMUM | |
| 62 | |
| 63 #define MIN_SAVE_REG 13 | |
| 64 #define MAX_SAVE_REG 31 | |
| 65 | |
| 66 .macro save_special | |
| 67 .endm | |
| 68 | |
| 69 .macro load_special | |
| 70 .endm | |
| 71 #else | |
| 72 | |
| 73 #define MIN_SAVE_REG 6 | |
| 74 #define MAX_SAVE_REG 31 | |
| 75 | |
| 76 .macro save_special | |
| 77 mfxer r6 | |
| 78 mfctr r7 | |
| 79 stw r6,ppcreg_xer(sp) | |
| 80 stw r7,ppcreg_ctr(sp) | |
| 81 .endm | |
| 82 | |
| 83 .macro load_special | |
| 84 lwz r6,ppcreg_xer(sp) | |
| 85 lwz r7,ppcreg_ctr(sp) | |
| 86 mtxer r6 | |
| 87 mtctr r7 | |
| 88 .endm | |
| 89 | |
| 90 #endif | |
| 91 | |
| 92 #------------------------------------------------------------------------------ | |
| 93 # hal_thread_switch_context | |
| 94 # Switch thread contexts | |
| 95 # R3 = address of sp of next thread to execute | |
| 96 # R4 = address of sp save location of current thread | |
| 97 | |
| 98 | |
| 99 FUNC_START(hal_thread_switch_context) | |
| 100 mr r5,sp # R5 = saved stack pointer | |
| 101 subi sp,sp,ppcreg_context_size # space for state | |
| 102 | |
| 103 # Save registers MIN..MAX | |
| 104 .set _reg,MIN_SAVE_REG | |
| 105 .rept MAX_SAVE_REG+1-MIN_SAVE_REG | |
| 106 stw _reg,(ppcreg_regs+_reg*4)(sp) | |
| 107 .set _reg,_reg+1 | |
| 108 .endr | |
| 109 | |
| 2 | 110 stw r0,ppcreg_regs+0*4(sp) # R0 |
| 111 stw r5,ppcreg_regs+1*4(sp) # R5 = real SP, save in R1 slot | |
| 112 stw r2,ppcreg_regs+2*4(sp) # R2 = TOC | |
| 0 | 113 |
| 114 # CR cannot be treated as a special register since GCC will only | |
| 115 # do partial restore of CR at function exit, depending on which | |
| 116 # of CR2, CR3, and CR4 have been used in the given function. | |
| 117 mfcr r5 # save CR. | |
| 118 stw r5,ppcreg_cr(sp) | |
| 2 | 119 |
| 120 #ifdef CYGDBG_HAL_DEBUG_GDB_THREAD_SUPPORT | |
| 121 # Make the thread context look like an exception context if thread- | |
| 122 # aware debugging is required. This state does not need restoring. | |
| 123 mflr r5 | |
| 124 stw r5,ppcreg_pc(sp) # pc of caller | |
| 125 mfmsr r5 | |
| 126 stw r5,ppcreg_msr(sp) # msr (or PS) | |
| 127 #endif | |
| 128 | |
| 0 | 129 save_special # save special regs |
| 130 | |
| 131 mflr r5 # save LR == return link for this fn | |
| 132 stw r5,ppcreg_lr(sp) | |
| 133 | |
| 134 stw sp,0(r4) # save SP into save location | |
| 135 | |
| 136 # Now load the destination thread by dropping through | |
| 137 # to hal_thread_load_context | |
| 138 | |
| 139 #------------------------------------------------------------------------------ | |
| 140 # hal_thread_load_context | |
| 141 # Load thread context | |
| 142 # R3 = address of sp of next thread to execute | |
| 143 # Note that this function is also the second half of hal_thread_switch_context | |
| 144 # and is simply dropped into from it. | |
| 145 | |
| 146 FUNC_START(hal_thread_load_context) | |
| 147 | |
| 148 lwz sp,0(r3) # load state directly into SP | |
| 149 | |
| 150 load_special # load special registers | |
| 151 | |
| 152 lwz r5,ppcreg_cr(sp) # restore CR | |
| 153 mtcr r5 | |
| 154 | |
| 155 lwz r5,ppcreg_lr(sp) # get LR as set as return link | |
| 156 mtlr r5 | |
| 157 | |
| 158 # Load registers MIN..MAX | |
| 159 .set _reg,MIN_SAVE_REG | |
| 160 .rept MAX_SAVE_REG+1-MIN_SAVE_REG | |
| 161 lwz _reg,(ppcreg_regs+_reg*4)(sp) | |
| 162 .set _reg,_reg+1 | |
| 163 .endr | |
| 164 | |
| 2 | 165 lwz r0,ppcreg_regs+0*4(sp) # R0 |
| 166 lwz r2,ppcreg_regs+2*4(sp) # R2 = TOC | |
| 167 lwz r3,ppcreg_regs+3*4(sp) # load r3 | |
| 0 | 168 |
| 2 | 169 lwz sp,ppcreg_regs+1*4(sp) # finally restore true SP |
| 0 | 170 |
| 171 blr # jump to LR | |
| 172 | |
| 173 #------------------------------------------------------------------------------ | |
| 174 # HAL longjmp, setjmp implementations | |
| 175 # hal_setjmp saves only to callee save registers 13-31, r1[sp],r2, cr[2-4] | |
| 176 # and lr into buffer supplied in r3[arg0] | |
| 2 | 177 # Note: These definitions are repeated in hal_arch.h. If changes are required |
| 178 # remember to update both sets. | |
| 179 | |
| 180 #define CYGARC_JMP_BUF_SP 0 | |
| 181 #define CYGARC_JMP_BUF_R2 1 | |
| 182 #define CYGARC_JMP_BUF_R13 2 | |
| 183 #define CYGARC_JMP_BUF_R14 3 | |
| 184 #define CYGARC_JMP_BUF_R15 4 | |
| 185 #define CYGARC_JMP_BUF_R16 5 | |
| 186 #define CYGARC_JMP_BUF_R17 6 | |
| 187 #define CYGARC_JMP_BUF_R18 7 | |
| 188 #define CYGARC_JMP_BUF_R19 8 | |
| 189 #define CYGARC_JMP_BUF_R20 9 | |
| 190 #define CYGARC_JMP_BUF_R21 10 | |
| 191 #define CYGARC_JMP_BUF_R22 11 | |
| 192 #define CYGARC_JMP_BUF_R23 12 | |
| 193 #define CYGARC_JMP_BUF_R24 13 | |
| 194 #define CYGARC_JMP_BUF_R25 14 | |
| 195 #define CYGARC_JMP_BUF_R26 15 | |
| 196 #define CYGARC_JMP_BUF_R27 16 | |
| 197 #define CYGARC_JMP_BUF_R28 17 | |
| 198 #define CYGARC_JMP_BUF_R29 18 | |
| 199 #define CYGARC_JMP_BUF_R30 19 | |
| 200 #define CYGARC_JMP_BUF_R31 20 | |
| 201 #define CYGARC_JMP_BUF_LR 21 | |
| 202 #define CYGARC_JMP_BUF_CR 22 | |
| 203 | |
| 204 #define CYGARC_JMP_BUF_SIZE 23 | |
| 0 | 205 |
| 206 FUNC_START(hal_setjmp) | |
| 207 mfcr r5 | |
| 2 | 208 stw r5, CYGARC_JMP_BUF_CR*4(r3) |
| 0 | 209 mflr r5 |
| 2 | 210 stw r5, CYGARC_JMP_BUF_LR*4(r3) |
| 211 stw r31,CYGARC_JMP_BUF_R31*4(r3) | |
| 212 stw r30,CYGARC_JMP_BUF_R30*4(r3) | |
| 213 stw r29,CYGARC_JMP_BUF_R29*4(r3) | |
| 214 stw r28,CYGARC_JMP_BUF_R28*4(r3) | |
| 215 stw r27,CYGARC_JMP_BUF_R27*4(r3) | |
| 216 stw r26,CYGARC_JMP_BUF_R26*4(r3) | |
| 217 stw r25,CYGARC_JMP_BUF_R25*4(r3) | |
| 218 stw r24,CYGARC_JMP_BUF_R24*4(r3) | |
| 219 stw r23,CYGARC_JMP_BUF_R23*4(r3) | |
| 220 stw r22,CYGARC_JMP_BUF_R22*4(r3) | |
| 221 stw r21,CYGARC_JMP_BUF_R21*4(r3) | |
| 222 stw r20,CYGARC_JMP_BUF_R20*4(r3) | |
| 223 stw r19,CYGARC_JMP_BUF_R19*4(r3) | |
| 224 stw r18,CYGARC_JMP_BUF_R18*4(r3) | |
| 225 stw r17,CYGARC_JMP_BUF_R17*4(r3) | |
| 226 stw r16,CYGARC_JMP_BUF_R16*4(r3) | |
| 227 stw r15,CYGARC_JMP_BUF_R15*4(r3) | |
| 228 stw r14,CYGARC_JMP_BUF_R14*4(r3) | |
| 229 stw r13,CYGARC_JMP_BUF_R13*4(r3) | |
| 230 stw r2, CYGARC_JMP_BUF_R2*4(r3) # TOC, optimize out? | |
| 231 stw sp, CYGARC_JMP_BUF_SP*4(r3) | |
| 0 | 232 li r3,0 # return 0 |
| 233 blr | |
| 234 | |
| 235 # hal_longjmp loads state from r3[arg0] and returns | |
| 236 # and lr into buffer supplied in r3[arg0] | |
| 2 | 237 |
| 0 | 238 FUNC_START(hal_longjmp) |
| 2 | 239 lwz r5,CYGARC_JMP_BUF_CR*4(r3) |
| 0 | 240 mtcr r5 |
| 2 | 241 lwz r5,CYGARC_JMP_BUF_LR*4(r3) |
| 0 | 242 mtlr r5 |
| 2 | 243 lwz r31,CYGARC_JMP_BUF_R31*4(r3) |
| 244 lwz r30,CYGARC_JMP_BUF_R30*4(r3) | |
| 245 lwz r29,CYGARC_JMP_BUF_R29*4(r3) | |
| 246 lwz r28,CYGARC_JMP_BUF_R28*4(r3) | |
| 247 lwz r27,CYGARC_JMP_BUF_R27*4(r3) | |
| 248 lwz r26,CYGARC_JMP_BUF_R26*4(r3) | |
| 249 lwz r25,CYGARC_JMP_BUF_R25*4(r3) | |
| 250 lwz r24,CYGARC_JMP_BUF_R24*4(r3) | |
| 251 lwz r23,CYGARC_JMP_BUF_R23*4(r3) | |
| 252 lwz r22,CYGARC_JMP_BUF_R22*4(r3) | |
| 253 lwz r21,CYGARC_JMP_BUF_R21*4(r3) | |
| 254 lwz r20,CYGARC_JMP_BUF_R20*4(r3) | |
| 255 lwz r19,CYGARC_JMP_BUF_R19*4(r3) | |
| 256 lwz r18,CYGARC_JMP_BUF_R18*4(r3) | |
| 257 lwz r17,CYGARC_JMP_BUF_R17*4(r3) | |
| 258 lwz r16,CYGARC_JMP_BUF_R16*4(r3) | |
| 259 lwz r15,CYGARC_JMP_BUF_R15*4(r3) | |
| 260 lwz r14,CYGARC_JMP_BUF_R14*4(r3) | |
| 261 lwz r13,CYGARC_JMP_BUF_R13*4(r3) | |
| 262 lwz r2, CYGARC_JMP_BUF_R2*4(r3) | |
| 263 lwz sp, CYGARC_JMP_BUF_SP*4(r3) | |
| 0 | 264 mr r3,r4 # return r4[arg1] |
| 265 blr | |
| 266 | |
| 267 #------------------------------------------------------------------------------ | |
| 268 # end of context.S |
