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