mirror of
https://github.com/corda/corda.git
synced 2025-01-10 06:52:44 +00:00
77 lines
1.4 KiB
Plaintext
77 lines
1.4 KiB
Plaintext
|
AREA text, CODE, ARM
|
||
|
|
||
|
EXPORT vmNativeCall [FUNC]
|
||
|
vmNativeCall
|
||
|
; arguments:
|
||
|
; r0 -> r4 : function
|
||
|
; r1 -> r5 : stackTotal
|
||
|
; r2 : memoryTable
|
||
|
; r3 : memoryCount
|
||
|
; [sp, #0] -> r6 : gprTable
|
||
|
|
||
|
mov ip, sp ; save stack frame
|
||
|
stmfd sp!, {r4-r6, lr} ; save clobbered non-volatile regs
|
||
|
|
||
|
; mv args into non-volatile regs
|
||
|
mov r4, r0
|
||
|
mov r5, r1
|
||
|
ldr r6, [ip]
|
||
|
|
||
|
; setup stack arguments if necessary
|
||
|
sub sp, sp, r5 ; allocate stack
|
||
|
mov ip, sp
|
||
|
loop
|
||
|
tst r3, r3
|
||
|
ldrne r0, [r2], #4
|
||
|
strne r0, [ip], #4
|
||
|
subne r3, r3, #4
|
||
|
bne loop
|
||
|
|
||
|
; setup argument registers if necessary
|
||
|
tst r6, r6
|
||
|
ldmneia r6, {r0-r3}
|
||
|
|
||
|
blx r4 ; call function
|
||
|
add sp, sp, r5 ; deallocate stack
|
||
|
|
||
|
ldmfd sp!, {r4-r6, pc} ; restore non-volatile regs and return
|
||
|
|
||
|
EXPORT vmJump [FUNC]
|
||
|
vmJump
|
||
|
mov lr, r0
|
||
|
ldr r0, [sp]
|
||
|
ldr r1, [sp, #4]
|
||
|
mov sp, r2
|
||
|
mov r8, r3
|
||
|
bx lr
|
||
|
|
||
|
CHECKPOINT_THREAD EQU 4
|
||
|
CHECKPOINT_STACK EQU 24
|
||
|
|
||
|
EXPORT vmRun [FUNC]
|
||
|
vmRun
|
||
|
; r0: function
|
||
|
; r1: arguments
|
||
|
; r2: checkpoint
|
||
|
stmfd sp!, {r4-r11, lr}
|
||
|
; align stack
|
||
|
sub sp, sp, #12
|
||
|
|
||
|
str sp, [r2, #CHECKPOINT_STACK]
|
||
|
|
||
|
mov r12, r0
|
||
|
ldr r0, [r2, #CHECKPOINT_THREAD]
|
||
|
|
||
|
blx r12
|
||
|
|
||
|
EXPORT vmRun_returnAddress [FUNC]
|
||
|
vmRun_returnAddress
|
||
|
add sp, sp, #12
|
||
|
ldmfd sp!, {r4-r11, lr}
|
||
|
bx lr
|
||
|
|
||
|
EXPORT vmTrap [FUNC]
|
||
|
vmTrap
|
||
|
bkpt 3
|
||
|
|
||
|
END
|