/* PowerPC64 support code for fibers and multithreading. Copyright (C) 2019 Free Software Foundation, Inc. This file is part of GCC. GCC is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. GCC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. Under Section 7 of GPL version 3, you are granted additional permissions described in the GCC Runtime Library Exception, version 3.1, as published by the Free Software Foundation. You should have received a copy of the GNU General Public License and a copy of the GCC Runtime Library Exception along with this program; see the files COPYING3 and COPYING.RUNTIME respectively. If not, see . */ #include "../common/threadasm.S" #if defined(_CALL_ELF) && _CALL_ELF == 2 #define USE_ABI_2 #define LINKAGE_SZ 32 #define LR_OFS 16 #define TOC_OFS 24 #define GPR_OFS 32 #define STACK_SZ (LINKAGE_SZ + 26*8) #define OFS_R3_R10 GPR_OFS #define OFS_R14_R31 (GPR_OFS+8*8) #else #define LINKAGE_SZ 48 #define LR_OFS 16 #define TOC_OFS 40 #define GPR_OFS 112 #define STACK_SZ (LINKAGE_SZ + 8*8 + 18*8) #define OFS_R3_R10 (STACK_SZ+LINKAGE_SZ) #define OFS_R14_R31 GPR_OFS #endif .text #if defined( USE_ABI_2 ) .abiversion 2 #endif .globl _D4core6thread18callWithStackShellFNbMDFNbPvZvZv .align 2 .type _D4core6thread18callWithStackShellFNbMDFNbPvZvZv,@function #if defined( USE_ABI_2 ) .section .text._D4core6thread18callWithStackShellFNbMDFNbPvZvZv,"a",@progbits #else .section .opd,"aw",@progbits #endif _D4core6thread18callWithStackShellFNbMDFNbPvZvZv: #if !defined( USE_ABI_2 ) .align 3 .quad .L._D4core6thread18callWithStackShellFNbMDFNbPvZvZv .quad .TOC.@tocbase .quad 0 #endif .text /* * Called with: * r3: pointer context * r4: pointer to function */ .L._D4core6thread18callWithStackShellFNbMDFNbPvZvZv: .cfi_startproc stdu 1, -STACK_SZ(1) mflr 0 std 0, LR_OFS(1) .cfi_def_cfa_offset 256 .cfi_offset lr, 16 /* Save r14-r31 in general register save area */ std 14, (OFS_R14_R31 + 0 * 8)(1) std 15, (OFS_R14_R31 + 1 * 8)(1) std 16, (OFS_R14_R31 + 2 * 8)(1) std 17, (OFS_R14_R31 + 3 * 8)(1) std 18, (OFS_R14_R31 + 4 * 8)(1) std 19, (OFS_R14_R31 + 5 * 8)(1) std 20, (OFS_R14_R31 + 6 * 8)(1) std 21, (OFS_R14_R31 + 7 * 8)(1) std 22, (OFS_R14_R31 + 8 * 8)(1) std 23, (OFS_R14_R31 + 9 * 8)(1) std 24, (OFS_R14_R31 + 10 * 8)(1) std 25, (OFS_R14_R31 + 11 * 8)(1) std 26, (OFS_R14_R31 + 12 * 8)(1) std 27, (OFS_R14_R31 + 13 * 8)(1) std 28, (OFS_R14_R31 + 14 * 8)(1) std 29, (OFS_R14_R31 + 15 * 8)(1) std 30, (OFS_R14_R31 + 16 * 8)(1) std 31, (OFS_R14_R31 + 17 * 8)(1) /* Save r3-r10 in parameter save area of caller */ std 3, (OFS_R3_R10 + 0 * 8)(1) std 4, (OFS_R3_R10 + 1 * 8)(1) std 5, (OFS_R3_R10 + 2 * 8)(1) std 6, (OFS_R3_R10 + 3 * 8)(1) std 7, (OFS_R3_R10 + 4 * 8)(1) std 8, (OFS_R3_R10 + 5 * 8)(1) std 9, (OFS_R3_R10 + 6 * 8)(1) std 10, (OFS_R3_R10 + 7 * 8)(1) /* Save r2 in TOC save area */ std 2, TOC_OFS(1) /* Do not save r11, r12 and r13. */ /* Call delegate: * r3: pointer to context * r4: pointer to stack */ mr 5, 4 mr 4, 1 ld 6, 0(5) ld 11, 16(5) ld 2, 8(5) mtctr 6 bctrl nop /* Restore r2 from TOC save area */ ld 2, TOC_OFS(1) /* Restore r3-r10 from local variable space */ ld 3, (OFS_R3_R10 + 0 * 8)(1) ld 4, (OFS_R3_R10 + 1 * 8)(1) ld 5, (OFS_R3_R10 + 2 * 8)(1) ld 6, (OFS_R3_R10 + 3 * 8)(1) ld 7, (OFS_R3_R10 + 4 * 8)(1) ld 8, (OFS_R3_R10 + 5 * 8)(1) ld 9, (OFS_R3_R10 + 6 * 8)(1) ld 10, (OFS_R3_R10 + 7 * 8)(1) /* Restore r14-r31 from general register save area */ ld 14, (OFS_R14_R31 + 0 * 8)(1) ld 15, (OFS_R14_R31 + 1 * 8)(1) ld 16, (OFS_R14_R31 + 2 * 8)(1) ld 17, (OFS_R14_R31 + 3 * 8)(1) ld 18, (OFS_R14_R31 + 4 * 8)(1) ld 19, (OFS_R14_R31 + 5 * 8)(1) ld 20, (OFS_R14_R31 + 6 * 8)(1) ld 21, (OFS_R14_R31 + 7 * 8)(1) ld 22, (OFS_R14_R31 + 8 * 8)(1) ld 23, (OFS_R14_R31 + 9 * 8)(1) ld 24, (OFS_R14_R31 + 10 * 8)(1) ld 25, (OFS_R14_R31 + 11 * 8)(1) ld 26, (OFS_R14_R31 + 12 * 8)(1) ld 27, (OFS_R14_R31 + 13 * 8)(1) ld 28, (OFS_R14_R31 + 14 * 8)(1) ld 29, (OFS_R14_R31 + 15 * 8)(1) ld 30, (OFS_R14_R31 + 16 * 8)(1) ld 31, (OFS_R14_R31 + 17 * 8)(1) ld 0, LR_OFS(1) mtlr 0 addi 1, 1, STACK_SZ blr .long 0 .quad 0 .Lend: .size _D4core6thread18callWithStackShellFNbMDFNbPvZvZv, .Lend-.L._D4core6thread18callWithStackShellFNbMDFNbPvZvZv .cfi_endproc