1# OP-TEE Trusted OS 2## Contents 31. [Introduction](#1-introduction) 42. [License](#2-license) 53. [Platforms supported](#3-platforms-supported) 6 3. [Development board for community user] (#31-development-board-for-community-user) 74. [Get and build OP-TEE software](#4-get-and-build-op-tee-software) 8 4. [Prerequisites](#41-prerequisites) 9 4. [Basic setup](#42-basic-setup) 10 4. [STMicroelectronics boards](#44-stmicroelectronics-boards) 11 4. [Allwinner A80](#45-allwinner-a80) 12 4. [Freescale MX6UL EVK](#46-freescale-mx6ul-evk) 135. [repo manifests](#5-repo-manifests) 14 5. [Install repo](#51-install-repo) 15 5. [Get the source code](#52-get-the-source-code) 16 5. [Targets](#521-targets) 17 5. [Branches](#522-branches) 18 5. [Get the toolchains](#523-get-the-toolchains) 19 5. [QEMU](#53-qemu) 20 5. [FVP](#54-fvp) 21 5. [HiKey](#55-hikey) 22 5. [MT8173-EVB](#56-mt8173-evb) 23 5. [Juno](#57-juno) 24 5. [Update flash and its layout](#571-update-flash-and-its-layout) 25 5. [GlobalPlatform testsuite support](#572-globalplatform-testsuite-support) 26 5. [GCC5 support](#573-gcc5-support) 27 5. [Raspberry Pi 3](#58-raspberry-pi-3) 28 5. [Tips and tricks](#59-tips-and-tricks) 29 5. [Reference existing project to speed up repo sync](#581-reference-existing-project-to-speed-up-repo-sync) 30 5. [Use ccache](#582-use-ccache) 316. [Load driver, tee-supplicant and run xtest](#6-load-driver-tee-supplicant-and-run-xtest) 327. [Coding standards](#7-coding-standards) 33 7. [checkpatch](#71-checkpatch) 34 35# 1. Introduction 36The `optee_os git`, contains the source code for the TEE in Linux using the 37ARM® TrustZone® technology. This component meets the GlobalPlatform 38TEE System Architecture specification. It also provides the TEE Internal core API 39v1.1 as defined by the GlobalPlatform TEE Standard for the development of 40Trusted Applications. For a general overview of OP-TEE and to find out how to 41contribute, please see the [Notice.md](Notice.md) file. 42 43The Trusted OS is accessible from the Rich OS (Linux) using the 44[GlobalPlatform TEE Client API Specification v1.0](http://www.globalplatform.org/specificationsdevice.asp), 45which also is used to trigger secure execution of applications within the TEE. 46 47--- 48## 2. License 49The software is distributed mostly under the 50[BSD 2-Clause](http://opensource.org/licenses/BSD-2-Clause) open source 51license, apart from some files in the `optee_os/lib/libutils` directory 52which are distributed under the 53[BSD 3-Clause](http://opensource.org/licenses/BSD-3-Clause) or public domain 54licenses. 55 56--- 57## 3. Platforms supported 58Several platforms are supported. In order to manage slight differences 59between platforms, a `PLATFORM_FLAVOR` flag has been introduced. 60The `PLATFORM` and `PLATFORM_FLAVOR` flags define the whole configuration 61for a chip the where the Trusted OS runs. Note that there is also a 62composite form which makes it possible to append `PLATFORM_FLAVOR` directly, 63by adding a dash in-between the names. The composite form is shown below 64for the different boards. For more specific details about build flags etc, 65please read the file [build_system.md](documentation/build_system.md). Some 66platforms have different sub-maintainers, please refer to the file 67[MAINTAINERS.md](MAINTAINERS.md) for contact details for various platforms. 68 69<!-- Please keep this list sorted in alphabetic order --> 70| Platform | Composite PLATFORM flag | Publicly available? | 71|----------|-------------------------|---------------------| 72| [Allwinner A80 Board](http://www.allwinnertech.com/en/clq/processora/A80.html)|`PLATFORM=sunxi`| No | 73| [ARM Juno Board](http://www.arm.com/products/tools/development-boards/versatile-express/juno-arm-development-platform.php) |`PLATFORM=vexpress-juno`| Yes | 74| [FSL ls1021a](http://www.freescale.com/tools/embedded-software-and-tools/hardware-development-tools/tower-development-boards/mcu-and-processor-modules/powerquicc-and-qoriq-modules/qoriq-ls1021a-tower-system-module:TWR-LS1021A?lang_cd=en)|`PLATFORM=ls-ls1021atwr`| Yes | 75| [FSL i.MX6 Quad SABRE Lite Board](https://boundarydevices.com/product/sabre-lite-imx6-sbc/) |`PLATFORM=imx`| Yes | 76| [FSL i.MX6 Quad SABRE SD Board](http://www.nxp.com/products/software-and-tools/hardware-development-tools/sabre-development-system/sabre-board-for-smart-devices-based-on-the-i.mx-6quad-applications-processors:RD-IMX6Q-SABRE) |`PLATFORM=imx`| Yes | 77| [FSL i.MX6 UltraLite EVK Board](http://www.freescale.com/products/arm-processors/i.mx-applications-processors-based-on-arm-cores/i.mx-6-processors/i.mx6qp/i.mx6ultralite-evaluation-kit:MCIMX6UL-EVK) |`PLATFORM=imx`| Yes | 78| [ARM Foundation FVP](http://www.arm.com/fvp) |`PLATFORM=vexpress-fvp`| Yes | 79| [HiSilicon D02](http://open-estuary.org/d02-2)|`PLATFORM=d02`| No | 80| [HiKey Board (HiSilicon Kirin 620)](https://www.96boards.org/products/hikey)|`PLATFORM=hikey`| Yes | 81| [MediaTek MT8173 EVB Board](http://www.mediatek.com/en/products/mobile-communications/tablet/mt8173)|`PLATFORM=mediatek-mt8173`| No | 82| [QEMU](http://wiki.qemu.org/Main_Page) |`PLATFORM=vexpress-qemu_virt`| Yes | 83| [QEMUv8](http://wiki.qemu.org/Main_Page) |`PLATFORM=vexpress-qemu_armv8a`| Yes | 84| [Raspberry Pi 3](https://www.raspberrypi.org/products/raspberry-pi-3-model-b) |`PLATFORM=rpi3`| Yes | 85| [Renesas RCAR](https://www.renesas.com/en-sg/solutions/automotive/products/rcar-h3.html)|`PLATFORM=rcar`| No | 86| [STMicroelectronics b2260 - h410 (96boards fmt)](http://www.st.com/web/en/catalog/mmc/FM131/SC999/SS1628/PF258776) |`PLATFORM=stm-b2260`| No | 87| [STMicroelectronics b2120 - h310 / h410](http://www.st.com/web/en/catalog/mmc/FM131/SC999/SS1628/PF258776) |`PLATFORM=stm-cannes`| No | 88| [STMicroelectronics b2020-h416](http://www.st.com/web/catalog/mmc/FM131/SC999/SS1633/PF253155?sc=internet/imag_video/product/253155.jsp)|`PLATFORM=stm-orly2`| No | 89| [Texas Instruments DRA7xx](http://www.ti.com/product/DRA746)|`PLATFORM=ti-dra7xx`| Yes | 90| [Xilinx Zynq UltraScale+ MPSOC](http://www.xilinx.com/products/silicon-devices/soc/zynq-ultrascale-mpsoc.html)|`PLATFORM=zynqmp-zcu102`| Yes | 91| [Spreadtrum SC9860](http://www.spreadtrum.com/en/SC9860GV.html)|`PLATFORM=sprd-sc9860`| No | 92 93### 3.1 Development board for community user 94For community users, we suggest using [HiKey board](https://www.96boards.org/products/ce/hikey/) 95as development board. It provides detailed documentation including chip 96datasheet, board schematics, source code, binaries etc on the download link at 97the website. 98 99--- 100## 4. Get and build OP-TEE software 101There are a couple of different build options depending on the target you are 102going to use. If you just want to get the software and compile it, then you 103should follow the instructions under the "Basic setup" below. In case you are 104going to run for a certain hardware or FVP, QEMU for example, then please follow 105the respective section found below instead, having that said, we are moving from 106the shell script based setups to instead use 107[repo](https://source.android.com/source/downloading.html), so for some targets 108you will see that we are using repo ([section 5](#5-repo-manifests)) and for 109others we are still using the shell script based setup 110([section 4](#4-get-and-build-op-tee-software)), please see this transitions as 111work in progress. 112 113--- 114### 4.1 Prerequisites 115We believe that you can use any Linux distribution to build OP-TEE, but as 116maintainers of OP-TEE we are mainly using Ubuntu-based distributions and to be 117able to build and run OP-TEE there are a few packages that needs to be installed 118to start with. Therefore install the following packages regardless of what 119target you will use in the end. 120``` 121$ sudo apt-get install android-tools-adb android-tools-fastboot autoconf bc \ 122 bison cscope curl flex gdisk libc6:i386 libfdt-dev libftdi-dev \ 123 libglib2.0-dev libhidapi-dev libncurses5-dev libpixman-1-dev \ 124 libstdc++6:i386 libtool libz1:i386 mtools netcat python-crypto \ 125 python-serial python-wand unzip uuid-dev xdg-utils xz-utils zlib1g-dev 126``` 127 128--- 129### 4.2 Basic setup 130#### 4.2.1 Get the compiler 131We strive to use the latest available compiler from Linaro. Start by downloading 132and unpacking the compiler. Then export the `PATH` to the compilers `bin` 133folder. Beware that we are using a couple of different toolchains depending on 134the target device. This includes both 64- and 32-bit toolchains. For the exact 135toolchain in use, please have a look at [toolchain.mk](https://github.com/OP-TEE/build/blob/master/toolchain.mk) 136and then look at the targets makefile (see [build.git](https://github.com/OP-TEE/build)) 137to find out where the respective toolchain will be used. For example in the 138[QEMU makefile](https://github.com/OP-TEE/build/blob/master/qemu.mk#L12-L15) you 139will see: 140``` 141CROSS_COMPILE_NS_USER ?= "$(CCACHE)$(AARCH32_CROSS_COMPILE)" 142CROSS_COMPILE_NS_KERNEL ?= "$(CCACHE)$(AARCH32_CROSS_COMPILE)" 143CROSS_COMPILE_S_USER ?= "$(CCACHE)$(AARCH32_CROSS_COMPILE)" 144CROSS_COMPILE_S_KERNEL ?= "$(CCACHE)$(AARCH32_CROSS_COMPILE)" 145``` 146 147However, if you only want to compile optee_os, then you can do like this: 148``` 149$ cd $HOME 150$ mkdir toolchains 151$ cd toolchains 152$ wget http://releases.linaro.org/14.08/components/toolchain/binaries/gcc-linaro-arm-linux-gnueabihf-4.9-2014.08_linux.tar.xz 153$ tar xvf gcc-linaro-arm-linux-gnueabihf-4.9-2014.08_linux.tar.xz 154$ export PATH=$HOME/toolchains/gcc-linaro-arm-linux-gnueabihf-4.9-2014.08_linux/bin:$PATH 155``` 156 157#### 4.2.2 Download the source code 158``` 159$ cd $HOME 160$ mkdir devel 161$ cd devel 162$ git clone https://github.com/OP-TEE/optee_os.git 163``` 164 165#### 4.2.3 Build 166``` 167$ cd $HOME/devel/optee_os 168$ CROSS_COMPILE=arm-linux-gnueabihf- make 169``` 170 171#### 4.2.4 Compiler flags 172To be able to see the full command when building you could build using 173following flag: 174``` 175$ make V=1 176``` 177 178To enable debug builds use the following flag: 179``` 180$ make DEBUG=1 181``` 182 183OP-TEE supports a couple of different levels of debug prints for both TEE core 184itself and for the Trusted Applications. The level ranges from 1 to 4, where 185four is the most verbose. To set the level you use the following flag: 186``` 187$ make CFG_TEE_CORE_LOG_LEVEL=4 188``` 189 190--- 191### 4.4 STMicroelectronics boards 192Currently OP-TEE is supported on Orly-2 (`b2020-h416`), Cannes family 193(`b2120` both `h310` and `h410` chip) and 96boards/cannes board (`b2260-h410`). 194 195#### 4.4.1 Get the compiler 196Follow the instructions in the "4.2 Basic setup". 197 198#### 4.4.2 Download the source code 199See section "4.2.2 Download the source code". 200 201#### 4.4.3 Build the images and files 202For the 96boards/cannes: 203``` 204$ make PLATFORM=stm-b2260 205``` 206For the legacy cannes family: 207``` 208$ make PLATFORM=stm-cannes 209``` 210For the orly2 family 211``` 212$ make PLATFORM=stm-orly2 213``` 214 215#### 4.4.4 Prepare and install the images 216Will be written soon. 217 218#### 4.4.5 Boot and run the software 219<!-- All magic with STM and so on must be stated here. --> 220Will be written soon. 221 222--- 223### 4.5 Allwinner A80 224 225#### 4.5.1 Locked versus unlocked A80 boards 226**Important!** All A80 boards sold to the general public are boards where secure 227side has been locked down, which means that you **cannot** use them for secure 228side development, i.e, it will not be possible to put OP-TEE on those devices. 229If you want to use A80 board for secure side development, then you will need to 230talk to 231[Allwinner](https://github.com/OP-TEE/optee_os/blob/master/MAINTAINERS.md) 232directly and ask if it is possible get a device from them. 233 234#### 4.5.2 Get the compiler and source 235Follow the instructions in the "4.2 Basic setup". 236 237#### 4.5.3 Build 238``` 239$ cd optee_os 240$ export PLATFORM=sunxi 241$ export CROSS_COMPILE=arm-linux-gnueabihf- 242$ make 243``` 244 245#### 4.5.4 Prepare the images to run on A80 Board 246 247Download Allwinner A80 platform SDK, the SDK refers to Allwinner A80 platform 248SDK root directory. A80 SDK directory tree looks like this: 249``` 250SDK/ 251 Android 252 lichee 253``` 254`Android` contains all source code related to Android and `lichee` 255contains the bootloader and Linux kernel. 256 257##### 4.5.4.1 Copy OP-TEE output to package directory 258Copy the OP-TEE output binary to `SDK/lichee/tools/pack/sun9i/bin` 259 260``` 261$ cd optee_os 262$ cp ./out/arm32-plat-sunxi/core/tee.bin SDK/lichee/tools/pack/sun9i/bin 263``` 264 265##### 4.5.4.2 Build Linux kernel 266In the `lichee` directory, run the following commands: 267``` 268$ cd SDK/lichee 269$ ./build.sh 270``` 271 272##### 4.5.4.3 Build Android 273In the Android directory, run the following commands: 274``` 275$ cd SDK/android 276$ extract-bsp 277$ make -j 278``` 279 280##### 4.5.4.4 Create the Android image 281In the Android directory, run the following commands: 282``` 283$ cd SDK/android 284$ pack 285``` 286The output image will been signed internally when packed. The output image name 287is `a80_android_board.img`. 288 289##### 4.5.4.5 Download the Android image 290Use `Allwinner PhoenixSuit` tool to download to A80 board. 291Choose the output image(`a80_android_board.img`), select download and wait 292for the download to complete. 293 294#### 4.5.5 Boot and run the software on A80 Board 295When the host platform is Windows, use a console application to connect A80 296board `uart0`. In the console window, You can install OP-TEE linux kernel 297driver `optee.ko`, load OP-TEE-Client daemon `tee-supplicant` and run 298the example "hello world" Trusted Application, do this by running: 299``` 300$ insmod /system/vendor/modules/optee.ko 301$ /system/bin/tee-supplicant & 302$ /system/bin/tee-helloworld 303``` 304 305--- 306### 4.6 Freescale MX6UL EVK 307 308Get U-Boot source: 309https://github.com/MrVan/uboot/commit/4f016adae573aaadd7bf6a37f8c58a882b391ae6 310 311Build U-Boot: 312``` 313 make ARCH=arm mx6ul_14x14_evk_optee_defconfig 314 make ARCH=arm 315 Burn u-boot.imx to offset 0x400 of SD card 316``` 317 318Get Kernel source: https://github.com/linaro-swg/linux/tree/optee 319 320Patch kernel: 321```c 322 diff --git a/arch/arm/boot/dts/imx6ul-14x14-evk.dts b/arch/arm/boot/dts/imx6ul-14x14-evk.dts 323 index 6aaa5ec..2ac9c80 100644 324 --- a/arch/arm/boot/dts/imx6ul-14x14-evk.dts 325 +++ b/arch/arm/boot/dts/imx6ul-14x14-evk.dts 326 @@ -23,6 +23,13 @@ 327 reg = <0x80000000 0x20000000>; 328 }; 329 330 + firmware { 331 + optee { 332 + compatible = "linaro,optee-tz"; 333 + method = "smc"; 334 + }; 335 + }; 336 + 337 regulators { 338 compatible = "simple-bus"; 339 #address-cells = <1>; 340``` 341 342Compile the Kernel: 343 344``` 345make ARCH=arm imx_v6_v7_defconfig 346make menuconfig 347select the two entries 348 CONFIG_TEE=y 349 CONFIG_OPTEE 350make ARCH=arm 351``` 352Copy zImage and imx6ul_14x14_evk.dtb to SD card. 353 354OPTEE OS Build: 355``` 356 PLATFORM_FLAVOR=mx6ulevk make PLATFORM=imx 357 ${CROSS_COMPILE}-objcopy -O binary out/arm-plat-imx/core/tee.elf optee.bin 358 copy optee.bin to the first partition of SD card which is used for boot. 359``` 360 361Run using U-Boot: 362``` 363 run loadfdt; 364 run loadimage; 365 fatload mmc 1:1 0x9c100000 optee.bin; 366 run mmcargs; 367 bootz ${loadaddr} - ${fdt_addr}; 368``` 369 370Note: 371 CAAM is not implemented now, this will be added later. 372 373More steps: http://mrvan.github.io/optee-imx6ul 374 375--- 376## 5. repo manifests 377 378A Git repository is available at https://github.com/OP-TEE/manifest where you 379will find XML-files for use with the Android 'repo' tool. 380 381### 5.1. Install repo 382Follow the instructions under the "Installing Repo" section 383[here](https://source.android.com/source/downloading.html). 384 385### 5.2. Get the source code 386First ensure that you have the necessary Ubuntu packages installed, see [4.1 387Prerequisites](#41-prerequisites) (this is the only important step from section 3884 in case you are setting up any of the target devices mentioned below). 389 390``` 391$ mkdir -p $HOME/devel/optee 392$ cd $HOME/devel/optee 393$ repo init -u https://github.com/OP-TEE/manifest.git -m ${TARGET}.xml [-b ${BRANCH}] 394$ repo sync 395``` 396**Notes**<br> 397* The folder could be at any location, we are just giving a suggestion by 398 saying `$HOME/devel/optee`. 399* `repo sync` can take an additional parameter -j to sync multiple remotes. For 400 example `repo sync -j3` will sync three remotes in parallel. 401 402#### 5.2.1 Targets 403| Target | Latest | Stable | 404|--------|--------|--------| 405| QEMU | `default.xml` | `default_stable.xml` | 406| QEMUv8 | `qemu_v8.xml` | `qemu_v8_stable.xml` | 407| FVP | `fvp.xml` | `fvp_stable.xml` | 408| HiKey | `hikey.xml` | `hikey_stable.xml` | 409| HiKey Debian | `hikey_debian.xml` | `hikey_debian_stable.xml` | 410| MediaTek MT8173 EVB Board | `mt8173-evb.xml` | `mt8173-evb_stable.xml` | 411| ARM Juno board| `juno.xml` | `juno_stable.xml` | 412| Raspberry Pi 3 | `rpi3.xml` | `rpi3_stable.xml` | 413 414#### 5.2.2 Branches 415Currently we are only using one branch, i.e, the `master` branch. 416 417#### 5.2.3 Get the toolchains 418This is a one time thing you run only once after getting all the source code 419using repo. 420``` 421$ cd build 422$ make toolchains 423``` 424 425##### Note : 426If you have been using GCC4.9 and are upgrading to GCC5 via [this commit] (https://github.com/OP-TEE/build/commit/69a8a37bc417d28d62ae57e7ca2a8df4bdec93c8), please make sure that you delete the `toolchains` directory before running `make toolchains` again, or else the toolchain binaries can get mixed up or corrupted, and generate errors during builds. 427 428--- 429### 5.3. QEMU 430After getting the source and toolchain, just run (from the `build` folder) 431``` 432$ make all run 433``` 434and everything should compile and at the end QEMU should start. 435 436--- 437### 5.4. FVP 438After getting the source and toolchain you must also obtain Foundation Model 439([link](http://www.arm.com/products/tools/models/fast-models/foundation-model.php)) 440binaries and untar it to the forest root, then just run (from the `build` folder) 441 442``` 443$ make all run 444``` 445and everything should compile and at the end FVP should start. 446 447--- 448### 5.5. HiKey 449#### 5.5.1 Initramfs based 450After getting the source and toolchain, just run (from the `build` folder) 451``` 452$ make all 453``` 454 455After that connect the board and flash the binaries by running: 456``` 457$ make flash 458``` 459 460(more information about how to flash individual binaries could be found 461[here](https://github.com/96boards/documentation/wiki/HiKeyUEFI#flash-binaries-to-emmc-)) 462 463The board is ready to be booted. 464#### 5.5.2 Debian based / 96boards RPB 465Start by getting the source and toolchain (see above), then continue by 466downloading the system image (root fs). Note that this step is something you 467only should do once. 468 469``` 470$ make system-img 471``` 472 473Which should be followed by 474``` 475$ make all 476``` 477 478When everything has been built, flash the files to the device: 479``` 480$ make flash 481``` 482 483Now you can boot up the device, note that OP-TEE normal world binaries still 484hasn't been put on the device at this stage. So by now you're basically booting 485up an RPB build. When you have a prompt, the next step is to connect the device 486to the network. WiFi is preferable, since HiKey has no Ethernet jack. Easiest is 487to edit `/etc/network/interfaces`. To find out what to add, run: 488``` 489$ make help 490``` 491 492When that's been added, reboot and when you have a prompt again, you're ready to 493push the OP-TEE client binaries and the kernel with OP-TEE support. First find 494out the IP for your device (`ifconfig`). Then send the files to HiKey by 495running: 496``` 497$ IP=111.222.333.444 make send 498 499Credentials for the image are: 500username: linaro 501password: linaro 502``` 503 504When the files has been transfered, please follow the commands from the `make 505send` command which will install the debian packages on the device. Typically it 506tells you to run something like this on the device itself: 507``` 508$ dpkg --force-all -i /tmp/out/optee_2.0-1.deb 509$ dpkg --force-all -i /tmp/linux-image-*.deb 510``` 511 512Now you are ready to use OP-TEE on HiKey using Debian, please goto step 6 below 513to continue. 514 515##### Good to know 516Just want to update secure side? Put the device in fastboot mode and 517``` 518$ make arm-tf 519$ make flash-fip 520 521``` 522 523Just want to update OP-TEE client software? Put the device in fastboot mode and 524``` 525$ make optee-client 526$ make xtest 527``` 528 529Boot up the device and follow the instructions from make send 530``` 531$ IP=111.222.333.444 make send 532``` 533 534--- 535### 5.6. MT8173-EVB 536After getting the source and toolchain, just run (from the `build` folder) 537 538``` 539$ make all run 540``` 541 542When `< waiting for device >` prompt appears, press reset button and the 543flashing procedure should begin. 544 545--- 546### 5.7 Juno 547After getting the source and toolchain, just run (from the `build` folder) 548``` 549$ make all 550``` 551 552Enter the firmware console on the juno board and press enter to stop 553the auto boot flow 554``` 555ARM V2M_Juno Firmware v1.3.9 556Build Date: Nov 11 2015 557 558Time : 12:50:45 559Date : 29:03:2016 560 561Press Enter to stop auto boot... 562 563``` 564Enable ftp at the firmware prompt 565``` 566Cmd> ftp_on 567Enabling ftp server... 568 MAC address: xxxxxxxxxxxx 569 570 IP address: 192.168.1.158 571 572 Local host name = V2M-JUNO-A2 573``` 574 575Flash the binary by running (note the IP address from above): 576``` 577make JUNO_IP=192.168.1.158 flash 578``` 579 580Once the binaries are transferred, reboot the board: 581``` 582Cmd> reboot 583 584``` 585 586#### 5.7.1 Update flash and its layout 587The flash in the board may need to be updated for the flashing above to 588work. If the flashing fails or if ARM-TF refuses to boot due to wrong 589version of the SCP binary the flash needs to be updated. To update the 590flash please follow the instructions at [Using Linaro's deliverable on 591Juno](https://community.arm.com/docs/DOC-10804) selecting one of the zips 592under "4.1 Prebuilt configurations" flashing it as described under "5. 593Running the software". 594 595#### 5.7.2 GlobalPlatform testsuite support 596##### Warning : 597Depending on the Juno pre-built configuration, the built ramdisk.img 598size with GlobalPlatform testsuite may exceed its pre-defined Juno flash 599memory reserved location (image.txt file). 600In that case, you will need to extend the Juno flash block size reserved 601location for the ramdisk.img in the image.txt file accordingly and 602follow the instructions under "5.7.1 Update flash and its layout". 603 604##### Example with juno-latest-busybox-uboot.zip: 605The current ramdisk.img size with GlobalPlatform testsuite 606is 8.6 MBytes. 607 608###### Updated file is /JUNO/SITE1/HBI0262B/images.txt (limited to 8.3 MB) 609``` 610NOR4UPDATE: AUTO ;Image Update:NONE/AUTO/FORCE 611NOR4ADDRESS: 0x01800000 ;Image Flash Address 612NOR4FILE: \SOFTWARE\ramdisk.img ;Image File Name 613NOR4NAME: ramdisk.img 614NOR4LOAD: 00000000 ;Image Load Address 615NOR4ENTRY: 00000000 ;Image Entry Point 616``` 617 618###### Extended to 16MB 619``` 620NOR4UPDATE: AUTO ;Image Update:NONE/AUTO/FORCE 621NOR4ADDRESS: 0x01000000 ;Image Flash Address 622NOR4FILE: \SOFTWARE\ramdisk.img ;Image File Name 623NOR4NAME: ramdisk.img 624NOR4LOAD: 00000000 ;Image Load Address 625NOR4ENTRY: 00000000 ;Image Entry Point 626``` 627 628#### 5.7.3 GCC5 support 629##### Note : 630In case you are using the **Latest version** of the ARM Juno board (this is 631`juno.xml` manifest), the built `ramdisk.img` size with GCC5 compiler, at 632the moment, exceeds its pre-defined Juno flash memory reserved location 633(`image.txt` file). 634 635To solve this problem you will need to extend the Juno flash block size 636reserved location for the `ramdisk.img` and decrease the size for other 637images in the `image.txt` file accordingly and then follow the instructions 638under "5.7.1 Update flash and its layout". 639 640##### Example with juno-latest-busybox-uboot.zip: 641The current `ramdisk.img` size with GCC5 compiler is 29.15 MBytes we will 642extend it to 32 MBytes. The only changes that you need to do are those in 643**bold** 644 645###### File to update is /JUNO/SITE1/HBI0262B/images.txt 646<pre> 647NOR2UPDATE: AUTO ;Image Update:NONE/AUTO/FORCE 648NOR2ADDRESS: <b>0x00100000</b> ;Image Flash Address 649NOR2FILE: \SOFTWARE\Image ;Image File Name 650NOR2NAME: norkern ;Rename kernel to norkern 651NOR2LOAD: 00000000 ;Image Load Address 652NOR2ENTRY: 00000000 ;Image Entry Point 653 654NOR3UPDATE: AUTO ;Image Update:NONE/AUTO/FORCE 655NOR3ADDRESS: <b>0x02C00000</b> ;Image Flash Address 656NOR3FILE: \SOFTWARE\juno.dtb ;Image File Name 657NOR3NAME: board.dtb ;Specify target filename to preserve file extension 658NOR3LOAD: 00000000 ;Image Load Address 659NOR3ENTRY: 00000000 ;Image Entry Point 660 661NOR4UPDATE: AUTO ;Image Update:NONE/AUTO/FORCE 662NOR4ADDRESS: <b>0x00D00000</b> ;Image Flash Address 663NOR4FILE: \SOFTWARE\ramdisk.img ;Image File Name 664NOR4NAME: ramdisk.img 665NOR4LOAD: 00000000 ;Image Load Address 666NOR4ENTRY: 00000000 ;Image Entry Point 667 668NOR5UPDATE: AUTO ;Image Update:NONE/AUTO/FORCE 669NOR5ADDRESS: <b>0x02D00000</b> ;Image Flash Address 670NOR5FILE: \SOFTWARE\hdlcdclk.dat ;Image File Name 671NOR5LOAD: 00000000 ;Image Load Address 672NOR5ENTRY: 00000000 ;Image Entry Point 673</pre> 674 675--- 676### 5.8 Raspberry Pi 3 677There is a separate document for Raspberry Pi 3 [here](documentation/rpi3.md). 678That document will tell you how to flash, how to debug, known problems and 679things still to be done. 680 681--- 682### 5.9 Tips and tricks 683#### 5.9.1 Reference existing project to speed up repo sync 684Doing a `repo init`, `repo sync` from scratch can take a fair amount of time. 685The main reason for that is simply because of the size of some of the gits we 686are using, like for the Linux kernel and EDK2. With repo you can reference an 687existing forest and by doing so you can speed up repo sync to instead taking ~20 688seconds instead of an hour. The way to do this are as follows. 689 6901. Start by setup a clean forest that you will not touch, in this example, let 691 us call that `optee-ref` and put that under for `$HOME/devel/optee-ref`. This 692 step will take roughly an hour. 6932. Then setup a cronjob (`crontab -e`) that does a `repo sync` in this folder 694 particular folder once a night (that is more than enough). 6953. Now you should setup your actual tree which you are going to use as your 696 working tree. The way to do this is almost the same as stated in the 697 instructions above, the only difference is that you reference the other local 698 forest when running `repo init`, like this 699 ``` 700 repo init -u https://github.com/OP-TEE/manifest.git --reference /home/jbech/devel/optee-ref 701 ``` 7024. The rest is the same above, but now it will only take a couple of seconds to 703 clone a forest. 704 705Normally step 1 and 2 above is something you will only do once. Also if you 706ignore step 2, then you will still get the latest from official git trees, since 707repo will also check for updates that aren't at the local reference. 708 709#### 5.9.2. Use ccache 710ccache is a tool that caches build object-files etc locally on the disc and can 711speed up build time significantly in subsequent builds. On Debian-based systems 712(Ubuntu, Mint etc) you simply install it by running: 713``` 714$ sudo apt-get install ccache 715``` 716 717The helper makefiles are configured to automatically find and use ccache if 718ccache is installed on your system, so other than having it installed you don't 719have to think about anything. 720 721--- 722## 6. Load driver, tee-supplicant and run xtest 723Since release v2.0.0 you don't have to load the kernel driver explicitly. In the 724standard configuration it will be built into the kernel directly. To actually 725run something on a device you however need to run tee-supplicant. This is the 726same for all platforms, so when a device has booted, then run 727``` 728$ tee-supplicant & 729``` 730and OP-TEE is ready to be used. 731 732In case you want to try run something that triggers both normal and secure side 733code you could run xtest (the main test suite for OP-TEE), run 734``` 735$ xtest 736``` 737 738--- 739## 7. Coding standards 740In this project we are trying to adhere to the same coding convention as used in 741the Linux kernel (see 742[CodingStyle](https://www.kernel.org/doc/Documentation/CodingStyle)). We achieve this by running 743[checkpatch](http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/scripts/checkpatch.pl) 744from Linux kernel. However there are a few exceptions that we had to make since 745the code also follows GlobalPlatform standards. The exceptions are as follows: 746 747- CamelCase for GlobalPlatform types are allowed. 748- And we also exclude checking third party code that we might use in this 749 project, such as LibTomCrypt, MPA, newlib (not in this particular git, but 750 those are also part of the complete TEE solution). The reason for excluding 751 and not fixing third party code is because we would probably deviate too much 752 from upstream and therefore it would be hard to rebase against those projects 753 later on (and we don't expect that it is easy to convince other software 754 projects to change coding style). 755 756### 7.1 checkpatch 757Since checkpatch is licensed under the terms of GNU GPL License Version 2, we 758cannot include this script directly into this project. Therefore we have 759written the Makefile so you need to explicitly point to the script by exporting 760an environment variable, namely CHECKPATCH. So, suppose that the source code for 761the Linux kernel is at `$HOME/devel/linux`, then you have to export like follows: 762 763 $ export CHECKPATCH=$HOME/devel/linux/scripts/checkpatch.pl 764thereafter it should be possible to use one of the different checkpatch targets 765in the [Makefile](Makefile). There are targets for checking all files, checking 766against latest commit, against a certain base-commit etc. For the details, read 767the [Makefile](Makefile). 768