invokeNative_thumb.s 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  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 ptr
  13. * r1 argv
  14. * r2 argc
  15. */
  16. invokeNative:
  17. push {r4, r5, r6, r7}
  18. push {lr}
  19. mov ip, r0 /* ip = function ptr */
  20. mov r4, r1 /* r4 = argv */
  21. mov r5, r2 /* r5 = argc */
  22. cmp r5, #1 /* at least one argument required: exec_env */
  23. blt return
  24. mov r6, #0 /* increased stack size */
  25. ldr r0, [r4] /* r0 = argv[0] = exec_env */
  26. add r4, r4, #4 /* r4 += 4 */
  27. cmp r5, #1
  28. beq call_func
  29. ldr r1, [r4] /* r1 = argv[1] */
  30. add r4, r4, #4
  31. cmp r5, #2
  32. beq call_func
  33. ldr r2, [r4] /* r2 = argv[2] */
  34. add r4, r4, #4
  35. cmp r5, #3
  36. beq call_func
  37. ldr r3, [r4] /* r3 = argv[3] */
  38. add r4, r4, #4
  39. cmp r5, #4
  40. beq call_func
  41. sub r5, r5, #4 /* argc -= 4, now we have r0 ~ r3 */
  42. /* Ensure address is 8 byte aligned */
  43. lsl r6, r5, #2 /* r6 = argc * 4 */
  44. mov r7, #7
  45. add r6, r6, r7 /* r6 = (r6 + 7) & ~7 */
  46. bic r6, r6, r7
  47. add r6, r6, #4 /* +4 because odd(5) registers are in stack */
  48. mov r7, sp
  49. sub r7, r7, r6 /* reserved stack space for left arguments */
  50. mov sp, r7
  51. mov lr, r2 /* save r2 */
  52. loop_args: /* copy left arguments to stack */
  53. cmp r5, #0
  54. beq call_func1
  55. ldr r2, [r4]
  56. add r4, r4, #4
  57. str r2, [r7]
  58. add r7, r7, #4
  59. sub r5, r5, #1
  60. b loop_args
  61. call_func1:
  62. mov r2, lr /* restore r2 */
  63. call_func:
  64. blx ip
  65. add sp, sp, r6 /* restore sp */
  66. return:
  67. pop {r3}
  68. pop {r4, r5, r6, r7}
  69. mov lr, r3
  70. bx lr