aboutsummaryrefslogtreecommitdiff
path: root/uskel.s
diff options
context:
space:
mode:
Diffstat (limited to 'uskel.s')
-rw-r--r--uskel.s166
1 files changed, 166 insertions, 0 deletions
diff --git a/uskel.s b/uskel.s
new file mode 100644
index 0000000..d558856
--- /dev/null
+++ b/uskel.s
@@ -0,0 +1,166 @@
+
+.include "macros.s"
+
+.section .init
+.global _start
+_start:
+ jmp _uskel_start
+
+.section .bss
+_memory_state:
+ cell 0 # next free position
+ cell 0 # region start
+ cell 0 # region end
+
+.section .text
+
+_uskel_alloc_basic_mem:
+ mov $0x100000, %r15 # desired size
+
+ mov $0x9, %rax # mmap
+ mov $0, %rdi # addr = NULL
+ mov %r15, %rsi # len = %rcx
+ mov $0x3, %rdx # prot = PROT_READ 0x1 | PROT_WRITE 0x2
+ 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, (%rdi)
+ mov %rax, 0x8(%rdi)
+ add %r15, %rax
+ mov %rax, 0x10(%rdi)
+ retq
+
+_uskel_start:
+ call _uskel_alloc_basic_mem
+ mov _memory_state, %rdi
+ # push a thunk for main
+ mov %rdi, %r15 # backup main for later
+ movq $main, 0x00(%rdi)
+ movq $0, 0x08(%rdi)
+ add $0x10, %rdi
+ # save the memory ptr
+ mov %rdi, _memory_state
+
+ mov $0, %rsi # no result for main
+ mov $0, %rdi # set continuation to exit
+ enter %r15 # run the program
+
+# Simple values and boxed machine integers
+# | ptr | value |
+CON_evacuate1:
+ retq
+CON_scavenge1:
+ add $0x10, %rsi
+ retq
+INT_info_table:
+ cell CON_evacuate1
+ cell CON_scavenge1
+ cell 0
+INT_code:
+ continue
+
+# List
+# | ptr | 0 |
+# | ptr | 1 | a | b |
+LIST_evacuate:
+ # [] | a : b
+ retq #TODO
+LIST_scavenge:
+ mov 0x8(%rbp), %rax
+ shl $1, %rax
+ add $2, %rax
+ shl $3, %rax
+ add %rax, %rsi
+ retq
+LIST_info_table:
+ cell LIST_evacuate
+ cell LIST_scavenge
+ cell 0
+LIST_code:
+ continue
+
+# FUN/PAP combo objects
+# | ptr | thunkptr | args | arg[0] | arg[1] | ... | arg[args] |
+FUN_evacuate:
+ retq #TODO
+FUN_scavenge:
+ mov 0x10(%rbp), %rax
+ add $3, %rax
+ shl $3, %rax
+ add %rax, %rsi
+ retq
+
+# Simple info for n-ary functions
+# TODO continue to add as required
+fun1_info_table:
+ cell FUN_evacuate
+ cell FUN_scavenge
+ cell 1
+fun1_code:
+ continue
+
+fun2_info_table:
+ cell FUN_evacuate
+ cell FUN_scavenge
+ cell 2
+fun2_code:
+ continue
+
+fun3_info_table:
+ cell FUN_evacuate
+ cell FUN_scavenge
+ cell 3
+fun3_code:
+ continue
+
+# indirection (Q: how to recognize IND and THUNK on return?)
+# | ptr | indptr |
+IND_evacuate:
+ retq #TODO
+IND_scavenge:
+ add $0x10,%rsi
+ retq
+IND_info:
+ cell IND_evacuate
+ cell IND_scavenge
+ cell 0
+IND_code:
+ enter 0x8(%rbp)
+
+# THU objects (gc implementation only, actual THUs are defined by functions)
+# | ptr | args | arg[0] | arg[1] | ... | arg[args] |
+# args wouldn't need to be here but let's keep them for gc simplicity
+THU_evacuate:
+ retq #TODO
+THU_scavenge:
+ mov 0x8(%rbp), %rax
+ add $2,%rax
+ shl $3,%rax
+ add %rax,%rsi
+ retq
+
+#
+# Actual code!
+#
+
+.makethunk main
+ # push a thunk for main_exit
+ mov _memory_state, %r15
+ mov %r15, %r14 # backup for later
+ movq $main_exit, 0x00(%r15)
+ movq $1, 0x08(%r15)
+ mov %rdi, 0x10(%r15)
+ add $0x18, %r15
+ mov %r15, _memory_state
+ # continue 123
+ movq $INT_code, (%rbp)
+ movq $123, 0x8(%rbp)
+ mov %rbp, %rsi
+ enter %r14
+
+.makethunk main_exit
+ mov 0x8(%rsi), %rdi
+ mov $0x3c, %rax
+ syscall # exit %rdi