invokeNative_arm.s 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. /*
  2. * Copyright (C) 2019 Intel Corporation. All rights reserved.
  3. * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  4. */
  5. .text
  6. .align 2
  7. .global invokeNative
  8. .type invokeNative,function
  9. /*
  10. * Arguments passed in:
  11. *
  12. * r0 function pntr
  13. * r1 argv
  14. * r2 argc
  15. */
  16. invokeNative:
  17. stmfd sp!, {r4, r5, r6, r7, lr}
  18. mov ip, r0 /* get function ptr */
  19. mov r4, r1 /* get argv */
  20. mov r5, r2 /* get argc */
  21. cmp r5, #2 /* is argc < 2 ? */
  22. blt return
  23. ldr r0, [r4], #4 /* argv[0] */
  24. ldr r1, [r4], #4 /* argv[1] */
  25. mov r6, #0
  26. cmp r5, #2
  27. beq call_func
  28. ldr r2, [r4], #4
  29. cmp r5, #3
  30. beq call_func
  31. ldr r3, [r4], #4
  32. subs r5, r5, #4 /* now we have r0 ~ r3 */
  33. /* Ensure address is 8 byte aligned */
  34. mov r6, r5, lsl#2
  35. add r6, r6, #7
  36. bic r6, r6, #7
  37. add r6, r6, #4 /* +4 because only odd(5) registers are in stack */
  38. subs sp, sp, r6 /* for stacked args */
  39. mov r7, sp
  40. loop_args:
  41. cmp r5, #0
  42. beq call_func
  43. ldr lr, [r4], #4
  44. str lr, [r7], #4
  45. subs r5, r5, #1
  46. b loop_args
  47. call_func:
  48. blx ip
  49. add sp, sp, r6 /* recover sp */
  50. return:
  51. ldmfd sp!, {r4, r5, r6, r7, lr}
  52. bx lr