Changes in uspace/lib/c/arch/ia64/src/fibril.S [58563585:9d58539] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/arch/ia64/src/fibril.S
r58563585 r9d58539 27 27 # 28 28 29 #include <abi/asmtool.h>30 #include <libarch/fibril_context.h>31 32 29 .text 33 30 34 FUNCTION_BEGIN(context_save) 35 alloc loc0 = ar.pfs, 1, 49, 0, 0 36 mov loc1 = ar.unat ;; 31 .global context_save 32 .global context_restore 33 34 context_save: 35 alloc loc0 = ar.pfs, 1, 8, 0, 0 36 mov loc1 = ar.unat ;; 37 /* loc2 */ 37 38 mov loc3 = ar.rsc 38 39 … … 57 58 58 59 mov loc6 = ar.lc 59 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 ;; 106 60 61 /* 62 * Save application registers 63 */ 64 st8 [in0] = loc0, 8 ;; /* save ar.pfs */ 65 st8 [in0] = loc1, 8 ;; /* save ar.unat (caller) */ 66 mov loc2 = in0 ;; 67 add in0 = 8, in0 ;; /* skip ar.unat (callee) */ 68 st8 [in0] = loc3, 8 ;; /* save ar.rsc */ 69 st8 [in0] = loc4, 8 ;; /* save ar.bsp */ 70 st8 [in0] = loc5, 8 ;; /* save ar.rnat */ 71 st8 [in0] = loc6, 8 ;; /* save ar.lc */ 72 107 73 /* 108 74 * Save general registers including NaT bits 109 75 */ 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 119 120 /* 121 * Save application registers 122 */ 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 */ 76 st8.spill [in0] = r1, 8 ;; 77 st8.spill [in0] = r4, 8 ;; 78 st8.spill [in0] = r5, 8 ;; 79 st8.spill [in0] = r6, 8 ;; 80 st8.spill [in0] = r7, 8 ;; 81 st8.spill [in0] = r12, 8 ;; /* save sp */ 82 st8.spill [in0] = r13, 8 ;; /* save tp */ 83 84 mov loc3 = ar.unat ;; 85 st8 [loc2] = loc3 /* save ar.unat (callee) */ 130 86 131 87 /* 132 88 * Save branch registers 133 89 */ 134 mov loc2 = b0 135 mov loc3 = b1136 mov loc 4 = b2137 mov loc5 = b3138 mov loc 6 = b4139 mov loc7 = b5 ;;140 st8 [loc22] = loc2 /* save pc */141 st8 [ loc23] = loc3142 st8 [loc24] = loc4143 st8 [ loc25] = loc5144 st8 [loc26] = loc6145 st8 [ loc27] = loc7 ;;90 mov loc2 = b0 ;; 91 st8 [in0] = loc2, 8 /* save pc */ 92 mov loc3 = b1 ;; 93 st8 [in0] = loc3, 8 94 mov loc4 = b2 ;; 95 st8 [in0] = loc4, 8 96 mov loc5 = b3 ;; 97 st8 [in0] = loc5, 8 98 mov loc6 = b4 ;; 99 st8 [in0] = loc6, 8 100 mov loc7 = b5 ;; 101 st8 [in0] = loc7, 8 146 102 147 103 /* 148 104 * Save predicate registers 149 105 */ 150 mov loc2 = pr 151 st8 [ loc28] = loc2106 mov loc2 = pr ;; 107 st8 [in0] = loc2, 16;; /* Next fpu registers should be spilled to 16B aligned address */ 152 108 153 109 /* 154 110 * Save floating-point registers. 155 111 */ 156 stf.spill [ loc29] = f2157 stf.spill [ loc30] = f3158 stf.spill [ loc31] = f4159 stf.spill [ loc32] = f5160 161 stf.spill [ loc33] = f16162 stf.spill [ loc34] = f17163 stf.spill [ loc35] = f18164 stf.spill [ loc36] = f19165 stf.spill [ loc37] = f20166 stf.spill [ loc38] = f21167 stf.spill [ loc39] = f22168 stf.spill [ loc40] = f23169 stf.spill [ loc41] = f24170 stf.spill [ loc42] = f25171 stf.spill [ loc43] = f26172 stf.spill [ loc44] = f27173 stf.spill [ loc45] = f28174 stf.spill [ loc46] = f29175 stf.spill [ loc47] = f30176 stf.spill [ loc48] = f31112 stf.spill [in0] = f2, 16 ;; 113 stf.spill [in0] = f3, 16 ;; 114 stf.spill [in0] = f4, 16 ;; 115 stf.spill [in0] = f5, 16 ;; 116 117 stf.spill [in0] = f16, 16 ;; 118 stf.spill [in0] = f17, 16 ;; 119 stf.spill [in0] = f18, 16 ;; 120 stf.spill [in0] = f19, 16 ;; 121 stf.spill [in0] = f20, 16 ;; 122 stf.spill [in0] = f21, 16 ;; 123 stf.spill [in0] = f22, 16 ;; 124 stf.spill [in0] = f23, 16 ;; 125 stf.spill [in0] = f24, 16 ;; 126 stf.spill [in0] = f25, 16 ;; 127 stf.spill [in0] = f26, 16 ;; 128 stf.spill [in0] = f27, 16 ;; 129 stf.spill [in0] = f28, 16 ;; 130 stf.spill [in0] = f29, 16 ;; 131 stf.spill [in0] = f30, 16 ;; 132 stf.spill [in0] = f31, 16 ;; 177 133 178 134 mov ar.unat = loc1 179 135 180 add r8 = r0, r0, 1 /* context_save returns 1 */136 add r8 = r0, r0, 1 /* context_save returns 1 */ 181 137 br.ret.sptk.many b0 182 FUNCTION_END(context_save) 183 184 FUNCTION_BEGIN(context_restore) 185 alloc loc0 = ar.pfs, 1, 50, 0, 0 ;; 186 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 ;; 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 */ 138 139 context_restore: 140 alloc loc0 = ar.pfs, 1, 9, 0, 0 ;; 141 142 ld8 loc0 = [in0], 8 ;; /* load ar.pfs */ 143 ld8 loc1 = [in0], 8 ;; /* load ar.unat (caller) */ 144 ld8 loc2 = [in0], 8 ;; /* load ar.unat (callee) */ 145 ld8 loc3 = [in0], 8 ;; /* load ar.rsc */ 146 ld8 loc4 = [in0], 8 ;; /* load ar.bsp */ 147 ld8 loc5 = [in0], 8 ;; /* load ar.rnat */ 148 ld8 loc6 = [in0], 8 ;; /* load ar.lc */ 241 149 242 150 .auto … … 272 180 .explicit 273 181 274 mov ar.unat = loc2 182 mov ar.unat = loc2 ;; 275 183 mov ar.lc = loc6 276 184 … … 278 186 * Restore general registers including NaT bits 279 187 */ 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];;188 ld8.fill r1 = [in0], 8 ;; 189 ld8.fill r4 = [in0], 8 ;; 190 ld8.fill r5 = [in0], 8 ;; 191 ld8.fill r6 = [in0], 8 ;; 192 ld8.fill r7 = [in0], 8 ;; 193 ld8.fill r12 = [in0], 8 ;; /* restore sp */ 194 ld8.fill r13 = [in0], 8 ;; 287 195 288 196 /* 289 197 * Restore branch registers 290 198 */ 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] ;; 199 ld8 loc2 = [in0], 8 ;; /* restore pc */ 297 200 mov b0 = loc2 201 ld8 loc3 = [in0], 8 ;; 298 202 mov b1 = loc3 203 ld8 loc4 = [in0], 8 ;; 299 204 mov b2 = loc4 205 ld8 loc5 = [in0], 8 ;; 300 206 mov b3 = loc5 207 ld8 loc6 = [in0], 8 ;; 301 208 mov b4 = loc6 302 mov b5 = loc7 ;; 209 ld8 loc7 = [in0], 8 ;; 210 mov b5 = loc7 303 211 304 212 /* 305 213 * Restore predicate registers 306 214 */ 307 ld8 loc2 = [ loc29];;215 ld8 loc2 = [in0], 16 ;; 308 216 mov pr = loc2, ~0 309 217 … … 311 219 * Restore floating-point registers. 312 220 */ 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]221 ldf.fill f2 = [in0], 16 ;; 222 ldf.fill f3 = [in0], 16 ;; 223 ldf.fill f4 = [in0], 16 ;; 224 ldf.fill f5 = [in0], 16 ;; 225 226 ldf.fill f16 = [in0], 16 ;; 227 ldf.fill f17 = [in0], 16 ;; 228 ldf.fill f18 = [in0], 16 ;; 229 ldf.fill f19 = [in0], 16 ;; 230 ldf.fill f20 = [in0], 16 ;; 231 ldf.fill f21 = [in0], 16 ;; 232 ldf.fill f22 = [in0], 16 ;; 233 ldf.fill f23 = [in0], 16 ;; 234 ldf.fill f24 = [in0], 16 ;; 235 ldf.fill f25 = [in0], 16 ;; 236 ldf.fill f26 = [in0], 16 ;; 237 ldf.fill f27 = [in0], 16 ;; 238 ldf.fill f28 = [in0], 16 ;; 239 ldf.fill f29 = [in0], 16 ;; 240 ldf.fill f30 = [in0], 16 ;; 241 ldf.fill f31 = [in0], 16 ;; 334 242 335 243 mov ar.unat = loc1 … … 337 245 mov r8 = r0 /* context_restore returns 0 */ 338 246 br.ret.sptk.many b0 339 FUNCTION_END(context_restore)
Note:
See TracChangeset
for help on using the changeset viewer.