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 9 * 64 bit additions from reading the PPC elf64abi document. 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" 44 45 #ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE 46 47 .section ".text" 48 49 #ifndef CONFIG_PPC64 50 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 233 234 #ifdef CONFIG_ALTIVEC 235 /* Called with r0 pointing just beyond the end of the vector save area. */ 236 237 _GLOBAL(_savevr_20) 238 li r11,-192 239 stvx v20,r11,r0 240 _GLOBAL(_savevr_21) 241 li r11,-176 242 stvx v21,r11,r0 243 _GLOBAL(_savevr_22) 244 li r11,-160 245 stvx v22,r11,r0 246 _GLOBAL(_savevr_23) 247 li r11,-144 248 stvx v23,r11,r0 249 _GLOBAL(_savevr_24) 250 li r11,-128 251 stvx v24,r11,r0 252 _GLOBAL(_savevr_25) 253 li r11,-112 254 stvx v25,r11,r0 255 _GLOBAL(_savevr_26) 256 li r11,-96 257 stvx v26,r11,r0 258 _GLOBAL(_savevr_27) 259 li r11,-80 260 stvx v27,r11,r0 261 _GLOBAL(_savevr_28) 262 li r11,-64 263 stvx v28,r11,r0 264 _GLOBAL(_savevr_29) 265 li r11,-48 266 stvx v29,r11,r0 267 _GLOBAL(_savevr_30) 268 li r11,-32 269 stvx v30,r11,r0 270 _GLOBAL(_savevr_31) 271 li r11,-16 272 stvx v31,r11,r0 273 blr 274 275 _GLOBAL(_restvr_20) 276 li r11,-192 277 lvx v20,r11,r0 278 _GLOBAL(_restvr_21) 279 li r11,-176 280 lvx v21,r11,r0 281 _GLOBAL(_restvr_22) 282 li r11,-160 283 lvx v22,r11,r0 284 _GLOBAL(_restvr_23) 285 li r11,-144 286 lvx v23,r11,r0 287 _GLOBAL(_restvr_24) 288 li r11,-128 289 lvx v24,r11,r0 290 _GLOBAL(_restvr_25) 291 li r11,-112 292 lvx v25,r11,r0 293 _GLOBAL(_restvr_26) 294 li r11,-96 295 lvx v26,r11,r0 296 _GLOBAL(_restvr_27) 297 li r11,-80 298 lvx v27,r11,r0 299 _GLOBAL(_restvr_28) 300 li r11,-64 301 lvx v28,r11,r0 302 _GLOBAL(_restvr_29) 303 li r11,-48 304 lvx v29,r11,r0 305 _GLOBAL(_restvr_30) 306 li r11,-32 307 lvx v30,r11,r0 308 _GLOBAL(_restvr_31) 309 li r11,-16 310 lvx v31,r11,r0 311 blr 312 313 #endif /* CONFIG_ALTIVEC */ 314 315 #else /* CONFIG_PPC64 */ 316 317 .globl _savegpr0_14 318 _savegpr0_14: 319 std r14,-144(r1) 320 .globl _savegpr0_15 321 _savegpr0_15: 322 std r15,-136(r1) 323 .globl _savegpr0_16 324 _savegpr0_16: 325 std r16,-128(r1) 326 .globl _savegpr0_17 327 _savegpr0_17: 328 std r17,-120(r1) 329 .globl _savegpr0_18 330 _savegpr0_18: 331 std r18,-112(r1) 332 .globl _savegpr0_19 333 _savegpr0_19: 334 std r19,-104(r1) 335 .globl _savegpr0_20 336 _savegpr0_20: 337 std r20,-96(r1) 338 .globl _savegpr0_21 339 _savegpr0_21: 340 std r21,-88(r1) 341 .globl _savegpr0_22 342 _savegpr0_22: 343 std r22,-80(r1) 344 .globl _savegpr0_23 345 _savegpr0_23: 346 std r23,-72(r1) 347 .globl _savegpr0_24 348 _savegpr0_24: 349 std r24,-64(r1) 350 .globl _savegpr0_25 351 _savegpr0_25: 352 std r25,-56(r1) 353 .globl _savegpr0_26 354 _savegpr0_26: 355 std r26,-48(r1) 356 .globl _savegpr0_27 357 _savegpr0_27: 358 std r27,-40(r1) 359 .globl _savegpr0_28 360 _savegpr0_28: 361 std r28,-32(r1) 362 .globl _savegpr0_29 363 _savegpr0_29: 364 std r29,-24(r1) 365 .globl _savegpr0_30 366 _savegpr0_30: 367 std r30,-16(r1) 368 .globl _savegpr0_31 369 _savegpr0_31: 370 std r31,-8(r1) 371 std r0,16(r1) 372 blr 373 374 .globl _restgpr0_14 375 _restgpr0_14: 376 ld r14,-144(r1) 377 .globl _restgpr0_15 378 _restgpr0_15: 379 ld r15,-136(r1) 380 .globl _restgpr0_16 381 _restgpr0_16: 382 ld r16,-128(r1) 383 .globl _restgpr0_17 384 _restgpr0_17: 385 ld r17,-120(r1) 386 .globl _restgpr0_18 387 _restgpr0_18: 388 ld r18,-112(r1) 389 .globl _restgpr0_19 390 _restgpr0_19: 391 ld r19,-104(r1) 392 .globl _restgpr0_20 393 _restgpr0_20: 394 ld r20,-96(r1) 395 .globl _restgpr0_21 396 _restgpr0_21: 397 ld r21,-88(r1) 398 .globl _restgpr0_22 399 _restgpr0_22: 400 ld r22,-80(r1) 401 .globl _restgpr0_23 402 _restgpr0_23: 403 ld r23,-72(r1) 404 .globl _restgpr0_24 405 _restgpr0_24: 406 ld r24,-64(r1) 407 .globl _restgpr0_25 408 _restgpr0_25: 409 ld r25,-56(r1) 410 .globl _restgpr0_26 411 _restgpr0_26: 412 ld r26,-48(r1) 413 .globl _restgpr0_27 414 _restgpr0_27: 415 ld r27,-40(r1) 416 .globl _restgpr0_28 417 _restgpr0_28: 418 ld r28,-32(r1) 419 .globl _restgpr0_29 420 _restgpr0_29: 421 ld r0,16(r1) 422 ld r29,-24(r1) 423 mtlr r0 424 ld r30,-16(r1) 425 ld r31,-8(r1) 426 blr 427 428 .globl _restgpr0_30 429 _restgpr0_30: 430 ld r30,-16(r1) 431 .globl _restgpr0_31 432 _restgpr0_31: 433 ld r0,16(r1) 434 ld r31,-8(r1) 435 mtlr r0 436 blr 437 438 #ifdef CONFIG_ALTIVEC 439 /* Called with r0 pointing just beyond the end of the vector save area. */ 440 441 .globl _savevr_20 442 _savevr_20: 443 li r12,-192 444 stvx v20,r12,r0 445 .globl _savevr_21 446 _savevr_21: 447 li r12,-176 448 stvx v21,r12,r0 449 .globl _savevr_22 450 _savevr_22: 451 li r12,-160 452 stvx v22,r12,r0 453 .globl _savevr_23 454 _savevr_23: 455 li r12,-144 456 stvx v23,r12,r0 457 .globl _savevr_24 458 _savevr_24: 459 li r12,-128 460 stvx v24,r12,r0 461 .globl _savevr_25 462 _savevr_25: 463 li r12,-112 464 stvx v25,r12,r0 465 .globl _savevr_26 466 _savevr_26: 467 li r12,-96 468 stvx v26,r12,r0 469 .globl _savevr_27 470 _savevr_27: 471 li r12,-80 472 stvx v27,r12,r0 473 .globl _savevr_28 474 _savevr_28: 475 li r12,-64 476 stvx v28,r12,r0 477 .globl _savevr_29 478 _savevr_29: 479 li r12,-48 480 stvx v29,r12,r0 481 .globl _savevr_30 482 _savevr_30: 483 li r12,-32 484 stvx v30,r12,r0 485 .globl _savevr_31 486 _savevr_31: 487 li r12,-16 488 stvx v31,r12,r0 489 blr 490 491 .globl _restvr_20 492 _restvr_20: 493 li r12,-192 494 lvx v20,r12,r0 495 .globl _restvr_21 496 _restvr_21: 497 li r12,-176 498 lvx v21,r12,r0 499 .globl _restvr_22 500 _restvr_22: 501 li r12,-160 502 lvx v22,r12,r0 503 .globl _restvr_23 504 _restvr_23: 505 li r12,-144 506 lvx v23,r12,r0 507 .globl _restvr_24 508 _restvr_24: 509 li r12,-128 510 lvx v24,r12,r0 511 .globl _restvr_25 512 _restvr_25: 513 li r12,-112 514 lvx v25,r12,r0 515 .globl _restvr_26 516 _restvr_26: 517 li r12,-96 518 lvx v26,r12,r0 519 .globl _restvr_27 520 _restvr_27: 521 li r12,-80 522 lvx v27,r12,r0 523 .globl _restvr_28 524 _restvr_28: 525 li r12,-64 526 lvx v28,r12,r0 527 .globl _restvr_29 528 _restvr_29: 529 li r12,-48 530 lvx v29,r12,r0 531 .globl _restvr_30 532 _restvr_30: 533 li r12,-32 534 lvx v30,r12,r0 535 .globl _restvr_31 536 _restvr_31: 537 li r12,-16 538 lvx v31,r12,r0 539 blr 540 541 #endif /* CONFIG_ALTIVEC */ 542 543 #endif /* CONFIG_PPC64 */ 544 545 #endif
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.