xref: /optee_os/README.md (revision 39a6336d8f7647cb2ed723e9e050c2b4c4a98db8)
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