hvisor Hardware Adaptation Development Manual 🧑🏻💻
wheatfox (wheatfox17@icloud.com) 2025.3.17
Design Principles
- Code and board configuration separation: No
platform_xxx
relatedcfg
should appear insidesrc
of hvisor itself. - Platform independence: Introduce the previous hvisor-deploy architecture, orderly store information about various architectures and boards in the
platform
directory. - Board directory index:
- Uniformly use
platform/$ARCH/$BOARD
as the dedicated directory for the board. - Each board's unique BID (Board ID) adopts the
ARCH/BOARD
format, such asaarch64/qemu-gicv3
.
- Uniformly use
- Simplified compilation: Support using
BID=xxx/xxx
to directly specify the board, while also compatible withARCH=xxx BOARD=xxx
style. - Structured configuration: Each board directory contains the following files:
linker.ld
- Link scriptplatform.mk
- QEMU startup Makefile andhvisor.bin
handlingboard.rs
- Board definition Rust codeconfigs/
- JSON configurations for hvisor-tool startup zonescargo/
features
- Specific cargo features corresponding to the board, including drivers, functions, etc.config.template.toml
- Template for.cargo/config
, maintained by each board
test/
- (Optional) QEMU related test code, including unit tests, system tests, etc.image/
- Startup file directory, containing multiple subdirectories:bootloader/
- (Optional) Used for local QEMU operation and unittest/systemtest testingdts/
- (Optional) Device tree source files for zones 0, 1, 2, …its/
- (Optional) Used for generating U-Boot FIT image (hvisor aarch64 zcu102)acpi/
- (Optional) ACPI device tree source code for x86 platform (hvisor x86_64)kernel/
- (Optional) Kernel Image suitable for the target platformvirtdisk/
- (Optional) Virtual disk files, such as rootfs, etc.
Code Implementation Details
Auto-generate .cargo/config.toml
- Generated by
tools/gen_cargo_config.sh
, ensuring dynamic updates to thelinker.ld
configuration. config.template.toml
uses placeholders like__ARCH__
,__BOARD__
, replaced bygen_cargo_config.sh
to generate.cargo/config.toml
.
build.rs
Automatically Symlink board.rs
build.rs
is responsible for symlinkingplatform/$ARCH/$BOARD/board.rs
tosrc/platform/__board.rs
.- Avoids Makefile handling, triggered only when
env
variables change, reducing unnecessary full recompilations.
Select drivers through Cargo features
- Avoid
platform_xxx
directly appearing insrc/
, switch to configuration based onfeatures
. cargo/features
uniformly stores configurations of board drivers, functions, etc.
Overview of features
Corresponding to Each Board
BOARD ID | FEATURES |
---|---|
aarch64/qemu-gicv3 | gicv3 pl011 iommu pci pt_layout_qemu |
aarch64/qemu-gicv2 | gicv2 pl011 iommu pci pt_layout_qemu |
aarch64/imx8mp | gicv3 imx_uart |
aarch64/zcu102 | gicv2 xuartps |
riscv64/qemu-plic | plic |
riscv64/qemu-aia | aia |
loongarch64/ls3a5000 | loongson_chip_7a2000 loongson_uart loongson_cpu_3a5000 |
loongarch64/ls3a6000 | loongson_chip_7a2000 loongson_uart loongson_cpu_3a6000 |
aarch64/rk3588 | gicv3 uart_16550 uart_addr_rk3588 pt_layout_rk |
aarch64/rk3568 | gicv3 uart_16550 uart_addr_rk3568 pt_layout_rk |
x86_64/qemu |
Development and Compilation Guide
Compile Different Boards
make ARCH=aarch64 BOARD=qemu-gicv3
make BID=aarch64/qemu-gicv3 # Use BID shorthand
make BID=aarch64/imx8mp
make BID=loongarch64/ls3a5000
make BID=x86_64/qemu
Adapt New Boards
- Determine
features
: Refer to existingfeatures
for classification, add required drivers and configurations. - Create
platform/$ARCH/$BOARD
directory:- Add
linker.ld
,board.rs
,features
, etc.
- Add
- Compile Test:
make BID=xxx/new_board
features
Design Principles
- Minimize hierarchy:
- For example,
cpu-a72
instead ofboard_xxx
, to facilitate reuse across multiple boards.
- For example,
- Clear driver/function classification:
irqchip
(gicv3
,plic
, ...)uart
(pl011
,imx_uart
, ...)iommu
,pci
,pt_layout_xxx
, ...