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