xref: /aosp_15_r20/external/libffi/src/or1k/sysv.S (revision 1fd5a2e1d639cd1ddf29dd0c484c123bbd850c21)
1*1fd5a2e1SPrashanth Swaminathan/* -----------------------------------------------------------------------
2*1fd5a2e1SPrashanth Swaminathan   sysv.S - Copyright (c) 2014 Sebastian Macke <[email protected]>
3*1fd5a2e1SPrashanth Swaminathan
4*1fd5a2e1SPrashanth Swaminathan   OpenRISC Foreign Function Interface
5*1fd5a2e1SPrashanth Swaminathan
6*1fd5a2e1SPrashanth Swaminathan   Permission is hereby granted, free of charge, to any person obtaining
7*1fd5a2e1SPrashanth Swaminathan   a copy of this software and associated documentation files (the
8*1fd5a2e1SPrashanth Swaminathan   ``Software''), to deal in the Software without restriction, including
9*1fd5a2e1SPrashanth Swaminathan   without limitation the rights to use, copy, modify, merge, publish,
10*1fd5a2e1SPrashanth Swaminathan   distribute, sublicense, and/or sell copies of the Software, and to
11*1fd5a2e1SPrashanth Swaminathan   permit persons to whom the Software is furnished to do so, subject to
12*1fd5a2e1SPrashanth Swaminathan   the following conditions:
13*1fd5a2e1SPrashanth Swaminathan
14*1fd5a2e1SPrashanth Swaminathan   The above copyright notice and this permission notice shall be included
15*1fd5a2e1SPrashanth Swaminathan   in all copies or substantial portions of the Software.
16*1fd5a2e1SPrashanth Swaminathan
17*1fd5a2e1SPrashanth Swaminathan   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
18*1fd5a2e1SPrashanth Swaminathan   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19*1fd5a2e1SPrashanth Swaminathan   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20*1fd5a2e1SPrashanth Swaminathan   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
21*1fd5a2e1SPrashanth Swaminathan   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
22*1fd5a2e1SPrashanth Swaminathan   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23*1fd5a2e1SPrashanth Swaminathan   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
24*1fd5a2e1SPrashanth Swaminathan   DEALINGS IN THE SOFTWARE.
25*1fd5a2e1SPrashanth Swaminathan   ----------------------------------------------------------------------- */
26*1fd5a2e1SPrashanth Swaminathan
27*1fd5a2e1SPrashanth Swaminathan#define LIBFFI_ASM
28*1fd5a2e1SPrashanth Swaminathan#include <fficonfig.h>
29*1fd5a2e1SPrashanth Swaminathan#include <ffi.h>
30*1fd5a2e1SPrashanth Swaminathan
31*1fd5a2e1SPrashanth Swaminathan.text
32*1fd5a2e1SPrashanth Swaminathan	.globl ffi_call_SYSV
33*1fd5a2e1SPrashanth Swaminathan	.type ffi_call_SYSV, @function
34*1fd5a2e1SPrashanth Swaminathan/*
35*1fd5a2e1SPrashanth Swaminathan  r3: size to allocate on stack
36*1fd5a2e1SPrashanth Swaminathan  r4: extended cif structure
37*1fd5a2e1SPrashanth Swaminathan  r5: function pointer ffi_prep_args
38*1fd5a2e1SPrashanth Swaminathan  r6: ret address
39*1fd5a2e1SPrashanth Swaminathan  r7: function to call
40*1fd5a2e1SPrashanth Swaminathan  r8: flag for return type
41*1fd5a2e1SPrashanth Swaminathan*/
42*1fd5a2e1SPrashanth Swaminathan
43*1fd5a2e1SPrashanth Swaminathanffi_call_SYSV:
44*1fd5a2e1SPrashanth Swaminathan	/* Store registers used on stack */
45*1fd5a2e1SPrashanth Swaminathan	l.sw -4(r1), r9 /* return address */
46*1fd5a2e1SPrashanth Swaminathan	l.sw -8(r1), r1 /* stack address */
47*1fd5a2e1SPrashanth Swaminathan	l.sw -12(r1), r14 /* callee saved registers */
48*1fd5a2e1SPrashanth Swaminathan	l.sw -16(r1), r16
49*1fd5a2e1SPrashanth Swaminathan	l.sw -20(r1), r18
50*1fd5a2e1SPrashanth Swaminathan	l.sw -24(r1), r20
51*1fd5a2e1SPrashanth Swaminathan
52*1fd5a2e1SPrashanth Swaminathan	l.ori r14, r1, 0x0 /* save stack pointer */
53*1fd5a2e1SPrashanth Swaminathan	l.addi r1, r1, -24
54*1fd5a2e1SPrashanth Swaminathan
55*1fd5a2e1SPrashanth Swaminathan	l.ori r16, r7, 0x0 /* save function address */
56*1fd5a2e1SPrashanth Swaminathan	l.ori r18, r6, 0x0 /* save ret address */
57*1fd5a2e1SPrashanth Swaminathan	l.ori r20, r8, 0x0 /* save flag */
58*1fd5a2e1SPrashanth Swaminathan
59*1fd5a2e1SPrashanth Swaminathan	l.sub r1, r1, r3 /* reserve space on stack */
60*1fd5a2e1SPrashanth Swaminathan
61*1fd5a2e1SPrashanth Swaminathan	/* Call ffi_prep_args */
62*1fd5a2e1SPrashanth Swaminathan	l.ori r3, r1, 0x0  /* first argument stack address, second already ecif */
63*1fd5a2e1SPrashanth Swaminathan	l.jalr r5
64*1fd5a2e1SPrashanth Swaminathan	l.nop
65*1fd5a2e1SPrashanth Swaminathan
66*1fd5a2e1SPrashanth Swaminathan	/* Load register arguments and call*/
67*1fd5a2e1SPrashanth Swaminathan
68*1fd5a2e1SPrashanth Swaminathan	l.lwz r3, 0(r1)
69*1fd5a2e1SPrashanth Swaminathan	l.lwz r4, 4(r1)
70*1fd5a2e1SPrashanth Swaminathan	l.lwz r5, 8(r1)
71*1fd5a2e1SPrashanth Swaminathan	l.lwz r6, 12(r1)
72*1fd5a2e1SPrashanth Swaminathan	l.lwz r7, 16(r1)
73*1fd5a2e1SPrashanth Swaminathan	l.lwz r8, 20(r1)
74*1fd5a2e1SPrashanth Swaminathan	l.ori r1, r11, 0x0 /* new stack pointer */
75*1fd5a2e1SPrashanth Swaminathan	l.jalr r16
76*1fd5a2e1SPrashanth Swaminathan	l.nop
77*1fd5a2e1SPrashanth Swaminathan
78*1fd5a2e1SPrashanth Swaminathan	/* handle return values */
79*1fd5a2e1SPrashanth Swaminathan
80*1fd5a2e1SPrashanth Swaminathan	l.sfeqi r20, FFI_TYPE_STRUCT
81*1fd5a2e1SPrashanth Swaminathan	l.bf ret  /* structs don't return an rvalue */
82*1fd5a2e1SPrashanth Swaminathan	l.nop
83*1fd5a2e1SPrashanth Swaminathan
84*1fd5a2e1SPrashanth Swaminathan	/* copy ret address */
85*1fd5a2e1SPrashanth Swaminathan
86*1fd5a2e1SPrashanth Swaminathan	l.sfeqi r20, FFI_TYPE_UINT64
87*1fd5a2e1SPrashanth Swaminathan	l.bnf four_byte_ret  /* 8 byte value is returned */
88*1fd5a2e1SPrashanth Swaminathan	l.nop
89*1fd5a2e1SPrashanth Swaminathan
90*1fd5a2e1SPrashanth Swaminathan	l.sw 4(r18), r12
91*1fd5a2e1SPrashanth Swaminathan
92*1fd5a2e1SPrashanth Swaminathanfour_byte_ret:
93*1fd5a2e1SPrashanth Swaminathan	l.sw 0(r18), r11
94*1fd5a2e1SPrashanth Swaminathan
95*1fd5a2e1SPrashanth Swaminathanret:
96*1fd5a2e1SPrashanth Swaminathan	/* return */
97*1fd5a2e1SPrashanth Swaminathan	l.ori r1, r14, 0x0 /* reset stack pointer */
98*1fd5a2e1SPrashanth Swaminathan	l.lwz r9, -4(r1)
99*1fd5a2e1SPrashanth Swaminathan	l.lwz r1, -8(r1)
100*1fd5a2e1SPrashanth Swaminathan	l.lwz r14, -12(r1)
101*1fd5a2e1SPrashanth Swaminathan	l.lwz r16, -16(r1)
102*1fd5a2e1SPrashanth Swaminathan	l.lwz r18, -20(r1)
103*1fd5a2e1SPrashanth Swaminathan	l.lwz r20, -24(r1)
104*1fd5a2e1SPrashanth Swaminathan	l.jr r9
105*1fd5a2e1SPrashanth Swaminathan	l.nop
106*1fd5a2e1SPrashanth Swaminathan
107*1fd5a2e1SPrashanth Swaminathan.size ffi_call_SYSV, .-ffi_call_SYSV
108