1*1fd5a2e1SPrashanth Swaminathan/* ----------------------------------------------------------------------- 2*1fd5a2e1SPrashanth Swaminathan eabi.S - Copyright (c) 2012, 2013 Anthony Green 3*1fd5a2e1SPrashanth Swaminathan 4*1fd5a2e1SPrashanth Swaminathan Moxie Assembly glue. 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, EXPRESS 18*1fd5a2e1SPrashanth Swaminathan OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 19*1fd5a2e1SPrashanth Swaminathan MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 20*1fd5a2e1SPrashanth Swaminathan IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR 21*1fd5a2e1SPrashanth Swaminathan OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 22*1fd5a2e1SPrashanth Swaminathan ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 23*1fd5a2e1SPrashanth Swaminathan OTHER DEALINGS IN THE SOFTWARE. 24*1fd5a2e1SPrashanth Swaminathan ----------------------------------------------------------------------- */ 25*1fd5a2e1SPrashanth Swaminathan 26*1fd5a2e1SPrashanth Swaminathan#define LIBFFI_ASM 27*1fd5a2e1SPrashanth Swaminathan#include <fficonfig.h> 28*1fd5a2e1SPrashanth Swaminathan#include <ffi.h> 29*1fd5a2e1SPrashanth Swaminathan 30*1fd5a2e1SPrashanth Swaminathan .globl ffi_prep_args_EABI 31*1fd5a2e1SPrashanth Swaminathan 32*1fd5a2e1SPrashanth Swaminathan .text 33*1fd5a2e1SPrashanth Swaminathan .p2align 4 34*1fd5a2e1SPrashanth Swaminathan .globl ffi_call_EABI 35*1fd5a2e1SPrashanth Swaminathan .type ffi_call_EABI, @function 36*1fd5a2e1SPrashanth Swaminathan 37*1fd5a2e1SPrashanth Swaminathan # $r0 : ffi_prep_args 38*1fd5a2e1SPrashanth Swaminathan # $r1 : &ecif 39*1fd5a2e1SPrashanth Swaminathan # $r2 : cif->bytes 40*1fd5a2e1SPrashanth Swaminathan # $r3 : fig->flags 41*1fd5a2e1SPrashanth Swaminathan # $r4 : ecif.rvalue 42*1fd5a2e1SPrashanth Swaminathan # $r5 : fn 43*1fd5a2e1SPrashanth Swaminathan 44*1fd5a2e1SPrashanth Swaminathanffi_call_EABI: 45*1fd5a2e1SPrashanth Swaminathan push $sp, $r6 46*1fd5a2e1SPrashanth Swaminathan push $sp, $r7 47*1fd5a2e1SPrashanth Swaminathan push $sp, $r8 48*1fd5a2e1SPrashanth Swaminathan dec $sp, 24 49*1fd5a2e1SPrashanth Swaminathan 50*1fd5a2e1SPrashanth Swaminathan /* Store incoming args on stack. */ 51*1fd5a2e1SPrashanth Swaminathan sto.l 0($sp), $r0 /* ffi_prep_args */ 52*1fd5a2e1SPrashanth Swaminathan sto.l 4($sp), $r1 /* ecif */ 53*1fd5a2e1SPrashanth Swaminathan sto.l 8($sp), $r2 /* bytes */ 54*1fd5a2e1SPrashanth Swaminathan sto.l 12($sp), $r3 /* flags */ 55*1fd5a2e1SPrashanth Swaminathan sto.l 16($sp), $r4 /* &rvalue */ 56*1fd5a2e1SPrashanth Swaminathan sto.l 20($sp), $r5 /* fn */ 57*1fd5a2e1SPrashanth Swaminathan 58*1fd5a2e1SPrashanth Swaminathan /* Call ffi_prep_args. */ 59*1fd5a2e1SPrashanth Swaminathan mov $r6, $r4 /* Save result buffer */ 60*1fd5a2e1SPrashanth Swaminathan mov $r7, $r5 /* Save the target fn */ 61*1fd5a2e1SPrashanth Swaminathan mov $r8, $r3 /* Save the flags */ 62*1fd5a2e1SPrashanth Swaminathan sub $sp, $r2 /* Allocate stack space */ 63*1fd5a2e1SPrashanth Swaminathan mov $r0, $sp /* We can stomp over $r0 */ 64*1fd5a2e1SPrashanth Swaminathan /* $r1 is already set up */ 65*1fd5a2e1SPrashanth Swaminathan jsra ffi_prep_args 66*1fd5a2e1SPrashanth Swaminathan 67*1fd5a2e1SPrashanth Swaminathan /* Load register arguments. */ 68*1fd5a2e1SPrashanth Swaminathan ldo.l $r0, 0($sp) 69*1fd5a2e1SPrashanth Swaminathan ldo.l $r1, 4($sp) 70*1fd5a2e1SPrashanth Swaminathan ldo.l $r2, 8($sp) 71*1fd5a2e1SPrashanth Swaminathan ldo.l $r3, 12($sp) 72*1fd5a2e1SPrashanth Swaminathan ldo.l $r4, 16($sp) 73*1fd5a2e1SPrashanth Swaminathan ldo.l $r5, 20($sp) 74*1fd5a2e1SPrashanth Swaminathan 75*1fd5a2e1SPrashanth Swaminathan /* Call the target function. */ 76*1fd5a2e1SPrashanth Swaminathan jsr $r7 77*1fd5a2e1SPrashanth Swaminathan 78*1fd5a2e1SPrashanth Swaminathan ldi.l $r7, 0xffffffff 79*1fd5a2e1SPrashanth Swaminathan cmp $r8, $r7 80*1fd5a2e1SPrashanth Swaminathan beq retstruct 81*1fd5a2e1SPrashanth Swaminathan 82*1fd5a2e1SPrashanth Swaminathan ldi.l $r7, 4 83*1fd5a2e1SPrashanth Swaminathan cmp $r8, $r7 84*1fd5a2e1SPrashanth Swaminathan bgt ret2reg 85*1fd5a2e1SPrashanth Swaminathan 86*1fd5a2e1SPrashanth Swaminathan st.l ($r6), $r0 87*1fd5a2e1SPrashanth Swaminathan jmpa retdone 88*1fd5a2e1SPrashanth Swaminathan 89*1fd5a2e1SPrashanth Swaminathanret2reg: 90*1fd5a2e1SPrashanth Swaminathan st.l ($r6), $r0 91*1fd5a2e1SPrashanth Swaminathan sto.l 4($r6), $r1 92*1fd5a2e1SPrashanth Swaminathan 93*1fd5a2e1SPrashanth Swaminathanretstruct: 94*1fd5a2e1SPrashanth Swaminathanretdone: 95*1fd5a2e1SPrashanth Swaminathan /* Return. */ 96*1fd5a2e1SPrashanth Swaminathan ldo.l $r6, -4($fp) 97*1fd5a2e1SPrashanth Swaminathan ldo.l $r7, -8($fp) 98*1fd5a2e1SPrashanth Swaminathan ldo.l $r8, -12($fp) 99*1fd5a2e1SPrashanth Swaminathan ret 100*1fd5a2e1SPrashanth Swaminathan .size ffi_call_EABI, .-ffi_call_EABI 101*1fd5a2e1SPrashanth Swaminathan 102