1 /* -----------------------------------------------------------------------
2 sysv.h - Copyright (c) 2003 Jakub Jelinek <jakub@redhat.com>
3 Copyright (c) 2008 Red Hat, Inc.
5 PowerPC64 Assembly glue.
7 Permission is hereby granted, free of charge, to any person obtaining
8 a copy of this software and associated documentation files (the
9 ``Software''), to deal in the Software without restriction, including
10 without limitation the rights to use, copy, modify, merge, publish,
11 distribute, sublicense, and/or sell copies of the Software, and to
12 permit persons to whom the Software is furnished to do so, subject to
13 the following conditions:
15 The above copyright notice and this permission notice shall be included
16 in all copies or substantial portions of the Software.
18 THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
19 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
21 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
22 HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
23 WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
25 DEALINGS IN THE SOFTWARE.
26 ----------------------------------------------------------------------- */
29 #include <fficonfig.h>
33 .hidden ffi_call_LINUX64
34 .globl ffi_call_LINUX64
38 addis %r2, %r12, .TOC.-ffi_call_LINUX64@ha
39 addi %r2, %r2, .TOC.-ffi_call_LINUX64@l
40 .localentry ffi_call_LINUX64, . - ffi_call_LINUX64
46 .quad .L.ffi_call_LINUX64,.TOC.@tocbase,0
47 .type ffi_call_LINUX64,@function
51 .hidden .ffi_call_LINUX64
52 .globl .ffi_call_LINUX64
53 .quad .ffi_call_LINUX64,.TOC.@tocbase,0
54 .size ffi_call_LINUX64,24
55 .type .ffi_call_LINUX64,@function
68 mr %r28, %r1 /* our AP. */
71 mr %r31, %r5 /* flags, */
72 mr %r30, %r6 /* rvalue, */
73 mr %r29, %r7 /* function address. */
74 /* Save toc pointer, not for the ffi_prep_args64 call, but for the later
75 bctrl function call. */
82 /* Call ffi_prep_args64. */
84 # if defined _CALL_LINUX || _CALL_ELF == 2
97 /* Now do the call. */
98 /* Set up cr1 with bits 4-7 of the flags. */
101 /* Get the address to call into CTR. */
103 /* Load all those argument registers. */
104 ld %r3, -32-(8*8)(%r28)
105 ld %r4, -32-(7*8)(%r28)
106 ld %r5, -32-(6*8)(%r28)
107 ld %r6, -32-(5*8)(%r28)
109 ld %r7, -32-(4*8)(%r28)
110 ld %r8, -32-(3*8)(%r28)
111 ld %r9, -32-(2*8)(%r28)
112 ld %r10, -32-(1*8)(%r28)
115 /* Load all the FP registers. */
117 lfd %f1, -32-(21*8)(%r28)
118 lfd %f2, -32-(20*8)(%r28)
119 lfd %f3, -32-(19*8)(%r28)
120 lfd %f4, -32-(18*8)(%r28)
121 lfd %f5, -32-(17*8)(%r28)
122 lfd %f6, -32-(16*8)(%r28)
123 lfd %f7, -32-(15*8)(%r28)
124 lfd %f8, -32-(14*8)(%r28)
125 lfd %f9, -32-(13*8)(%r28)
126 lfd %f10, -32-(12*8)(%r28)
127 lfd %f11, -32-(11*8)(%r28)
128 lfd %f12, -32-(10*8)(%r28)
129 lfd %f13, -32-(9*8)(%r28)
135 /* This must follow the call immediately, the unwinder
136 uses this to find out if r2 has been saved or not. */
143 /* Now, deal with the return value. */
145 bt 31, .Lstruct_return_value
146 bt 30, .Ldone_return_value
147 bt 29, .Lfp_return_value
149 /* Fall through... */
152 /* Restore the registers we used and return. */
163 bf 28, .Lfloat_return_value
165 mtcrf 0x02, %r31 /* cr6 */
166 bf 27, .Ldone_return_value
168 b .Ldone_return_value
169 .Lfloat_return_value:
171 b .Ldone_return_value
173 .Lstruct_return_value:
174 bf 29, .Lsmall_struct
175 bf 28, .Lfloat_homog_return_value
184 b .Ldone_return_value
186 .Lfloat_homog_return_value:
195 b .Ldone_return_value
200 b .Ldone_return_value
204 .byte 0,12,0,1,128,4,0,0
206 .size ffi_call_LINUX64,.-ffi_call_LINUX64
209 .size ffi_call_LINUX64,.-.L.ffi_call_LINUX64
211 .size .ffi_call_LINUX64,.-.ffi_call_LINUX64
215 .section .eh_frame,EH_FRAME_FLAGS,@progbits
217 .4byte .LECIE1-.LSCIE1 # Length of Common Information Entry
219 .4byte 0x0 # CIE Identifier Tag
220 .byte 0x1 # CIE Version
221 .ascii "zR\0" # CIE Augmentation
222 .uleb128 0x1 # CIE Code Alignment Factor
223 .sleb128 -8 # CIE Data Alignment Factor
224 .byte 0x41 # CIE RA Column
225 .uleb128 0x1 # Augmentation size
226 .byte 0x14 # FDE Encoding (pcrel udata8)
227 .byte 0xc # DW_CFA_def_cfa
233 .4byte .LEFDE1-.LASFDE1 # FDE Length
235 .4byte .LASFDE1-.Lframe1 # FDE CIE offset
236 .8byte .LFB1-. # FDE initial location
237 .8byte .LFE1-.LFB1 # FDE address range
238 .uleb128 0x0 # Augmentation size
239 .byte 0x2 # DW_CFA_advance_loc1
241 .byte 0xd # DW_CFA_def_cfa_register
243 .byte 0x11 # DW_CFA_offset_extended_sf
246 .byte 0x9f # DW_CFA_offset, column 0x1f
248 .byte 0x9e # DW_CFA_offset, column 0x1e
250 .byte 0x9d # DW_CFA_offset, column 0x1d
252 .byte 0x9c # DW_CFA_offset, column 0x1c
257 # if (defined __ELF__ && defined __linux__) || _CALL_ELF == 2
258 .section .note.GNU-stack,"",@progbits