From 8504d72bda94c3a1668ebbdd262ae8a4963a23c1 Mon Sep 17 00:00:00 2001 From: Mirek Kratochvil Date: Sun, 29 Oct 2023 23:03:33 +0100 Subject: gc attempt 1 (to be cont'd) --- include/uskel.s | 79 +++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 49 insertions(+), 30 deletions(-) (limited to 'include/uskel.s') diff --git a/include/uskel.s b/include/uskel.s index 34ee63a..bca33c9 100644 --- a/include/uskel.s +++ b/include/uskel.s @@ -8,41 +8,57 @@ _start: .include "include/macros.s" +# this has globals .section .bss -_memory_state: - cell 0 # bottom of allocation (grows down) - cell 0 # region start - cell 0 # region end - cell 0 # program entry rsp (aka the actual stack) +_unix_rsp: + # back-up of program entry rsp (aka the actual stack given by the + # actual OS; we might like to use it at some point, maybe) + cell 0 +_write_region_start: + # begin of the active memory area + cell 0 +_write_region_end: + # end of the active memory area (%rsp kinda starts here and goes down + # towars the start) + cell 0 +_gc_last_size: + # how much data we evacuated last time + cell 0 +_gc_min_alloc: + # minimum possible allocation + cell 0x100000 # tunable constant +_gc_min_expect_ratio: + # 256th's of the minimal amount of memory increment compared to the + # last time. New minimal amount is compared as: + # (ratio * last size) >> 8 + cell 0x200 # tunable constant +_gc_region_start: + # in GC, this region is being evacuated and will eventually disappear + cell 0 +_gc_region_end: + # end of the disappear region + cell 0 +_gc_backup_thunk: + # backup of %rsi so that we can use the register for other nonsense + cell 0 +_gc_backup_cont: + # backup of %rbp for same reason + cell 0 .section .text -_uskel_alloc_basic_mem: - mov $0x100000, %r15 # desired size - - mov $9, %rax # mmap - mov $0, %rdi # addr = NULL - mov %r15, %rsi # len = %rcx - mov $0b11, %rdx # prot = PROT_READ 0b1 | PROT_WRITE 0b10 - mov $0x22, %r10 # flags = MAP_PRIVATE 0x2 | MAP_ANONYMOUS 0x20 - mov $-1, %r8 # fd = -1 - mov $0, %r9 # off = 0 - syscall - mov $_memory_state, %rdi - mov %rax, 010(%rdi) - add %r15, %rax - mov %rax, (%rdi) - mov %rax, 020(%rdi) - retq +.include "include/gc.s" _uskel_start: - call _uskel_alloc_basic_mem - # use the stack pointer for easy writing to the heap, - # but back it up to memory state - mov $_memory_state, %rdi - mov %rsp, 030(%rdi) - mov 0(%rdi), %rsp + # we use the stack pointer for easy writing to the heap; + # back it up to memory state just if we ever needed it again. + mov %rsp, _unix_rsp + # allocate the initial chunk of memory + mov $_uskel_start_main, %rsi + jmp _uskel_alloc + + _uskel_start_main: # push a thunk for main pushq $0 pushq $main @@ -50,5 +66,8 @@ _uskel_start: mov $0, %rsi # set continuation to exit enter %rsp # run the program # Q: are there gonna be functions that have both the argument AND the cont? - # A: No, stuff is either entered as return-continuation (takes res, cont has to be saved) or as forward call (takes cont) - # (needs validation) + # + # A: No, stuff is either entered as return-continuation (takes res, + # cont has to be saved) or as forward call (takes cont) + # + # (A needs validation) -- cgit v1.2.3