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