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. [Tips and tricks](#57-tips-and-tricks) 26 5. [Reference existing project to speed up repo sync](#571-reference-existing-project-to-speed-up-repo-sync) 27 5. [Use ccache](#572-use-ccache) 286. [Load driver, tee-supplicant and run xtest](#6-load-driver-tee-supplicant-and-run-xtest) 297. [Coding standards](#7-coding-standards) 30 7. [checkpatch](#71-checkpatch) 31 32# 1. Introduction 33The `optee_os git`, contains the source code for the TEE in Linux using the 34ARM® TrustZone® technology. This component meets the GlobalPlatform 35TEE System Architecture specification. It also provides the TEE Internal core API 36v1.1 as defined by the GlobalPlatform TEE Standard for the development of 37Trusted Applications. For a general overview of OP-TEE and to find out how to 38contribute, please see the [Notice.md](Notice.md) file. 39 40The Trusted OS is accessible from the Rich OS (Linux) using the 41[GlobalPlatform TEE Client API Specification v1.0](http://www.globalplatform.org/specificationsdevice.asp), 42which also is used to trigger secure execution of applications within the TEE. 43 44--- 45## 2. License 46The software is distributed mostly under the 47[BSD 2-Clause](http://opensource.org/licenses/BSD-2-Clause) open source 48license, apart from some files in the `optee_os/lib/libutils` directory 49which are distributed under the 50[BSD 3-Clause](http://opensource.org/licenses/BSD-3-Clause) or public domain 51licenses. 52 53--- 54## 3. Platforms supported 55Several platforms are supported. In order to manage slight differences 56between platforms, a `PLATFORM_FLAVOR` flag has been introduced. 57The `PLATFORM` and `PLATFORM_FLAVOR` flags define the whole configuration 58for a chip the where the Trusted OS runs. Note that there is also a 59composite form which makes it possible to append `PLATFORM_FLAVOR` directly, 60by adding a dash in-between the names. The composite form is shown below 61for the different boards. For more specific details about build flags etc, 62please read the file [build_system.md](documentation/build_system.md). Some 63platforms have different sub-maintainers, please refer to the file 64[MAINTAINERS.md](MAINTAINERS.md) for contact details for various platforms. 65 66<!-- Please keep this list sorted in alphabetic order --> 67| Platform | Composite PLATFORM flag | Publicly available? | 68|----------|-------------------------|---------------------| 69| [Allwinner A80 Board](http://www.allwinnertech.com/en/clq/processora/A80.html)|`PLATFORM=sunxi`| No | 70| [ARM Juno Board](http://www.arm.com/products/tools/development-boards/versatile-express/juno-arm-development-platform.php) |`PLATFORM=vexpress-juno`| Yes | 71| [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 | 72| [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 | 73| [ARM Foundation FVP](http://www.arm.com/fvp) |`PLATFORM=vexpress-fvp`| Yes | 74| [HiKey Board (HiSilicon Kirin 620)](https://www.96boards.org/products/hikey)|`PLATFORM=hikey`| Yes | 75| [MediaTek MT8173 EVB Board](http://www.mediatek.com/en/products/mobile-communications/tablet/mt8173)|`PLATFORM=mediatek-mt8173`| No | 76| [QEMU](http://wiki.qemu.org/Main_Page) |`PLATFORM=vexpress-qemu_virt`| Yes | 77| [STMicroelectronics b2120 - h310 / h410](http://www.st.com/web/en/catalog/mmc/FM131/SC999/SS1628/PF258776) |`PLATFORM=stm-cannes`| No | 78| [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 | 79| [Texas Instruments DRA7xx](http://www.ti.com/product/DRA746)|`PLATFORM=ti-dra7xx`| Yes | 80 81### 3.1 Development board for community user 82For community users, we suggest using [HiKey board](https://www.96boards.org/products/ce/hikey/) 83as development board. It provides detailed documentation including chip 84datasheet, board schematics, source code, binaries etc on the download link at 85the website. 86 87--- 88## 4. Get and build OP-TEE software 89There are a couple of different build options depending on the target you are 90going to use. If you just want to get the software and compile it, then you 91should follow the instructions under the "Basic setup" below. In case you are 92going to run for a certain hardware or FVP, QEMU for example, then please follow 93the respective section found below instead, having that said, we are moving from 94the shell script based setups to instead use 95[repo](https://source.android.com/source/downloading.html), so for some targets 96you will see that we are using repo ([section 5](#5-repo-manifests)) and for 97others we are still using the shell script based setup 98([section 4](#4-get-and-build-op-tee-software)), please see this transitions as 99work in progress. 100 101--- 102### 4.1 Prerequisites 103We believe that you can use any Linux distribution to build OP-TEE, but as 104maintainers of OP-TEE we are mainly using Ubuntu-based distributions and to be 105able to build and run OP-TEE there are a few packages that needs to be installed 106to start with. Therefore install the following packages regardless of what 107target you will use in the end. 108``` 109$ sudo apt-get install android-tools-fastboot autoconf bison cscope curl \ 110 flex gdisk libc6:i386 libfdt-dev libglib2.0-dev \ 111 libpixman-1-dev libstdc++6:i386 libz1:i386 netcat \ 112 python-crypto python-serial uuid-dev xz-utils zlib1g-dev 113``` 114 115--- 116### 4.2 Basic setup 117#### 4.2.1 Get the compiler 118We strive to use the latest available compiler from Linaro. Start by downloading 119and unpacking the compiler. Then export the `PATH` to the compilers `bin` 120folder. Beware that we are using a couple of different toolchains depending on 121the target device. This includes both 64- and 32-bit toolchains. For the exact 122toolchain in use, please have a look at [toolchain.mk](https://github.com/OP-TEE/build/blob/master/toolchain.mk) 123and then look at the targets makefile (see [build.git](https://github.com/OP-TEE/build)) 124to find out where the respective toolchain will be used. For example in the 125[QEMU makefile](https://github.com/OP-TEE/build/blob/master/qemu.mk#L12-L15) you 126will see: 127``` 128CROSS_COMPILE_NS_USER ?= "$(CCACHE)$(AARCH32_CROSS_COMPILE)" 129CROSS_COMPILE_NS_KERNEL ?= "$(CCACHE)$(AARCH32_CROSS_COMPILE)" 130CROSS_COMPILE_S_USER ?= "$(CCACHE)$(AARCH32_CROSS_COMPILE)" 131CROSS_COMPILE_S_KERNEL ?= "$(CCACHE)$(AARCH32_CROSS_COMPILE)" 132``` 133 134However, if you only want to compile optee_os, then you can do like this: 135``` 136$ cd $HOME 137$ mkdir toolchains 138$ cd toolchains 139$ wget http://releases.linaro.org/14.08/components/toolchain/binaries/gcc-linaro-arm-linux-gnueabihf-4.9-2014.08_linux.tar.xz 140$ tar xvf gcc-linaro-arm-linux-gnueabihf-4.9-2014.08_linux.tar.xz 141$ export PATH=$HOME/toolchains/gcc-linaro-arm-linux-gnueabihf-4.9-2014.08_linux/bin:$PATH 142``` 143 144#### 4.2.2 Download the source code 145``` 146$ cd $HOME 147$ mkdir devel 148$ cd devel 149$ git clone https://github.com/OP-TEE/optee_os.git 150``` 151 152#### 4.2.3 Build 153``` 154$ cd $HOME/devel/optee_os 155$ CROSS_COMPILE=arm-linux-gnueabihf- make 156``` 157 158#### 4.2.4 Compiler flags 159To be able to see the full command when building you could build using 160following flag: 161``` 162$ make V=1 163``` 164 165To enable debug builds use the following flag: 166``` 167$ make DEBUG=1 168``` 169 170OP-TEE supports a couple of different levels of debug prints for both TEE core 171itself and for the Trusted Applications. The level ranges from 1 to 4, where 172four is the most verbose. To set the level you use the following flag: 173``` 174$ make CFG_TEE_CORE_LOG_LEVEL=4 175``` 176 177--- 178### 4.4 STMicroelectronics boards 179Currently OP-TEE is supported on Orly-2 (`b2020-h416`) and Cannes family 180(`b2120` both `h310` and `h410` chip). 181 182#### 4.4.1 Get the compiler for Orly-2 183Will be written soon. 184 185#### 4.4.2 Download the source code 186See section "4.2.2 Download the source code". 187 188#### 4.4.3 Build for Orly-2 189For Orly-2 do as follows 190``` 191$ PLATFORM=stm-orly2 CROSS_COMPILE=arm-linux-gnueabihf- make 192``` 193 194For Cannes family do as follows 195``` 196$ PLATFORM=stm-cannes CROSS_COMPILE=arm-linux-gnueabihf- make 197``` 198 199#### 4.4.4 Prepare and install the images 200Will be written soon. 201 202#### 4.4.5 Boot and run the software 203<!-- All magic with STM and so on must be stated here. --> 204Will be written soon. 205 206--- 207### 4.5 Allwinner A80 208 209#### 4.5.1 Locked versus unlocked A80 boards 210**Important!** All A80 boards sold to the general public are boards where secure 211side has been locked down, which means that you **cannot** use them for secure 212side development, i.e, it will not be possible to put OP-TEE on those devices. 213If you want to use A80 board for secure side development, then you will need to 214talk to 215[Allwinner](https://github.com/OP-TEE/optee_os/blob/master/MAINTAINERS.md) 216directly and ask if it is possible get a device from them. 217 218#### 4.5.2 Get the compiler and source 219Follow the instructions in the "4.2 Basic setup". 220 221#### 4.5.3 Build 222``` 223$ cd optee_os 224$ export PLATFORM=sunxi 225$ export CROSS_COMPILE=arm-linux-gnueabihf- 226$ make 227``` 228 229#### 4.5.4 Prepare the images to run on A80 Board 230 231Download Allwinner A80 platform SDK, the SDK refers to Allwinner A80 platform 232SDK root directory. A80 SDK directory tree looks like this: 233``` 234SDK/ 235 Android 236 lichee 237``` 238`Android` contains all source code related to Android and `lichee` 239contains the bootloader and Linux kernel. 240 241##### 4.5.4.1 Copy OP-TEE output to package directory 242Copy the OP-TEE output binary to `SDK/lichee/tools/pack/sun9i/bin` 243 244``` 245$ cd optee_os 246$ cp ./out/arm32-plat-sunxi/core/tee.bin SDK/lichee/tools/pack/sun9i/bin 247``` 248 249##### 4.5.4.2 Build Linux kernel 250In the `lichee` directory, run the following commands: 251``` 252$ cd SDK/lichee 253$ ./build.sh 254``` 255 256##### 4.5.4.3 Build Android 257In the Android directory, run the following commands: 258``` 259$ cd SDK/android 260$ extract-bsp 261$ make -j 262``` 263 264##### 4.5.4.4 Create the Android image 265In the Android directory, run the following commands: 266``` 267$ cd SDK/android 268$ pack 269``` 270The output image will been signed internally when packed. The output image name 271is `a80_android_board.img`. 272 273##### 4.5.4.5 Download the Android image 274Use `Allwinner PhoenixSuit` tool to download to A80 board. 275Choose the output image(`a80_android_board.img`), select download and wait 276for the download to complete. 277 278#### 4.5.5 Boot and run the software on A80 Board 279When the host platform is Windows, use a console application to connect A80 280board `uart0`. In the console window, You can install OP-TEE linux kernel 281driver `optee.ko`, load OP-TEE-Client daemon `tee-supplicant` and run 282the example "hello world" Trusted Application, do this by running: 283``` 284$ insmod /system/vendor/modules/optee.ko 285$ /system/bin/tee-supplicant & 286$ /system/bin/tee-helloworld 287``` 288 289--- 290### 4.6 Freescale MX6UL EVK 291Build: 292``` 293 PLATFORM_FLAVOR=mx6ulevk make PLATFORM=imx 294 ${CROSS_COMPILE}-objcopy -O binary out/arm-plat-imx/core/tee.elf optee.bin 295 copy optee.bin to the first partition of SD card which is used for boot. 296``` 297Run using U-Boot: 298``` 299 run loadfdt; 300 run loadimage; 301 fatload mmc 1:1 0x9c100000 optee.bin; 302 run mmcargs; 303 bootz ${loadaddr} - ${fdt_addr}; 304``` 305 306Note: 307 CAAM is not implemented now, this will be added later. 308 309--- 310## 5. repo manifests 311 312A Git repository is available at https://github.com/OP-TEE/manifest where you 313will find XML-files for use with the Android 'repo' tool. 314 315### 5.1. Install repo 316Follow the instructions under the "Installing Repo" section 317[here](https://source.android.com/source/downloading.html). 318 319### 5.2. Get the source code 320First ensure that you have the necessary Ubuntu packages installed, see [4.1 321Prerequisites](#41-prerequisites) (this is the only important step from section 3224 in case you are setting up any of the target devices mentioned below). 323 324``` 325$ mkdir -p $HOME/devel/optee 326$ cd $HOME/devel/optee 327$ repo init -u https://github.com/OP-TEE/manifest.git -m ${TARGET}.xml [-b ${BRANCH}] 328$ repo sync 329``` 330 331#### 5.2.1 Targets 332| Target | Latest | Stable | 333|--------|--------|--------| 334| QEMU | `default.xml` | `default_stable.xml` | 335| FVP | `fvp.xml` | `fvp_stable.xml` | 336| HiKey | `hikey.xml` | `hikey_stable.xml` | 337| MediaTek MT8173 EVB Board | `mt8173-evb.xml` | `mt8173-evb_stable.xml` | 338| ARM Juno board| `juno.xml` | `juno_stable.xml` | 339 340#### 5.2.2 Branches 341Currently we are only using one branch, i.e, the `master` branch. 342 343#### 5.2.3 Get the toolchains 344``` 345$ cd build 346$ make toolchains 347``` 348 349**Notes**<br> 350* The folder could be at any location, we are just giving a suggestion by 351 saying `$HOME/devel/optee`. 352* `repo sync` can take an additional parameter -j to sync multiple remotes. For 353 example `repo sync -j3` will sync three remotes in parallel. 354 355--- 356### 5.3. QEMU 357After getting the source and toolchain, just run (from the `build` folder) 358``` 359$ make all run 360``` 361and everything should compile and at the end QEMU should start. 362 363--- 364### 5.4. FVP 365After getting the source and toolchain you must also obtain Foundation Model 366([link](http://www.arm.com/products/tools/models/fast-models/foundation-model.php)) 367binaries and untar it to the forest root, then just run (from the `build` folder) 368 369``` 370$ make all run 371``` 372and everything should compile and at the end FVP should start. 373 374--- 375### 5.5. HiKey 376After getting the source and toolchain, just run (from the `build` folder) 377``` 378$ make all 379``` 380 381After that connect the board and flash the binaries by running: 382``` 383$ make flash 384``` 385 386(more information about how to flash individual binaries could be found 387[here](https://github.com/96boards/documentation/wiki/HiKeyUEFI#flash-binaries-to-emmc-)) 388 389The board is ready to be booted. 390 391--- 392### 5.6. MT8173-EVB 393After getting the source and toolchain, just run (from the `build` folder) 394 395``` 396$ make all run 397``` 398 399When `< waiting for device >` prompt appears, press reset button and the 400flashing procedure should begin. 401 402--- 403### 5.7 Juno 404After getting the source and toolchain, just run (from the `build` folder) 405``` 406$ make all 407``` 408 409Enter the firmware console on the juno board and press enter to stop 410the auto boot flow 411``` 412ARM V2M_Juno Firmware v1.3.9 413Build Date: Nov 11 2015 414 415Time : 12:50:45 416Date : 29:03:2016 417 418Press Enter to stop auto boot... 419 420``` 421Enable ftp at the firmware prompt 422``` 423Cmd> ftp_on 424Enabling ftp server... 425 MAC address: xxxxxxxxxxxx 426 427 IP address: 192.168.1.158 428 429 Local host name = V2M-JUNO-A2 430``` 431 432Flash the binary by running (note the IP address from above): 433``` 434make JUNO_IP=192.168.1.158 flash 435``` 436 437Once the binaries are transferred, reboot the board: 438``` 439Cmd> reboot 440 441``` 442 443#### 5.7.1 Update flash and its layout 444The flash in the board may need to be updated for the flashing above to 445work. If the flashing fails or if ARM-TF refuses to boot due to wrong 446version of the SCP binary the flash needs to be updated. To update the 447flash please follow the instructions at [Using Linaro's deliverable on 448Juno](https://community.arm.com/docs/DOC-10804) selecting one of the zips 449under "4.1 Prebuilt configurations" flashing it as described under "5. 450Running the software". 451 452#### 5.7.2 GlobalPlatform testsuite support 453##### Warning : 454Depending on the Juno pre-built configuration, the built ramdisk.img 455size with GlobalPlatform testsuite may exceed its pre-defined Juno flash 456memory reserved location (image.txt file). 457In that case, you will need to extend the Juno flash block size reserved 458location for the ramdisk.img in the image.txt file accordingly and 459follow the instructions under "5.7.1 Update flash and its layout". 460 461##### Example with juno-latest-busybox-uboot.zip: 462The current ramdisk.img size with GlobalPlatform testsuite 463is 8.6 MBytes. 464 465###### Updated file is /JUNO/SITE1/HBI0262B/images.txt (limited to 8.3 MB) 466``` 467NOR4UPDATE: AUTO ;Image Update:NONE/AUTO/FORCE 468NOR4ADDRESS: 0x01800000 ;Image Flash Address 469NOR4FILE: \SOFTWARE\ramdisk.img ;Image File Name 470NOR4NAME: ramdisk.img 471NOR4LOAD: 00000000 ;Image Load Address 472NOR4ENTRY: 00000000 ;Image Entry Point 473``` 474 475###### Extended to 16MB 476``` 477NOR4UPDATE: AUTO ;Image Update:NONE/AUTO/FORCE 478NOR4ADDRESS: 0x01000000 ;Image Flash Address 479NOR4FILE: \SOFTWARE\ramdisk.img ;Image File Name 480NOR4NAME: ramdisk.img 481NOR4LOAD: 00000000 ;Image Load Address 482NOR4ENTRY: 00000000 ;Image Entry Point 483``` 484 485--- 486### 5.8 Tips and tricks 487#### 5.8.1 Reference existing project to speed up repo sync 488Doing a `repo init`, `repo sync` from scratch can take a fair amount of time. 489The main reason for that is simply because of the size of some of the gits we 490are using, like for the Linux kernel and EDK2. With repo you can reference an 491existing forest and by doing so you can speed up repo sync to instead taking ~20 492seconds instead of an hour. The way to do this are as follows. 493 4941. Start by setup a clean forest that you will not touch, in this example, let 495 us call that `optee-ref` and put that under for `$HOME/devel/optee-ref`. This 496 step will take roughly an hour. 4972. Then setup a cronjob (`crontab -e`) that does a `repo sync` in this folder 498 particular folder once a night (that is more than enough). 4993. Now you should setup your actual tree which you are going to use as your 500 working tree. The way to do this is almost the same as stated in the 501 instructions above, the only difference is that you reference the other local 502 forest when running `repo init`, like this 503 ``` 504 repo init -u https://github.com/OP-TEE/manifest.git --reference /home/jbech/devel/optee-ref 505 ``` 5064. The rest is the same above, but now it will only take a couple of seconds to 507 clone a forest. 508 509Normally step 1 and 2 above is something you will only do once. Also if you 510ignore step 2, then you will still get the latest from official git trees, since 511repo will also check for updates that aren't at the local reference. 512 513#### 5.8.2. Use ccache 514ccache is a tool that caches build object-files etc locally on the disc and can 515speed up build time significantly in subsequent builds. On Debian-based systems 516(Ubuntu, Mint etc) you simply install it by running: 517``` 518$ sudo apt-get install ccache 519``` 520 521The helper makefiles are configured to automatically find and use ccache if 522ccache is installed on your system, so other than having it installed you don't 523have to think about anything. 524 525--- 526## 6. Load driver, tee-supplicant and run xtest 527Since release v2.0.0 you don't have to load the kernel driver explicitly. In the 528standard configuration it will be built into the kernel directly. To actually 529run something on a device you however need to run tee-supplicant. This is the 530same for all platforms, so when a device has booted, then run 531``` 532$ tee-supplicant & 533``` 534and OP-TEE is ready to be used. 535 536In case you want to try run something that triggers both normal and secure side 537code you could run xtest (the main test suite for OP-TEE), run 538``` 539$ xtest 540``` 541 542--- 543## 7. Coding standards 544In this project we are trying to adhere to the same coding convention as used in 545the Linux kernel (see 546[CodingStyle](https://www.kernel.org/doc/Documentation/CodingStyle)). We achieve this by running 547[checkpatch](http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/scripts/checkpatch.pl) 548from Linux kernel. However there are a few exceptions that we had to make since 549the code also follows GlobalPlatform standards. The exceptions are as follows: 550 551- CamelCase for GlobalPlatform types are allowed. 552- And we also exclude checking third party code that we might use in this 553 project, such as LibTomCrypt, MPA, newlib (not in this particular git, but 554 those are also part of the complete TEE solution). The reason for excluding 555 and not fixing third party code is because we would probably deviate too much 556 from upstream and therefore it would be hard to rebase against those projects 557 later on (and we don't expect that it is easy to convince other software 558 projects to change coding style). 559 560### 7.1 checkpatch 561Since checkpatch is licensed under the terms of GNU GPL License Version 2, we 562cannot include this script directly into this project. Therefore we have 563written the Makefile so you need to explicitly point to the script by exporting 564an environment variable, namely CHECKPATCH. So, suppose that the source code for 565the Linux kernel is at `$HOME/devel/linux`, then you have to export like follows: 566 567 $ export CHECKPATCH=$HOME/devel/linux/scripts/checkpatch.pl 568thereafter it should be possible to use one of the different checkpatch targets 569in the [Makefile](Makefile). There are targets for checking all files, checking 570against latest commit, against a certain base-commit etc. For the details, read 571the [Makefile](Makefile). 572 573