You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
210 lines
7.2 KiB
210 lines
7.2 KiB
NXP i.MX7 WaRP7
|
|
===============
|
|
|
|
The Trusted Firmware-A port for the i.MX7Solo WaRP7 implements BL2 at EL3.
|
|
The i.MX7S contains a BootROM with a High Assurance Boot (HAB) functionality.
|
|
This functionality provides a mechanism for establishing a root-of-trust from
|
|
the reset vector to the command-line in user-space.
|
|
|
|
Boot Flow
|
|
---------
|
|
|
|
BootROM --> TF-A BL2 --> BL32(OP-TEE) --> BL33(U-Boot) --> Linux
|
|
|
|
In the WaRP7 port we encapsulate OP-TEE, DTB and U-Boot into a FIP. This FIP is
|
|
expected and required
|
|
|
|
Build Instructions
|
|
------------------
|
|
|
|
We need to use a file generated by u-boot in order to generate a .imx image the
|
|
BootROM will boot. It is therefore _required_ to build u-boot before TF-A and
|
|
furthermore it is _recommended_ to use the mkimage in the u-boot/tools directory
|
|
to generate the TF-A .imx image.
|
|
|
|
U-Boot
|
|
~~~~~~
|
|
|
|
https://git.linaro.org/landing-teams/working/mbl/u-boot.git
|
|
|
|
.. code:: shell
|
|
|
|
git checkout -b rms-atf-optee-uboot linaro-mbl/rms-atf-optee-uboot
|
|
make warp7_bl33_defconfig;
|
|
make u-boot.imx arch=ARM CROSS_COMPILE=arm-linux-gnueabihf-
|
|
|
|
OP-TEE
|
|
~~~~~~
|
|
|
|
https://github.com/OP-TEE/optee_os.git
|
|
|
|
.. code:: shell
|
|
|
|
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- PLATFORM=imx PLATFORM_FLAVOR=mx7swarp7 ARCH=arm CFG_PAGEABLE_ADDR=0 CFG_DT_ADDR=0x83000000 CFG_NS_ENTRY_ADDR=0x87800000
|
|
|
|
TF-A
|
|
~~~~
|
|
|
|
https://github.com/ARM-software/arm-trusted-firmware.git
|
|
|
|
The following commands assume that a directory exits in the top-level TFA build
|
|
directory "fiptool_images". "fiptool_images" contains
|
|
|
|
- u-boot.bin
|
|
The binary output from the u-boot instructions above
|
|
|
|
- tee-header_v2.bin
|
|
- tee-pager_v2.bin
|
|
- tee-pageable_v2.bin
|
|
Binary outputs from the previous OPTEE build steps
|
|
|
|
It is also assumed copy of mbedtls is available on the path path ../mbedtls
|
|
https://github.com/ARMmbed/mbedtls.git
|
|
At the time of writing HEAD points to 0592ea772aee48ca1e6d9eb84eca8e143033d973
|
|
|
|
.. code:: shell
|
|
|
|
mkdir fiptool_images
|
|
cp /path/to/optee/out/arm-plat-imx/core/tee-header_v2.bin fiptool_images
|
|
cp /path/to/optee/out/arm-plat-imx/core/tee-pager_v2.bin fiptool_images
|
|
cp /path/to/optee/out/arm-plat-imx/core/tee-pageable_v2.bin fiptool_images
|
|
|
|
make CROSS_COMPILE=${CROSS_COMPILE} PLAT=warp7 ARCH=aarch32 ARM_ARCH_MAJOR=7 \
|
|
ARM_CORTEX_A7=yes AARCH32_SP=optee PLAT_WARP7_UART=1 GENERATE_COT=1 \
|
|
TRUSTED_BOARD_BOOT=1 USE_TBBR_DEFS=1 MBEDTLS_DIR=../mbedtls \
|
|
NEED_BL32=yes BL32=fiptool_images/tee-header_v2.bin \
|
|
BL32_EXTRA1=fiptool_images/tee-pager_v2.bin \
|
|
BL32_EXTRA2=fiptool_images/tee-pageable_v2.bin \
|
|
BL33=fiptool_images/u-boot.bin certificates all
|
|
|
|
/path/to/u-boot/tools/mkimage -n /path/to/u-boot/u-boot.cfgout -T imximage -e 0x9df00000 -d ./build/warp7/debug/bl2.bin ./build/warp7/debug/bl2.bin.imx
|
|
|
|
FIP
|
|
~~~
|
|
|
|
.. code:: shell
|
|
|
|
cp /path/to/uboot/u-boot.bin fiptool_images
|
|
cp /path/to/linux/arch/boot/dts/imx7s-warp.dtb fiptool_images
|
|
|
|
tools/cert_create/cert_create -n --rot-key "build/warp7/debug/rot_key.pem" \
|
|
--tfw-nvctr 0 \
|
|
--ntfw-nvctr 0 \
|
|
--trusted-key-cert fiptool_images/trusted-key-cert.key-crt \
|
|
--tb-fw=build/warp7/debug/bl2.bin \
|
|
--tb-fw-cert fiptool_images/trusted-boot-fw.key-crt\
|
|
--tos-fw fiptool_images/tee-header_v2.bin \
|
|
--tos-fw-cert fiptool_images/tee-header_v2.bin.crt \
|
|
--tos-fw-key-cert fiptool_images/tee-header_v2.bin.key-crt \
|
|
--tos-fw-extra1 fiptool_images/tee-pager_v2.bin \
|
|
--tos-fw-extra2 fiptool_images/tee-pageable_v2.bin \
|
|
--nt-fw fiptool_images/u-boot.bin \
|
|
--nt-fw-cert fiptool_images/u-boot.bin.crt \
|
|
--nt-fw-key-cert fiptool_images/u-boot.bin.key-crt \
|
|
--hw-config fiptool_images/imx7s-warp.dtb
|
|
|
|
tools/fiptool/fiptool create --tos-fw fiptool_images/tee-header_v2.bin \
|
|
--tos-fw-extra1 fiptool_images/tee-pager_v2.bin \
|
|
--tos-fw-extra2 fiptool_images/tee-pageable_v2.bin \
|
|
--nt-fw fiptool_images/u-boot.bin \
|
|
--hw-config fiptool_images/imx7s-warp.dtb \
|
|
--tos-fw-cert fiptool_images/tee-header_v2.bin.crt \
|
|
--tos-fw-key-cert fiptool_images/tee-header_v2.bin.key-crt \
|
|
--nt-fw-cert fiptool_images/u-boot.bin.crt \
|
|
--nt-fw-key-cert fiptool_images/u-boot.bin.key-crt \
|
|
--trusted-key-cert fiptool_images/trusted-key-cert.key-crt \
|
|
--tb-fw-cert fiptool_images/trusted-boot-fw.key-crt warp7.fip
|
|
|
|
Deploy Images
|
|
-------------
|
|
|
|
First place the WaRP7 into UMS mode in u-boot this should produce an entry in
|
|
/dev like /dev/disk/by-id/usb-Linux_UMS_disk_0_WaRP7-0xf42400d3000001d4-0\:0
|
|
|
|
.. code:: shell
|
|
|
|
=> ums 0 mmc 0
|
|
|
|
Next flash bl2.imx and warp7.fip
|
|
|
|
bl2.imx is flashed @ 1024 bytes
|
|
warp7.fip is flash @ 1048576 bytes
|
|
|
|
.. code:: shell
|
|
|
|
sudo dd if=bl2.bin.imx of=/dev/disk/by-id/usb-Linux_UMS_disk_0_WaRP7-0xf42400d3000001d4-0\:0 bs=512 seek=2 conv=notrunc
|
|
# Offset is 1MB 1048576 => 1048576 / 512 = 2048
|
|
sudo dd if=./warp7.fip of=/dev/disk/by-id/usb-Linux_UMS_disk_0_WaRP7-0xf42400d3000001d4-0\:0 bs=512 seek=2048 conv=notrunc
|
|
|
|
Remember to umount the USB device pefore proceeding
|
|
|
|
.. code:: shell
|
|
|
|
sudo umount /dev/disk/by-id/usb-Linux_UMS_disk_0_WaRP7-0xf42400d3000001d4-0\:0*
|
|
|
|
|
|
Signing BL2
|
|
-----------
|
|
|
|
A further step is to sign BL2.
|
|
|
|
The image_sign.sh and bl2_sign.csf files alluded to blow are available here.
|
|
|
|
https://github.com/bryanodonoghue/atf-code-signing
|
|
|
|
It is suggested you use this script plus the example CSF file in order to avoid
|
|
hard-coding data into your CSF files.
|
|
|
|
Download both "image_sign.sh" and "bl2_sign.csf" to your
|
|
arm-trusted-firmware top-level directory.
|
|
|
|
.. code:: shell
|
|
|
|
#!/bin/bash
|
|
SIGN=image_sign.sh
|
|
TEMP=`pwd`/temp
|
|
BL2_CSF=bl2_sign.csf
|
|
BL2_IMX=bl2.bin.imx
|
|
CST_PATH=/path/to/cst-2.3.2
|
|
CST_BIN=${CST_PATH}/linux64/cst
|
|
|
|
#Remove temp
|
|
rm -rf ${TEMP}
|
|
mkdir ${TEMP}
|
|
|
|
# Generate IMX header
|
|
/path/to/u-boot/tools/mkimage -n u-boot.cfgout.warp7 -T imximage -e 0x9df00000 -d ./build/warp7/debug/bl2.bin ./build/warp7/debug/bl2.bin.imx > ${TEMP}/${BL2_IMX}.log
|
|
|
|
# Copy required items to $TEMP
|
|
cp build/warp7/debug/bl2.bin.imx ${TEMP}
|
|
cp ${CST_PATH}/keys/* ${TEMP}
|
|
cp ${CST_PATH}/crts/* ${TEMP}
|
|
cp ${BL2_CSF} ${TEMP}
|
|
|
|
# Generate signed BL2 image
|
|
./${SIGN} image_sign_mbl_binary ${TEMP} ${BL2_CSF} ${BL2_IMX} ${CST_BIN}
|
|
|
|
# Copy signed BL2 to top-level directory
|
|
cp ${TEMP}/${BL2_IMX}-signed .
|
|
cp ${BL2_RECOVER_CSF} ${TEMP}
|
|
|
|
|
|
The resulting bl2.bin.imx-signed can replace bl2.bin.imx in the Deploy
|
|
Images section above, once done.
|
|
|
|
Suggested flow for verifying.
|
|
|
|
1. Followed all previous steps above and verify a non-secure ATF boot
|
|
2. Down the NXP Code Singing Tool
|
|
3. Generate keys
|
|
4. Program the fuses on your board
|
|
5. Replace bl2.bin.imx with bl2.bin.imx-signed
|
|
6. Verify inside u-boot that "hab_status" shows no events
|
|
7. Subsequently close your board.
|
|
|
|
If you have HAB events @ step 6 - do not lock your board.
|
|
|
|
To get a good over-view of generating keys and programming the fuses on the
|
|
board read "High Assurance Boot for Dummies" by Boundary Devices.
|
|
|
|
https://boundarydevices.com/high-assurance-boot-hab-dummies/
|
|
|