diff --git a/build/Makefile b/build/Makefile index 04cb4bbf..559e6893 100644 --- a/build/Makefile +++ b/build/Makefile @@ -87,6 +87,10 @@ export OUTPUTDIR := $(TOPDIR)/output export SDK_VER := tee-kernel-local-release +ifneq ($(PLATFORM),) +export PLATFORM_DRIVERS_PATH := $(DRIVERS_PATH)/platform/$(PLATFORM) +endif + PHONY += default default: all @@ -133,11 +137,20 @@ HDR_INSTALL_DIR:=$(HDR_L_DIR) $(shell test -d $(HDR_INSTALL_DIR) || mkdir -p $(HDR_INSTALL_DIR)) endif +check_platform: +ifndef PLATFORM + $(error PLATFORM is not set) +endif + @echo "PLATFORM is set to $(PLATFORM)" + +PHONY += check_platform + # default target -PHONY += libs $(drivers) $(frameworks) $(service) package -all: install_headers setup_links libs $(drivers) $(frameworks) $(service) package -tees: setup_links libs $(drivers) $(frameworks) $(service) +PHONY += libs $(drivers) $(platform_drivers) $(frameworks) $(service) package +all: install_headers setup_links libs $(drivers) $(platform_drivers) $(frameworks) $(service) package +tees: setup_links libs $(drivers) $(platform_drivers) $(frameworks) $(service) $(drivers): setup_links libs link_libs +$(platform_drivers): check_platform setup_links libs link_libs $(frameworks): setup_links libs link_libs $(service): setup_links libs link_libs package: check_sym @@ -197,7 +210,8 @@ check_sym: $(product_apps) echo " [ CHECK a64 SYMS ]: $$i" ;\ $(BUILD_TOOLS)/generate_img/check-syms.sh $$i \ $(PREBUILD_LIBS)/aarch64/libc_shared.so \ - $(OUTPUTDIR)/aarch64/obj/aarch64/libtee_shared/libtee_shared.so; \ + $(OUTPUTDIR)/aarch64/obj/aarch64/libtee_shared/libtee_shared.so \ + $(OUTPUTDIR)/aarch64/obj/aarch64/libdrv_shared/libdrv_shared.so; \ done ; fi $(BUILD_TOOLS)/generate_img/smart-strip.sh $(product_apps) diff --git a/build/build_framework.sh b/build/build_framework.sh index 819a2bbd..6cbc2d1f 100755 --- a/build/build_framework.sh +++ b/build/build_framework.sh @@ -10,9 +10,9 @@ # PURPOSE. # See the Mulan PSL v2 for more details. -make TARGET_BOARD_PLATFORM=$1 FRAMEWORK_ELF_PATH=$2 TEE_COMPILER_DIR=$3 LLVM_BASEVER=$4 TOPDIR=$5 THIRDPARTY=$6 GEN_CONF_FILE -j -make TARGET_BOARD_PLATFORM=$1 FRAMEWORK_ELF_PATH=$2 TEE_COMPILER_DIR=$3 LLVM_BASEVER=$4 TOPDIR=$5 THIRDPARTY=$6 PREBUILD_OPENSSL -j -make TARGET_BOARD_PLATFORM=$1 FRAMEWORK_ELF_PATH=$2 TEE_COMPILER_DIR=$3 LLVM_BASEVER=$4 TOPDIR=$5 THIRDPARTY=$6 install_headers -j -make TARGET_BOARD_PLATFORM=$1 FRAMEWORK_ELF_PATH=$2 TEE_COMPILER_DIR=$3 LLVM_BASEVER=$4 TOPDIR=$5 THIRDPARTY=$6 libs -j -make TARGET_BOARD_PLATFORM=$1 FRAMEWORK_ELF_PATH=$2 TEE_COMPILER_DIR=$3 LLVM_BASEVER=$4 TOPDIR=$5 THIRDPARTY=$6 tees -j -make TARGET_BOARD_PLATFORM=$1 FRAMEWORK_ELF_PATH=$2 TEE_COMPILER_DIR=$3 LLVM_BASEVER=$4 TOPDIR=$5 THIRDPARTY=$6 package -j +make TARGET_BOARD_PLATFORM=$1 FRAMEWORK_ELF_PATH=$2 TEE_COMPILER_DIR=$3 LLVM_BASEVER=$4 TOPDIR=$5 THIRDPARTY=$6 PLATFORM=$7 GEN_CONF_FILE -j +make TARGET_BOARD_PLATFORM=$1 FRAMEWORK_ELF_PATH=$2 TEE_COMPILER_DIR=$3 LLVM_BASEVER=$4 TOPDIR=$5 THIRDPARTY=$6 PLATFORM=$7 PREBUILD_OPENSSL -j +make TARGET_BOARD_PLATFORM=$1 FRAMEWORK_ELF_PATH=$2 TEE_COMPILER_DIR=$3 LLVM_BASEVER=$4 TOPDIR=$5 THIRDPARTY=$6 PLATFORM=$7 install_headers -j +make TARGET_BOARD_PLATFORM=$1 FRAMEWORK_ELF_PATH=$2 TEE_COMPILER_DIR=$3 LLVM_BASEVER=$4 TOPDIR=$5 THIRDPARTY=$6 PLATFORM=$7 libs -j +make TARGET_BOARD_PLATFORM=$1 FRAMEWORK_ELF_PATH=$2 TEE_COMPILER_DIR=$3 LLVM_BASEVER=$4 TOPDIR=$5 THIRDPARTY=$6 PLATFORM=$7 tees -j +make TARGET_BOARD_PLATFORM=$1 FRAMEWORK_ELF_PATH=$2 TEE_COMPILER_DIR=$3 LLVM_BASEVER=$4 TOPDIR=$5 THIRDPARTY=$6 PLATFORM=$7 package -j diff --git a/build/mk/common/cfi/llvm-apps-cfi.mk b/build/mk/common/cfi/llvm-apps-cfi.mk index 472f5914..a6e260ac 100644 --- a/build/mk/common/cfi/llvm-apps-cfi.mk +++ b/build/mk/common/cfi/llvm-apps-cfi.mk @@ -36,7 +36,7 @@ endif else #32bit cfi-no-icall := libswcrypto_engine_a32.a tarunner_a32.elf libtimer_a32.a libcrypto_hal_a32.a libteeos_a32.a \ - libpermission_service_a32.a libtaentry_a32.a libcrypto_a32.a libssa_a32.a #libdrv_frame_a32.a + libpermission_service_a32.a libtaentry_a32.a libcrypto_a32.a libssa_a32.a libdrv_frame_a32.a no-cfi:= libopenssl${TARG}.a diff --git a/build/mk/common/config/feature-macro.mk b/build/mk/common/config/feature-macro.mk index 1f1ad2c1..bd1bfaf7 100644 --- a/build/mk/common/config/feature-macro.mk +++ b/build/mk/common/config/feature-macro.mk @@ -53,9 +53,9 @@ flags += -DTEE_SUPPORT_HUK_SERVICE_32BIT endif ifeq ($(CONFIG_DRVMGR_64BIT), true) -#flags += -DTEE_SUPPORT_DRV_SERVER_64BIT +flags += -DTEE_SUPPORT_DRV_SERVER_64BIT endif ifeq ($(CONFIG_DRVMGR_64BIT), false) -#flags += -DTEE_SUPPORT_DRV_SERVER_32BIT +flags += -DTEE_SUPPORT_DRV_SERVER_32BIT endif diff --git a/build/mk/common/operation/project.mk b/build/mk/common/operation/project.mk index 20d6d9c5..7174b9b3 100644 --- a/build/mk/common/operation/project.mk +++ b/build/mk/common/operation/project.mk @@ -19,16 +19,16 @@ include $(BUILD_CONFIG)/arch_config.mk libtee_shared_a32: libteeconfig libtimer libteeagentcommon_client libcrypto_hal libswcrypto_engine $(crypto_lib) libteedynsrv libtee_stub libtee_shared: libteeconfig libtimer libteeagentcommon_client libcrypto_hal libswcrypto_engine $(crypto_lib) libteedynsrv libtee_stub -libdrv_shared_a32: #libteeconfig_a32 -libdrv_shared: #libteeconfig +libdrv_shared_a32: libteeconfig_a32 +libdrv_shared: libteeconfig teelib := libcrypto_hal libtimer libagent libagent_base libdrv libteeos libpermission_service \ libswcrypto_engine libtaentry libteeagentcommon_client libcrypto libteeconfig libteemem \ libssa libhuk libteedynsrv libopenssl libipc_hal libtee_stub syslib := libelf_verify libspawn_common libelf_verify_key libdynconfmgr libdynconfbuilder -drvlib := #libdrv_frame +drvlib := libdrv_frame -libs: libtee_shared $(syslib) #libdrv_shared +libs: libtee_shared $(syslib) libdrv_shared @echo "libsok" $(teelib): @@ -58,7 +58,7 @@ libdrv_shared: $(drvlib) # compile drivers rules -frameworks := gtask teesmcmgr tarunner #drvmgr +frameworks := gtask teesmcmgr tarunner drvmgr service := huk_service ifdef CONFIG_SSA_64BIT @@ -69,12 +69,21 @@ ifdef CONFIG_PERMSRV_64BIT service += permission_service endif -#drivers := crypto_mgr +drivers := crypto_mgr +platform_drivers := ifdef CONFIG_TEE_MISC_DRIVER_64BIT -#drivers += tee_misc_driver +drivers += tee_misc_driver endif +ifdef CONFIG_HADRWARE_CRYPTO_ENABLE +platform_drivers += libhardware_crypto_drv +endif + +$(platform_drivers): + @echo "building platform_drivers=$@ target path $(PLATFORM_DRIVERS_PATH)/$@" + $(VER) LDFLAGS= $(MAKE) -C $(PLATFORM_DRIVERS_PATH)/$@ ARCH=aarch64 -f $(PREBUILD_HEADER)/.config -f Makefile all + $(drivers): @echo "building ARCH=arm driver=$@ target" $(VER) LDFLAGS= $(MAKE) -C $(DRIVERS_PATH)/$@ ARCH=arm TARG=_a32 -f $(PREBUILD_HEADER)/.config -f Makefile all diff --git a/build/mk/pack/plat_config.mk b/build/mk/pack/plat_config.mk index 8fc7c579..bcd7f88d 100644 --- a/build/mk/pack/plat_config.mk +++ b/build/mk/pack/plat_config.mk @@ -72,42 +72,42 @@ endif ifneq ($(CONFIG_DRVMGR_64BIT),) ifeq ($(CONFIG_SUPPORT_64BIT),) -#product_apps += $(OUTPUTDIR)/aarch64/obj/aarch64/libdrv_shared/libdrv_shared.so -#product_apps += $(OUTPUTDIR)/arm/obj/arm/libdrv_shared/libdrv_shared_a32.so +product_apps += $(OUTPUTDIR)/aarch64/obj/aarch64/libdrv_shared/libdrv_shared.so +product_apps += $(OUTPUTDIR)/arm/obj/arm/libdrv_shared/libdrv_shared_a32.so else ifeq ($(CONFIG_SUPPORT_64BIT), true) -#product_apps += $(OUTPUTDIR)/aarch64/obj/aarch64/libdrv_shared/libdrv_shared.so +product_apps += $(OUTPUTDIR)/aarch64/obj/aarch64/libdrv_shared/libdrv_shared.so endif ifeq ($(CONFIG_SUPPORT_64BIT), false) -#product_apps += $(OUTPUTDIR)/arm/obj/arm/libdrv_shared/libdrv_shared_a32.so +product_apps += $(OUTPUTDIR)/arm/obj/arm/libdrv_shared/libdrv_shared_a32.so endif endif endif ifeq ($(CONFIG_DRVMGR_64BIT), true) -#product_apps += $(OUTPUTDIR)/aarch64/drivers/drvmgr.elf -#check-a64-syms-y += $(OUTPUTDIR)/aarch64/drivers/drvmgr.elf +product_apps += $(OUTPUTDIR)/aarch64/drivers/drvmgr.elf +check-a64-syms-y += $(OUTPUTDIR)/aarch64/drivers/drvmgr.elf ifeq ($(CONFIG_TEE_MISC_DRIVER_64BIT), true) -#product_apps += $(OUTPUTDIR)/aarch64/drivers/tee_misc_driver.elf -#check-s64-syms-y += $(OUTPUTDIR)/aarch64/drivers/tee_misc_driver.elf +product_apps += $(OUTPUTDIR)/aarch64/drivers/tee_misc_driver.elf +check-s64-syms-y += $(OUTPUTDIR)/aarch64/drivers/tee_misc_driver.elf endif endif ifeq ($(CONFIG_DRVMGR_64BIT), false) -#product_apps += $(OUTPUTDIR)/arm/drivers/drvmgr.elf -#check-syms-y += $(OUTPUTDIR)/arm/drivers/drvmgr.elf +product_apps += $(OUTPUTDIR)/arm/drivers/drvmgr.elf +check-syms-y += $(OUTPUTDIR)/arm/drivers/drvmgr.elf ifeq ($(CONFIG_TEE_MISC_DRIVER_64BIT), false) -#product_apps += $(OUTPUTDIR)/arm/drivers/tee_misc_driver.elf -#check-syms-y += $(OUTPUTDIR)/arm/drivers/tee_misc_driver.elf +product_apps += $(OUTPUTDIR)/arm/drivers/tee_misc_driver.elf +check-syms-y += $(OUTPUTDIR)/arm/drivers/tee_misc_driver.elf endif endif ifeq ($(CONFIG_TEE_CRYPTO_MGR_SERVER_64BIT), true) -#product_apps += $(OUTPUTDIR)/aarch64/drivers/crypto_mgr.elf -#check-a64-syms-y += $(OUTPUTDIR)/aarch64/drivers/crypto_mgr.elf +product_apps += $(OUTPUTDIR)/aarch64/drivers/crypto_mgr.elf +check-a64-syms-y += $(OUTPUTDIR)/aarch64/drivers/crypto_mgr.elf endif ifeq ($(CONFIG_TEE_CRYPTO_MGR_SERVER_64BIT), false) -#product_apps += $(OUTPUTDIR)/arm/drivers/crypto_mgr.elf -#check-syms-y += $(OUTPUTDIR)/arm/drivers/crypto_mgr.elf +product_apps += $(OUTPUTDIR)/arm/drivers/crypto_mgr.elf +check-syms-y += $(OUTPUTDIR)/arm/drivers/crypto_mgr.elf endif ifeq ($(CONFIG_ARCH_AARCH64),y) @@ -117,3 +117,8 @@ else product_apps += $(OUTPUTDIR)/arm/apps/teesmcmgr.elf check-syms-y += $(OUTPUTDIR)/arm/apps/teesmcmgr.elf endif + +ifdef CONFIG_HADRWARE_CRYPTO_ENABLE +product_apps += $(OUTPUTDIR)/aarch64/drivers/libhardware_crypto_drv.so +check-a64-syms-y += $(OUTPUTDIR)/aarch64/drivers/libhardware_crypto_drv.so +endif diff --git a/config/release_config/oh_64_release_config b/config/release_config/oh_64_release_config index 3d7e6a5c..8e133b2e 100644 --- a/config/release_config/oh_64_release_config +++ b/config/release_config/oh_64_release_config @@ -46,6 +46,7 @@ CONFIG_APP_TEE_PERM=y CONFIG_APP_TEE_HUK=y CONFIG_OH_LOAD_KEY=y CONFIG_DISABLE_PERM_STORAGE=y +CONFIG_DISABLE_MULTI_DRV=y # # lib # @@ -95,3 +96,7 @@ CONFIG_CC_STACKPROTECTOR_STRONG=y # Log # TLOG_USE_TEE_PRINT=y + +CRYPTO_MGR_SERVER_ENABLE=y +CONFIG_TEE_CRYPTO_MGR_SERVER_64BIT=true +CONFIG_HADRWARE_CRYPTO_ENABLE=y diff --git a/drivers/crypto_mgr/src/crypto_ioctl/crypto_syscall.c b/drivers/crypto_mgr/src/crypto_ioctl/crypto_syscall.c index 1339c02a..351fb041 100644 --- a/drivers/crypto_mgr/src/crypto_ioctl/crypto_syscall.c +++ b/drivers/crypto_mgr/src/crypto_ioctl/crypto_syscall.c @@ -31,7 +31,7 @@ #include "crypto_syscall_pm.h" struct crypto_drv_ops_t *g_drv_entry = NULL; -#define DRV_NAME "/tafs/libhardware_crypto_drv.so" +#define DRV_NAME "libhardware_crypto_drv.so" static int32_t load_drv_hardware(void) { diff --git a/drivers/crypto_mgr/src/crypto_mgr.c b/drivers/crypto_mgr/src/crypto_mgr.c index 587e3246..a8f51347 100644 --- a/drivers/crypto_mgr/src/crypto_mgr.c +++ b/drivers/crypto_mgr/src/crypto_mgr.c @@ -18,6 +18,7 @@ #include #include "drv_random.h" #include "crypto_driver_adaptor.h" +#include const char *g_debug_prefix = "crypto_mgr"; uint8_t *g_src_ctx_buf = NULL; @@ -50,7 +51,7 @@ static int32_t crypto_ioctl_alloc_ctx_buf(struct drv_data *drv, uint32_t cmd, un tloge("Malloc ctx buffer failed, ctx size=%d\n", ctx_size); return CRYPTO_OVERFLOW; } - if (memset_s(ctx_buffer, (size_t)ctx_size, 0, (size_t)ctx_size) != EOK) { + if (memset_s(ctx_buffer, (size_t)ctx_size, 0, (size_t)ctx_size) != 0) { tloge("memset ctx buffer failed\n"); free(ctx_buffer); return CRYPTO_ERROR_SECURITY; diff --git a/drivers/platform/rk3568/libhardware_crypto_drv/Makefile b/drivers/platform/rk3568/libhardware_crypto_drv/Makefile new file mode 100644 index 00000000..e2e11924 --- /dev/null +++ b/drivers/platform/rk3568/libhardware_crypto_drv/Makefile @@ -0,0 +1,31 @@ +# Copyright (c) 2023 Institute of Parallel And Distributed Systems (IPADS), Shanghai Jiao Tong University (SJTU) +# Licensed under the Mulan PSL v2. +# You can use this software according to the terms and conditions of the Mulan PSL v2. +# You may obtain a copy of Mulan PSL v2 at: +# http://license.coscl.org.cn/MulanPSL2 +# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR +# PURPOSE. +# See the Mulan PSL v2 for more details. + +DRIVER := libhardware_crypto_drv.so + +include $(BUILD_CONFIG)/var.mk + +libhardware_crypto_drv_c_files += $(wildcard src/*.c) + +inc-flags += -I$(FRAMEWORK_PATH)/drvmgr/src +inc-flags += -I$(DRIVERS_PATH)/include +inc-flags += -I$(DRVLIB)/common/libdrv_frame/include +inc-flags += -I$(DRVLIB)/libdrv_shared/include +inc-flags += -I$(DRIVERS_PATH)/crypto_mgr/src/crypto_ioctl/ +inc-flags += -I$(TEELIB)/libcrypto_hal/include +inc-flags += -I$(TEELIB)/libteeos/include/tee +inc-flags += -I$(TEELIB)/libteeos/include/legacy +inc-flags += -I$(TEELIB)/libtimer/include +inc-flags += -I$(TEELIB)/libteemem/include + +# Libraries + +SVC_PARTITIAL_LINK = y +include $(BUILD_SERVICE)/svc-common.mk diff --git a/drivers/platform/rk3568/libhardware_crypto_drv/src/driver.c b/drivers/platform/rk3568/libhardware_crypto_drv/src/driver.c new file mode 100644 index 00000000..d439a04e --- /dev/null +++ b/drivers/platform/rk3568/libhardware_crypto_drv/src/driver.c @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2023 Institute of Parallel And Distributed Systems (IPADS), Shanghai Jiao Tong University (SJTU) + * Licensed under the Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR + * PURPOSE. + * See the Mulan PSL v2 for more details. + */ + +#include +#include +#include +#include +#include + +#define MIN(x, y) ((x) < (y) ? (x) : (y)) +#define BIT(x) (1 << (x)) + +#define TRNG_64_BIT_LEN (0 << 4) +#define TRNG_128_BIT_LEN (1 << 4) +#define TRNG_192_BIT_LEN (2 << 4) +#define TRNG_256_BIT_LEN (3 << 4) +#define TRNG_FATESY_SOC_RING (0 << 2) +#define TRNG_SLOWER_SOC_RING_0 (1 << 2) +#define TRNG_SLOWER_SOC_RING_1 (2 << 2) +#define TRNG_SLOWEST_SOC_RING (3 << 2) +#define TRNG_ENABLE BIT(1) +#define TRNG_START BIT(0) +#define TRNG_BASE (0xfe370000) +#define TRNG_SIZE (0x10000) +#define TRNG_RNG_CTL(addr) ((addr) + 0x0400) +#define TRNG_RST_CTL(addr) ((addr) + 0x0004) +#define TRNG_RNG_SAMPLE_CNT(addr) ((addr) + 0x0404) +#define TRNG_RNG_DOUT(addr, x) ((addr) + 0x0410 + 4 * (x)) + +static void put32(unsigned long addr, uint32_t val) +{ + *(volatile uint32_t *)addr = val; +} + +static uint32_t get32(unsigned long addr) +{ + return *(volatile uint32_t *)addr; +} + +static void set32(unsigned long addr, uint32_t set_mask) +{ + put32(addr, get32(addr) | set_mask); +} + +static unsigned long s_trng_vaddr; + +int32_t init(void) +{ + s_trng_vaddr = (unsigned long)ioremap((uintptr_t)TRNG_BASE, TRNG_SIZE, PROT_READ | PROT_WRITE); + if ((void *)s_trng_vaddr == NULL) + return -EFAULT; + return 0; +} + +uint64_t hw_rng(void) +{ + int reg = 0; + uint64_t rnd; + + set32(TRNG_RNG_SAMPLE_CNT(s_trng_vaddr), 100); + + reg |= TRNG_64_BIT_LEN; + reg |= TRNG_SLOWER_SOC_RING_0; + reg |= TRNG_ENABLE; + reg |= TRNG_START; + + put32(TRNG_RNG_CTL(s_trng_vaddr), ((0xffff) | (reg)) << 16 | (reg)); + + set32(TRNG_RNG_CTL(s_trng_vaddr), 0b1); + while (get32(TRNG_RNG_CTL(s_trng_vaddr)) & 1); + + rnd = ((uint64_t)get32(TRNG_RNG_DOUT(s_trng_vaddr, 0)) << 32) | (uint64_t)get32(TRNG_RNG_DOUT(s_trng_vaddr, 1)); + + put32(TRNG_RNG_CTL(s_trng_vaddr), (0xffff) << 16); + + return rnd; +} + +int32_t generate_random(void *buffer, size_t size) +{ + size_t i; + int rnd; + for (i = 0; i < size; i += sizeof(uint64_t)) { + rnd = hw_rng(); + memcpy(buffer + i, &rnd, MIN(sizeof(uint64_t), size - i)); + } + return 0; +} + +__attribute__((visibility("default"))) const struct crypto_drv_ops_t g_crypto_drv_ops = { + .init = init, + .generate_random = generate_random, +}; diff --git a/drivers/tee_misc_driver/src/drv_sharedmem.c b/drivers/tee_misc_driver/src/drv_sharedmem.c index 1aa342aa..0f905518 100644 --- a/drivers/tee_misc_driver/src/drv_sharedmem.c +++ b/drivers/tee_misc_driver/src/drv_sharedmem.c @@ -9,6 +9,7 @@ * PURPOSE. * See the Mulan PSL v2 for more details. */ +#define _GNU_SOURCE #include "drv_sharedmem.h" #include #include "tee_log.h" diff --git a/framework/drvmgr/src/base_drv_node.c b/framework/drvmgr/src/base_drv_node.c index 4cd8711b..c97e59df 100644 --- a/framework/drvmgr/src/base_drv_node.c +++ b/framework/drvmgr/src/base_drv_node.c @@ -17,6 +17,7 @@ #include "target_type.h" #include "tee_config.h" #include "tee_log.h" +#include const struct base_driver_node g_product_base_drv[] = { #ifdef CRYPTO_MGR_SERVER_ENABLE diff --git a/framework/drvmgr/src/drv_dispatch.c b/framework/drvmgr/src/drv_dispatch.c index 8f19002a..3d3a7346 100644 --- a/framework/drvmgr/src/drv_dispatch.c +++ b/framework/drvmgr/src/drv_dispatch.c @@ -9,6 +9,7 @@ * PURPOSE. * See the Mulan PSL v2 for more details. */ +#define _GNU_SOURCE #include "drv_dispatch.h" #include #include @@ -37,7 +38,7 @@ #include static int32_t get_drv_params(struct tee_drv_param *params, const struct drv_req_msg_t *msg, - const struct cap_message_info *info) + const struct src_msginfo *info) { spawn_uuid_t uuid; int32_t ret; @@ -46,27 +47,21 @@ static int32_t get_drv_params(struct tee_drv_param *params, const struct drv_req return -1; } - uint32_t cnode_idx = info->src_cnode_idx; - if ((cnode_idx == 0) || (info->msg_size < sizeof(struct drv_req_msg_t))) { - tloge("invalid cnode or invalid msg size\n"); - return -1; - } - - ret = getuuid(info->src_cred.pid, &uuid); + ret = getuuid(info->src_pid, &uuid); if (ret != 0) { - tloge("get pid:%u uuid failed\n", info->src_cred.pid); + tloge("get pid:%u uuid failed\n", info->src_pid); return -1; } ret = memcpy_s(&(params->uuid), sizeof(params->uuid), &uuid.uuid, sizeof(uuid.uuid)); if (ret != 0) { - tloge("copy pid:%u uuid:0x%x to params failed\n", info->src_cred.pid, uuid.uuid.timeLow); + tloge("copy pid:%u uuid:0x%x to params failed\n", info->src_pid, uuid.uuid.timeLow); return -1; } params->args = (uintptr_t)msg->args; params->data = (uintptr_t)msg->data; - params->caller_pid = pid_to_taskid(TCBCREF2TID(info->src_tcb_cref), info->src_cred.pid); + params->caller_pid = pid_to_taskid(info->src_tid, info->src_pid); return 0; } @@ -745,7 +740,7 @@ static void driver_reply_error_handle(int32_t swi_id, const struct tee_drv_param driver_open_reply_error_callback(ret_val, params); } -static int32_t driver_handle_message(const struct drv_req_msg_t *msg, const struct cap_message_info *info, +static int32_t driver_handle_message(const struct drv_req_msg_t *msg, const struct src_msginfo *info, struct drv_reply_msg_t *rmsg, const cref_t *msg_hdl) { int64_t ret_val = -1; @@ -791,7 +786,7 @@ static int32_t driver_handle_message(const struct drv_req_msg_t *msg, const stru return ret; } -intptr_t driver_dispatch(void *msg, cref_t *p_msg_hdl, struct cap_message_info *info) +intptr_t driver_dispatch(void *msg, cref_t *p_msg_hdl, struct src_msginfo *info) { int32_t ret; struct drv_reply_msg_t reply_raw_buf; diff --git a/framework/drvmgr/src/drv_process_mgr.c b/framework/drvmgr/src/drv_process_mgr.c index f397bf2e..94976eb7 100644 --- a/framework/drvmgr/src/drv_process_mgr.c +++ b/framework/drvmgr/src/drv_process_mgr.c @@ -166,6 +166,7 @@ static int32_t init_spawn_argv(const char *drv_name, uint32_t drv_name_len, static void init_spawn_buffer(struct spawn_drv_buffer *buffer) { + g_argv[ARGV_ELF_PATH_INDEX] = (char *)g_drv_loader; g_argv[ARGV_TASK_NAME_INDEX] = buffer->argv.task_name; g_argv[ARGV_TASK_PATH_INDEX] = buffer->argv.task_path; g_argv[ARGV_UNCOMMIT_INDEX] = buffer->argv.uncommit; diff --git a/framework/drvmgr/src/main.c b/framework/drvmgr/src/main.c index 3521c91d..83b0dc3a 100644 --- a/framework/drvmgr/src/main.c +++ b/framework/drvmgr/src/main.c @@ -19,6 +19,7 @@ #include "drv_thread.h" #include "drv_process_mgr.h" #include "tee_log.h" +#include "cs.h" const char *g_debug_prefix = "drvmgr"; @@ -33,7 +34,6 @@ int32_t main(int32_t argc __attribute__((unused)), char *argv[] __attribute__((u { static dispatch_fn_t dispatch_fns[] = { [0] = driver_dispatch, - [HM_MSG_HEADER_CLASS_ACMGR_PUSH] = ac_dispatch, }; tlogi("drvmgr main begin\n"); @@ -74,6 +74,7 @@ int32_t main(int32_t argc __attribute__((unused)), char *argv[] __attribute__((u tloge("drv thread init fail\n"); exit(ret); } + tlogi("%s: start server loop\n", drv_frame.name); cs_server_loop(ch, dispatch_fns, ARRAY_SIZE(dispatch_fns), NULL, NULL); diff --git a/framework/drvmgr/src/task_mgr.c b/framework/drvmgr/src/task_mgr.c index 1c1c1216..5301e476 100644 --- a/framework/drvmgr/src/task_mgr.c +++ b/framework/drvmgr/src/task_mgr.c @@ -13,7 +13,6 @@ #include "task_mgr.h" #include #include -#include #include #include #include @@ -24,6 +23,7 @@ #include "drv_dyn_policy_mgr.h" #include "drv_index_mgr.h" #include "drv_dyn_conf_mgr.h" +#include static struct dlist_node g_task_list = dlist_head_init(g_task_list); static pthread_mutex_t g_task_mtx = PTHREAD_MUTEX_INITIALIZER; diff --git a/framework/tarunner/src/main.c b/framework/tarunner/src/main.c index cb171076..b17640de 100644 --- a/framework/tarunner/src/main.c +++ b/framework/tarunner/src/main.c @@ -130,13 +130,6 @@ static int32_t create_task_channel(const char *task_name, const struct env_param } tlogd("create drv:%s channel:0x%llx\n", task_name, (unsigned long long)(*drv_channel)); - - /* used for irq thread */ - ret = ipc_create_channel(NULL, IPC_CHANNEL_NUM, NULL, reg_items); - if (ret != 0) { - tloge("create drv irq channel failed\n"); - return -1; - } } else { /* Create 2 IPC channels */ ret = ipc_create_channel(task_name, IPC_CHANNEL_NUM, NULL, reg_items); diff --git a/lib/drvlib/common/libdrv_frame/include/drv_thread.h b/lib/drvlib/common/libdrv_frame/include/drv_thread.h index 4b22e123..f2dcff76 100644 --- a/lib/drvlib/common/libdrv_frame/include/drv_thread.h +++ b/lib/drvlib/common/libdrv_frame/include/drv_thread.h @@ -11,14 +11,19 @@ */ #ifndef PLATDRV_DRV_THREAD_H #define PLATDRV_DRV_THREAD_H -#include +#include #include +#include #define DRV_CALL_OK 0 #define DRV_CALL_ERROR (-1) -intptr_t driver_dispatch(void *msg, cref_t *p_msg_hdl, struct hmcap_message_info *info); +intptr_t driver_dispatch(void *msg, cref_t *p_msg_hdl, struct src_msginfo *info); +#ifdef CONFIG_DISABLE_MULTI_DRV +#define DRV_THREAD_MAX 0 +#else /* CONFIG_DISABLE_MULTI_DRV */ #define DRV_THREAD_MAX 8 +#endif /* CONFIG_DISABLE_MULTI_DRV */ #define INVALID_CALLER_PID (-1) #define TASK_MAX 20 #define REPLY_BUF_LEN 2048U diff --git a/lib/drvlib/common/libdrv_frame/include/libdrv_frame.h b/lib/drvlib/common/libdrv_frame/include/libdrv_frame.h index 34738053..900a2da5 100644 --- a/lib/drvlib/common/libdrv_frame/include/libdrv_frame.h +++ b/lib/drvlib/common/libdrv_frame/include/libdrv_frame.h @@ -13,6 +13,7 @@ #define LIBDRV_FRAME_DRV_FRAME_H #include +#include "ipclib.h" typedef int32_t (*drv_frame_init_t)(void); diff --git a/lib/drvlib/common/libdrv_frame/src/drv_param_ops.c b/lib/drvlib/common/libdrv_frame/src/drv_param_ops.c index 0c15ad03..1d1654d1 100644 --- a/lib/drvlib/common/libdrv_frame/src/drv_param_ops.c +++ b/lib/drvlib/common/libdrv_frame/src/drv_param_ops.c @@ -10,11 +10,12 @@ * See the Mulan PSL v2 for more details. */ +#define _GNU_SOURCE #include "drv_param_ops.h" #include +#include #include #include -#include #include static int32_t get_drv_caller_taskid(uint32_t *taskid) diff --git a/lib/drvlib/common/libdrv_frame/src/drv_thread.c b/lib/drvlib/common/libdrv_frame/src/drv_thread.c index fa8e1a0f..667137ee 100644 --- a/lib/drvlib/common/libdrv_frame/src/drv_thread.c +++ b/lib/drvlib/common/libdrv_frame/src/drv_thread.c @@ -11,11 +11,14 @@ */ #include "drv_thread.h" #include +#include #include #include #include #include #include +#include +#include "cs.h" #define IPC_CHANNEL_NUM 2 static pthread_mutex_t g_drv_caller_info_mutex = PTHREAD_MUTEX_INITIALIZER; diff --git a/lib/drvlib/common/libdrv_frame/src/libdrv_frame.c b/lib/drvlib/common/libdrv_frame/src/libdrv_frame.c index d8dc949c..07bfdec2 100644 --- a/lib/drvlib/common/libdrv_frame/src/libdrv_frame.c +++ b/lib/drvlib/common/libdrv_frame/src/libdrv_frame.c @@ -15,11 +15,8 @@ #include #include #include -#include #include #include -#include -#include #include #include #include @@ -71,7 +68,7 @@ static int32_t system_init(const char *name) set_log_use_tid_flag(); - ret = hm_tamgr_register(name); + ret = tamgr_register(name); if (ret != 0) { tloge("%s: tamgr registration for platdrv failed\n", name); return -1; @@ -90,7 +87,6 @@ int32_t register_drv_framework(const struct drv_frame_t *drv_frame, cref_t *ch, } print_drv_info(drv_frame->name); - _init(); ret = ipc_init(drv_frame->name, ch); if (ret != 0) diff --git a/lib/drvlib/libdrv_shared/Makefile b/lib/drvlib/libdrv_shared/Makefile index a3ee13dd..f1797ab1 100644 --- a/lib/drvlib/libdrv_shared/Makefile +++ b/lib/drvlib/libdrv_shared/Makefile @@ -50,6 +50,11 @@ inc-flags += -I$(SYSLIB)/libspawn_common/include inc-flags += -I$(TEELIB)/libteeconfig/include endif +ifneq ($(CRYPTO_MGR_SERVER_ENABLE), ) +inc-flags += -I$(TEELIB)/libcrypto_hal/include +inc-flags += -I$(TEELIB)/libcrypto/include +endif + include $(BUILD_CONFIG)/feature-macro.mk MODULE_FILE = $(BUILD_DIR)/$(SONAME) @@ -73,7 +78,7 @@ $(BUILD_DIR)/export.txt: export.txt @${CC} ${flags} -P -E -o $@ -x c $< ld-flags := -ld-flags += -lhwi$(TARG) -lc_shared$(TARG) -lteemem$(TARG) -lteeconfig$(TARG) -lio$(TARG) +ld-flags += -lc_shared$(TARG) -lteemem$(TARG) -lteeconfig$(TARG) ld-flags += -z separate-loadable-segments diff --git a/lib/drvlib/libdrv_shared/include/drv_io_share.h b/lib/drvlib/libdrv_shared/include/drv_io_share.h deleted file mode 100644 index fe67f5d5..00000000 --- a/lib/drvlib/libdrv_shared/include/drv_io_share.h +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright (C) 2022 Huawei Technologies Co., Ltd. - * Licensed under the Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * http://license.coscl.org.cn/MulanPSL2 - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR - * PURPOSE. - * See the Mulan PSL v2 for more details. - */ -#ifndef LIBDRV_IO_SHARED_H -#define LIBDRV_IO_SHARED_H - -#include - -void *ioremap(uintptr_t phys_addr, unsigned long size, int32_t prot); -int32_t iounmap(uintptr_t pddr, const void *addr); - -#endif diff --git a/lib/drvlib/libdrv_shared/src/drv_dispatch.c b/lib/drvlib/libdrv_shared/src/drv_dispatch.c index 207cd9cb..4f1ac22c 100644 --- a/lib/drvlib/libdrv_shared/src/drv_dispatch.c +++ b/lib/drvlib/libdrv_shared/src/drv_dispatch.c @@ -9,6 +9,7 @@ * PURPOSE. * See the Mulan PSL v2 for more details. */ +#define _GNU_SOURCE #include "drv_dispatch.h" #include #include @@ -26,23 +27,17 @@ #include static int32_t get_drv_params(struct tee_drv_param *params, const struct drv_req_msg_t *msg, - const struct hmcap_message_info *info) + const struct src_msginfo *info) { if (msg == NULL || info == NULL) { tloge("invalid parameters\n"); return -1; } - uint32_t cnode_idx = info->src_cnode_idx; - if ((cnode_idx == 0) || (info->msg_size < sizeof(struct drv_req_msg_t))) { - tloge("invalid cnode or invalid msg size\n"); - return -1; - } - /* params uuid will set in open/ioctl/close function */ params->args = (uintptr_t)msg->args; params->data = (uintptr_t)msg->data; - params->caller_pid = pid_to_taskid(TCBCREF2TID(info->src_tcb_cref), info->src_cred.pid); + params->caller_pid = pid_to_taskid(info->src_tid, info->src_pid); return 0; } @@ -156,7 +151,7 @@ static int32_t driver_syscall_dispatch(int32_t swi_id, struct tee_drv_param *par return ret; } -static int32_t driver_syscall(const struct drv_req_msg_t *msg, const struct hmcap_message_info *info, +static int32_t driver_syscall(const struct drv_req_msg_t *msg, const struct src_msginfo *info, struct tee_drv_param *params, int32_t swi_id, int64_t *ret_val) { int32_t ret; @@ -204,7 +199,7 @@ static void driver_reply_error_handle(int32_t swi_id, const struct tee_drv_param tloge("close fd:%" PRIx64 " failed in reply error handle\n", ret_val); } -static int32_t driver_handle_message(const struct drv_req_msg_t *msg, const struct hmcap_message_info *info, +static int32_t driver_handle_message(const struct drv_req_msg_t *msg, const struct src_msginfo *info, struct drv_reply_msg_t *rmsg, const cref_t *msg_hdl) { int64_t ret_val = -1; @@ -230,7 +225,7 @@ static int32_t driver_handle_message(const struct drv_req_msg_t *msg, const stru return ret; } -intptr_t driver_dispatch(void *msg, cref_t *p_msg_hdl, struct hmcap_message_info *info) +intptr_t driver_dispatch(void *msg, cref_t *p_msg_hdl, struct src_msginfo *info) { struct drv_reply_msg_t reply_raw_buf; int32_t ret; diff --git a/lib/drvlib/libdrv_shared/src/drv_random.c b/lib/drvlib/libdrv_shared/src/drv_random.c index 7df3b976..33a14f30 100644 --- a/lib/drvlib/libdrv_shared/src/drv_random.c +++ b/lib/drvlib/libdrv_shared/src/drv_random.c @@ -10,9 +10,7 @@ * See the Mulan PSL v2 for more details. */ #include "drv_random.h" -#include #include -#include #include "tee_log.h" static crypto_drv_init g_rand = 0; @@ -24,43 +22,10 @@ void register_crypto_rand_driver(crypto_drv_init fun, void *ops) g_crypto_ops = ops; } -static int32_t drv_push_random(struct hmcap_message_info *info) +intptr_t rand_update(void *msg, cref_t *p_msg_hdl, struct src_msginfo *info) { - int32_t ret; - uint64_t rnd[PUSHED_RND_64_NUM] = { 0 }; - - if (info == NULL || g_rand == 0 || g_crypto_ops == NULL) { - tloge("invalid args or fun is not register\n"); - return -1; - } - - ret = g_rand(g_crypto_ops, rnd, sizeof(rnd)); - if (ret != 0) { - tloge("gen random failed\n"); - return ret; - } - - return push_random(info, rnd, sizeof(rnd)); -} - -intptr_t rand_update(void *msg, cref_t *p_msg_hdl, struct hmcap_message_info *info) -{ - int32_t ret; - - if (p_msg_hdl == NULL || msg == NULL || info == NULL) - return -1; - - cref_t msg_hdl = *p_msg_hdl; - msg_header *msg_hdr = (msg_header *)msg; - - switch (msg_hdr->send.msg_id) { - case HM_MSG_ID_DRV_PUSHED_RANDOM: - ret = drv_push_random(info); - break; - default: - ret = reply_invalid_rand_request(msg_hdl); - break; - } - - return (intptr_t)ret; + (void)msg; + (void)p_msg_hdl; + (void)info; + return 0; } diff --git a/lib/drvlib/libdrv_shared/src/drv_random.h b/lib/drvlib/libdrv_shared/src/drv_random.h index 25d86a6b..2891e9b6 100644 --- a/lib/drvlib/libdrv_shared/src/drv_random.h +++ b/lib/drvlib/libdrv_shared/src/drv_random.h @@ -15,8 +15,9 @@ #include #include #include +#include typedef int32_t (*crypto_drv_init) (const void *ops, void *buf, uint32_t buf_len); void register_crypto_rand_driver(crypto_drv_init fun, void *ops); -intptr_t rand_update(void *msg, cref_t *p_msg_hdl, struct hmcap_message_info *info); +intptr_t rand_update(void *msg, cref_t *p_msg_hdl, struct src_msginfo *info); #endif diff --git a/lib/drvlib/libdrv_shared/src/drv_share.c b/lib/drvlib/libdrv_shared/src/drv_share.c index 532c26f8..d4c2e4ea 100644 --- a/lib/drvlib/libdrv_shared/src/drv_share.c +++ b/lib/drvlib/libdrv_shared/src/drv_share.c @@ -14,19 +14,8 @@ #include #include "drv_io_share.h" #include "drv_addr_share.h" -#include "iomgr_ext.h" #include "drv_thread.h" -void *ioremap(uintptr_t phys_addr, unsigned long size, int32_t prot) -{ - return hm_io_remap((uintptr_t)phys_addr, NULL, size, prot); -} - -int32_t iounmap(uintptr_t pddr, const void *addr) -{ - return hm_io_unmap(pddr, addr); -} - uint64_t drv_virt_to_phys(uintptr_t addr) { return virt_to_phys(addr); diff --git a/lib/drvlib/libdrv_shared/src/tee_drv_entry.c b/lib/drvlib/libdrv_shared/src/tee_drv_entry.c index 60ae1fd9..4197cff1 100644 --- a/lib/drvlib/libdrv_shared/src/tee_drv_entry.c +++ b/lib/drvlib/libdrv_shared/src/tee_drv_entry.c @@ -14,16 +14,15 @@ #include #include #include -#include #include #include #include "drv_dispatch.h" #include "drv_thread.h" #include "drv_operations.h" +#include "cs.h" #ifdef CRYPTO_MGR_SERVER_ENABLE #include "drv_random.h" #include "crypto_manager.h" -#include #endif static taskid_t g_drv_mgr_pid; @@ -56,32 +55,6 @@ uint32_t get_drv_index(void) return g_drv_index; } -static int32_t hwi_context_init(const char *drv_name) -{ - cref_t hwi_ch = 0; - const int channel_index = 1; - - int32_t ret = ipc_get_my_channel(channel_index, &hwi_ch); - if (ret != 0) { - tloge("drv %s get ipc channel for hwi fail:0x%x\n", drv_name, ret); - return -1; - } - - ret = hwi_init(hwi_ch); - if (ret != 0) { - tloge("drv %s hwi init failed 0x%x\n", drv_name, ret); - return -1; - } - - ret = hwi_create_irq_thread(); - if (ret != 0) { - tloge("drv %s create hwi irq thread fail:0x%x\n", drv_name, ret); - return -1; - } - - return 0; -} - static int32_t send_succ_msg_to_drvmgr(void) { cref_t ch = -1; @@ -148,9 +121,6 @@ void tee_drv_entry(const struct tee_driver_module *drv_func, const char *drv_nam { static dispatch_fn_t dispatch_fns[] = { [0] = driver_dispatch, -#ifdef CRYPTO_MGR_SERVER_ENABLE - [HM_MSG_HEADER_CLASS_UPDATE_RND] = rand_update, -#endif }; int32_t ret = param_check(drv_func, drv_name, param); @@ -159,24 +129,9 @@ void tee_drv_entry(const struct tee_driver_module *drv_func, const char *drv_nam tlogi("%s begin thread_limit:%u drv_index:%u\n", drv_name, param->thread_limit, param->drv_index); -#ifdef CRYPTO_MGR_SERVER_ENABLE - if (strcmp(drv_name, TEE_CRYPTO_DRIVER_NAME) == 0) { - ret = ipc_register_ch_path(RAND_DRV_PATH, ch); - if (ret != 0) { - tloge("failed to register channel with name \"%s\":%d\n", RAND_DRV_PATH, ret); - return; - } - } -#endif g_drv_func = drv_func; g_drv_index = param->drv_index; - ret = hwi_context_init(drv_name); - if (ret != 0) { - tloge("drv:%s hwi init failed\n", drv_name); - return; - } - ret = hunt_drv_mgr_pid(&g_drv_mgr_pid); if (ret != 0) return; diff --git a/lib/syslib/libdynconfbuilder/src/drv_dyn_conf_builder.c b/lib/syslib/libdynconfbuilder/src/drv_dyn_conf_builder.c index 9bbc3a5b..89240827 100644 --- a/lib/syslib/libdynconfbuilder/src/drv_dyn_conf_builder.c +++ b/lib/syslib/libdynconfbuilder/src/drv_dyn_conf_builder.c @@ -1457,8 +1457,11 @@ void dump_drv_conf(void) { uint64_t args[] = {}; uint32_t lens[] = {}; - +#ifndef CONFIG_DISABLE_MULTI_DRV (void)drv_call_new("drvmgr_multi", DUMP_DRV_CONF, args, lens, ARRAY_SIZE(args)); +#else + (void)drv_call_new("drvmgr", DUMP_DRV_CONF, args, lens, ARRAY_SIZE(args)); +#endif } static int32_t send_drv_service_name(const char *service_name, uint32_t name_size) @@ -1472,8 +1475,11 @@ static int32_t send_drv_service_name(const char *service_name, uint32_t name_siz name_size, 0, }; - +#ifndef CONFIG_DISABLE_MULTI_DRV return drv_call_new("drvmgr_multi", UNREGISTER_DRV_CONF, args, lens, ARRAY_SIZE(args)); +#else + return drv_call_new("drvmgr", UNREGISTER_DRV_CONF, args, lens, ARRAY_SIZE(args)); +#endif } void uninstall_drv_permission(const void *obj, uint32_t obj_size) diff --git a/lib/syslib/libdynconfbuilder/src/drvcall_dyn_conf_builder.c b/lib/syslib/libdynconfbuilder/src/drvcall_dyn_conf_builder.c index 87e3e556..310130ef 100644 --- a/lib/syslib/libdynconfbuilder/src/drvcall_dyn_conf_builder.c +++ b/lib/syslib/libdynconfbuilder/src/drvcall_dyn_conf_builder.c @@ -293,8 +293,11 @@ static int32_t send_drvcall_uuid(const struct tee_uuid *uuid, uint32_t uuid_size uuid_size, 0, }; - +#ifndef CONFIG_DISABLE_MULTI_DRV return drv_call_new("drvmgr_multi", UNREGISTER_DRVCALL_CONF, args, lens, ARRAY_SIZE(args)); +#else + return drv_call_new("drvmgr", UNREGISTER_DRVCALL_CONF, args, lens, ARRAY_SIZE(args)); +#endif } void dump_drvcall_conf(void) @@ -302,7 +305,11 @@ void dump_drvcall_conf(void) uint64_t args[] = {}; uint32_t lens[] = {}; +#ifndef CONFIG_DISABLE_MULTI_DRV (void)drv_call_new("drvmgr_multi", DUMP_DRVCALL_CONF, args, lens, ARRAY_SIZE(args)); +#else + (void)drv_call_new("drvmgr", DUMP_DRVCALL_CONF, args, lens, ARRAY_SIZE(args)); +#endif } void uninstall_drvcall_permission(const void *obj, uint32_t obj_size) diff --git a/lib/teelib/libipc_hal/Makefile b/lib/teelib/libipc_hal/Makefile index f1a77f5e..a39a0b21 100644 --- a/lib/teelib/libipc_hal/Makefile +++ b/lib/teelib/libipc_hal/Makefile @@ -10,6 +10,7 @@ MODULE := libipc_hal${TARG}.a CPPFLAGS += -I$(TEELIB)/libipc_hal/include +CPPFLAGS += -I$(TEELIB)/libdrv/include CPPFLAGS += -I$(TEELIB)/libteeos/include/tee CPPFLAGS += -I$(PREBUILD_HEADER)/sys # Source files required to build the target diff --git a/lib/teelib/libipc_hal/include/cs.h b/lib/teelib/libipc_hal/include/cs.h new file mode 100644 index 00000000..62cf6fc4 --- /dev/null +++ b/lib/teelib/libipc_hal/include/cs.h @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2022 Huawei Technologies Co., Ltd. + * Licensed under the Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR + * PURPOSE. + * See the Mulan PSL v2 for more details. + */ +#ifndef __CS_H +#define __CS_H + +#include +#include +#include +#include +#include + +#define CS_SERVER_MAX_MSG_LEN 2048 + +struct cs_req_msg { + msg_header hdr; + char payload[]; +} __attribute__((__packed__)); + +struct reply_cs_msg { + msg_header hdr; +} __attribute__((__packed__)); + +struct thread_init_info { + cref_t channel; + void *(*func)(void *arg); + uint32_t max_thread; + sem_t *thread_sem; + int32_t capid; + int32_t task_id; + int32_t shadow; + size_t stack_size; + void* args; +}; + +typedef intptr_t (*dispatch_fn_t)(void *msg, cref_t *p_msg_hdl, struct src_msginfo *info); + +void cs_server_loop(cref_t channel, const dispatch_fn_t dispatch_fns[], unsigned n_dispatch_fns, int (*hook)(void), void *cur_thread); + +#endif diff --git a/lib/teelib/libipc_hal/src/cs.c b/lib/teelib/libipc_hal/src/cs.c new file mode 100644 index 00000000..bfdcd0b0 --- /dev/null +++ b/lib/teelib/libipc_hal/src/cs.c @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2022 Huawei Technologies Co., Ltd. + * Licensed under the Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR + * PURPOSE. + * See the Mulan PSL v2 for more details. + */ +#include +#include +#include +#include +#include + +static int do_deal_with_msg(const dispatch_fn_t dispatch_fns[], unsigned n_dispatch_fns, void *msg_buff, + struct src_msginfo *info, cref_t *msg_hdl) +{ + msg_header *msg_hdr = (msg_header *)(uintptr_t)msg_buff; + uint8_t class = msg_hdr->send.msg_class; + struct reply_cs_msg rmsg; + int32_t ret = 0; + (void)memset_s(&rmsg, sizeof(rmsg), 0, sizeof(rmsg)); + + bool flag = (class >= n_dispatch_fns) || (dispatch_fns[class] == NULL); + if (flag) { + rmsg.hdr.reply.ret_val = -EINVAL; + if (info->msg_type == MSG_TYPE_CALL) { + ret = ipc_msg_reply(*msg_hdl, &rmsg, sizeof(rmsg)); + if (ret != 0) + tloge("cs reply msg error %d\n", ret); + } + } else { + ret = dispatch_fns[class](msg_buff, msg_hdl, info); + } + return ret; +} + +void cs_server_loop(cref_t channel, const dispatch_fn_t dispatch_fns[], unsigned n_dispatch_fns, int (*hook)(void), void *cur_thread) +{ + (void)hook; + (void)cur_thread; + int32_t ret; + char msg_buf[SYSCAL_MSG_BUFFER_SIZE] = {0}; + struct cs_req_msg *msg = (struct cs_req_msg *)msg_buf; + struct src_msginfo info = { 0 }; + for (;;) { + cref_t msg_hdl = ipc_get_my_msghdl(); + + ret = ipc_msg_receive(channel, msg, sizeof(msg_buf), msg_hdl, &info, -1); + if (ret != 0) { + tloge("message receive failed, %llx\n", ret); + continue; + } + + ret = do_deal_with_msg(dispatch_fns, n_dispatch_fns, msg, &info, &msg_hdl); + if (ret != 0) { + tloge("deal with msg error"); + } + } +} \ No newline at end of file diff --git a/lib/teelib/libtee_shared/oh_export.txt b/lib/teelib/libtee_shared/oh_export.txt index fedcecef..6d91cb2e 100644 --- a/lib/teelib/libtee_shared/oh_export.txt +++ b/lib/teelib/libtee_shared/oh_export.txt @@ -156,6 +156,9 @@ tee_ext_root_uuid_derive_key; tee_hal_get_provision_key; g_debug_prefix; +cs_server_loop; +get_valid_bit; + /* the following apis are exported for gtask dynamic link tee_shared library*/ BN_new; BN_free; diff --git a/lib/teelib/libtee_shared/oh_extern.txt b/lib/teelib/libtee_shared/oh_extern.txt index a1eb3f20..772e13f4 100644 --- a/lib/teelib/libtee_shared/oh_extern.txt +++ b/lib/teelib/libtee_shared/oh_extern.txt @@ -155,6 +155,9 @@ tee_ext_root_uuid_derive_key; tee_hal_get_provision_key; g_debug_prefix; +cs_server_loop; +get_valid_bit; + /* the following apis are exported for gtask dynamic link tee_shared library*/ BN_new; BN_free; diff --git a/lib/teelib/libteeconfig/Makefile b/lib/teelib/libteeconfig/Makefile index 9d0563e5..b2568796 100644 --- a/lib/teelib/libteeconfig/Makefile +++ b/lib/teelib/libteeconfig/Makefile @@ -14,8 +14,6 @@ MODULE := libteeconfig$(TARG).a flags += -fno-builtin -flags += -DCONFIG_TEE_DRV_STUB - ifeq ($(CONFIG_TEE_MISC_DRIVER_64BIT), false) flags += -DCONFIG_TEE_MISC_DRIVER endif diff --git a/lib/teelib/libteeconfig/src/drv_hal/tee_drv_client.c b/lib/teelib/libteeconfig/src/drv_hal/tee_drv_client.c index 53b232df..2ff585bb 100644 --- a/lib/teelib/libteeconfig/src/drv_hal/tee_drv_client.c +++ b/lib/teelib/libteeconfig/src/drv_hal/tee_drv_client.c @@ -229,8 +229,11 @@ int64_t tee_drv_open(const char *drv_name, const void *param, uint32_t param_len name_len, 0, }; - +#ifndef CONFIG_DISABLE_MULTI_DRV int64_t fd = drv_call_new("drvmgr_multi", DRV_GENERAL_CMD_ID, args, lens, ARRAY_SIZE(args)); +#else + int64_t fd = drv_call_new("drvmgr", DRV_GENERAL_CMD_ID, args, lens, ARRAY_SIZE(args)); +#endif if (fd <= 0) { tloge("alloc fd failed\n"); return fd; @@ -316,7 +319,12 @@ static int64_t tee_drv_close_handle(int64_t fd) (uint64_t)fd, }; +#ifndef CONFIG_DISABLE_MULTI_DRV int64_t ret = drv_call_new("drvmgr_multi", DRV_GENERAL_CMD_ID, args, NULL, ARRAY_SIZE(args)); +#else + int64_t ret = drv_call_new("drvmgr", DRV_GENERAL_CMD_ID, args, NULL, ARRAY_SIZE(args)); +#endif + if (ret != 0) tloge("close fd:0x%llx fail\n", fd); @@ -357,14 +365,23 @@ void tee_drv_task_exit(uint32_t exit_pid) exit_pid, }; +#ifndef CONFIG_DISABLE_MULTI_DRV int64_t ret = drv_call_new("drvmgr_multi", DRV_EXCEPTION_CMD_ID, args, NULL, ARRAY_SIZE(args)); +#else + int64_t ret = drv_call_new("drvmgr", DRV_EXCEPTION_CMD_ID, args, NULL, ARRAY_SIZE(args)); +#endif + if (ret != 0) tloge("call driver exception failed\n"); } void tee_drv_task_dump(void) { +#ifndef CONFIG_DISABLE_MULTI_DRV int64_t ret = drv_call_new("drvmgr_multi", DRV_DUMP_CMD_ID, NULL, NULL, 0); +#else + int64_t ret = drv_call_new("drvmgr", DRV_DUMP_CMD_ID, NULL, NULL, 0); +#endif if (ret != 0) tloge("drv task dump drv call failed\n"); } diff --git a/lib/teelib/libteeconfig/src/tee_config/tee_config.c b/lib/teelib/libteeconfig/src/tee_config/tee_config.c index 35711a86..53d5b270 100644 --- a/lib/teelib/libteeconfig/src/tee_config/tee_config.c +++ b/lib/teelib/libteeconfig/src/tee_config/tee_config.c @@ -14,8 +14,10 @@ static struct drv_frame_info g_drv_frame_configs[] = { #if defined(TEE_SUPPORT_DRV_SERVER_64BIT) || defined(TEE_SUPPORT_DRV_SERVER_32BIT) - { "drvmgr", AC_SID_DRVMGR, 0, 0, 0, DRVMGR, true }, - { "drvmgr_multi", AC_SID_DRVMGR, 0, 0, 0, DRVMGR, false }, + { "drvmgr", 0, 0, 0, 0, DRVMGR, true }, +#ifndef CONFIG_DISABLE_MULTI_DRV + { "drvmgr_multi", 0, 0, 0, 0, DRVMGR, false }, +#endif #endif };