Search
PDF
TeX
.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