Kumar Gala | da3de6d | 2008-06-13 07:20:58 +1000 | [diff] [blame] | 1 | /* |
| 2 | * Special support for eabi and SVR4 |
| 3 | * |
| 4 | * Copyright (C) 1995, 1996, 1998, 2000, 2001 Free Software Foundation, Inc. |
| 5 | * Copyright 2008 Freescale Semiconductor, Inc. |
| 6 | * Written By Michael Meissner |
| 7 | * |
| 8 | * Based on gcc/config/rs6000/crtsavres.asm from gcc |
Stephen Rothwell | 7fca5dc | 2010-06-29 20:08:42 +0000 | [diff] [blame] | 9 | * 64 bit additions from reading the PPC elf64abi document. |
Kumar Gala | da3de6d | 2008-06-13 07:20:58 +1000 | [diff] [blame] | 10 | * |
| 11 | * This file is free software; you can redistribute it and/or modify it |
| 12 | * under the terms of the GNU General Public License as published by the |
| 13 | * Free Software Foundation; either version 2, or (at your option) any |
| 14 | * later version. |
| 15 | * |
| 16 | * In addition to the permissions in the GNU General Public License, the |
| 17 | * Free Software Foundation gives you unlimited permission to link the |
| 18 | * compiled version of this file with other programs, and to distribute |
| 19 | * those programs without any restriction coming from the use of this |
| 20 | * file. (The General Public License restrictions do apply in other |
| 21 | * respects; for example, they cover modification of the file, and |
| 22 | * distribution when not linked into another program.) |
| 23 | * |
| 24 | * This file is distributed in the hope that it will be useful, but |
| 25 | * WITHOUT ANY WARRANTY; without even the implied warranty of |
| 26 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 27 | * General Public License for more details. |
| 28 | * |
| 29 | * You should have received a copy of the GNU General Public License |
| 30 | * along with this program; see the file COPYING. If not, write to |
| 31 | * the Free Software Foundation, 51 Franklin Street, Fifth Floor, |
| 32 | * Boston, MA 02110-1301, USA. |
| 33 | * |
| 34 | * As a special exception, if you link this library with files |
| 35 | * compiled with GCC to produce an executable, this does not cause |
| 36 | * the resulting executable to be covered by the GNU General Public License. |
| 37 | * This exception does not however invalidate any other reasons why |
| 38 | * the executable file might be covered by the GNU General Public License. |
| 39 | */ |
| 40 | |
| 41 | #include <asm/ppc_asm.h> |
| 42 | |
| 43 | .file "crtsavres.S" |
Kumar Gala | da3de6d | 2008-06-13 07:20:58 +1000 | [diff] [blame] | 44 | |
| 45 | #ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE |
| 46 | |
Stephen Rothwell | 7fca5dc | 2010-06-29 20:08:42 +0000 | [diff] [blame] | 47 | #ifndef CONFIG_PPC64 |
| 48 | |
Stephen Rothwell | 1d5a436 | 2012-07-05 21:09:40 +0000 | [diff] [blame] | 49 | .section ".text" |
| 50 | |
Kumar Gala | da3de6d | 2008-06-13 07:20:58 +1000 | [diff] [blame] | 51 | /* Routines for saving integer registers, called by the compiler. */ |
| 52 | /* Called with r11 pointing to the stack header word of the caller of the */ |
| 53 | /* function, just beyond the end of the integer save area. */ |
| 54 | |
| 55 | _GLOBAL(_savegpr_14) |
| 56 | _GLOBAL(_save32gpr_14) |
| 57 | stw 14,-72(11) /* save gp registers */ |
| 58 | _GLOBAL(_savegpr_15) |
| 59 | _GLOBAL(_save32gpr_15) |
| 60 | stw 15,-68(11) |
| 61 | _GLOBAL(_savegpr_16) |
| 62 | _GLOBAL(_save32gpr_16) |
| 63 | stw 16,-64(11) |
| 64 | _GLOBAL(_savegpr_17) |
| 65 | _GLOBAL(_save32gpr_17) |
| 66 | stw 17,-60(11) |
| 67 | _GLOBAL(_savegpr_18) |
| 68 | _GLOBAL(_save32gpr_18) |
| 69 | stw 18,-56(11) |
| 70 | _GLOBAL(_savegpr_19) |
| 71 | _GLOBAL(_save32gpr_19) |
| 72 | stw 19,-52(11) |
| 73 | _GLOBAL(_savegpr_20) |
| 74 | _GLOBAL(_save32gpr_20) |
| 75 | stw 20,-48(11) |
| 76 | _GLOBAL(_savegpr_21) |
| 77 | _GLOBAL(_save32gpr_21) |
| 78 | stw 21,-44(11) |
| 79 | _GLOBAL(_savegpr_22) |
| 80 | _GLOBAL(_save32gpr_22) |
| 81 | stw 22,-40(11) |
| 82 | _GLOBAL(_savegpr_23) |
| 83 | _GLOBAL(_save32gpr_23) |
| 84 | stw 23,-36(11) |
| 85 | _GLOBAL(_savegpr_24) |
| 86 | _GLOBAL(_save32gpr_24) |
| 87 | stw 24,-32(11) |
| 88 | _GLOBAL(_savegpr_25) |
| 89 | _GLOBAL(_save32gpr_25) |
| 90 | stw 25,-28(11) |
| 91 | _GLOBAL(_savegpr_26) |
| 92 | _GLOBAL(_save32gpr_26) |
| 93 | stw 26,-24(11) |
| 94 | _GLOBAL(_savegpr_27) |
| 95 | _GLOBAL(_save32gpr_27) |
| 96 | stw 27,-20(11) |
| 97 | _GLOBAL(_savegpr_28) |
| 98 | _GLOBAL(_save32gpr_28) |
| 99 | stw 28,-16(11) |
| 100 | _GLOBAL(_savegpr_29) |
| 101 | _GLOBAL(_save32gpr_29) |
| 102 | stw 29,-12(11) |
| 103 | _GLOBAL(_savegpr_30) |
| 104 | _GLOBAL(_save32gpr_30) |
| 105 | stw 30,-8(11) |
| 106 | _GLOBAL(_savegpr_31) |
| 107 | _GLOBAL(_save32gpr_31) |
| 108 | stw 31,-4(11) |
| 109 | blr |
| 110 | |
| 111 | /* Routines for restoring integer registers, called by the compiler. */ |
| 112 | /* Called with r11 pointing to the stack header word of the caller of the */ |
| 113 | /* function, just beyond the end of the integer restore area. */ |
| 114 | |
| 115 | _GLOBAL(_restgpr_14) |
| 116 | _GLOBAL(_rest32gpr_14) |
| 117 | lwz 14,-72(11) /* restore gp registers */ |
| 118 | _GLOBAL(_restgpr_15) |
| 119 | _GLOBAL(_rest32gpr_15) |
| 120 | lwz 15,-68(11) |
| 121 | _GLOBAL(_restgpr_16) |
| 122 | _GLOBAL(_rest32gpr_16) |
| 123 | lwz 16,-64(11) |
| 124 | _GLOBAL(_restgpr_17) |
| 125 | _GLOBAL(_rest32gpr_17) |
| 126 | lwz 17,-60(11) |
| 127 | _GLOBAL(_restgpr_18) |
| 128 | _GLOBAL(_rest32gpr_18) |
| 129 | lwz 18,-56(11) |
| 130 | _GLOBAL(_restgpr_19) |
| 131 | _GLOBAL(_rest32gpr_19) |
| 132 | lwz 19,-52(11) |
| 133 | _GLOBAL(_restgpr_20) |
| 134 | _GLOBAL(_rest32gpr_20) |
| 135 | lwz 20,-48(11) |
| 136 | _GLOBAL(_restgpr_21) |
| 137 | _GLOBAL(_rest32gpr_21) |
| 138 | lwz 21,-44(11) |
| 139 | _GLOBAL(_restgpr_22) |
| 140 | _GLOBAL(_rest32gpr_22) |
| 141 | lwz 22,-40(11) |
| 142 | _GLOBAL(_restgpr_23) |
| 143 | _GLOBAL(_rest32gpr_23) |
| 144 | lwz 23,-36(11) |
| 145 | _GLOBAL(_restgpr_24) |
| 146 | _GLOBAL(_rest32gpr_24) |
| 147 | lwz 24,-32(11) |
| 148 | _GLOBAL(_restgpr_25) |
| 149 | _GLOBAL(_rest32gpr_25) |
| 150 | lwz 25,-28(11) |
| 151 | _GLOBAL(_restgpr_26) |
| 152 | _GLOBAL(_rest32gpr_26) |
| 153 | lwz 26,-24(11) |
| 154 | _GLOBAL(_restgpr_27) |
| 155 | _GLOBAL(_rest32gpr_27) |
| 156 | lwz 27,-20(11) |
| 157 | _GLOBAL(_restgpr_28) |
| 158 | _GLOBAL(_rest32gpr_28) |
| 159 | lwz 28,-16(11) |
| 160 | _GLOBAL(_restgpr_29) |
| 161 | _GLOBAL(_rest32gpr_29) |
| 162 | lwz 29,-12(11) |
| 163 | _GLOBAL(_restgpr_30) |
| 164 | _GLOBAL(_rest32gpr_30) |
| 165 | lwz 30,-8(11) |
| 166 | _GLOBAL(_restgpr_31) |
| 167 | _GLOBAL(_rest32gpr_31) |
| 168 | lwz 31,-4(11) |
| 169 | blr |
| 170 | |
| 171 | /* Routines for restoring integer registers, called by the compiler. */ |
| 172 | /* Called with r11 pointing to the stack header word of the caller of the */ |
| 173 | /* function, just beyond the end of the integer restore area. */ |
| 174 | |
| 175 | _GLOBAL(_restgpr_14_x) |
| 176 | _GLOBAL(_rest32gpr_14_x) |
| 177 | lwz 14,-72(11) /* restore gp registers */ |
| 178 | _GLOBAL(_restgpr_15_x) |
| 179 | _GLOBAL(_rest32gpr_15_x) |
| 180 | lwz 15,-68(11) |
| 181 | _GLOBAL(_restgpr_16_x) |
| 182 | _GLOBAL(_rest32gpr_16_x) |
| 183 | lwz 16,-64(11) |
| 184 | _GLOBAL(_restgpr_17_x) |
| 185 | _GLOBAL(_rest32gpr_17_x) |
| 186 | lwz 17,-60(11) |
| 187 | _GLOBAL(_restgpr_18_x) |
| 188 | _GLOBAL(_rest32gpr_18_x) |
| 189 | lwz 18,-56(11) |
| 190 | _GLOBAL(_restgpr_19_x) |
| 191 | _GLOBAL(_rest32gpr_19_x) |
| 192 | lwz 19,-52(11) |
| 193 | _GLOBAL(_restgpr_20_x) |
| 194 | _GLOBAL(_rest32gpr_20_x) |
| 195 | lwz 20,-48(11) |
| 196 | _GLOBAL(_restgpr_21_x) |
| 197 | _GLOBAL(_rest32gpr_21_x) |
| 198 | lwz 21,-44(11) |
| 199 | _GLOBAL(_restgpr_22_x) |
| 200 | _GLOBAL(_rest32gpr_22_x) |
| 201 | lwz 22,-40(11) |
| 202 | _GLOBAL(_restgpr_23_x) |
| 203 | _GLOBAL(_rest32gpr_23_x) |
| 204 | lwz 23,-36(11) |
| 205 | _GLOBAL(_restgpr_24_x) |
| 206 | _GLOBAL(_rest32gpr_24_x) |
| 207 | lwz 24,-32(11) |
| 208 | _GLOBAL(_restgpr_25_x) |
| 209 | _GLOBAL(_rest32gpr_25_x) |
| 210 | lwz 25,-28(11) |
| 211 | _GLOBAL(_restgpr_26_x) |
| 212 | _GLOBAL(_rest32gpr_26_x) |
| 213 | lwz 26,-24(11) |
| 214 | _GLOBAL(_restgpr_27_x) |
| 215 | _GLOBAL(_rest32gpr_27_x) |
| 216 | lwz 27,-20(11) |
| 217 | _GLOBAL(_restgpr_28_x) |
| 218 | _GLOBAL(_rest32gpr_28_x) |
| 219 | lwz 28,-16(11) |
| 220 | _GLOBAL(_restgpr_29_x) |
| 221 | _GLOBAL(_rest32gpr_29_x) |
| 222 | lwz 29,-12(11) |
| 223 | _GLOBAL(_restgpr_30_x) |
| 224 | _GLOBAL(_rest32gpr_30_x) |
| 225 | lwz 30,-8(11) |
| 226 | _GLOBAL(_restgpr_31_x) |
| 227 | _GLOBAL(_rest32gpr_31_x) |
| 228 | lwz 0,4(11) |
| 229 | lwz 31,-4(11) |
| 230 | mtlr 0 |
| 231 | mr 1,11 |
| 232 | blr |
Stephen Rothwell | 7fca5dc | 2010-06-29 20:08:42 +0000 | [diff] [blame] | 233 | |
| 234 | #else /* CONFIG_PPC64 */ |
| 235 | |
Stephen Rothwell | 1d5a436 | 2012-07-05 21:09:40 +0000 | [diff] [blame] | 236 | .section ".text.save.restore","ax",@progbits |
| 237 | |
Stephen Rothwell | 7fca5dc | 2010-06-29 20:08:42 +0000 | [diff] [blame] | 238 | .globl _savegpr0_14 |
| 239 | _savegpr0_14: |
| 240 | std r14,-144(r1) |
| 241 | .globl _savegpr0_15 |
| 242 | _savegpr0_15: |
| 243 | std r15,-136(r1) |
| 244 | .globl _savegpr0_16 |
| 245 | _savegpr0_16: |
| 246 | std r16,-128(r1) |
| 247 | .globl _savegpr0_17 |
| 248 | _savegpr0_17: |
| 249 | std r17,-120(r1) |
| 250 | .globl _savegpr0_18 |
| 251 | _savegpr0_18: |
| 252 | std r18,-112(r1) |
| 253 | .globl _savegpr0_19 |
| 254 | _savegpr0_19: |
| 255 | std r19,-104(r1) |
| 256 | .globl _savegpr0_20 |
| 257 | _savegpr0_20: |
| 258 | std r20,-96(r1) |
| 259 | .globl _savegpr0_21 |
| 260 | _savegpr0_21: |
| 261 | std r21,-88(r1) |
| 262 | .globl _savegpr0_22 |
| 263 | _savegpr0_22: |
| 264 | std r22,-80(r1) |
| 265 | .globl _savegpr0_23 |
| 266 | _savegpr0_23: |
| 267 | std r23,-72(r1) |
| 268 | .globl _savegpr0_24 |
| 269 | _savegpr0_24: |
| 270 | std r24,-64(r1) |
| 271 | .globl _savegpr0_25 |
| 272 | _savegpr0_25: |
| 273 | std r25,-56(r1) |
| 274 | .globl _savegpr0_26 |
| 275 | _savegpr0_26: |
| 276 | std r26,-48(r1) |
| 277 | .globl _savegpr0_27 |
| 278 | _savegpr0_27: |
| 279 | std r27,-40(r1) |
| 280 | .globl _savegpr0_28 |
| 281 | _savegpr0_28: |
| 282 | std r28,-32(r1) |
| 283 | .globl _savegpr0_29 |
| 284 | _savegpr0_29: |
| 285 | std r29,-24(r1) |
| 286 | .globl _savegpr0_30 |
| 287 | _savegpr0_30: |
| 288 | std r30,-16(r1) |
| 289 | .globl _savegpr0_31 |
| 290 | _savegpr0_31: |
| 291 | std r31,-8(r1) |
| 292 | std r0,16(r1) |
| 293 | blr |
| 294 | |
| 295 | .globl _restgpr0_14 |
| 296 | _restgpr0_14: |
| 297 | ld r14,-144(r1) |
| 298 | .globl _restgpr0_15 |
| 299 | _restgpr0_15: |
| 300 | ld r15,-136(r1) |
| 301 | .globl _restgpr0_16 |
| 302 | _restgpr0_16: |
| 303 | ld r16,-128(r1) |
| 304 | .globl _restgpr0_17 |
| 305 | _restgpr0_17: |
| 306 | ld r17,-120(r1) |
| 307 | .globl _restgpr0_18 |
| 308 | _restgpr0_18: |
| 309 | ld r18,-112(r1) |
| 310 | .globl _restgpr0_19 |
| 311 | _restgpr0_19: |
| 312 | ld r19,-104(r1) |
| 313 | .globl _restgpr0_20 |
| 314 | _restgpr0_20: |
| 315 | ld r20,-96(r1) |
| 316 | .globl _restgpr0_21 |
| 317 | _restgpr0_21: |
| 318 | ld r21,-88(r1) |
| 319 | .globl _restgpr0_22 |
| 320 | _restgpr0_22: |
| 321 | ld r22,-80(r1) |
| 322 | .globl _restgpr0_23 |
| 323 | _restgpr0_23: |
| 324 | ld r23,-72(r1) |
| 325 | .globl _restgpr0_24 |
| 326 | _restgpr0_24: |
| 327 | ld r24,-64(r1) |
| 328 | .globl _restgpr0_25 |
| 329 | _restgpr0_25: |
| 330 | ld r25,-56(r1) |
| 331 | .globl _restgpr0_26 |
| 332 | _restgpr0_26: |
| 333 | ld r26,-48(r1) |
| 334 | .globl _restgpr0_27 |
| 335 | _restgpr0_27: |
| 336 | ld r27,-40(r1) |
| 337 | .globl _restgpr0_28 |
| 338 | _restgpr0_28: |
| 339 | ld r28,-32(r1) |
| 340 | .globl _restgpr0_29 |
| 341 | _restgpr0_29: |
| 342 | ld r0,16(r1) |
| 343 | ld r29,-24(r1) |
| 344 | mtlr r0 |
| 345 | ld r30,-16(r1) |
| 346 | ld r31,-8(r1) |
| 347 | blr |
| 348 | |
| 349 | .globl _restgpr0_30 |
| 350 | _restgpr0_30: |
| 351 | ld r30,-16(r1) |
| 352 | .globl _restgpr0_31 |
| 353 | _restgpr0_31: |
| 354 | ld r0,16(r1) |
| 355 | ld r31,-8(r1) |
| 356 | mtlr r0 |
| 357 | blr |
| 358 | |
| 359 | #endif /* CONFIG_PPC64 */ |
| 360 | |
Kumar Gala | da3de6d | 2008-06-13 07:20:58 +1000 | [diff] [blame] | 361 | #endif |