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