Code Monkey home page Code Monkey logo

unmatched-boot-build's Introduction

HiFive Unmatched сборка бутов

Сборка

$ git submodule update --init --recursive $ make kernel

Результирующие файлы:

build-linux/arch/riscv/boot/Image.gz
build-linux/arch/riscv/boot/dts/sifive/hifive-unmatched-a00.dtb

toolchain

тулчейн (https://github.com/riscv/riscv-gnu-toolchain) собирается вместе с проектом, полагается что у нас RV64GC с LP64D FLOAT ABI.

Можно просто положить (или подмонтировать) собранный тулчэйн на toolchain/riscv64-unknown-linux-gnu/

| The SiFive 7-series core IP options are 64-bit RISC-V RV64GC, RV64IMAC | | G - Shorthand for the IMAFDZicsr Zifencei base and extensions, intended to represent a standard general-purpose ISA | C - Standard Extension for Compressed Instructions | M - Standard Extension for Integer Multiplication and Division | A - Standard Extension for Atomic Instructions

Полезная ссылка по процессу загрузки HiFive Unmatched

https://github.com/carlosedp/riscv-bringup https://github.com/carlosedp/riscv-bringup/blob/master/unmatched/Readme.md

Заметка про reboot

https://forums.sifive.com/t/reboot-command/4721/7 https://www.dialog-semiconductor.com/products/pmics?post_id=10052#tab-support_tab_content https://github.com/riscv/opensbi/commits/master https://dpaste.com/AAS5ZTN8W

u-boot hijack

  • PROM на ядре с нулевым mhartid инициализирует переферийные делители осциллятора
  • PROM сканирует GPT партиции и ищет GUID 5B193300-FC78-40CD-8002-E86C45580B47
  • PROM загружает U-Boot SPL в L2 LIM (scratchpad TCM L2) в начало 0x08000000
  • U-Boot SPL помимо прочего инициализирует DDR и загружает u-boot.bin в 0x80200000, opensbi в 0x80000000
CONFIG_SPL_TEXT_BASE=0x08000000
CONFIG_SPL_LOAD_FIT_ADDRESS=0x84000000
CONFIG_SYS_TEXT_BASE=0x80200000
CONFIG_SPL_OPENSBI_LOAD_ADDR=0x80000000

Интересный момент, что в оригинальном конфиге Unmatched фигурирует CONFIG_SPL_LOAD_FIT_ADDRESS, хотя данный адрес используется только при загрузке spl_ram.

Дальнейшее нас пока не интересует. Из всего выше перечисленного можно сделать вывод, что возможна подмена образа U-Boot SPL и U-Boot, мы можем перехватить исполнение по адресу CONFIG_SPL_TEXT_BASE, загрузить свой U-Boot SPL, позволить U-Boot SPL произвести всю необходимую инициализацию и перехватить доступ по адресу CONFIG_SPL_LOAD_FIT_ADDRESS, загрузить по этому адресу U-Boot и продолжить исполнение.

Используется модифицированный конфиг sifive-hifive-unmatched-fu740 и модифицированный файл board/sifive/hifive_unmatched_fu740/spl.c, ветка riscv/unmatched-spl-ram.

Лучше всего использовать fork OpenOCD для RISCV: https://github.com/riscv/riscv-openocd

С конфигом openocd/openocd-unmatched.cfg

Функция для openocd:

proc load_uboot {} {
        reset init
        bp 0x08000000 0x1000 hw
        resume
        after 10000
        regexp {(0x[a-fA-F0-9]*)} [reg pc] pc
        echo "PC=$pc"
        load_image /home/user/nshubin/u-boot-spl.bin 0x8000000 bin
        rbp all
        wp 0x84000000 0x1000
        resume
        after 5000
        rwp 0x84000000
        load_image /home/user/nshubin/u-boot.itb 0x84000000 bin
        verify_image /home/user/nshubin/u-boot.itb 0x84000000 bin
        resume
}

Выхлоп:

U-Boot SPL 2021.01-00053-g8afbe20524-dirty (Jul 21 2021 - 04:00:02 +0000)
Trying to boot from RAM


U-Boot 2021.01-00053-g8afbe20524-dirty (Jul 21 2021 - 04:00:02 +0000)

Такая схема является рабочей до тех пор пока мы не трогаем оригинальный u-boot-spl.bin на MMC, если он по каким-то причинам отсутствует или отсутствует sd-карта, поведение PROM пока остается неизвестным, но вполне возможно, что можно просто загрузить u-boot-spl.bin и передать управление на адрес.

MSEL

> wp 0x00001000 0x4 
> wp
address: 0x00001000, len: 0x00000001, r/w/a: 2, value: 0x00000000, mask: 0xffffffff
> resume
> reg pc
pc (/64): 0x0000000000001008 -> (Reset Vector)
> resume
> reg pc
pc (/64): 0x00000000000101d8 -> (ZSBL)

Should be access from U-Boot SPL somewhere but i can't see it...

unmatched-boot-build's People

Contributors

maquefel avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.