NVIDIA Tegra
NVIDIA Tegra Linux Driver Package

Development Guide
28.2 Release


 
TX1 Bootloader Update and Redundancy
 
Prerequisites
BCT, Tegraboot, and Boot File Set Redundancy
Failure-Tolerant BCT and Boot Firmware Update
Implementing Boot Firmware Redundancy
Modifying the Linux Kernel
Populating the BFS to the Boot Partitions
Modifying Tregaflash Script
Enabling Boot Firmware Redundancy
Preparing New Boot Firmware Set and BCT Images for Update
Extracting the BCT from the System
Preparing New Boot Firmware Set from New L4T BSP
Preparing New U-Boot on Old L4T BSP
Regenerating the BCT and Boot Firmware Blob Images
Preparing a New U-Boot on an Old L4T BSP
Downloading the Updated BCT and BFS Blob Images
Copying the Downloaded BCT and BFS Images into eMMC
Executing the Updated Boot Loader
Recovering from an Error During an Update
Updating BFS/KFS 2 and 3
Testing BFS/KFS Redundancies
Use these guidelines to enable runtime boot firmware updates with data redundancy features as part of a failure-tolerant system update procedure for the NVIDIA® Tegra® Linux Driver Package (L4T) releases on the Jetson™ TX1 Development Kit. Adaptation of these instructions may be required for use on other Tegra X1-based platforms.
Implementation of a specific update mechanism or update procedure is outside the scope of this document.
Prerequisites
An understanding of these concepts is required:
TX1 Boot Flow
NVIDIA Developer Embedded Computing Website
Jetson TX1 and TX2 Developer Kits User Guide
BCT, Tegraboot, and Boot File Set Redundancy
The Tegra BootROM validates the BCT through an integrated checksum or RSA signature. If the calculated checksum, or RSA signature, does not match the checksum or signature value within the BCT, the BootROM searches for the next BCT and attempts to validate. Up to 64 copies of the BCT are searched, at mod-16KiB boundaries. The NVIDIA flashing utility, tegraflash, writes up to 64 copies of the BCT based on the space allocated for the BCT partition.
A BCT can contain up to four entries for indicating locations (offset and size) and checksums or signature of the tegraboot, bootfileset (BFS), and kernelfileset (KFS). The BootROM computes and validates the checksum or signature for each tegraboot entry. When the first valid checksum or signature is located, the BootROM transfers control (jumps) to the specified tegraboot.
The tegraboot computes and validates the checksum for its companion BFS and KFS. When the checksums for the BFS and KFS are validated and signature of each boot and kernel files are verified, the tegraboot takes the appropriate action loads boot files such as:
tegraboot-cpu
bootloader-DTB
kernel-DTB
warmboot-vector
TOS
When all necessary boot files are verified and loaded, the tegraboot transfers control (jumps) to the boot loader such as cboot. The boot loader validates and loads next level software such as Linux kernel or U-Boot.
If the tegraboot fails to validate bootfileset and kernelfileset, it overwrites itself and resets the board so that the BootROM can validate and load the next tegraboot, bootfileset, and kernelfiileset combination.
To update the runtime boot firmware
Implement Boot Firmware Redundancy as follows:
Modify the Linux kernel to expose the eMMC boot0 and boot1 partitions for runtime access.
Generate/Modify the partition configuration file to make the tegraboot and bootfileset partitions specified in the boot0 and boot1 partitions.
Verify the tegraflash scripts are inter-operable with SecureBoot.
Deploy devices with boot firmware redundancy.
Prepare new boot firmware, BCT, DTB, and kernel images for update:
Either download new L4T BSP or generate new U-Boot.
Extract the BCT from the deployed system for offline modification.
Use offline, host-based tools to regenerate the BCT, BFS, DTB, and kernel images.
Download the new BCT, BFS, DTB, and kernel images into the target device.
Update the new BCT, BFS and KFS images:
Copy the BCT, BFS, DTB, and kernel images to eMMC partitions.
Reboot to execute the updated boot loader.
Note:
In L4T r24.2.2, the kernel DTB is not part of the BFS image and is NOT protected by boot firmware redundancy. Even though it is validated and loaded by the boot loader, the kernel DTB is part of kernel, which is not part of BFS.
Starting in L4T r28.2, all of BFS and KFS files are protected by both checksum and PKC authentication.
Failure-Tolerant BCT and Boot Firmware Update
The standard L4T release for Jetson TX1 does NOT enable boot firmware redundancy features. As part of a failure-tolerant boot firmware update, you must:
Implement and deploy boot firmware redundancy
Follow the boot firmware update procedure
Implementing Boot Firmware Redundancy
Enabling boot firmware redundancy requires modification of these components:
Kernel eMMC driver
Partition configuration file
tegraflash script
Once these modifications are completed, flashed, and deployed, initial boot loader redundancy is enabled.
Modifying the Linux Kernel
Modify the Linux kernel to expose the eMMC boot0 and boot1 partitions for runtime access. By default, eMMC boot partitions are NOT exposed during runtime by the Linux kernel.
To expose the eMMC boot partitions
1. Navigate to the kernel driver:
<kernel>/drivers/mmc/host/sdhci-tegra.c
2. Comment out the following line:
host->mmc->caps2 |= MMC_CAP2_BOOTPART_NOACC;
3. Depending on L4T BSP version, the line above may be enclosed in an if statement. In that case, comment out entire if block.
When the kernel is booted, the write-protected boot partitions are available at:
- /dev/mmcblk0boot0 — BCT, BFS0, and BFS1
- /dev/mmcblk0boot1 — BFS2 and BFS3
Populating the BFS to the Boot Partitions
Populate the BFS to the boot partition configuration file by automatically generating or by modifying the existing default partition configuratin file.
To automatically generate the partition configuration file:
1. Navigate to the bootloader directory by executing the command:
cd <top>/Linux_for_tegra/bootloader
2. Execute the command:
./mkbctpart -G <newredundant.xml>
3. Replace the standard partition configuration file with <newredundant.xml> as instructed by mkbctpart.
To modify the partition configuration file
1. Modify the BSP configuration file available at:
bootloader/t210ref/cfg/gnu_linux_fastboot_emmc_full.xml
The BSP configuration file contains the partitioning information for both the Tegra partition table and the GPT.
Partitions defined after GP1 are visible to Linux.
Partition NVC contains the tegraboot.
Partitions NVC-1, NVC-2, and NVC-3 store additional tegraboot instances for redundancy. These partitions must be defined after BCT and before GP1 to be located in boot partitions.
Partitions PT, PT-1, PT-2, and PT-3 contain layout information for each BFS, and indicate the beginning of each BFS.
Partitions TBC, TBC-1, TBC-2, and TBC-3 contain the cpu-portion of tegraboot.
Partitions RP1, RP1-1, RP1-2, and RP1-3 contain tegraboot DTBs.
Partitions EBT, EBT-1, EBT-2, and EBT-3 contain secondary boot loaders such as U-Boot or cboot.
Beginning with L4T release 28.1.1, U-Boot is no longer a part of BFS. Only cboot is allowed to be located in EBT partitions. The U-Boot can be defined in kernel partition (LNX) as a secondary boot loader.
Partitions WB0, WB0-1, WB0-2, and WB0-3 contain the warmboot vector.
Partitions BPF, BPF-1, BPF-2, and BPF-3 contain BPMP microcode.
Partitions TOS, TOS-1, TOS-2, and TOS-3 contain secure monitor code.
Partitions DTB, DTB-1, DTB-2, and DTB-3 contain kernel DTBs.
Beginning with L4T release 24.2.2, kernel DTBs must be defined after the APP partition because they are not part of BFS.
Partitions LNX, LNX-1, LNX-2, and LNX-3 contain either Linux Kernel or U-Boot depending on user's choice of DFLT_KERNEL_IMAGE in jetson-tx1.conf file.
Partitions EKS, EKS-1, EKS-2, and EKS-3 are optional and reserved for future use.
2. Verify that each bootfileset is defined immediately after each NVC partition.
The PT partition is the first within each bootfileset. That is, NVC and bootfileset combinations must be defined in the order: NVC, then PT, then the rest.
3. Verify that sum of partitions sizes of one NVC and matching BFS partitions does not exceed (boot0_size - 1 MiB) / 2. With standard Jetson TX1, it is 1.5 MiB.
4. Modify the gnu_linux_fastboot_emmc_full.xml file to move the APP entry immediately after the GP1 entry, so that the RootFS is on:
/dev/mmcblk0p1
5. Verify that each kernelfileset (DTB and LNX) is defined after the APP partition and DTB{-1,-2,-3} are the beginning of each kernel file set and LNX{-1,-2,-3} are the ending of each KFS.
6. Modify all partition entry ID=values to be contiguous if the partition configuration file is altered from the original generation by mkbctpart.
The overall layout for the partition configuration file is as follows:
...
BCT
NVC
BFS -- PT, TBC, RP1, EBT, WB0, BPF, TOS
NVC-1
BFS-1 -- PT-1, TBC-1, RP1-1, EBT-1, WB0-1, BPF-1, TOS-1
NVC-2
BFS-2 -- PT-2, TBC-2, RP1-2, EBT-2, WB0-2, BPF-2, TOS-2
NVC-3
BFS-3 -- PT-3, TBC-3, RP1-3, EBT-3, WB0-3, BPF-3, TOS-3
GP1
APP
KFS -- DTB, LNX
KFS-1 -- DTB-1, LNX-1
KFS-2 -- DTB-2, LNX-2
KFS-3 -- DTB-3, LNX-3
...
An example of a complete partition configuration file generation is as follows
cd <L4T BSP>/Linux_for_Tegra/bootloader/t210ref/cfg
mv -f gnu_linux_tegraboot_emmc_full.xml gnu_linux_tegraboot_emmc_full.xml.sav
cd ../..
./mkbctpart -G new_config.xml
If necessary, modify the new_config.xml.
mv -f new_config.xml t210ref/cfg/gnu_linux_tegraboot_emmc_full.xml
From this point, perform normal operations such as signing, flashing, etc...
This modification:
Causes the tegraboot and boot file set partitions to disappear from Linux as /dev/mmcblk0px
Makes other partitions visible.
Causes the root file system partition to stay as /dev/mmcblk0p1.
Unlike BFS, all KFS partitions are visible from Linux:
DTB in /dev/mmcblk0p2
LNX in /dev/mmcblk0p2
DTB-1 in /dev/mmcblkp5
LNX-1 in /detc/mmcblkp6
No further modifications are required to inform boot loader and the Linux kernel of the location of the new root file system.
Modifying Tregaflash Script
This topic does NOT apply to L4T R28 releases or if SecureBoot is not used.
Enable boot firmware redundancy inter-operability with SecureBoot in L4T R24 releases by adding one line of python code to the tegraflash script as follows:
1. Navigate to the bootloader directory.
cd <L4T BSP>/Linux_for_Tegra/bootloader
2. Edit tegraflash_internal.py.
3. Navigate to the line starting with def tegraflash_secureflash.
4. From the def tegraflash_secureflash line, find a line with tegraflash_parse_partitionlayout().
5. Add a new line:
tegraflash_update_bfs_images()
Under the following line:
tegraflash_parse_partitionlayout
6. Ensure the leading 4 spaces are enforced to have proper indentation.
Congratulations, the L4T R24.x.x BSP can now inter-operate with the Secureboot.
Enabling Boot Firmware Redundancy
Flash the Jetson TX1 platform with the above modifications to verify proper loading and functioning of boot firmwares, the Linux kernel, and the proper location specified for the root file system.
To ensure that all build components are functional
Verify the boot firmwares and kernel independently prior to enabling boot firmware redundancy.
Because enabling redundancy makes eMMC boot partitions very crowded, you must:
Notify the flash.sh script to skip the boot partition.
check by commenting out the BOOTPARTSIZE=xxx line in the <device name>.conf file before flashing.
For flashing instructions, see the Development Guide for your device.
Preparing New Boot Firmware Set and BCT Images for Update
For convenience, BCT image names are identified with four appended numeric values to denote the boot firmware version described by the BCT image. The numeric versions are arbitrary but indicate the boot firmware update process.
For example, after flashing, with initial boot firmware redundancy enabled, all boot firmware and kernel file versions are identical and referred to as bct_1111. When boot firmware is updated and the BCT is modified to contain two new images in slots 0 and 1 positions 1 and 2, the boot version is referred to as bct_2211.
Likewise, for descriptive purposes, a similar numeric value is appended to the name of the BCT binary.
Extracting the BCT from the System
Before updating the boot firmware, read and maintain a copy of the BCT (bct_1111) flashed on the production device. This BCT is used for later modifications to update the boot firmware entries (location, size, hash, and signature) within the BCT.
To retrieve the binary BCT:
1. Place a production device into forced-recovery mode.
For instructions on how to place a device in recovery mode, see the Setting Up Your Platform topic in the Development Guide for your device.
2. Use the tegraflash utility to read bct_1111 from the device.
cd <BSP>/Linux_for_Tegra/bootloader/
For clear system:
./tegraflash.py --bl cboot.bin --chip 0x21 --applet \
nvtboot_recovery.bin --cmd "read BCT bct_1111;"
For PKC protected system:
./tegraflash.py --bl cboot.bin.signed --chip 0x21 --applet \
rcm_1_signed.rcm --cmd "read BCT bct_1111" --securedev --skipuid
Preparing New Boot Firmware Set from New L4T BSP
To update boot firmware from newer L4T BSP, prepare a new boot firmware as follows:
1. Download and install new L4T BSP as shown in the Developer Embedded Computing website.
2. To update U-Boot, build a new U-Boot for Jetson-tx1 and copy u-boot-dtb.bin to:
<L4T BSP>/Linux_for_Tegra/bootloader/t210ref/p2371-0000/
3. Populate all boot firmware binaries in flashable format:
For clear system:
./flash.sh --no-flash jetson-tx1 mmcblk0p1
For PKC protected system,
./flash.sh --no-flash -x 0x21 -y PKC -u <RSA key> jetson-tx1 mmcblk0p1
4. Execute the following command to copy the bct_1111
cp bct_1111 <New L4T BSP>/Linux_for_Tegra/bootloader/
 
Preparing New U-Boot on Old L4T BSP
To update U-Boot on an old L4T BSP
1. Build new U-Boot for Jetson TX1 and copy u-boot-dtb.bin to:
<L4T BSP>/Linux_for_Tegra/bootloader/t210ref/p2371-0000/
2. Copy the BCT by executing the command.
cp bct_1111 <New L4T BSP>/Linux_for_Tegra/bootloader/
3. Populate all boot firmware binaries in flashable format:
For clear system:
cd <L4T BSP>/Linux_for_Tegra
./flash.sh --no-flash jetson-tx1 mmcblk0p1
cd bootloader
./mkbctpart -b bct_1111 -i 0,1 -V bct_2211
The mkbctpart generates bct_2211 and bfsblob.bin files.
For PKC protected system:
cd <L4T BSP>/Linux_for_Tegra
./flash.sh --no-flash -x 0x21 -y PKC -u <RSA key> jetson-tx1 mmcblk0p1
cd bootloader
./mkbctpart -k <RSA Key> -b bct_1111 -i 0,1 -V bct_2211
The mkbctpart generates bct_2211 and bfsblob_signed.bin files.
Upon completion, the mkbctpart utility prints out the download instructions and identifies where to locate the files on the target.
Regenerating the BCT and Boot Firmware Blob Images
NVIDIA provides a host-based utility, mkbctpart, for offline modifications and updates of the BCT. Use mkbctpart to specify a new location, size, and hash value for an updated boot loader binary.
The mcbctpart utility generates the updated BCT partition file and padded boot loader files from the provided BCT partition file and the new boot loader file as follows:
Reads in the BCT partition file and validates it.
Reads the new boot firmware, builds the bfsblob{signed}.bin, and calculates the hashes and signatures.
Updates the boot loader entries in the BCT as specified by the -i option.
Entries, also known as slots, NOT specified for modification remain the same; assuming the location, size, hash, and signatures of the boot loader being replaced.
Writes out the new updated BCT partition file and bfsblob{signed}.bin file.
The mkbctpart syntax is as follows:
mkbctpart [options] [new BCT file]
The command syntax is as follows:
Option
Description
Default
-b|--bctpartition <input BCT file>
Specifies the BCT partition filename.
bct.dump
-i|--instances <BFS update entry CSV>
Specifies the BFS instance.
0,1
-k|--keyfile <RSA Private key filename>
Specifies the RSA key filename.
none
-l|--listbcts
Specifies the BCT.
N/A
-p|--paddedfile <flashable BFS image file>
Specifies the BFS image filename. It must include tegraboot and the new PFS image to be downloaded and flashed on Jetson TX1 device.
BFSBLOB
For example: bfsblob{_signed}.bin
-t|--tegratype <Tegra type>
Specifies the Tegra chip.
T210
-B|--Bootloader <new BL filename>
Specifies the bootloeader filename.
tegraboot
For example: cboot.bin{.signed}
-G|--Genconfig <new configuration filename>
Specifies the new configuration filename.
none
-V|--Verbose
Returns verbose output.
0
The new BCT file is the output filename for the updated BCT partition.
The BFSBLOB is the blob that includes tegraboot and the new BFS image to be downloaded and flashed for Jetson TX1 device. The default name of the BFSBLOB is bfsblob{_signed}.bin.
tegraboot is cboot.bin{.signed}.
For example:
./mkbctpart -G new_redundant_partition_config.xml
./mkbctpart -b bct_1111 -i 0,1 -V bct_2211
./mkbctpart -k <RSA Key File> -b bct_1111 -i 0,1 -V bct_2211
Where mkbctpart:
Takes bct_1111 as input, describing four version 1 BFS blobs originally flashed in the production device.
Generates the new BCT file bct_2211, which describes BFS version-2 in slots 0 and 1, and BFS version-1 in slots 2 and 3.
Generates a new BFSBLOB named as bfsblob{_signed}.bin. All of bct_2211, bfsblob{_signed}.bin, <DTB file>.dtb.{encrypt|signed} are downloaded to the device prior to the update process.
The mkbctpart utility expects all BFS files, signed or unsigned, to exist in the same directory in L4T BSP:
<BSP>/Linux_for_Tegra/bootloaer/
Preparing a New U-Boot on an Old L4T BSP
To update U-Boot on an old L4T BSP
1. Build new U-Boot for Jetson TX1 and copy u-boot-dtb.bin to the following location:
<L4T BSP>/Linux_for_Tegra/bootloader/t210ref/p2371-0000/
2. Copy bct_1111 with the command:
cp bct_1111 <New L4T BSP>/Linux_for_Tegra/bootloader/
3. Populate all the boot firmware binaries in flashable format:
For clear system, execute these commands:
cd <L4T BSP>/Linux_for_Tegra
./flash.sh --no-flash jetson-tx1 mmcblk0p1
cd bootloader
./mkbctpart -b bct_1111 -i 0,1 -V bct_2211
The mkbctpart generates bct_2211 and bfsblob.bin files.
For PKC protected system, execute these commands:
cd <L4T BSP>/Linux_for_Tegra
./flash.sh --no-flash -x 0x21 -y PKC -u <RSA key> jetson-tx1 mmcblk0p1
cd bootloader
./mkbctpart -k <RSA Key> -b bct_1111 -i 0,1 -V bct_2211
The mkbctpart generates bct_2211 and bfsblob_signed.bin files.
Upon completion, the mkbctpart utility prints out the download instructions to identify where to locate files on the target device.
Downloading the Updated BCT and BFS Blob Images
Using the scp command on a removable storage device, copy the updated bct_2211, new kernel dtb file, and new boot file image bfsblob{_signed}.bin to the target device.
To update U-Boot on r28.x.x
Download boot.img to the target device.
Copying the Downloaded BCT and BFS Images into eMMC
The following provides example target commands to overwrite the BCT and bfsblob{_signed}.bin with the updated binaries into BFS instance 0 and 1. This example is for the standard Jetson TX1 eMMC device with 4 MiB boot0 and 4 MiB boot1.
# sudo bash # enter password and become superuser
# echo 0 > /sys/block/mmcblk0boot0/force_ro
# dd if=bct_2211 of=/dev/mmcblk0boot0
# dd if=bfsblob{_signed}.bin of=/dev/mmcblk0boot0 seek=2048
# dd if=bfsblob{_signed}.bin of=/dev/mmcblk0boot0 seek=5120
# dd if=<new kernel dtb>.{encrypt|signed} of=/dev/mmcblk0p2
# dd if=boot.img.{encrypt|signed} of=/dev/mmcblk0p3
# dd if=<new kernel dtb>.{encrypt|signed} of=/dev/mmcblk0p5
# dd if=boot.img.{encrypt|signed} of=/dev/mmcblk0p6
# sync
# sync
# echo 1 >/sys/block/mmcblk0boot0/force_ro
 
Note:
In the provided example, copying boot.img.{encrypt|signed} overwrites the U-Boot on the target system running L4T 28.1.0 or later version.
For L4T r24.x.x, U-Boot is included in the BFSBLOB and additional operations are not necessary.
 
The name of KFS files are *.encrypt for non-PKC protected system, and *.signed for PKC protected system.
Executing the Updated Boot Loader
To execute the updated BCT and boot loader, reboot the system.
Recovering from an Error During an Update
To recover from an error during an update
1. Reboot the target device.
Even if there was an error during update BFS/KFS 0 and 1, BFS/KFS 2 and 3 are intact and must be able to boot.
2. Repeat same update.
The update process is "stateless" so it can be restarted without knowing the previous update status.
Updating BFS/KFS 2 and 3
Once the BFS/KFS 0 and 1 are updated successfully, the new BFS/KFS is used in next boot cycle. Leave the target as is because BFS/KFS 0 and 1 are new versions and BFS/KFS 2 and 3 are older versions. To update BFS/KFS 2 and 3 to the new versions, repeat same update procedure with some numbers changed.
For example:
1. Navigate to the L4T environment where you built bct_2211.
2. Build bct_2222.
For clear system, execute these commands:
cd <L4T BSP>/Linux_for_Tegra/bootloader
./mkbctpart -b bct_2211 -i 0,1 -V bct_2222
The mkbctpart generates bct_2222 and bfsblob.bin files.
For PKC protected system, execute these commands:
cd <L4T BSP>/Linux_for_Tegra/bootloader
./mkbctpart -k <RSA Key> -b bct_2211 -i 0,1 -V bct_2222
The mkbctpart generates bct_2222 and bfsblob_signed.bin files.
3. Download bct_2222, fbsblob{_signed}.bin.
4. Flash new binaries to eMMC:
sudo bash # enter password and become superuser
# echo 0 > /sys/block/mmcblk0boot0/force_ro
# dd if=bct_2222 of=/dev/mmcblk0boot0
# echo 0 > /sys/block/mmcblk0boot1/force_ro
# dd if=bfsblob{_signed}.bin of=/dev/mmcblk0boot1
# dd if=bfsblob{_signed}.bin of=/dev/mmcblk0boot1 seek=3072
# dd if=<new kernel dtb>.{encrypt|signed} of=/dev/mmcblk0p8
# dd if=boot.img.{encrypt|signed} of=/dev/mmcblk0p9
# dd if=<new kernel dtb>.{encrypt|signed} of=/dev/mmcblk0p11
# dd if=boot.img.{encrypt|signed} of=/dev/mmcblk0p12
# sync
# sync
# echo 1 >/sys/block/mmcblk0boot0/force_ro
# echo 1 >/sys/block/mmcblk0boot1/force_ro
Testing BFS/KFS Redundancies
Testing BCT redundancy
The BCT partition has 64 identical BCT images. Each BCT image behaves as sub-partition. As long as there is 1 valid BCT image intact, the boot ROM detects it and the target system is configured properly.
# sudo bash # enter password and become superuser
# echo 0 > /sys/block/mmcblk0boot0/force_ro
# dd if=/bin/ls of=/dev/mmcblk0boot0 count=20 # 100KiB of BCT clobbered
# sync
# sync
# <reset the board>
Even after the first 100KiB of BCT partition is clobbered, the boot ROM quietly detects and uses the first healthy BCT and configures the system properly.
Testing BFS0 corruption
# sudo bash # enter password and become superuser
# echo 0 > /sys/block/mmcblk0boot0/force_ro
# dd if=/bin/ls of=/dev/mmcblk0boot0 seek=3048 count=1 # BFS0 clobbered
# sync
# sync
# <reset the board>
The following messages are displayed in the UART log:
...
*** Failing over to BFS1.
...
*** Booting BFS1.
*** Booting KFS1.
...
Testing KFS1 corruption
# sudo bash # enter password and become superuser
# dd if=/dev/zero of=/dev/mmcblk0p5 count=1 # DTB-1 clobbered
# sync
# sync
# <reset the board>
The following messages are displayed in the UART log:
...
*** Failing over to KFS2.
...
*** Booting BFS2.
*** Booting KFS2.
...
Testing KFS2 corruption:
# sudo bash # enter password and become superuser
# dd if=/bin/ls of=/dev/mmcblk0p9 count=10 # LNX-2 clobbered
# sync
# sync
# <reset the board>
 
The following messages are displayed in the UART log:
...
*** Failing over to KFS3.
...
*** Booting BFS3.
*** Booting KFS3.
...
Testing BFS3 corruption
# sudo bash # enter password and become superuser
# echo 0 > /sys/block/mmcblk0boot1/force_ro
# dd if=/bin/ls of=/dev/mmcblk0boot1 seek=3072 count=1 # BFS3 clobbered
# sync
# sync
# <reset the board>
At this point, the system is halted because all of 4 BFS/KFS are clobbered. Re-flash to update the system.