aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMirek Kratochvil <exa.exa@gmail.com>2023-08-02 19:50:50 +0200
committerMirek Kratochvil <exa.exa@gmail.com>2023-08-02 19:50:50 +0200
commitdf8e4931f42bf5a7a8dc21cc31bb7383f3ca2c4d (patch)
tree5a5b104686635a4f5d2c27ec5cebad51b138576e
downloaduskel-df8e4931f42bf5a7a8dc21cc31bb7383f3ca2c4d.tar.gz
uskel-df8e4931f42bf5a7a8dc21cc31bb7383f3ca2c4d.tar.bz2
stuff
-rw-r--r--Makefile11
-rw-r--r--macros.s31
-rw-r--r--uskel.s166
3 files changed, 208 insertions, 0 deletions
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..d75a9df
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,11 @@
+
+all: uskel
+
+clean:
+ rm -f uskel.o uskel
+
+uskel.o: uskel.s $(wildcard *.s)
+ as $< -o $@
+
+uskel: uskel.o
+ ld $@.o -o $@
diff --git a/macros.s b/macros.s
new file mode 100644
index 0000000..fcb80eb
--- /dev/null
+++ b/macros.s
@@ -0,0 +1,31 @@
+
+.macro enter x
+ mov \x, %rbp
+ jmp *(%rbp)
+.endm
+
+.macro cell x
+ .quad \x
+.endm
+
+.macro continue
+ enter %rdi
+.endm
+
+.macro thunkenv arg, dest
+ mov (8*(\arg+2))(%rbp), \dest
+.endm
+
+.macro enter_thunkenv arg
+ mov (8*(\arg+2))(%rbp), %rbp
+ jmp *(%rbp)
+.endm
+
+.macro .makethunk name
+ .align 8
+ \name\()_info:
+ cell THU_evacuate
+ cell THU_scavenge
+ cell 0
+ \name:
+.endm
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