Files
Toooba/Tests/isa/MemoryAllocator.S

165 lines
3.2 KiB
ArmAsm

.option norvc
.option norelax
# ==================================================
# Text section
# ==================================================
.section .text
.globl _start
.globl vm_boot
_start:
vm_boot:
# Only hart 0 runs
csrr a0, mhartid
bnez a0, hang
# --------------------------------------------------
# Page tables (Sv39, identity map)
# --------------------------------------------------
la t0, l1_pt
srli t0, t0, 12
slli t0, t0, 10
ori t0, t0, 1
la t1, root_pt
sd t0, 0(t1)
la t0, l0_pt
srli t0, t0, 12
slli t0, t0, 10
ori t0, t0, 1
la t1, l1_pt
sd t0, 0(t1)
li t0, (1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<6) # V R W X A
la t1, l0_pt
sd t0, 0(t1)
# Enable Sv39
la t0, root_pt
srli t0, t0, 12
li t1, (8 << 60)
or t0, t0, t1
csrw satp, t0
sfence.vma zero, zero
# --------------------------------------------------
# Init allocator (explicit, no .bss)
# --------------------------------------------------
la t0, heap_base
la t1, heap_ptr
sd t0, 0(t1)
la t0, free_list
sd zero, 0(t0)
# --------------------------------------------------
# Allocate free reuse test
# --------------------------------------------------
li a0, 16
jal ra, alloc
mv s1, a0
li t0, 0x1122334455667788
sd t0, 0(s1)
mv a0, s1
jal ra, free
li a0, 16
jal ra, alloc
mv s2, a0
ld t1, 0(s2)
li t0, 0x1122334455667788
bne t1, t0, hang
# success
la t0, tohost
li t1, 1
sd t1, 0(t0)
hang:
wfi
j hang
# ==================================================
# alloc(size)
# a0 = size
# returns a0 = ptr
# ==================================================
.globl alloc
alloc:
la t0, free_list
ld t1, 0(t0)
beqz t1, alloc_bump
# pop free list
ld t2, 0(t1)
sd t2, 0(t0)
addi a0, t1, 8
ret
alloc_bump:
la t0, heap_ptr
ld t1, 0(t0)
addi t2, a0, 8
add t3, t1, t2
la t4, heap_end
bgtu t3, t4, hang
sd t3, 0(t0)
addi a0, t1, 8
ret
# ==================================================
# free(ptr)
# a0 = user pointer
# ==================================================
.globl free
free:
addi t0, a0, -8
la t1, free_list
ld t2, 0(t1)
sd t2, 0(t0)
sd t0, 0(t1)
ret
# ==================================================
# Exit symbol
# ==================================================
.globl exit
exit:
j exit
# ==================================================
# Data section (NO .bss)
# ==================================================
.section .data
.align 3
# Host interface
.globl tohost
.globl fromhost
tohost: .dword 0
fromhost: .dword 0
# Allocator state (explicitly initialized)
.globl heap_ptr
.globl free_list
heap_ptr: .dword 0
free_list: .dword 0
# Heap
.align 12
heap_base:
.zero 4096
heap_end:
# Page tables
.align 12
root_pt: .zero 4096
.align 12
l1_pt: .zero 4096
.align 12
l0_pt: .zero 4096