Mercurial > ecos-v2_0-branch
comparison packages/hal/mips/arch/current/src/context.S @ 0:3111d98ba7b3 ecos-v1_1-release
Initial commit of eCos version 1.1
| author | jlarmour |
|---|---|
| date | Tue, 11 May 1999 11:16:07 +0000 |
| parents | |
| children | 443894e2e912 |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:3111d98ba7b3 |
|---|---|
| 1 ##=============================================================================## | |
| 2 ## context.S | |
| 3 ## | |
| 4 ## MIPS context switch code | |
| 5 ## | |
| 6 ##============================================================================= | |
| 7 #####COPYRIGHTBEGIN#### | |
| 8 # | |
| 9 # ------------------------------------------- | |
| 10 # The contents of this file are subject to the Cygnus eCos Public License | |
| 11 # Version 1.0 (the "License"); you may not use this file except in | |
| 12 # compliance with the License. You may obtain a copy of the License at | |
| 13 # http://sourceware.cygnus.com/ecos | |
| 14 # | |
| 15 # Software distributed under the License is distributed on an "AS IS" | |
| 16 # basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the | |
| 17 # License for the specific language governing rights and limitations under | |
| 18 # the License. | |
| 19 # | |
| 20 # The Original Code is eCos - Embedded Cygnus Operating System, released | |
| 21 # September 30, 1998. | |
| 22 # | |
| 23 # The Initial Developer of the Original Code is Cygnus. Portions created | |
| 24 # by Cygnus are Copyright (C) 1998 Cygnus Solutions. All Rights Reserved. | |
| 25 # ------------------------------------------- | |
| 26 # | |
| 27 #####COPYRIGHTEND#### | |
| 28 ##============================================================================= | |
| 29 #######DESCRIPTIONBEGIN#### | |
| 30 ## | |
| 31 ## Author(s): nickg | |
| 32 ## Contributors: nickg | |
| 33 ## Date: 1998-04-27 | |
| 34 ## Purpose: MIPS context switch code | |
| 35 ## Description: This file contains implementations of the thread context | |
| 36 ## switch routines. It also contains the longjmp() and setjmp() | |
| 37 ## routines. | |
| 38 ## | |
| 39 ######DESCRIPTIONEND#### | |
| 40 ## | |
| 41 ##============================================================================= | |
| 42 | |
| 43 #include <pkgconf/hal.h> | |
| 44 | |
| 45 #include <cyg/hal/mips.inc> | |
| 46 | |
| 47 .set noat | |
| 48 | |
| 49 #------------------------------------------------------------------------------ | |
| 50 # hal_thread_switch_context | |
| 51 # Switch thread contexts | |
| 52 # A0 = address of sp of next thread to execute | |
| 53 # A1 = address of sp save location of current thread | |
| 54 | |
| 55 .global hal_thread_switch_context | |
| 56 hal_thread_switch_context: | |
| 57 | |
| 58 addi sp,sp,-mipsreg_size # space for registers | |
| 59 | |
| 60 # store GPRs | |
| 61 #ifndef CYGDBG_HAL_COMMON_CONTEXT_SAVE_MINIMUM | |
| 62 sw $0,(mipsreg_regs+0*4)(sp) | |
| 63 sw $1,(mipsreg_regs+1*4)(sp) | |
| 64 sw $2,(mipsreg_regs+2*4)(sp) | |
| 65 sw $3,(mipsreg_regs+3*4)(sp) | |
| 66 sw $4,(mipsreg_regs+4*4)(sp) | |
| 67 sw $5,(mipsreg_regs+5*4)(sp) | |
| 68 sw $6,(mipsreg_regs+6*4)(sp) | |
| 69 sw $7,(mipsreg_regs+7*4)(sp) | |
| 70 sw $8,(mipsreg_regs+8*4)(sp) | |
| 71 sw $9,(mipsreg_regs+9*4)(sp) | |
| 72 sw $10,(mipsreg_regs+10*4)(sp) | |
| 73 sw $11,(mipsreg_regs+11*4)(sp) | |
| 74 sw $12,(mipsreg_regs+12*4)(sp) | |
| 75 sw $13,(mipsreg_regs+13*4)(sp) | |
| 76 sw $14,(mipsreg_regs+14*4)(sp) | |
| 77 sw $15,(mipsreg_regs+15*4)(sp) | |
| 78 sw $24,(mipsreg_regs+24*4)(sp) | |
| 79 sw $25,(mipsreg_regs+25*4)(sp) | |
| 80 sw $28,(mipsreg_regs+28*4)(sp) # == GP | |
| 81 #endif | |
| 82 sw $16,(mipsreg_regs+16*4)(sp) | |
| 83 sw $17,(mipsreg_regs+17*4)(sp) | |
| 84 sw $18,(mipsreg_regs+18*4)(sp) | |
| 85 sw $19,(mipsreg_regs+19*4)(sp) | |
| 86 sw $20,(mipsreg_regs+20*4)(sp) | |
| 87 sw $21,(mipsreg_regs+21*4)(sp) | |
| 88 sw $22,(mipsreg_regs+22*4)(sp) | |
| 89 sw $23,(mipsreg_regs+23*4)(sp) | |
| 90 # sw $26,(mipsreg_regs+26*4)(sp) # == K0 | |
| 91 # sw $27,(mipsreg_regs+27*4)(sp) # == K1 | |
| 92 # sw $29,(mipsreg_regs+29*4)(sp) # == SP | |
| 93 sw $30,(mipsreg_regs+30*4)(sp) # == FP | |
| 94 sw $31,(mipsreg_regs+31*4)(sp) # == RA | |
| 95 sw $31,(mipsreg_pc)(sp) # == PC (to help with debugging) | |
| 96 | |
| 97 #ifndef CYGDBG_HAL_COMMON_CONTEXT_SAVE_MINIMUM | |
| 98 | |
| 99 mflo t0 # save LO and HI regs | |
| 100 mfhi t1 | |
| 101 sw t0,mipsreg_lo(sp) | |
| 102 sw t1,mipsreg_hi(sp) | |
| 103 | |
| 104 #endif | |
| 105 | |
| 106 addi t0,sp,mipsreg_size # save SP in reg dump | |
| 107 sw t0,(mipsreg_regs+29*4)(sp) | |
| 108 | |
| 109 sw sp,0(a1) # save sp in save loc | |
| 110 | |
| 111 # Now load the destination thread by dropping through | |
| 112 # to hal_thread_load_context | |
| 113 | |
| 114 #------------------------------------------------------------------------------ | |
| 115 # hal_thread_load_context | |
| 116 # Load thread context | |
| 117 # A0 = address of sp of next thread to execute | |
| 118 # Note that this function is also the second half of hal_thread_switch_context | |
| 119 # and is simply dropped into from it. | |
| 120 | |
| 121 .global hal_thread_load_context | |
| 122 hal_thread_load_context: | |
| 123 | |
| 124 lw sp,0(a0) # load new SP directly | |
| 125 | |
| 126 #ifndef CYGDBG_HAL_COMMON_CONTEXT_SAVE_MINIMUM | |
| 127 | |
| 128 lw t0,mipsreg_hi(sp) # load HI and LO regs | |
| 129 lw t1,mipsreg_lo(sp) | |
| 130 mthi t0 | |
| 131 mtlo t1 | |
| 132 | |
| 133 #endif | |
| 134 | |
| 135 # load GPRs | |
| 136 # lw $0,(mipsreg_regs+0*4)(sp) | |
| 137 lw $4,(mipsreg_regs+4*4)(sp) # A0, must load for thread startup | |
| 138 #ifndef CYGDBG_HAL_COMMON_CONTEXT_SAVE_MINIMUM | |
| 139 lw $1,(mipsreg_regs+1*4)(sp) | |
| 140 lw $2,(mipsreg_regs+2*4)(sp) | |
| 141 lw $3,(mipsreg_regs+3*4)(sp) | |
| 142 lw $5,(mipsreg_regs+5*4)(sp) | |
| 143 lw $6,(mipsreg_regs+6*4)(sp) | |
| 144 lw $7,(mipsreg_regs+7*4)(sp) | |
| 145 lw $8,(mipsreg_regs+8*4)(sp) | |
| 146 lw $9,(mipsreg_regs+9*4)(sp) | |
| 147 lw $10,(mipsreg_regs+10*4)(sp) | |
| 148 lw $11,(mipsreg_regs+11*4)(sp) | |
| 149 lw $12,(mipsreg_regs+12*4)(sp) | |
| 150 lw $13,(mipsreg_regs+13*4)(sp) | |
| 151 lw $14,(mipsreg_regs+14*4)(sp) | |
| 152 lw $15,(mipsreg_regs+15*4)(sp) | |
| 153 lw $24,(mipsreg_regs+24*4)(sp) | |
| 154 lw $25,(mipsreg_regs+25*4)(sp) | |
| 155 #endif | |
| 156 lw $16,(mipsreg_regs+16*4)(sp) | |
| 157 lw $17,(mipsreg_regs+17*4)(sp) | |
| 158 lw $18,(mipsreg_regs+18*4)(sp) | |
| 159 lw $19,(mipsreg_regs+19*4)(sp) | |
| 160 lw $20,(mipsreg_regs+20*4)(sp) | |
| 161 lw $21,(mipsreg_regs+21*4)(sp) | |
| 162 lw $22,(mipsreg_regs+22*4)(sp) | |
| 163 lw $23,(mipsreg_regs+23*4)(sp) | |
| 164 # lw $26,(mipsreg_regs+26*4)(sp) # == K0 | |
| 165 # lw $27,(mipsreg_regs+27*4)(sp) # == K1 | |
| 166 # lw $28,(mipsreg_regs+28*4)(sp) # == GP | |
| 167 # lw $29,(mipsreg_regs+29*4)(sp) # == SP | |
| 168 lw $30,(mipsreg_regs+30*4)(sp) # == FP | |
| 169 lw $31,(mipsreg_regs+31*4)(sp) # == RA | |
| 170 | |
| 171 # Note that the following lw must go here and not | |
| 172 # in the jr delay slot, since it has a delay slot | |
| 173 # of its own. | |
| 174 lw sp,(mipsreg_regs+29*4)(sp) # load SP | |
| 175 jr ra # return via ra | |
| 176 nop # delay slot - must be nop | |
| 177 | |
| 178 #------------------------------------------------------------------------------ | |
| 179 # HAL longjmp, setjmp implementations | |
| 180 # hal_setjmp saves only to callee save registers 13-31, r1[sp],r2 | |
| 181 # and lr into buffer supplied in r3[arg0] | |
| 182 | |
| 183 .globl hal_setjmp | |
| 184 .ent hal_setjmp | |
| 185 hal_setjmp: | |
| 186 sw $31,44(a0) # ra (link) | |
| 187 sw $30,40(a0) | |
| 188 sw $28,36(a0) # gp, optimize out? | |
| 189 sw $23,32(a0) | |
| 190 sw $22,28(a0) | |
| 191 sw $21,24(a0) | |
| 192 sw $20,20(a0) | |
| 193 sw $19,16(a0) | |
| 194 sw $18,12(a0) | |
| 195 sw $17,8(a0) | |
| 196 sw $16,4(a0) | |
| 197 sw sp,0(a0) # $29 | |
| 198 li v0,0 | |
| 199 jr ra | |
| 200 nop # delay slot | |
| 201 .end hal_setjmp | |
| 202 | |
| 203 .globl hal_longjmp | |
| 204 .ent hal_longjmp | |
| 205 hal_longjmp: | |
| 206 lw $31,44(a0) # ra (link) | |
| 207 lw $30,40(a0) | |
| 208 lw $28,36(a0) # gp, optimize out? | |
| 209 lw $23,32(a0) | |
| 210 lw $22,28(a0) | |
| 211 lw $21,24(a0) | |
| 212 lw $20,20(a0) | |
| 213 lw $19,16(a0) | |
| 214 lw $18,12(a0) | |
| 215 lw $17,8(a0) | |
| 216 lw $16,4(a0) | |
| 217 lw sp,0(a0) # $29 | |
| 218 move v0,a1 | |
| 219 jr ra | |
| 220 nop # delay slot | |
| 221 .end hal_longjmp | |
| 222 | |
| 223 | |
| 224 #------------------------------------------------------------------------------ | |
| 225 # end of context.S | |
| 226 | |
| 227 |
