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