Jinak přes weekend jsem akorát pokusničil s testem, který mělo SiFive pro bare-metal testování MMU na U74 a U54, a s naším QtRvSim simulátorem, který plánujeme před LinuxDays vydat s podporou MMU. Po řešení problémů s buildem testu, jeho úpravami pro náš UART a opravami a rozšiřováním simulátoru jsem se dostal k výpisu
Boot Hart Entered Main!
vm_boot reached
vm_boot switch to user
handle_fault
ABhandle_fault
handle_fault
handle_fault
handle_fault
CABCABCABCAB
První řádka je puts z M-mode přes smyčku do emulovaného QtRvSim UARTu, druhá a třetí je z M-mode přes putchar, který jsem si naimplementoval jako sysccall na CAUSE_MACHINE_ECALL handleru, ve vm_boot se nastaví nahoře MEGAPAGE pro systém a dole nevyplněný kus na stránky pro UNPRIVILEGED/USER, pak se provede mret do USER kódu, ale ten tam ještě není mapovaný, page-fault spadně do SUPERVISOR/SYSTEM, ten namapuje kód do odpovídající stránky dole a přes ten puchar ecall vypíše handle_faul přes M-mode, po návratu již běží test funkčnosti instrukcí v assembleru v U-mode. Kolem této části jsou ecall z S-mode, které píší A a B přes CAUSE_USER_ECALL zpracovávaný delegací v S-mode, který putchar předává přes ecall do M-mode. Dále jsem pak přidal postupné čtení slov přes další čtyři stránky, ty jsou postupně namapované přes ty handle_fault v S-mode. Nakonec user code vypíše přes ecall C a test jede znova, s tím, že nyní jsou stránky namapované.
S testem byl hlavní problém najít správný způsob kompilace, kdy ze stejného buildu kódu běží M-mode na původních adresách, pak se S-mode část mapuje na 2^64-SUPERPAGE a user mode se mapuje od 4k výše. Nakonec hlavní finta byla zakázat pic (position independent), protože ten vyplní GOT na pevné adresy, a použít medany mód, který do bloku pod 2 GB vytvoří kompatní kód a data.
riscv64-unknown-elf-gcc -march=rv64ima_zicsr -mabi=lp64 -fno-lto -ggdb -fno-pic -mcmodel=medany -nostdlib -nodefaultlibs -nostartfiles -Triscv64-bare.ld -ggdb -I . ...
Ještě je potřeba ve správných místech (reset, přechod do U, S a M mode) nastavit global pointer
.option push
.option norelax
la gp, __global_pointer$
.option pop
Jinak na QtRvSim nám již od jara běží upravený XV6. Je to systém odpovídající UNIX verze 6 přepsaný pro výuku do moderního C na Parallel and Distributed Operating Systems group (PDOS) at MIT CSAIL.
Co se pak týče zkoumání kódu pro SiFive U54, tak mi to přináší znalosti i pro práci na systému
RTEMS, kde mají kolegové zájem práci na rozvoji portu pro letové Microchip PolarFire čipy, kde jsou právě 4x U54-MC + management E51 (v podstatě SiFive Freedom U540 + FPGA).
Pokud bude přijatá naše RISC-V přednáška na LinuxDays, tak na mnohem lépe na výuku připraveném jednoduchém příkládku pro náš QtRvSim simulátor zkusíme základy stránkování obecně a i na RISC-V vysvětlit, viz předáška o stránkování z kurzu základů architektur počítačů B35APO.
V další přednášce (pokud bude schválená) pak bude pan Jakub Jurčík předvádět, jak si dopsat debug modul napojitelný na GDB i grafické nadstavby pro vlastní RISC-V procesor ve VHDL simulovaný v GHDL, více jeho bakalářská práce Debugging and Interrupt Support for VHDL Pipelined Educational RISC-V Core.