mirror of
				https://github.com/bytecodealliance/wasm-micro-runtime.git
				synced 2025-10-31 13:17:31 +00:00 
			
		
		
		
	 272a41dc80
			
		
	
	
		272a41dc80
		
			
		
	
	
	
	
		
			
			Also refer to: https://github.com/fluent/fluent-bit/issues/10513 Signed-off-by: Jaco Kroon <jaco@uls.co.za>
		
			
				
	
	
		
			95 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			95 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| /*
 | |
|  * Copyright (C) 2019 Intel Corporation.  All rights reserved.
 | |
|  * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 | |
|  */
 | |
|         .text
 | |
|         .align  2
 | |
| #ifndef BH_PLATFORM_DARWIN
 | |
|         .globl invokeNative
 | |
|         .type  invokeNative, function
 | |
| invokeNative:
 | |
| #else
 | |
|         .globl _invokeNative
 | |
| _invokeNative:
 | |
| #endif /* end of BH_PLATFORM_DARWIN */
 | |
| 
 | |
| /*
 | |
|  * Arguments passed in:
 | |
|  *
 | |
|  * r0 function ptr
 | |
|  * r1 argv
 | |
|  * r2 argc
 | |
|  */
 | |
| 
 | |
|         push    {r4, r5, r6, r7}
 | |
|         push    {lr}
 | |
|         sub     sp, sp, #4      /* make sp 8 byte aligned */
 | |
|         mov     ip, r0          /* ip = function ptr */
 | |
|         mov     r4, r1          /* r4 = argv */
 | |
|         mov     r5, r2          /* r5 = argc */
 | |
| 
 | |
|         cmp     r5, #1          /* at least one argument required: exec_env */
 | |
|         blt     return
 | |
| 
 | |
|         mov     r6, #0          /* increased stack size */
 | |
| 
 | |
|         ldr     r0, [r4]        /* r0 = argv[0] = exec_env */
 | |
|         add     r4, r4, #4      /* r4 += 4 */
 | |
|         cmp     r5, #1
 | |
|         beq     call_func
 | |
| 
 | |
|         ldr     r1, [r4]        /* r1 = argv[1] */
 | |
|         add     r4, r4, #4
 | |
|         cmp     r5, #2
 | |
|         beq     call_func
 | |
| 
 | |
|         ldr     r2, [r4]        /* r2 = argv[2] */
 | |
|         add     r4, r4, #4
 | |
|         cmp     r5, #3
 | |
|         beq     call_func
 | |
| 
 | |
|         ldr     r3, [r4]        /* r3 = argv[3] */
 | |
|         add     r4, r4, #4
 | |
|         cmp     r5, #4
 | |
|         beq     call_func
 | |
| 
 | |
|         sub    r5, r5, #4       /* argc -= 4, now we have r0 ~ r3 */
 | |
| 
 | |
|         /* Ensure address is 8 byte aligned */
 | |
|         lsl     r6, r5, #2      /* r6 = argc * 4 */
 | |
|         mov     r7, #7
 | |
|         add     r6, r6, r7      /* r6 = (r6 + 7) & ~7 */
 | |
|         bic     r6, r6, r7
 | |
|         add     r6, r6, #4      /* +4 because odd(5) registers are in stack */
 | |
|         mov     r7, sp
 | |
|         sub     r7, r7, r6      /* reserved stack space for left arguments */
 | |
|         mov     sp, r7
 | |
| 
 | |
|         mov     lr, r2          /* save r2 */
 | |
| loop_args:                      /* copy left arguments to stack */
 | |
|         cmp     r5, #0
 | |
|         beq     call_func1
 | |
|         ldr     r2, [r4]
 | |
|         add     r4, r4, #4
 | |
|         str     r2, [r7]
 | |
|         add     r7, r7, #4
 | |
|         sub     r5, r5, #1
 | |
|         b       loop_args
 | |
| 
 | |
| call_func1:
 | |
|         mov     r2, lr          /* restore r2 */
 | |
| 
 | |
| call_func:
 | |
|         blx     ip
 | |
|         add     sp, sp, r6       /* restore sp */
 | |
| 
 | |
| return:
 | |
|         add     sp, sp, #4      /* make sp 8 byte aligned */
 | |
|         pop     {r3}
 | |
|         pop     {r4, r5, r6, r7}
 | |
|         mov     lr, r3
 | |
|         bx      lr
 | |
| #if defined(__linux__) && defined(__ELF__)
 | |
| .section .note.GNU-stack,"",%progbits
 | |
| #endif
 |