.text
.globl _start
.equ PAGE_SIZE 4096
.equ ATTR 0x0CF
.equ PTE_V 1
# PTE_V = 0x001
# PTE_R = 0x002
# PTE_W = 0x004
# PTE_X = 0x008
# PTE_A = 0x040
# PTE_D = 0x080
# -------------------------------------------------
# start v M-mode
# -------------------------------------------------
_start:
# vytvořit mapování
la a0, _start
addi a1, a0, 0
call map_page
li a0, 0x6000
la a1, source_page
call map_page
li a0, 0x7000
la a1, target_page
call map_page
# nastavit satp (Sv32)
la t0, l1_table
srli t0, t0, 12
li t1, 0x80000000
or t0, t0, t1
csrw satp, t0
fence
# připravit přechod do S-mode
la t0, s_mode_start
csrw mepc, t0
csrr t1, mstatus
li t2, 0xffffe700 # ~(3 << 11) # clear MPP
and t1, t1, t2
li t2, 0x800 # (1 << 11) # MPP = S
or t1, t1, t2
csrw mstatus, t1
mret
# -------------------------------------------------
# map_page(a0 = virtuální adresa, a1 = fyzicka adresa)
# -------------------------------------------------
map_page:
mv t0, a0
# VPN1
srli t1, t0, 22
andi t1, t1, 0x3ff
slli t1, t1, 2
la t2, l1_table
add t3, t2, t1
# pokud L1 prázdná → vložit L0
lw t4, 0(t3)
bnez t4, l1_ok
la t5, l0_table
srli t5, t5, 12
slli t5, t5, 10
ori t5, t5, 1
sw t5, 0(t3)
l1_ok:
# VPN0
srli t1, t0, 12
andi t1, t1, 0x3ff
slli t1, t1, 2
la t2, l0_table
add t3, t2, t1
# leaf PTE
srli t4, a1, 12
slli t4, t4, 10
li t5, 0xcf
or t4, t4, t5
sw t4, 0(t3)
ret
# -------------------------------------------------
# kód v S-mode
# -------------------------------------------------
s_mode_start:
li t0, 0x6000
li t1, 0x7000
li t2, 1024
copy_loop:
lw t3, 0(t0)
sw t3, 0(t1)
addi t0, t0, 4
addi t1, t1, 4
addi t2, t2, -1
bnez t2, copy_loop
hang:
j hang
#-------------------------------------------------
# Data
#-------------------------------------------------
.data
.org 0x1000
source_page:
.word 0x12345678, 1,2,3,4,5,6,7, 8, 9, 10, 11, 12 ,13, 14, 15
.word 0,1,2,3,4,5,6,7, 8, 9, 10, 11, 12 ,13, 14, 15
.word 0,1,2,3,4,5,6,7, 8, 9, 10, 11, 12 ,13, 14, 15
.word 0,1,2,3,4,5,6,7, 8, 9, 10, 11, 12 ,13, 14, 15
.word 0,1,2,3,4,5,6,7, 8, 9, 10, 11, 12 ,13, 14, 15
.word 0,1,2,3,4,5,6,7, 8, 9, 10, 11, 12 ,13, 14, 15
.word 0,1,2,3,4,5,6,7, 8, 9, 10, 11, 12 ,13, 14, 15
.word 0,1,2,3,4,5,6,7, 8, 9, 10, 11, 12 ,13, 14, 15
.org 0x2000
target_page:
.word 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
.word 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
.word 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
.word 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
.word 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
.word 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
.word 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
.word 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
#-------------------------------------------------
# Page table
#-------------------------------------------------
.org 0x3000
l1_table:
.word 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
.org 0x4000
l0_table:
.word 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0