1# OP-TEE Trusted OS 2## Contents 3<!--- TOC generated using http://doctoc.herokuapp.com/ --> 41. [Introduction](#1-introduction) 52. [License](#2-license) 63. [Platforms supported](#3-platforms-supported) 74. [Get and build the software](#4-get-and-build-the-software) 8 4. [Basic setup](#41-basic-setup) 9 4. [Foundation Models](#42-foundation-models) 10 4. [ARM Juno board](#43-juno) 11 4. [QEMU](#44-qemu) 12 4. [STMicroelectronics boards](#45-stmicroelectronics-boards) 13 4. [Allwinner A80](#46-allwinner-a80) 145. [Coding standards](#5-coding-standards) 15 5. [checkpatch](#51-checkpatch) 16 17# 1. Introduction 18The optee_os git, contains the source code for the TEE in Linux using the ARM(R) 19TrustZone(R) technology. This component meets the GlobalPlatform TEE System 20Architecture specification. It also provides the TEE Internal API v1.0 as 21defined by the Global Platform TEE Standard for the development of Trusted 22Applications. For a general overview of OP-TEE and to find out how to contribute, 23please see the [Notice.md](Notice.md) file. 24 25The Trusted OS is accessible from the Rich OS (Linux) using the 26[GlobalPlatform TEE Client API Specification v1.0](http://www.globalplatform.org/specificationsdevice.asp), 27which also is used to trigger secure execution of applications within the TEE. 28 29## 2. License 30The software is distributed mostly under the 31[BSD 2-Clause](http://opensource.org/licenses/BSD-2-Clause) open source 32license, apart from some files in the optee_os/lib/libutils directory which 33are distributed under the 34[BSD 3-Clause](http://opensource.org/licenses/BSD-3-Clause) or public domain 35licenses. 36 37## 3. Platforms supported 38Several platforms are supported. In order to manage slight differences 39between platforms, a `PLATFORM_FLAVOR` flag has been introduced. 40The `PLATFORM` and `PLATFORM_FLAVOR` flags define the whole configuration 41for a chip the where the Trusted OS runs. Note that there is also a 42composite form which makes it possible to append `PLATFORM_FLAVOR` directly, 43by adding a dash inbetween the names. The composite form is shown below 44for the different boards. For more specific details about build flags etc, 45please read the file [build_system.md](documentation/build_system.md). 46 47| Platform | Composite PLATFORM flag | 48|--------|--------| 49| [Foundation FVP](http://www.arm.com/fvp) |`PLATFORM=vexpress-fvp`| 50| [ARMs Juno Board](http://www.arm.com/products/tools/development-boards/versatile-express/juno-arm-development-platform.php) |`PLATFORM=vexpress-juno`| 51| [QEMU](http://wiki.qemu.org/Main_Page) |`PLATFORM=vexpress-qemu_virt`| 52| [STMicroelectronics b2120 - h310 / h410](http://www.st.com/web/en/catalog/mmc/FM131/SC999/SS1628/PF258776) |`PLATFORM=stm-cannes`| 53| [STMicroelectronics b2020-h416](http://www.st.com/web/catalog/mmc/FM131/SC999/SS1633/PF253155?sc=internet/imag_video/product/253155.jsp)|`PLATFORM=stm-orly2`| 54| [Allwinner A80 Board](http://www.allwinnertech.com/en/clq/processora/A80.html)|`PLATFORM=sunxi`| 55| [HiKey Board (HiSilicon Kirin 620)](https://www.96boards.org/products/hikey/)|`PLATFORM=hikey`| 56 57## 4. Get and build the software 58There are a couple of different build options depending on the target you are 59going to use. If you just want to get the software and compile it, then you 60should follow the instructions under the "Basic setup" below. In case you are 61going to run for a certain hardware or FVP, QEMU for example, then please follow 62the respective section instead. 63 64--- 65### 4.1 Basic setup 66#### 4.1.1 Get the compiler 67We will strive to use the latest available compiler from Linaro. Start by 68downloading and unpacking the compiler. Then export the PATH to the bin folder. 69 70``` 71$ cd $HOME 72$ mkdir toolchains 73$ cd toolchains 74$ wget http://releases.linaro.org/14.05/components/toolchain/binaries/gcc-linaro-arm-linux-gnueabihf-4.9-2014.05_linux.tar.xz 75$ tar xvf gcc-linaro-arm-linux-gnueabihf-4.9-2014.05_linux.tar.xz 76$ export PATH=$HOME/toolchains/gcc-linaro-arm-linux-gnueabihf-4.9-2014.05_linux/bin:$PATH 77``` 78 79#### 4.1.2 Download the source code 80``` 81$ cd $HOME 82$ mkdir devel 83$ cd devel 84$ git clone https://github.com/OP-TEE/optee_os.git 85``` 86 87#### 4.1.3 Build 88``` 89$ cd $HOME/devel/optee_os 90$ CROSS_COMPILE=arm-linux-gnueabihf- make 91``` 92 93#### 4.1.4 Compiler flags 94To be able to see the full command when building you could build using 95following flag: 96``` 97$ make V=1 98``` 99 100To enable debug builds use the following flag: 101``` 102$ make DEBUG=1 103``` 104 105OP-TEE supports a couple of different levels of debug prints for both TEE core 106itself and for the Trusted Applications. The level ranges from 1 to 4, where 107four is the most verbose. To set the level you use the following flag: 108``` 109$ make CFG_TEE_CORE_LOG_LEVEL=4 110``` 111 112--- 113### 4.2 Foundation Models 114By following this section will setup OP-TEE using FVP (Foundation Models and 115also Fast Models). You will have to download a script in this git and then run 116it, modify it slightly and then run it again. The reason for this is that we 117are not allowed to share Foundation models. I.e, the user has to download it 118from ARM directly. 119 120#### 4.2.1 Prerequisites 121To be able run this script you will need to install a couple of dependencies. On 122a Debian based system (Ubuntu, Mint etc.), you will at least need to install the 123following packages: 124 125``` 126$ sudo apt-get install uuid-dev 127``` 128and in case you are running on a 64bits system, then you will need to install 129the following packages. 130 131``` 132$ sudo apt-get install libc6:i386 libstdc++6:i386 libz1:i386 133``` 134 135#### 4.2.2 Download and setup FVP 136``` 137$ wget https://raw.githubusercontent.com/OP-TEE/optee_os/master/scripts/setup_fvp_optee.sh 138$ chmod 711 setup_fvp_optee.sh 139$ ./setup_fvp_optee.sh 140``` 141Follow the instructions to download Foundation Models and then update the first 142few lines under the "EDIT" section in the script. Note that if you are not 143working in Linaro and belongs to Security Working Group you will probably not 144have access to teetest.git, hence you should most likely leave this as it is. 145Run the script again. 146``` 147$ ./setup_fvp_optee.sh 148``` 149After about one hour (it's mainly cloning the kernel and edk2 that takes time) 150everything should have been cloned and built and you should be ready to use 151this. Pay attention to the line saying `OP-TEE and FVP setup completed.` that 152would be displayed when the script successfully ended. If you don't see this at 153the end, then something went wrong. 154 155#### 4.2.3 Compile 156During installation a couple of helper scripts were generated, the main reason 157for this is that there is a lot of interdependencies between the different 158software components and it's a bit tricky to point to the correct toolchains and 159to know in which order to build things. 160 161* `build_atf_opteed.sh`: This is used to build ARM-Trusted-Firmware and must be 162 called when you have updated any component that are included in the FIP (like 163 for example OP-TEE os). 164 165* `build_linux.sh`: This is used to build the Linux Kernel. 166 167* `build_normal.sh`: This is a pure helper script that build all the normal 168 world components (in correct order). 169 170* `build_optee_client.sh`: This will build OP-TEEs client library. 171 172* `build_optee_linuxkernel.sh`: This will build OP-TEEs Linux Kernel driver (as 173 a module). 174 175* `build_optee_os.sh`: Builds the Trusted OS itself. 176 177* `build_optee_tests.sh`: This will build the test suite (pay attention to the 178 access needed). 179 180* `build_secure.sh`: This is the helper script for the secure side that will 181 build all secure side components in the correct order. 182 183* `build_uefi.sh`: This will build Tianocore (UEFI). 184 185* `clean_gits.sh`: This will clean all gits. Beware that it will not reset the 186 commit to the one used when first cloning. Also note that it will only clean 187 git's (meaning that it will not clean Foundation models, toolchain folders). 188 189* `run_foundation.sh`: This is the script to use when starting FVP. 190 191* `update_rootfs.sh`: This script will update rootfs. For example when you have 192 updated normal world component, you will need to put them into rootfs. Calling 193 this script will do so. In case you are creating a new Trusted Application, 194 you must also edit filelist-tee.text in the gen_rootfs folder accordingly. 195 196Depending on how you are working you have the option to build components 197separately or you can build everything by running two of the scripts above. 198In case you want to make sure that everything was built and updated, we suggest 199that you call the scripts in the following order. 200``` 201$ ./build_secure.sh 202$ ./build_normal.sh 203``` 204By doing so all components should be (re-)built in the correct order and rootfs 205will be updated accordingly. 206 207#### 4.2.4 Run Foundation models and OP-TEE 208You simply run the script `run_foundation.sh`, load the module and start 209tee-supplicant. 210``` 211$ ./run_foundation.sh 212``` 213and in the console write 214``` 215root@FVP:/ modprobe optee_armtz 216root@FVP:/ tee-supplicant & 217``` 218Now everything has been set up and OP-TEE is ready to be used. 219 220#### 4.2.5 Known problems and limitations 221* The script `setup_fvp_optee.sh` doesn't do much error checking and doesn't 222 have many fallbacks in case of a problem. 223* The script `setup_fvp_optee.sh` setup things using absolute paths, i.e, you 224 cannot just copy a working environment to a new location. 225* In some situations you will get an error message about `undefined reference to 226 raise`. We know about this issue and it is being tracked in 227 [#issue95](https://github.com/OP-TEE/optee_os/issues/95) at GitHub. 228 229--- 230### 4.3 Juno 231Juno has been supported in OP-TEE since mid October 2014. 232 233#### WARNING: 234 235+ The ```setup_juno_optee.sh``` script provides a coherent set of components (OP-TEE client/driver/os, 236Linux kernel version 3-16.0-rc5) 237 238+ Further release will align the ARM Juno setup with other OP-TEE supported platforms: 239 240 + Linux kernel version alignment (3.18-rc1) with QEMU/FVP (DMA_BUF API change). 241 + Will need arch/arm/Kconfig patch(es) (i.e DMA_SHARED_BUFFER etc...). 242 243+ Temporary patch files required for linux kernel and juno dtb definition: 244 245 + config.linux-linaro-tracking.a226b22057c22b433caafc58eeae6e9b13ac6c8d.patch 246 + juno.dts.linux-linaro-tracking.a226b22057c22b433caafc58eeae6e9b13ac6c8d.patch 247 248#### 4.3.1 Prerequisites 249+ The following packages must be installed: 250 251``` 252$ sudo apt-get install zlib1g-dev libglib2.0-dev libpixman-1-dev libfdt-dev \ 253 libc6:i386 libstdc++6:i386 libz1:i386 cscope 254``` 255 256+ Download ARM Juno pre-built binaries: 257 258 + ARM Juno Pre-built binary bl30.bin (SCP runtime) 259 + ARM Juno Pre-built binary bl33.bin (UEFI) 260 + Download at http://community.arm.com/docs/DOC-8401 261 262 263#### 4.3.2 Download and install ARM Juno 264``` 265$ wget https://raw.githubusercontent.com/OP-TEE/optee_os/master/scripts/setup_juno_optee.sh 266$ chmod 711 setup_juno_optee.sh 267$ ./setup_juno_optee.sh 268``` 269 270#### 4.3.3 Build 271+ List of helper scripts generated during installation: 272 273* `build_atf_opteed.sh`: This is used to build ARM-Trusted-Firmware and must be 274 called when you have updated any component that are included in the FIP (like 275 for example OP-TEE os). 276 277* `build_linux.sh`: This is used to build the Linux Kernel. 278 279* `build_normal.sh`: This is a pure helper script that build all the normal 280 world components (in correct order). 281 282* `build_optee_client.sh`: This will build OP-TEEs client library. 283 284* `build_optee_linuxdriver.sh`: This will build OP-TEEs Linux Kernel driver (as 285 a module). 286 287* `build_optee_os.sh`: Builds the Trusted OS itself. 288 289* `build_optee_tests.sh`: This will build the test suite (pay attention to the 290 access needed). 291 292* `build_secure.sh`: This is the helper script for the secure side that will 293 build all secure side components in the correct order. 294 295* `clean_gits.sh`: This will clean all gits. Beware that it will not reset the 296 commit to the one used when first cloning. Also note that it will only clean 297 git's. 298 299+ Run the scripts in the following order: 300 301``` 302$ ./build_secure.sh 303$ ./build_normal.sh 304``` 305 306#### 4.3.4 Booting up ARM Juno 307 308+ Update the ARM Juno embedded flash memory (path: JUNO/SOFTWARE): 309 310 + bl1.bin 311 + fip.bin 312 + Image 313 + juno.dtb 314 315+ Copy OP-TEE binaries on the filesystem(*) located on the external USB key: 316 317 + user client libraries: libteec.so* 318 + supplicant: tee-supplicant 319 + driver modules: optee.ko. optee_armtz.ko 320 + CA: xtest 321 + TAs: *.ta 322 323+ Connect the USB key (filesystem) on any connector of the rear panel 324 325+ Connect a serial terminal (115200, 8, n, 1) 326to the upper 9-pin (UART0) connector. 327 328+ Connect the 12 volt power, then press the red button on the rear panel. 329 330Note: 331The default configuration is to automatically boot a Linux kernel, 332which expects to find a root filesystem on /dev/sda1 333(any one of the rear panel USB ports). 334 335(*)Download a minimal filesytem at: 336http://releases.linaro.org/14.02/openembedded/aarch64/ 337linaro-image-minimal-genericarmv8-20140223-649.rootfs.tar.gz 338 339UEFI offers a 10 second window to interrupt the boot sequence by pressing 340a key on the serial terminal, after which the kernel is launched. 341 342Once booted you will get the prompt: 343``` 344root@genericarmv8:~# 345``` 346 347#### 4.3.4 Run OP-TEE on ARM Juno 348Write in the console: 349``` 350root@genericarmv8:~# modprobe optee 351root@genericarmv8:~# tee-supplicant & 352``` 353Now everything has been set up and OP-TEE is ready to be used. 354 355#### 4.3.5 Known problems and limitations 356ARM Juno could be sensitive on the USB memory type (filesystem) 357Recommendation: Use USB memory 3.0 (ext3/ext4 filesystem) 358 359--- 360### 4.4 QEMU 361You can run OP-TEE using QEMU since October 2014. 362 363#### 4.4.1 Prerequisites 364To be able run this script you will need to install a couple of dependencies. On 365a Debian based system (Ubuntu, Mint etc.), you will at least need to install the 366following packages: 367 368``` 369$ sudo apt-get install zlib1g-dev libglib2.0-dev libpixman-1-dev libfdt-dev \ 370 libc6:i386 libstdc++6:i386 libz1:i386 cscope 371``` 372 373#### 4.4.2 Download and setup QEMU 374``` 375$ wget https://raw.githubusercontent.com/OP-TEE/optee_os/master/scripts/setup_qemu_optee.sh 376$ chmod 711 setup_qemu_optee.sh 377$ ./setup_qemu_optee.sh 378``` 379 380#### 4.4.3 Compile for QEMU 381During installation a couple of helper scripts were generated, the main reason 382for this is that there is a lot of interdependencies between the different 383software components and it's a bit tricky to point to the correct toolchains and 384to know in which order to build things. 385 386* `build_bios.sh`: This build the BIOS needed in QEMU 387 388* `build_linux.sh`: This is used to build the Linux Kernel. 389 390* `build_optee_client.sh`: This will build OP-TEEs client library. 391 392* `build_optee_linuxkernel.sh`: This will build OP-TEEs Linux Kernel driver (as 393 a module). 394 395* `build_optee_os.sh`: Builds the Trusted OS itself. 396 397* `build.sh`: Builds all software components in the correct order. 398 399* `run_qemu.sh`: This script starts QEMU. 400 401* `serial_0.sh`: Starts listening to QEMUs normal world UART console. 402 403* `serial_1.sh`: Starts listening to QEMUs secure world UART console. 404 405* `update_rootfs.sh`: This script will update rootfs. For example when you have 406 updated normal world component, you will need to put them into rootfs. Calling 407 this script will do so. In case you are creating a new Trusted Application, 408 you must also edit filelist-tee.text in the gen_rootfs folder accordingly. 409 410To build everything you will need to run the script `build.sh`, which will build 411all gits and in the correct order. 412 413#### 4.4.4 Boot and run QEMU and OP-TEE 414To run this you need to lunch two consoles for the UARTs and one console for 415QEMU itself, so in separate shell windows run: 416``` 417$ ./serial_0.sh 418``` 419``` 420$ ./serial_1.sh 421``` 422and finally 423``` 424$ ./run_qemu.sh 425... 426QEMU 2.1.50 monitor - type 'help' for more information 427(qemu) c 428``` 429 430In the window for serial_0 you will now get the normal world console and here 431you need to load and OP-TEEs Linux Kernel driver and also load tee-supplicant. 432This is done by the following lines: 433 434``` 435$ root@Vexpress:/ modprobe optee_armtz 436$ root@Vexpress:/ tee-supplicant & 437``` 438 439--- 440### 4.5 STMicroelectronics boards 441Currently OP-TEE is supported on Orly-2 (b2020-h416) and Cannes family (b2120 442both h310 and h410 chip). 443 444#### 4.5.1 Get the compiler for Orly-2 445Will be written soon. 446 447#### 4.5.2 Download the source code 448See section "4.1.2 Download the source code". 449 450#### 4.5.3 Build for Orly-2 451Will be written soon. 452 453For Orly-2 do as follows 454``` 455$ PLATFORM_FLAVOR=orly2 CROSS_COMPILE=arm-linux-gnueabihf- make 456``` 457 458For Cannes family do as follows 459``` 460$ PLATFORM_FLAVOR=cannes CROSS_COMPILE=arm-linux-gnueabihf- make 461``` 462 463#### 4.5.4 Prepare and install the images 464Will be written soon. 465 466For Orly-2 do as follows 467``` 468To be written. 469``` 470 471For Cannes family do as follows 472``` 473To be written. 474``` 475 476#### 4.5.5 Boot and run the software 477Will be written soon. All magic with STM and so on must be stated here. 478 479For Orly-2 do as follows 480``` 481To be written. 482``` 483 484For Cannes family do as follows 485``` 486To be written. 487``` 488 489--- 490### 4.6 Allwinner A80 491Allwinner A80 platform has been supported in OP-TEE since mid December 2014. 492#### 4.6.1 Get the compiler and source 493Follow the instructions in the "4.1 Basic setup". 494 495#### 4.6.2 Build 496``` 497$ cd optee_os 498$ export PLATFORM=sunxi 499$ export CROSS_COMPILE=arm-linux-gnueabihf- 500$ make 501``` 502 503#### 4.6.3 Prepare the images to run on A80 Board 504 505Download Allwinner A80 platform SDK. 506The SDK refer to Allwinner A80 platform SDK root directory. 507A80 SDK directory tree like this: 508``` 509SDK/ 510 Android 511 lichee 512``` 513Android include all Android source code, 514lichee include bootloader and linux kernel. 515 516##### 4.6.3.1 Copy OP-TEE output to package directory 517copy the OP-TEE output binary to SDK/lichee/tools/pack/sun9i/bin 518``` 519$ cd optee_os 520$ cp ./out/arm32-plat-sunxi/core/tee.bin SDK/lichee/tools/pack/sun9i/bin 521``` 522 523##### 4.6.3.2 Build linux kernel 524In lichee directory, Type the following commands: 525``` 526$ cd SDK/lichee 527$ ./build.sh 528``` 529 530##### 4.6.3.3 Build Android 531In Android directory, Type the following commands: 532``` 533$ cd SDK/android 534$ extract-bsp 535$ make -j 536``` 537 538##### 4.6.3.4 Create Android image 539In andoid directory, Type the following commands: 540``` 541$ cd SDK/android 542$ pack 543``` 544The output image will been signed internally when pack. 545The output image name is a80_android_board.img. 546 547##### 4.6.3.5 Download Android image 548Use Allwinner PhoenixSuit tool to download to A80 board. 549Choose the output image(a80_android_board.img), 550Choose download, 551Wait for the download to complete. 552 553#### 4.6.4 Boot and run the software on A80 Board 554When the host platform is Windows, Use a console application 555to connect A80 board uart0. In the console window, 556You can install OP-TEE linux kernel driver optee.ko, 557Load OP-TEE-Client daemon tee-supplicant, 558Run OP-TEE example hello world application. 559This is done by the following lines: 560``` 561$ insmod /system/vendor/modules/optee.ko 562$ /system/bin/tee-supplicant & 563$ /system/bin/tee-helloworld 564``` 565Enjoying OP-TEE on A80 board. 566 567## 5. Coding standards 568In this project we are trying to adhere to the same coding convention as used in 569the Linux kernel (see 570[CodingStyle](https://www.kernel.org/doc/Documentation/CodingStyle)). We achieve this by running 571[checkpatch](http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/scripts/checkpatch.pl) from Linux kernel. 572However there are a few exceptions that we had to make since the code also 573follows GlobalPlatform standards. The exceptions are as follows: 574 575- CamelCase for GlobalPlatform types are allowed. 576- And we also exclude checking third party code that we might use in this 577 project, such as LibTomCrypt, MPA, newlib (not in this particular git, but 578 those are also part of the complete TEE solution). The reason for excluding 579 and not fixing third party code is because we would probably deviate too much 580 from upstream and therefore it would be hard to rebase against those projects 581 later on (and we don't expect that it is easy to convince other software 582 projects to change coding style). 583 584### 5.1 checkpatch 585Since checkpatch is licensed under the terms of GNU GPL License Version 2, we 586cannot include this script directly into this project. Therefore we have 587written the Makefile so you need to explicitly point to the script by exporting 588an environment variable, namely CHECKPATCH. So, suppose that the source code for 589the Linux kernel is at `$HOME/devel/linux`, then you have to export like follows: 590 591 $ export CHECKPATCH=$HOME/devel/linux/scripts/checkpatch.pl 592thereafter it should be possible to use one of the different checkpatch targets 593in the [Makefile](Makefile). There are targets for checking all files, checking 594against latest commit, against a certain base-commit etc. For the details, read 595the [Makefile](Makefile). 596