[86d05fae] | 1 | #
|
---|
[df4ed85] | 2 | # Copyright (c) 2005 Jakub Jermar
|
---|
[86d05fae] | 3 | # All rights reserved.
|
---|
| 4 | #
|
---|
| 5 | # Redistribution and use in source and binary forms, with or without
|
---|
| 6 | # modification, are permitted provided that the following conditions
|
---|
| 7 | # are met:
|
---|
| 8 | #
|
---|
| 9 | # - Redistributions of source code must retain the above copyright
|
---|
| 10 | # notice, this list of conditions and the following disclaimer.
|
---|
| 11 | # - Redistributions in binary form must reproduce the above copyright
|
---|
| 12 | # notice, this list of conditions and the following disclaimer in the
|
---|
| 13 | # documentation and/or other materials provided with the distribution.
|
---|
| 14 | # - The name of the author may not be used to endorse or promote products
|
---|
| 15 | # derived from this software without specific prior written permission.
|
---|
| 16 | #
|
---|
| 17 | # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
---|
| 18 | # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
---|
| 19 | # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
---|
| 20 | # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
---|
| 21 | # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
---|
| 22 | # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
---|
| 23 | # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
---|
| 24 | # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
---|
| 25 | # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
---|
| 26 | # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
---|
| 27 | #
|
---|
| 28 |
|
---|
[27f67f5] | 29 | #include <abi/asmtool.h>
|
---|
[7947c34] | 30 | #include <libarch/fibril_context.h>
|
---|
| 31 |
|
---|
[86d05fae] | 32 | .text
|
---|
| 33 |
|
---|
[b4f1171] | 34 | FUNCTION_BEGIN(__context_save)
|
---|
[7947c34] | 35 | alloc loc0 = ar.pfs, 1, 49, 0, 0
|
---|
| 36 | mov loc1 = ar.unat ;;
|
---|
[86d05fae] | 37 | mov loc3 = ar.rsc
|
---|
| 38 |
|
---|
| 39 | .auto
|
---|
| 40 |
|
---|
| 41 | /*
|
---|
| 42 | * Flush dirty registers to backing store.
|
---|
| 43 | * After this ar.bsp and ar.bspstore are equal.
|
---|
| 44 | */
|
---|
| 45 | flushrs
|
---|
[1b20da0] | 46 | mov loc4 = ar.bsp
|
---|
[a35b458] | 47 |
|
---|
[86d05fae] | 48 | /*
|
---|
| 49 | * Put RSE to enforced lazy mode.
|
---|
| 50 | * So that ar.rnat can be read.
|
---|
| 51 | */
|
---|
| 52 | and loc5 = ~3, loc3
|
---|
| 53 | mov ar.rsc = loc5
|
---|
| 54 | mov loc5 = ar.rnat
|
---|
| 55 |
|
---|
| 56 | .explicit
|
---|
| 57 |
|
---|
| 58 | mov loc6 = ar.lc
|
---|
[7947c34] | 59 |
|
---|
[a5c78a18] | 60 | add loc8 = __CONTEXT_OFFSET_AR_PFS, in0
|
---|
| 61 | add loc9 = __CONTEXT_OFFSET_AR_UNAT_CALLER, in0
|
---|
| 62 | add loc10 = __CONTEXT_OFFSET_AR_UNAT_CALLEE, in0
|
---|
| 63 | add loc11 = __CONTEXT_OFFSET_AR_RSC, in0
|
---|
| 64 | add loc12 = __CONTEXT_OFFSET_BSP, in0
|
---|
| 65 | add loc13 = __CONTEXT_OFFSET_AR_RNAT, in0
|
---|
| 66 | add loc14 = __CONTEXT_OFFSET_AR_LC, in0
|
---|
| 67 |
|
---|
| 68 | add loc15 = __CONTEXT_OFFSET_R1, in0
|
---|
| 69 | add loc16 = __CONTEXT_OFFSET_R4, in0
|
---|
| 70 | add loc17 = __CONTEXT_OFFSET_R5, in0
|
---|
| 71 | add loc18 = __CONTEXT_OFFSET_R6, in0
|
---|
| 72 | add loc19 = __CONTEXT_OFFSET_R7, in0
|
---|
| 73 | add loc20 = __CONTEXT_OFFSET_SP, in0
|
---|
| 74 | add loc21 = __CONTEXT_OFFSET_TP, in0
|
---|
| 75 |
|
---|
| 76 | add loc22 = __CONTEXT_OFFSET_PC, in0
|
---|
| 77 | add loc23 = __CONTEXT_OFFSET_B1, in0
|
---|
| 78 | add loc24 = __CONTEXT_OFFSET_B2, in0
|
---|
| 79 | add loc25 = __CONTEXT_OFFSET_B3, in0
|
---|
| 80 | add loc26 = __CONTEXT_OFFSET_B4, in0
|
---|
| 81 | add loc27 = __CONTEXT_OFFSET_B5, in0
|
---|
| 82 |
|
---|
| 83 | add loc28 = __CONTEXT_OFFSET_PR, in0
|
---|
| 84 |
|
---|
| 85 | add loc29 = __CONTEXT_OFFSET_F2, in0
|
---|
| 86 | add loc30 = __CONTEXT_OFFSET_F3, in0
|
---|
| 87 | add loc31 = __CONTEXT_OFFSET_F4, in0
|
---|
| 88 | add loc32 = __CONTEXT_OFFSET_F5, in0
|
---|
| 89 |
|
---|
| 90 | add loc33 = __CONTEXT_OFFSET_F16, in0
|
---|
| 91 | add loc34 = __CONTEXT_OFFSET_F17, in0
|
---|
| 92 | add loc35 = __CONTEXT_OFFSET_F18, in0
|
---|
| 93 | add loc36 = __CONTEXT_OFFSET_F19, in0
|
---|
| 94 | add loc37 = __CONTEXT_OFFSET_F20, in0
|
---|
| 95 | add loc38 = __CONTEXT_OFFSET_F21, in0
|
---|
| 96 | add loc39 = __CONTEXT_OFFSET_F22, in0
|
---|
| 97 | add loc40 = __CONTEXT_OFFSET_F23, in0
|
---|
| 98 | add loc41 = __CONTEXT_OFFSET_F24, in0
|
---|
| 99 | add loc42 = __CONTEXT_OFFSET_F25, in0
|
---|
| 100 | add loc43 = __CONTEXT_OFFSET_F26, in0
|
---|
| 101 | add loc44 = __CONTEXT_OFFSET_F27, in0
|
---|
| 102 | add loc45 = __CONTEXT_OFFSET_F28, in0
|
---|
| 103 | add loc46 = __CONTEXT_OFFSET_F29, in0
|
---|
| 104 | add loc47 = __CONTEXT_OFFSET_F30, in0
|
---|
| 105 | add loc48 = __CONTEXT_OFFSET_F31, in0 ;;
|
---|
[7947c34] | 106 |
|
---|
[86d05fae] | 107 | /*
|
---|
[7947c34] | 108 | * Save general registers including NaT bits
|
---|
[86d05fae] | 109 | */
|
---|
[7947c34] | 110 | st8.spill [loc15] = r1 ;;
|
---|
| 111 | st8.spill [loc16] = r4 ;;
|
---|
| 112 | st8.spill [loc17] = r5 ;;
|
---|
| 113 | st8.spill [loc18] = r6 ;;
|
---|
| 114 | st8.spill [loc19] = r7 ;;
|
---|
| 115 | st8.spill [loc20] = r12 ;; /* save sp */
|
---|
| 116 | st8.spill [loc21] = r13 ;; /* save tp */
|
---|
| 117 |
|
---|
| 118 | mov loc2 = ar.unat
|
---|
[a35b458] | 119 |
|
---|
[86d05fae] | 120 | /*
|
---|
[7947c34] | 121 | * Save application registers
|
---|
[86d05fae] | 122 | */
|
---|
[7947c34] | 123 | st8 [loc8] = loc0 /* save ar.pfs */
|
---|
| 124 | st8 [loc9] = loc1 ;; /* save ar.unat (caller) */
|
---|
| 125 | st8 [loc10] = loc2 /* save ar.unat (callee) */
|
---|
| 126 | st8 [loc11] = loc3 /* save ar.rsc */
|
---|
| 127 | st8 [loc12] = loc4 /* save ar.bsp */
|
---|
| 128 | st8 [loc13] = loc5 /* save ar.rnat */
|
---|
| 129 | st8 [loc14] = loc6 ;; /* save ar.lc */
|
---|
[86d05fae] | 130 |
|
---|
| 131 | /*
|
---|
| 132 | * Save branch registers
|
---|
| 133 | */
|
---|
[7947c34] | 134 | mov loc2 = b0
|
---|
| 135 | mov loc3 = b1
|
---|
| 136 | mov loc4 = b2
|
---|
| 137 | mov loc5 = b3
|
---|
| 138 | mov loc6 = b4
|
---|
| 139 | mov loc7 = b5 ;;
|
---|
| 140 | st8 [loc22] = loc2 /* save pc */
|
---|
| 141 | st8 [loc23] = loc3
|
---|
| 142 | st8 [loc24] = loc4
|
---|
| 143 | st8 [loc25] = loc5
|
---|
| 144 | st8 [loc26] = loc6
|
---|
| 145 | st8 [loc27] = loc7 ;;
|
---|
[86d05fae] | 146 |
|
---|
| 147 | /*
|
---|
| 148 | * Save predicate registers
|
---|
| 149 | */
|
---|
[7947c34] | 150 | mov loc2 = pr ;;
|
---|
| 151 | st8 [loc28] = loc2
|
---|
[b1facba] | 152 |
|
---|
| 153 | /*
|
---|
| 154 | * Save floating-point registers.
|
---|
| 155 | */
|
---|
[7947c34] | 156 | stf.spill [loc29] = f2
|
---|
| 157 | stf.spill [loc30] = f3
|
---|
| 158 | stf.spill [loc31] = f4
|
---|
| 159 | stf.spill [loc32] = f5
|
---|
| 160 |
|
---|
| 161 | stf.spill [loc33] = f16
|
---|
| 162 | stf.spill [loc34] = f17
|
---|
| 163 | stf.spill [loc35] = f18
|
---|
| 164 | stf.spill [loc36] = f19
|
---|
| 165 | stf.spill [loc37] = f20
|
---|
| 166 | stf.spill [loc38] = f21
|
---|
| 167 | stf.spill [loc39] = f22
|
---|
| 168 | stf.spill [loc40] = f23
|
---|
| 169 | stf.spill [loc41] = f24
|
---|
| 170 | stf.spill [loc42] = f25
|
---|
| 171 | stf.spill [loc43] = f26
|
---|
| 172 | stf.spill [loc44] = f27
|
---|
| 173 | stf.spill [loc45] = f28
|
---|
| 174 | stf.spill [loc46] = f29
|
---|
| 175 | stf.spill [loc47] = f30
|
---|
| 176 | stf.spill [loc48] = f31
|
---|
[b1facba] | 177 |
|
---|
[86d05fae] | 178 | mov ar.unat = loc1
|
---|
[a35b458] | 179 |
|
---|
[b4f1171] | 180 | mov r8 = 0 /* __context_save returns 0 */
|
---|
[86d05fae] | 181 | br.ret.sptk.many b0
|
---|
[b4f1171] | 182 | FUNCTION_END(__context_save)
|
---|
[86d05fae] | 183 |
|
---|
[b4f1171] | 184 | FUNCTION_BEGIN(__context_restore)
|
---|
[b127e4af] | 185 | alloc loc0 = ar.pfs, 2, 50, 0, 0 ;;
|
---|
[7947c34] | 186 |
|
---|
[a5c78a18] | 187 | add loc9 = __CONTEXT_OFFSET_AR_PFS, in0
|
---|
| 188 | add loc10 = __CONTEXT_OFFSET_AR_UNAT_CALLER, in0
|
---|
| 189 | add loc11 = __CONTEXT_OFFSET_AR_UNAT_CALLEE, in0
|
---|
| 190 | add loc12 = __CONTEXT_OFFSET_AR_RSC, in0
|
---|
| 191 | add loc13 = __CONTEXT_OFFSET_BSP, in0
|
---|
| 192 | add loc14 = __CONTEXT_OFFSET_AR_RNAT, in0
|
---|
| 193 | add loc15 = __CONTEXT_OFFSET_AR_LC, in0
|
---|
| 194 |
|
---|
| 195 | add loc16 = __CONTEXT_OFFSET_R1, in0
|
---|
| 196 | add loc17 = __CONTEXT_OFFSET_R4, in0
|
---|
| 197 | add loc18 = __CONTEXT_OFFSET_R5, in0
|
---|
| 198 | add loc19 = __CONTEXT_OFFSET_R6, in0
|
---|
| 199 | add loc20 = __CONTEXT_OFFSET_R7, in0
|
---|
| 200 | add loc21 = __CONTEXT_OFFSET_SP, in0
|
---|
| 201 | add loc22 = __CONTEXT_OFFSET_TP, in0
|
---|
| 202 |
|
---|
| 203 | add loc23 = __CONTEXT_OFFSET_PC, in0
|
---|
| 204 | add loc24 = __CONTEXT_OFFSET_B1, in0
|
---|
| 205 | add loc25 = __CONTEXT_OFFSET_B2, in0
|
---|
| 206 | add loc26 = __CONTEXT_OFFSET_B3, in0
|
---|
| 207 | add loc27 = __CONTEXT_OFFSET_B4, in0
|
---|
| 208 | add loc28 = __CONTEXT_OFFSET_B5, in0
|
---|
| 209 |
|
---|
| 210 | add loc29 = __CONTEXT_OFFSET_PR, in0
|
---|
| 211 |
|
---|
| 212 | add loc30 = __CONTEXT_OFFSET_F2, in0
|
---|
| 213 | add loc31 = __CONTEXT_OFFSET_F3, in0
|
---|
| 214 | add loc32 = __CONTEXT_OFFSET_F4, in0
|
---|
| 215 | add loc33 = __CONTEXT_OFFSET_F5, in0
|
---|
| 216 |
|
---|
| 217 | add loc34 = __CONTEXT_OFFSET_F16, in0
|
---|
| 218 | add loc35 = __CONTEXT_OFFSET_F17, in0
|
---|
| 219 | add loc36 = __CONTEXT_OFFSET_F18, in0
|
---|
| 220 | add loc37 = __CONTEXT_OFFSET_F19, in0
|
---|
| 221 | add loc38 = __CONTEXT_OFFSET_F20, in0
|
---|
| 222 | add loc39 = __CONTEXT_OFFSET_F21, in0
|
---|
| 223 | add loc40 = __CONTEXT_OFFSET_F22, in0
|
---|
| 224 | add loc41 = __CONTEXT_OFFSET_F23, in0
|
---|
| 225 | add loc42 = __CONTEXT_OFFSET_F24, in0
|
---|
| 226 | add loc43 = __CONTEXT_OFFSET_F25, in0
|
---|
| 227 | add loc44 = __CONTEXT_OFFSET_F26, in0
|
---|
| 228 | add loc45 = __CONTEXT_OFFSET_F27, in0
|
---|
| 229 | add loc46 = __CONTEXT_OFFSET_F28, in0
|
---|
| 230 | add loc47 = __CONTEXT_OFFSET_F29, in0
|
---|
| 231 | add loc48 = __CONTEXT_OFFSET_F30, in0
|
---|
| 232 | add loc49 = __CONTEXT_OFFSET_F31, in0 ;;
|
---|
[7947c34] | 233 |
|
---|
| 234 | ld8 loc0 = [loc9] /* load ar.pfs */
|
---|
| 235 | ld8 loc1 = [loc10] /* load ar.unat (caller) */
|
---|
| 236 | ld8 loc2 = [loc11] /* load ar.unat (callee) */
|
---|
| 237 | ld8 loc3 = [loc12] /* load ar.rsc */
|
---|
| 238 | ld8 loc4 = [loc13] /* load ar.bsp */
|
---|
| 239 | ld8 loc5 = [loc14] /* load ar.rnat */
|
---|
| 240 | ld8 loc6 = [loc15] /* load ar.lc */
|
---|
[a35b458] | 241 |
|
---|
[1b20da0] | 242 | .auto
|
---|
[86d05fae] | 243 |
|
---|
| 244 | /*
|
---|
| 245 | * Invalidate the ALAT
|
---|
| 246 | */
|
---|
| 247 | invala
|
---|
| 248 |
|
---|
| 249 | /*
|
---|
| 250 | * Put RSE to enforced lazy mode.
|
---|
| 251 | * So that ar.bspstore and ar.rnat can be written.
|
---|
| 252 | */
|
---|
| 253 | movl loc8 = ~3
|
---|
| 254 | and loc8 = loc3, loc8
|
---|
| 255 | mov ar.rsc = loc8
|
---|
| 256 |
|
---|
| 257 | /*
|
---|
| 258 | * Flush dirty registers to backing store.
|
---|
| 259 | * We do this because we want the following move
|
---|
| 260 | * to ar.bspstore to assign the same value to ar.bsp.
|
---|
| 261 | */
|
---|
| 262 | flushrs
|
---|
| 263 |
|
---|
| 264 | /*
|
---|
| 265 | * Restore application registers
|
---|
| 266 | */
|
---|
| 267 | mov ar.bspstore = loc4 /* rse.bspload = ar.bsp = ar.bspstore = loc4 */
|
---|
| 268 | mov ar.rnat = loc5
|
---|
| 269 | mov ar.pfs = loc0
|
---|
| 270 | mov ar.rsc = loc3
|
---|
| 271 |
|
---|
| 272 | .explicit
|
---|
| 273 |
|
---|
[7947c34] | 274 | mov ar.unat = loc2 ;;
|
---|
[86d05fae] | 275 | mov ar.lc = loc6
|
---|
[a35b458] | 276 |
|
---|
[86d05fae] | 277 | /*
|
---|
| 278 | * Restore general registers including NaT bits
|
---|
| 279 | */
|
---|
[7947c34] | 280 | ld8.fill r1 = [loc16] ;;
|
---|
| 281 | ld8.fill r4 = [loc17] ;;
|
---|
| 282 | ld8.fill r5 = [loc18] ;;
|
---|
| 283 | ld8.fill r6 = [loc19] ;;
|
---|
| 284 | ld8.fill r7 = [loc20] ;;
|
---|
| 285 | ld8.fill r12 = [loc21] ;; /* restore sp */
|
---|
| 286 | ld8.fill r13 = [loc22] ;;
|
---|
[86d05fae] | 287 |
|
---|
[1b20da0] | 288 | /*
|
---|
[86d05fae] | 289 | * Restore branch registers
|
---|
| 290 | */
|
---|
[7947c34] | 291 | ld8 loc2 = [loc23] /* restore pc */
|
---|
| 292 | ld8 loc3 = [loc24]
|
---|
| 293 | ld8 loc4 = [loc25]
|
---|
| 294 | ld8 loc5 = [loc26]
|
---|
| 295 | ld8 loc6 = [loc27]
|
---|
| 296 | ld8 loc7 = [loc28] ;;
|
---|
[86d05fae] | 297 | mov b0 = loc2
|
---|
| 298 | mov b1 = loc3
|
---|
| 299 | mov b2 = loc4
|
---|
| 300 | mov b3 = loc5
|
---|
| 301 | mov b4 = loc6
|
---|
[7947c34] | 302 | mov b5 = loc7 ;;
|
---|
[86d05fae] | 303 |
|
---|
| 304 | /*
|
---|
| 305 | * Restore predicate registers
|
---|
| 306 | */
|
---|
[7947c34] | 307 | ld8 loc2 = [loc29] ;;
|
---|
[86d05fae] | 308 | mov pr = loc2, ~0
|
---|
[b1facba] | 309 |
|
---|
| 310 | /*
|
---|
| 311 | * Restore floating-point registers.
|
---|
| 312 | */
|
---|
[7947c34] | 313 | ldf.fill f2 = [loc30]
|
---|
| 314 | ldf.fill f3 = [loc31]
|
---|
| 315 | ldf.fill f4 = [loc32]
|
---|
| 316 | ldf.fill f5 = [loc33]
|
---|
| 317 |
|
---|
| 318 | ldf.fill f16 = [loc34]
|
---|
| 319 | ldf.fill f17 = [loc35]
|
---|
| 320 | ldf.fill f18 = [loc36]
|
---|
| 321 | ldf.fill f19 = [loc37]
|
---|
| 322 | ldf.fill f20 = [loc38]
|
---|
| 323 | ldf.fill f21 = [loc39]
|
---|
| 324 | ldf.fill f22 = [loc40]
|
---|
| 325 | ldf.fill f23 = [loc41]
|
---|
| 326 | ldf.fill f24 = [loc42]
|
---|
| 327 | ldf.fill f25 = [loc43]
|
---|
| 328 | ldf.fill f26 = [loc44]
|
---|
| 329 | ldf.fill f27 = [loc45]
|
---|
| 330 | ldf.fill f28 = [loc46]
|
---|
| 331 | ldf.fill f29 = [loc47]
|
---|
| 332 | ldf.fill f30 = [loc48]
|
---|
| 333 | ldf.fill f31 = [loc49]
|
---|
[a35b458] | 334 |
|
---|
[86d05fae] | 335 | mov ar.unat = loc1
|
---|
[a35b458] | 336 |
|
---|
[b4f1171] | 337 | mov r8 = in1 /* __context_restore returns second argument */
|
---|
[86d05fae] | 338 | br.ret.sptk.many b0
|
---|
[b4f1171] | 339 | FUNCTION_END(__context_restore)
|
---|