165 lines
3.2 KiB
ArmAsm
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 |