
# "Samsung Electronics Co", Ltd (Seoul, Republic of Korea)
# Copyright: (c) Samsung Electronics Co, Ltd 2021. All rights reserved.

###########################
# MZ Trusted Application
###########################
#
# TODO: provide correct parsing rules for MZ VERSIONS
#
###########################

TRUSTLET_DIR := $(KINIBI_TA_BUILD_ROOT)/kinibi_source/$(TA_NAME)/Locals/Code

# ARMCC TOOLCHAIN arch, values - 32/64
CONFIG_TOOLCHAIN_ARCH=64

# Set YES, if SCRYPTO enabled
CONFIG_USE_SCRYPTO := 
ifneq (,$(filter $(strip $(TA_TARGET_SOC)), mt6768))
    CONFIG_USE_SCRYPTO := YES
endif

# Mobicore parameters
# output binary name without path or extension
OUTPUT_NAME            := tlmz
TRUSTLET_UUID          := ffffffff000000000000000000000030
TRUSTLET_MEMTYPE       := 2 # external memory used
TRUSTLET_NO_OF_THREADS := 1 # has to be 1 for Trustlets
TRUSTLET_SERVICE_TYPE  := 3 # 3: system trustlet
TRUSTLET_INSTANCES     := 1 # min: 1; max: 16

# 0: no flag; 
# 1: permanent; 
# 2: service has no MZ control interface; 
# 3: both (permanent and service has not MZ control interface); 4: debuggable
# 8: set extended memory to TA or Driver. R7 uses k500, it doesn't allow TA or driver having legacy memory layout
TRUSTLET_FLAGS := 8 

TBASE_API_LEVEL := 5
HEAP_SIZE_INIT  := 262144
HEAP_SIZE_MAX   := 430080

ENABLE_STACK_PROTECTION := true

# Set x32 compiler
ARM_RVCT_PATH_BIN = $(ARM_RVCT_PATH)/bin/linux_x86_$(CONFIG_TOOLCHAIN_ARCH)
arm_cc_version := $(shell $(ARM_RVCT_PATH_BIN)/armcc --vsn)

# Print General Info
$(info =======================================)
$(info [MZ] - TA_NAME                  = $(TA_NAME))
$(info [MZ] - OUTPUT_NAME              = $(OUTPUT_NAME))
$(info [MZ] - TRUSTLET_DIR             = $(TRUSTLET_DIR))
$(info [MZ] - KINIBI_TA_BUILD_ROOT     = $(KINIBI_TA_BUILD_ROOT))
$(info [MZ] - TLSDK_DIR_SRC            = $(TLSDK_DIR_SRC))
$(info [MZ] - ARM_RVCT_PATH            = $(ARM_RVCT_PATH)) 
$(info [MZ] - ARM_RVCT_PATH_BIN        = $(ARM_RVCT_PATH_BIN))
$(info [MZ] - ARMCC version            = $(arm_cc_version))
$(info [MZ] - TARGET_BUILD_VARIANT     = $(TARGET_BUILD_VARIANT))
$(info [MZ] - TA_TARGET_SOC            = $(TA_TARGET_SOC))
$(info [MZ] - CONFIG_USE_SCRYPTO       = $(CONFIG_USE_SCRYPTO))
$(info [MZ] - TZ_SCRYPTO_VERSION       = $(TZ_SCRYPTO_VERSION))
$(info [MZ] - TZ_SCRYPTO_LIB32         = $(TZ_SCRYPTO_LIB32))
$(info [MZ] - TZ_SCRYPTO_TOOLS_IMPRINT = $(TZ_SCRYPTO_TOOLS_IMPRINT))
$(info [MZ] - PROCA_ENABLE             = $(PROCA_ENABLE))
$(info [MZ] - TZ_PROCA_LIB_VERSION     = $(TZ_PROCA_LIB_VERSION))
$(info [MZ] - TZ_PROCA_HEADER_PATH     = $(TZ_PROCA_HEADER_PATH))
$(info [MZ] - TZ_PROCA_LIB_PATH        = $(TZ_PROCA_LIB_PATH))
$(info [MZ] - TZ_PROCA_LIB32           = $(TZ_PROCA_LIB32))
$(info =======================================)

# Add include path here
INCLUDE_DIRS += \
    $(TLSDK_DIR_SRC)/Public \
	$(TLSDK_DIR_SRC)/Internal \
    $(TLSDK_DIR_SRC)/Public/MobiCore/inc \
    $(TLSDK_DIR_SRC)/Public/MobiCore/inc/TlApi \
        \
    $(TRUSTLET_DIR)/src \
    $(TRUSTLET_DIR)/include \
        \
    $(TRUSTLET_DIR)/src/common/include \
    $(TRUSTLET_DIR)/src/common/log/inc \
        \
    $(TRUSTLET_DIR)/src/daemon/src/TLC/inc \
        \
    $(TRUSTLET_DIR)/swd/common

SRC_C += \
    $(TRUSTLET_DIR)/swd/mc/mcAgentMain.c \
    $(TRUSTLET_DIR)/swd/mc/stack_protection.c \
    $(TRUSTLET_DIR)/swd/common/tl_handler.c \
        \
    $(TRUSTLET_DIR)/src/common/log/src/mz_log.c


TRUSTLET_OPTS += \
    -O0 --c99 -g --brief_diagnostics \
    --diag_error=warning \
    --diag_suppress=1301 \
        \
    -DTA_BUILD \
    -DSWD \
    -DTEE \
    -DMOBICORE \
    -DENABLE_TBASE_LOGGING \
    -DMZ_MOBICORE \
    -DNWD_PLATFORM=42 \
    -DTA_SOURCE_BUILD

ifneq (,$(filter $(strip $(TA_TARGET_SOC)), mt6768))
    TA_LINK_OPTS += --diag_suppress=L6242E \
                    --diag_suppress=L6915E
    TRUSTLET_OPTS += --diag_suppress=191 \
                     -DNO_STACK_CHK_IMPLEMENTED \
                     -DSTACK_CHK_FAIL_IMPLEMENTED
endif

# ------------------------------------------------------
# Patch SDK/KINIBI/exynos7885/400C/t-base-dev-kit/t-sdk/TlSdk/trustlet.mk
# due-to issue for x32: Fatal error: L3900U: Unrecognized option '--remarks'.
# Below line which remove '--remarks'
# ------------------------------------------------------
$(shell sed -i '/--remarks/d' $(TLSDK_DIR_SRC)/trustlet.mk)

# ------------------------------------------------------
# Debug / Release mode
# ------------------------------------------------------
ifneq (,$(filter $(strip $(TARGET_BUILD_VARIANT)), eng userdebug))
    MODE := Debug
    TRUSTLET_OPTS += -DENABLE_DEBUGGING -D__DEBUG__ -DDEBUG -D__FILENAME__=__FILE__
else
    MODE := Release
    TRUSTLET_OPTS += -D__RELEASE__ -D__FILENAME__=\"\" -DRELEASE
endif


# strip dublicated includes
INCLUDE_DIRS := $(sort $(INCLUDE_DIRS))

# ------------------------------------------------------
# Setup configure for signing
# ------------------------------------------------------
RUNTYPE := gd_mobicore400_trustlet
ifneq (,$(filter $(strip $(TA_TARGET_SOC)), mt6768))
    RUNTYPE := gd_mobicore410_trustlet
endif

st := -servicetype $(TRUSTLET_SERVICE_TYPE)
nt := -numberofthreads $(TRUSTLET_NO_OF_THREADS)
ni := -numberofinstances $(TRUSTLET_INSTANCES)
mt := -memtype $(TRUSTLET_MEMTYPE)
f  := -flags $(TRUSTLET_FLAGS)
is := -initheapsize $(HEAP_SIZE_INIT)
ms := -maxheapsize $(HEAP_SIZE_MAX)

TRUSTLET_SIGN_CONF := "$(st) $(nt) $(ni) $(mt) $(f) $(is) $(ms)"

#-------------------------------------------------------------------------------
# use generic make file
include $(TLSDK_DIR_SRC)/trustlet.mk

#-------------------------------------------------------------------------------
# imprint for app signing (SCRYPTO)
ifeq ($(CONFIG_USE_SCRYPTO),YES)
scrypto_hmac: $(TA_AXF)
	$(SCRYPTO_IMPRINT_TOOL) $<
all: scrypto_hmac
	# Build Done. Do not remove this line
endif
