stuff
This commit is contained in:
commit
df8e4931f4
11
Makefile
Normal file
11
Makefile
Normal file
|
@ -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 $@
|
31
macros.s
Normal file
31
macros.s
Normal file
|
@ -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
|
166
uskel.s
Normal file
166
uskel.s
Normal file
|
@ -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
|
Loading…
Reference in a new issue