lama_byterun/runtime/gc_runtime.s

117 lines
2.3 KiB
ArmAsm
Raw Normal View History

2018-11-21 14:23:35 +03:00
.data
printf_format: .string "Stack root: %lx\n"
printf_format2: .string "BOT: %lx\n"
printf_format3: .string "TOP: %lx\n"
printf_format4: .string "EAX: %lx\n"
printf_format5: .string "LOL\n"
__gc_stack_bottom: .long 0
__gc_stack_top: .long 0
2018-12-05 18:31:12 +03:00
.globl __pre_gc
.globl __post_gc
2020-08-02 23:56:21 +03:00
.globl __gc_init
2018-11-29 18:27:59 +03:00
.globl __gc_root_scan_stack
.globl __gc_stack_top
.globl __gc_stack_bottom
2018-11-29 18:27:59 +03:00
.extern init_pool
.extern gc_test_and_copy_root
2018-11-21 14:23:35 +03:00
.text
2018-12-11 10:22:23 +03:00
2020-08-02 23:56:21 +03:00
__gc_init: movl %ebp, __gc_stack_bottom
2018-11-21 14:23:35 +03:00
addl $4, __gc_stack_bottom
2020-08-02 23:56:21 +03:00
call __init
2018-11-21 14:23:35 +03:00
ret
// if __gc_stack_top is equal to 0
// then set __gc_stack_top to %ebp
// else return
2018-12-05 18:31:12 +03:00
__pre_gc:
pushl %eax
movl __gc_stack_top, %eax
cmpl $0, %eax
jne __pre_gc_2
movl %ebp, %eax
// addl $8, %eax
movl %eax, __gc_stack_top
__pre_gc_2:
popl %eax
ret
2018-12-11 10:22:23 +03:00
// if __gc_stack_top has been set by the caller
// (i.e. it is equal to its %ebp)
// then set __gc_stack_top to 0
// else return
__post_gc:
pushl %eax
movl __gc_stack_top, %eax
cmpl %eax, %ebp
jnz __post_gc2
movl $0, __gc_stack_top
__post_gc2:
popl %eax
ret
2018-12-05 18:31:12 +03:00
// Scan stack for roots
// strting from __gc_stack_top
// till __gc_stack_bottom
2018-11-21 14:23:35 +03:00
__gc_root_scan_stack:
pushl %ebp
movl %esp, %ebp
pushl %ebx
pushl %edx
2018-12-05 18:31:12 +03:00
movl __gc_stack_top, %eax
2018-11-29 18:27:59 +03:00
jmp next
2018-11-21 14:23:35 +03:00
loop:
movl (%eax), %ebx
// check that it is not a pointer to code section
// i.e. the following is not true:
// __executable_start <= (%eax) <= __etext
check11:
leal __executable_start, %edx
cmpl %ebx, %edx
jna check12
jmp check21
check12:
leal __etext, %edx
cmpl %ebx, %edx
jnb next
// check that it is not a pointer into the program stack
// i.e. the following is not true:
// __gc_stack_bottom <= (%eax) <= __gc_stack_top
check21:
cmpl %ebx, __gc_stack_top
jna check22
jmp loop2
check22:
cmpl %ebx, __gc_stack_bottom
jnb next
// check if it a valid pointer
// i.e. the lastest bit is set to zero
loop2:
andl $0x00000001, %ebx
jnz next
2018-11-29 18:27:59 +03:00
gc_run_t:
2018-11-21 14:23:35 +03:00
pushl %eax
2018-11-29 18:27:59 +03:00
pushl %eax
call gc_test_and_copy_root
2018-11-29 18:27:59 +03:00
addl $4, %esp
2018-11-21 14:23:35 +03:00
popl %eax
next:
addl $4, %eax
cmpl %eax, __gc_stack_bottom
jne loop
2018-11-29 18:27:59 +03:00
returnn:
movl $0, %eax
popl %edx
popl %ebx
movl %ebp, %esp
popl %ebp
2018-11-21 14:23:35 +03:00
ret