From 3071a35cf3cbf22ddbf27ba675b2c7b3ac2a39b9 Mon Sep 17 00:00:00 2001 From: suwanghw Date: Fri, 1 Dec 2023 10:21:22 +0800 Subject: [PATCH] modify README.md Signed-off-by: suwanghw --- README.md | 112 ++++++++++++++++++++------------- figures/tzdriver.drawio_en.png | Bin 0 -> 29902 bytes 2 files changed, 69 insertions(+), 43 deletions(-) create mode 100644 figures/tzdriver.drawio_en.png diff --git a/README.md b/README.md index b6c3308..a63349a 100644 --- a/README.md +++ b/README.md @@ -1,52 +1,78 @@ -# Tzdriver Module Introduction +# Tzdriver driver -- [Introduction](#section469617221261) -- [tzdriver project Structure](#section15884114210197) -- [secondary Directories structure](#section1464106163817) +## Introduction -## Introduction +Tzdriver is a kernel driver deployed on the REE side, supporting communication between REE and TEE. Tzdriver processes commands from Tee Client and sends instructions to switch from REE to TEE. Tzdriver supports data sharing between REE and TEE by managing shared memory. -tzdriver is a part of REE. The REE module provides a set of rich execution environment \(REE\) API components for interacting with TEEOS, including tzdriver \(driver\), libteec \(API library\), and teecd \(agent service\). This module tzdriver normally is a part of kernel, sometimes could be ko(kernel module). +Tzdriver includes the following main modules: -## Tzdriver project Structure +smc: Send smc instructions to switch the CPU from the REE side to the TEE side for operation. -tee_tzdriver:project directory -- README.md&README_zh.md:Introduction file -- LICENSE:GPL v2 LICENSE -- linux:tzdriver for linux kernel -- liteos:tzdriver for liteos_a kernel +session_manager: Manage communication sessions between REE and TEE. -## Secondary Directories structure +mailbox:Data is shared between REE and TEE through the mailbox. -**Table 1** tzdriver main secondary source code structure +cmd_monitor:Monitor the operation of SMC instructions and provides a timeout detection mechanism. - - - - - - - - - - - - - - - - - - -

main secondary directory

-

description

-

core

-

core function code, include:smc, agent...

-

tlogger

-

for tee log

-

auth

-

for authentication

-

include

-

export header files

-
+tzdebug:Create debugfs debugging nodes to facilitate developers in debugging TEE functionality +tlogger:TEE log driver module, supporting TEE log recording and printing. + +Figure 1: Tzdriver architecture diagram + +![](figures/tzdriver.drawio_en.png) + +## Directory + +``` +base/tee/tee_tzdriver +├── core +│ ├── cmdmonitor.c # SMC instruction execution monitoring + ├── gp_ops.c # GP TEE specification processing logic + ├── mailbox_mempool.c # REE and TEE shared memory management + ├── session_manager.c # Session management for CA access to TA + ├── smc_smp.c # Send SMC command to switch to TEE + ├── tzdebug.c # Debugging module +├── tlogger # TEE log driver +``` + +## Configuration Option + +If you want to enable the Tzdriver driver, you need to modify the defconfig file of the device in the Linux kernel code repository and add configuration options for Tzdriver: + +``` +# +# TEEOS +# +CONFIG_TZDRIVER=y +CONFIG_CPU_AFF_NR=1 +CONFIG_KERNEL_CLIENT=y +CONFIG_TEELOG=y +CONFIG_PAGES_MEM=y +CONFIG_THIRDPARTY_COMPATIBLE=y +``` + +The meanings of each option are shown in the table below: + +**Table 1** Configuration Options Description + +| Parameters | Description | +| ---------------------------- | ------------------------------------------------------------ | +| CONFIG_TZDRIVER | Tzdriver module switch. | +| CONFIG_CPU_AFF_NR | CA binding core function, non-zero values represent restrictions on CPUID less than CONFIG_ CPU_ AFF_ NR's CPU can enter TEE, where 0 represents unlimited. Currently, Tzdriver only supports running on 0 cores, so the value is 1. | +| CONFIG_KERNEL_CLIENT | Support the kernel CA option. | +| CONFIG_TEELOG | TEE log switch, it is recommended to enable. | +| CONFIG_PAGES_MEM | TEE log memory management, it is recommended to enable. | +| CONFIG_THIRDPARTY_COMPATIBLE | Used for compatibility with third-party optee, such as the RK3568 chip, which requires this option to be enabled. | + +## Compile Command + +Tzdriver is compiled together with the kernel. Taking the rk3568 chip as an example, the "boot_linux.img" can be compiled separately. The compilation command is as follows + +``` +./build.sh --product-name rk3568 --ccache --build-target kernel --gn-args linux_kernel_version=\"linux-5.10\" +``` + +## Related code repository + +[tee_client](https://gitee.com/openharmony-sig/tee_tee_client) diff --git a/figures/tzdriver.drawio_en.png b/figures/tzdriver.drawio_en.png new file mode 100644 index 0000000000000000000000000000000000000000..8f4329fd4b47b81e4141eb0732a23d34dc7a4373 GIT binary patch literal 29902 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 literal 0 HcmV?d00001