invokeNative_arm.s 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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. #ifndef BH_PLATFORM_DARWIN
  8. .globl invokeNative
  9. .type invokeNative, function
  10. invokeNative:
  11. #else
  12. .globl _invokeNative
  13. _invokeNative:
  14. #endif /* end of BH_PLATFORM_DARWIN */
  15. /*
  16. * Arguments passed in:
  17. *
  18. * r0 function ptr
  19. * r1 argv
  20. * r2 argc
  21. */
  22. stmfd sp!, {r4, r5, r6, r7, lr}
  23. sub sp, sp, #4 /* make sp 8 byte aligned */
  24. mov ip, r0 /* ip = function ptr */
  25. mov r4, r1 /* r4 = argv */
  26. mov r5, r2 /* r5 = argc */
  27. cmp r5, #1 /* at least one argument required: exec_env */
  28. blt return
  29. mov r6, #0 /* increased stack size */
  30. ldr r0, [r4], #4 /* r0 = argv[0] = exec_env */
  31. cmp r5, #1
  32. beq call_func
  33. ldr r1, [r4], #4 /* r1 = argv[1] */
  34. cmp r5, #2
  35. beq call_func
  36. ldr r2, [r4], #4 /* r2 = argv[2] */
  37. cmp r5, #3
  38. beq call_func
  39. ldr r3, [r4], #4 /* r3 = argv[3] */
  40. cmp r5, #4
  41. beq call_func
  42. sub r5, r5, #4 /* argc -= 4, now we have r0 ~ r3 */
  43. /* Ensure address is 8 byte aligned */
  44. mov r6, r5, lsl#2 /* r6 = argc * 4 */
  45. add r6, r6, #7 /* r6 = (r6 + 7) & ~7 */
  46. bic r6, r6, #7
  47. sub sp, sp, r6 /* reserved stack space for left arguments */
  48. mov r7, sp
  49. loop_args: /* copy left arguments to stack */
  50. cmp r5, #0
  51. beq call_func
  52. ldr lr, [r4], #4
  53. str lr, [r7], #4
  54. sub r5, r5, #1
  55. b loop_args
  56. call_func:
  57. blx ip
  58. add sp, sp, r6 /* restore sp */
  59. return:
  60. add sp, sp, #4
  61. ldmfd sp!, {r4, r5, r6, r7, lr}
  62. bx lr
  63. #if defined(__linux__) && defined(__ELF__)
  64. .section .note.GNU-stack,"",%progbits
  65. #endif