Skip to main content

U-Boot VxWorks Boot Guide: bootvx, bootm, and bootefi

·2046 words·10 mins
VxWorks U-Boot VxWorks 7 Embedded Systems Device-Tree Bootloader PowerPC ARM RISC-V X86
Table of Contents

U-Boot VxWorks Boot Guide: bootvx, bootm, and bootefi

U-Boot provides several mechanisms for loading and transferring control to a VxWorks kernel, with the appropriate method depending on the VxWorks generation, CPU architecture, image format, and firmware interface.

The three primary commands are bootvx, bootm, and bootefi. bootvx primarily serves legacy VxWorks boot flows, bootm provides the modern VxWorks 7 path on PowerPC, ARM, and RISC-V, while bootefi is used to chain-load VxWorks through a UEFI environment on x86 systems.

The boot architecture can be summarized as:

                         U-Boot
                           |
             +-------------+-------------+
             |             |             |
             v             v             v
          bootvx         bootm        bootefi
             |             |             |
             v             v             v
        Legacy ELF      uImage + DTB   UEFI Loader
             |             |             |
             +-------------+-------------+
                           |
                           v
                     VxWorks Kernel

Choosing the correct command is important because the three paths differ in image format, bootline handling, Device Tree processing, and kernel entry conventions.

🧭 Boot Command Compatibility
#

The supported command depends primarily on the target architecture and VxWorks version.

Command Typical VxWorks Compatibility Architecture / Workflow
bootvx Legacy VxWorks 6.9.x and VxWorks versions on other supported architectures Loads ELF images directly and prepares the VxWorks bootline
bootm VxWorks 7 Supports PowerPC, ARM, and RISC-V with kernel image plus DTB
bootefi VxWorks UEFI configurations Primarily used on x86/x64 through U-Boot’s EFI loader

The exact availability and behavior can depend on the U-Boot configuration and the VxWorks BSP.

bootvx
#

bootvx is the traditional VxWorks-oriented boot command.

It is particularly relevant to legacy BSPs where the kernel expects a VxWorks bootline at a predefined memory address.

The basic flow is:

VxWorks ELF
    |
    v
U-Boot bootvx
    |
    +--> Prepare bootline
    |
    +--> Place bootline at bootaddr
    |
    v
Kernel Entry Point

The bootaddr environment variable must correspond to the BSP’s expected BOOT_LINE_ADRS.

bootm
#

bootm is the primary path for modern VxWorks 7 configurations on PowerPC, ARM, and RISC-V.

A typical invocation is:

bootm <kernel_image_addr> - <dtb_address>

The kernel image and Flattened Device Tree are therefore supplied as separate boot objects.

bootefi
#

bootefi uses U-Boot’s EFI loader infrastructure to launch a VxWorks UEFI bootloader.

The flow becomes:

U-Boot
   |
   v
bootefi
   |
   v
VxWorks UEFI Loader
   |
   v
VxWorks Kernel

This approach is especially relevant to x86 and x64 systems where UEFI provides the expected firmware interface.

🌳 VxWorks 7 Device Tree and FDT Handling
#

VxWorks 7 introduced broader use of Flattened Device Trees (FDT) for describing platform hardware.

On PowerPC, ARM, and RISC-V, the DTB can provide information such as:

  • Memory regions
  • CPU topology
  • Interrupt controllers
  • Peripheral register addresses
  • Device compatibility information
  • Bus relationships
  • Platform-specific configuration

Since VxWorks SR0640, VxWorks supports standard Linux-compatible Device Trees.

This makes the VxWorks boot flow substantially closer to the Linux-style firmware-to-kernel interface used by modern embedded platforms.

DTB Selection Through bootargs
#

The least significant bit of the relevant flags in bootargs controls the DTB processing mode described by the VxWorks boot flow.

Conceptually:

bootargs flags
      |
      +---- LSB = 1 ---> Standard Linux-compatible DTB processing
      |
      +---- LSB = 0 ---> Legacy bootm execution

This distinction is important when integrating VxWorks with an existing U-Boot environment that was originally designed around Linux-compatible FDT conventions.

🧩 Kernel Entry Point Conventions
#

The kernel entry convention depends on the processor architecture and whether the Linux-compatible boot flow is being used.

PowerPC ePAPR Flow
#

Under the ePAPR-style interface, the kernel receives arguments corresponding to the FDT address and the expected boot protocol values.

Conceptually:

void (*kernel_entry)(
    fdt_addr,
    0,
    0,
    EPAPR_MAGIC,
    boot_IMA,
    0,
    0
);

The exact register-level calling convention should be matched against the VxWorks BSP and boot protocol expected by the kernel image.

ARM Legacy Flow
#

The legacy ARM flow uses the DTB pointer as the primary kernel argument:

void (*kernel_entry)(void *fdt_addr);

ARM and PowerPC Linux-Compatible Flow
#

When the Linux-compatible interface is selected, VxWorks follows the corresponding standard Linux-style kernel entry convention.

This allows U-Boot to reuse much of its existing DTB preparation and boot infrastructure.

RISC-V
#

RISC-V uses a Linux-compatible interface:

void (*kernel_entry)(
    unsigned long hartid,
    void *fdt_addr
);

The first argument identifies the boot hart, while the second points to the Flattened Device Tree.

📝 VxWorks Bootline and bootargs
#

The handling of kernel command-line information differs between bootvx, bootm, and bootefi.

Understanding this difference is essential when migrating an existing VxWorks BSP from a traditional bootloader flow to U-Boot.

bootvx Bootline Handling
#

With bootvx, U-Boot prepares the VxWorks command line in memory before transferring control to the kernel.

The key environment variable is:

bootaddr

It must match the VxWorks BSP’s expected:

BOOT_LINE_ADRS

For example:

bootaddr=0x101200

may be appropriate for a particular x86 BSP configuration.

The address is BSP-specific and should not be copied between platforms without verification.

Explicit bootargs
#

If bootargs is defined, U-Boot can copy the specified bootline directly to bootaddr.

Conceptually:

bootargs
   |
   v
U-Boot
   |
   v
BOOT_LINE_ADRS / bootaddr
   |
   v
VxWorks Kernel

Automatically Constructed Bootline
#

If bootargs is not explicitly configured, U-Boot can construct the bootline using environment variables such as:

bootdev
ipaddr
serverip
gatewayip
hostname

The resulting bootline is then placed at the configured boot address.

🌐 bootm Command-Line Handling
#

The bootm flow uses the Device Tree as the primary hardware and boot-parameter interface.

A typical configuration is:

setenv bootargs "..."
bootm <kernel_addr> - <dtb_addr>

U-Boot can update the DTB’s /chosen node with the appropriate boot arguments before entering the VxWorks kernel.

This differs fundamentally from the legacy bootvx model, where a bootline is explicitly placed at a predefined memory address.

The resulting flow is:

U-Boot Environment
        |
        v
    bootargs
        |
        v
     DTB /chosen
        |
        v
   VxWorks Kernel

🖥️ bootefi and UEFI Configuration
#

With bootefi, command-line and platform initialization are handled through the VxWorks UEFI bootloader.

The general flow is:

U-Boot
  |
  v
UEFI Services
  |
  v
VxWorks UEFI Loader
  |
  +--> Hardware / Memory Information
  |
  +--> Boot Configuration
  |
  v
VxWorks Kernel

This eliminates much of the legacy bootline preparation required by bootvx.

For x86 systems, however, the UEFI and VxWorks BSP configuration must still agree on memory, console, graphics, and firmware interfaces.

⚙️ Serial Console Configuration
#

A common source of apparently failed VxWorks boots is a console baud-rate mismatch.

For example:

U-Boot     -> 115200
VxWorks    -> 9600

The kernel may actually boot correctly while the terminal appears to hang because the serial receiver is using the wrong baud rate.

A practical configuration should therefore ensure:

U-Boot Console Baud
        =
VxWorks BSP Console Baud
        =
Terminal Baud

For x86 VxWorks BSPs, 9600 may be the BSP default while U-Boot commonly defaults to 115200.

The actual values should always be checked against the specific BSP and board configuration.

🖥️ x86 Memory Configuration
#

x86 VxWorks boots require particular attention to the relationship between physical memory and the BSP’s local-memory configuration.

vx_phys_mem_base
#

When using U-Boot to boot VxWorks on x86, the physical memory base can be provided through:

setenv vx_phys_mem_base <physical_address>

The value should correspond to the physical address associated with the BSP’s:

LOCAL_MEM_LOCAL_ADRS

A mismatch can cause the kernel to initialize with an incorrect view of system RAM.

The relationship is:

BSP Configuration
LOCAL_MEM_LOCAL_ADRS
        |
        v
vx_phys_mem_base
        |
        v
U-Boot / VxWorks Memory Mapping

The value must be derived from the actual BSP rather than copied from another x86 platform.

🔧 x86 ACPI and MPTABLE Considerations
#

Some U-Boot configurations do not provide the ACPI information expected by the VxWorks BSP.

In such cases, the kernel may need to be configured for an alternative multiprocessor-table initialization path.

Relevant VxWorks configuration options can include:

INCLUDE_MPTABLE_BOOT_OP
INCLUDE_VIRTUAL_WIRE_MODE

These options can provide the necessary x86 interrupt and processor initialization path when ACPI information is unavailable.

The correct configuration depends on the firmware capabilities exposed by the target platform.

🎨 x86 Graphics and Framebuffer Configuration
#

The boot configuration also differs depending on whether VxWorks is expected to operate in VGA text mode or graphical framebuffer mode.

VGA Text Mode
#

For an 80×25 VGA text console, U-Boot framebuffer mode should be disabled:

CONFIG_FRAMEBUFFER_SET_VESA_MODE

should be disabled in the relevant U-Boot configuration.

The resulting path is:

U-Boot
  |
  v
VGA Text Mode
  |
  v
VxWorks Console

EFI Bitmap Graphics Mode
#

For graphical EFI operation, VESA framebuffer configuration can remain enabled.

Supported 32-bit RGBA framebuffer formats can include:

10F
112
115
118
11B

The exact format should match the framebuffer representation expected by the VxWorks graphics subsystem.

The resulting flow is:

UEFI / U-Boot
      |
      v
VESA Framebuffer
      |
      v
VxWorks Graphics Subsystem

📋 Platform Configuration Checklist
#

Before attempting to boot a VxWorks kernel through U-Boot, validate the following parameters.

Configuration Area Verification
Boot Command Select bootvx, bootm, or bootefi according to the BSP and image format
Kernel Image Confirm the image format and load address
DTB Verify DTB address and architecture compatibility for VxWorks 7
bootaddr Match the VxWorks BSP’s BOOT_LINE_ADRS when using bootvx
bootargs Verify bootline or DT /chosen configuration
Memory Base Match vx_phys_mem_base with the BSP’s local memory address on x86
Console Ensure U-Boot, VxWorks, and terminal baud rates match
Interrupts Verify ACPI/MPTABLE or equivalent x86 interrupt configuration
Framebuffer Match U-Boot graphics configuration to the intended VxWorks console mode
UEFI Ensure U-Boot EFI support is enabled when using bootefi
Architecture Verify the kernel entry convention for PowerPC, ARM, RISC-V, or x86

🔬 Troubleshooting the Boot Path
#

When a VxWorks kernel fails to start through U-Boot, debugging should proceed from the bootloader interface toward the kernel rather than immediately changing kernel configuration.

A useful diagnostic sequence is:

1. Verify U-Boot command
          |
          v
2. Verify kernel image format
          |
          v
3. Verify kernel load address
          |
          v
4. Verify DTB / bootline handling
          |
          v
5. Verify memory configuration
          |
          v
6. Verify CPU entry convention
          |
          v
7. Verify serial console
          |
          v
8. Verify interrupt / firmware configuration
          |
          v
9. Verify VxWorks BSP initialization

No Console Output
#

If there is no output immediately after the kernel jump, first check:

  • Serial baud rate
  • Kernel load address
  • Kernel entry address
  • bootaddr
  • DTB address
  • Physical memory base
  • Console device configuration

A baud mismatch should be ruled out before assuming that the kernel failed to execute.

Kernel Starts but Hardware Is Incorrect
#

If VxWorks starts but devices are missing or malfunctioning, investigate:

  • DTB compatibility
  • DT /chosen properties
  • Peripheral address mappings
  • BSP hardware descriptions
  • Interrupt configuration
  • PCI/PCIe initialization
  • ACPI or MPTABLE availability on x86

bootm Versus bootvx
#

When migrating an older VxWorks BSP, one of the most important distinctions is whether the kernel expects a traditional VxWorks bootline or a modern DTB-based interface.

Conceptually:

Legacy BSP
   |
   v
bootvx
   |
   v
BOOT_LINE_ADRS
   |
   v
VxWorks

Modern VxWorks 7 BSP
   |
   v
bootm
   |
   v
Kernel + DTB
   |
   v
VxWorks

Using the wrong model can result in a kernel that executes but cannot correctly discover its hardware or networking configuration.

📊 Boot Method Comparison
#

Feature bootvx bootm bootefi
Primary Use Legacy VxWorks boot flow Modern VxWorks 7 UEFI-based VxWorks
Typical Image ELF uImage / supported VxWorks image UEFI executable / loader
Bootline Explicit memory location Passed through DTB /chosen Managed by UEFI loader
DTB Not central to legacy flow Core component Provided through UEFI mechanisms
PowerPC Supported legacy configurations Supported Platform-dependent
ARM Legacy configurations Supported Platform-dependent
RISC-V Limited legacy relevance Supported Platform-dependent
x86/x64 Legacy configurations Not the primary path Primary UEFI path
UEFI Dependency No No Yes

🏁 Conclusion
#

Loading VxWorks through U-Boot is primarily a matter of matching the boot command, image format, hardware description mechanism, and kernel entry convention to the target BSP.

The three main approaches serve different generations of the VxWorks boot architecture:

                 U-Boot
                    |
        +-----------+-----------+
        |           |           |
        v           v           v
      bootvx      bootm      bootefi
        |           |           |
        v           v           v
    Bootline       DTB         UEFI
        |           |           |
        +-----------+-----------+
                    |
                    v
              VxWorks Kernel

For legacy systems, bootvx remains centered on the VxWorks bootline and BOOT_LINE_ADRS. For VxWorks 7 on PowerPC, ARM, and RISC-V, bootm provides a more modern DTB-based boot interface. On x86 and x64 platforms using UEFI, bootefi shifts responsibility toward the VxWorks UEFI loader.

The most important practical rule is to treat the BSP as the authoritative source for memory addresses, bootline locations, console configuration, and hardware initialization requirements. U-Boot can provide the boot infrastructure, but successful VxWorks startup ultimately depends on those values matching the assumptions encoded in the target BSP.

Related

VxWorks 7 on T2080: BSP, U-Boot, and Kernel Adaptation Guide
·626 words·3 mins
VxWorks 7 T2080 U-Boot BSP Device-Tree Embedded Systems RTOS PowerPC VxBus
Build Self-Booting VxWorks Images with Archive Libraries (.a)
·611 words·3 mins
VxWorks RTOS Embedded Systems U-Boot BSP Static Linking Archive Library Tornado PowerPC
Building an MVB Monitoring and Early-Warning Terminal with VxWorks and FPGA
·1436 words·7 mins
VxWorks FPGA MVB Rail Transit Train Communication Network Industrial Cybersecurity Embedded Systems PowerPC Real-Time Systems