hvisor Hardware Adaptation Development Manual 🧑🏻💻
wheatfox (wheatfox17@icloud.com) 2025.3.17
Design Principles
- Code and board configuration separation: No
platform_xxxrelatedcfgshould appear insidesrcof hvisor itself. - Platform independence: Introduce the previous hvisor-deploy architecture, orderly store information about various architectures and boards in the
platformdirectory. - Board directory index:
- Uniformly use
platform/$ARCH/$BOARDas the dedicated directory for the board. - Each board's unique BID (Board ID) adopts the
ARCH/BOARDformat, such asaarch64/qemu-gicv3.
- Uniformly use
- Simplified compilation: Support using
BID=xxx/xxxto directly specify the board, while also compatible withARCH=xxx BOARD=xxxstyle. - Structured configuration: Each board directory contains the following files:
linker.ld- Link scriptplatform.mk- QEMU startup Makefile andhvisor.binhandlingboard.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.ldconfiguration. config.template.tomluses placeholders like__ARCH__,__BOARD__, replaced bygen_cargo_config.shto generate.cargo/config.toml.
build.rs Automatically Symlink board.rs
build.rsis responsible for symlinkingplatform/$ARCH/$BOARD/board.rstosrc/platform/__board.rs.- Avoids Makefile handling, triggered only when
envvariables change, reducing unnecessary full recompilations.
Select drivers through Cargo features
- Avoid
platform_xxxdirectly appearing insrc/, switch to configuration based onfeatures. cargo/featuresuniformly 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 existingfeaturesfor classification, add required drivers and configurations. - Create
platform/$ARCH/$BOARDdirectory:- Add
linker.ld,board.rs,features, etc.
- Add
- Compile Test:
make BID=xxx/new_board
features Design Principles
- Minimize hierarchy:
- For example,
cpu-a72instead 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, ...