# 'CONFIG_TA_ARCH' is used in 'teegris_config.mk'
CONFIG_TA_ARCH=64
include ../../build/teegris_config.mk

CSMC_ROOT_DIR         := $(PWD)
SIGNCLIENT            := $(PWD)/tools/signclient.jar
SDK_ROOT_DIR          := $(PWD)/../../teegris_sdk
BUILD_TARGET          := AARCH64
SEC_PRODUCT           := $(shell echo $(TEEGRIS_BUILD_MODEL) | tr a-z A-Z)

# Common system API and defines
COMMON_SRC_DIR        := $(CSMC_ROOT_DIR)/common
COMMON_OBJ_DIR        := $(CSMC_ROOT_DIR)/out
COMMON_SRC            := $(wildcard $(COMMON_SRC_DIR)/*.c)
COMMON_OBJ            := $(patsubst $(COMMON_SRC_DIR)/%.c,$(COMMON_OBJ_DIR)/%.o,$(COMMON_SRC))

# SPI Custom SMC handler
SPI_CSMC_NAME         := spi_csmc_handler
SPI_CSMC_SRC_DIR      := $(CSMC_ROOT_DIR)/src
SPI_CSMC_INC_DIR      := $(CSMC_ROOT_DIR)/include
SPI_CSMC_OBJ_DIR      := $(CSMC_ROOT_DIR)/out
SPI_CSMC_SRC          := $(wildcard $(SPI_CSMC_SRC_DIR)/*.c)
SPI_CSMC_OBJ          := $(patsubst $(SPI_CSMC_SRC_DIR)/%.c,$(SPI_CSMC_OBJ_DIR)/%.o,$(SPI_CSMC_SRC))
SPI_CSMC_OBJ          += $(COMMON_OBJ)
SPI_CSMC_STRIP        := $(SPI_CSMC_OBJ_DIR)/$(SPI_CSMC_NAME)
SPI_CSMC_ELF          := $(SPI_CSMC_OBJ_DIR)/$(SPI_CSMC_NAME).elf
SPI_CSMC_O            := $(SPI_CSMC_OBJ_DIR)/$(SPI_CSMC_NAME).o
SPI_CSMC_BIN          := $(SPI_CSMC_OBJ_DIR)/$(SPI_CSMC_NAME).bin
SPI_CSMC_BIN_O        := $(SPI_CSMC_OBJ_DIR)/$(SPI_CSMC_NAME).bin.o


ifeq ($(CONFIG_TA_ARCH),64)
	OBJCOPY_FLAGS = -I binary -O elf64-littleaarch64 -B aarch64
else ifeq ($(BUILD_TARGET),ARM)
	CFLAGS_ARCH := -marm -mabi=aapcs-linux
	OBJCOPY_FLAGS = -I binary -O elf32-littlearm -B arm
endif

CFLAGS_CSMC := \
	$(CONFIG_CFLAGS_SW) \
	$(CFLAGS_ARCH) \
	-Wundef -Wno-trigraphs \
	-Wstrict-prototypes \
	-Wno-format-security -Wno-pointer-arith \
	-fomit-frame-pointer \
	-nostdlib \
	-fno-strict-aliasing -fno-builtin \
	-fplugin-arg-warn_override-disable \
	-ffreestanding \
	-I$(SW_SYSROOT_INCLUDE) \
	-I$(COMMON_SRC_DIR) \
	-ffunction-sections -fdata-sections

LDFLAGS_CSMC := \
	$(CONFIG_LDFLAGS_SW) \
	-nostdlib \
	-Wl,-pie \
	-Wl,-static \
	-Wl,--no-dynamic-linker \
	-fno-profile-generate \
	-Wl,--gc-sections \
	-lcsmc \
	-L$(COMMON_SRC_DIR)

STRIPFLAGS_CSMC := -R .note -R .comment -s

ifeq ($(TEEGRIS_BUILD_MODEL), $(filter exynos9830 exynos990, $(TEEGRIS_BUILD_MODEL)))
	CFLAGS_CSMC += \
		-DCONFIG_EXYNOS9830

	### For eSE Protection and TZ control
	#CFLAGS_CSMC += \
	#	-DCONFIG_ESE_TZ_CONTROL

	### For MST Protection and TZ control
	CFLAGS_CSMC += \
		-DCONFIG_MST_TZ_CONTROL

	### For Fingerprint SPI Protection
	CFLAGS_CSMC += \
		-DCONFIG_FP_TZ_CONTROL
else ifeq ($(TEEGRIS_BUILD_MODEL), $(filter exynos9630 exynos980, $(TEEGRIS_BUILD_MODEL)))
	CFLAGS_CSMC += \
		-DCONFIG_EXYNOS9630

	### For eSE Protection and TZ control
	CFLAGS_CSMC += \
		-DCONFIG_ESE_TZ_CONTROL

	### For MST Protection and TZ control
	CFLAGS_CSMC += \
		-DCONFIG_MST_TZ_CONTROL

	### For Fingerprint SPI Protection
	CFLAGS_CSMC += \
		-DCONFIG_FP_TZ_CONTROL
else ifeq ($(TEEGRIS_BUILD_MODEL), $(filter exynos3830 exynos850, $(TEEGRIS_BUILD_MODEL)))
	CFLAGS_CSMC += \
		-DCONFIG_EXYNOS3830

	### For Fingerprint SPI Protection
	CFLAGS_CSMC += \
		-DCONFIG_FP_TZ_CONTROL
else ifeq ($(TEEGRIS_BUILD_MODEL), $(filter exynos2100, $(TEEGRIS_BUILD_MODEL)))
	CFLAGS_CSMC += \
		-DCONFIG_EXYNOS2100

	### For Fingerprint SPI Protection
	CFLAGS_CSMC += \
		-DCONFIG_FP_TZ_CONTROL

	### For MST Protection and TZ control
	CFLAGS_CSMC += \
		-DCONFIG_MST_TZ_CONTROL
else ifeq ($(TEEGRIS_BUILD_MODEL), $(filter s5e8825, $(TEEGRIS_BUILD_MODEL)))
	CFLAGS_CSMC += \
		-DCONFIG_S5E8825
	### For Fingerprint SPI Protection
	CFLAGS_CSMC += \
		-DCONFIG_FP_TZ_CONTROL

	### For MST Protection and TZ control
	CFLAGS_CSMC += \
		-DCONFIG_MST_TZ_CONTROL
else ifeq ($(TEEGRIS_BUILD_MODEL), $(filter s5e9925, $(TEEGRIS_BUILD_MODEL)))
	CFLAGS_CSMC += \
		-DCONFIG_S5E9925
	### For Fingerprint SPI Protection
	CFLAGS_CSMC += \
		-DCONFIG_FP_TZ_CONTROL

	### For MST Protection and TZ control
	CFLAGS_CSMC += \
		-DCONFIG_MST_TZ_CONTROL
else
$(info $(TEEGRIS_BUILD_MODEL) is not supported)
endif

# Prepare signed custom handler object file for NWD client
SIGN_MODEL := TEEGRIS_$(SEC_PRODUCT)_CSMC
SIGN_RUNTYPE := ss_teegris_csmc
SPI_CSMC_SIGN_CMD := java -jar $(SIGNCLIENT) -model $(SIGN_MODEL) -runtype $(SIGN_RUNTYPE) -input $(SPI_CSMC_STRIP) -output $(SPI_CSMC_BIN)
SPI_CSMC_OBJC_CMD := $(CONFIG_OBJCOPY_SW) $(OBJCOPY_FLAGS) $(SPI_CSMC_BIN) $(SPI_CSMC_BIN_O)

.PHONY: all clean out_dir copy_bin
.NOTPARALLEL:

all : clean out_dir $(SPI_CSMC_STRIP) copy_bin

# Prepare custom handler object file for test-TA
$(SPI_CSMC_O) : $(SPI_CSMC_STRIP)
	$(eval CMD := cd $(SPI_CSMC_OBJ_DIR); $(CONFIG_OBJCOPY_SW) $(OBJCOPY_FLAGS) $(SPI_CSMC_NAME) $(SPI_CSMC_O))
	$(call RUN,"OBJC $(@F)",$(CMD))

# Convert custom handler ELF to Binary
$(SPI_CSMC_STRIP) : $(SPI_CSMC_ELF)
	$(CONFIG_STRIP_SW) $(STRIPFLAGS_CSMC) $< -o $@
	$(SPI_CSMC_SIGN_CMD)
	$(SPI_CSMC_OBJC_CMD)

# Link custom handler objects, produce ELF executable
$(SPI_CSMC_ELF) : $(SPI_CSMC_OBJ)
	$(CONFIG_CC_SW) $(LDFLAGS_CSMC) -o $@ $(SPI_CSMC_OBJ)

# Compile custom handler sources
$(COMMON_OBJ_DIR)/%.o: $(COMMON_SRC_DIR)/%.c
	$(CONFIG_CC_SW) $(CFLAGS_CSMC) -I$(COMMON_SRC_DIR) -c -o $@ $<

$(SPI_CSMC_OBJ_DIR)/%.o: $(SPI_CSMC_SRC_DIR)/%.c
	$(CONFIG_CC_SW) $(CFLAGS_CSMC) -I$(COMMON_SRC_DIR) -I$(SPI_CSMC_INC_DIR) -c -o $@ $<

out_dir:
	@mkdir -p $(SPI_CSMC_OBJ_DIR)

copy_bin:
	@cp -vf $(SPI_CSMC_BIN) $(TEEGRIS_TA_DIST_PATH)

clean:
	@rm -rf $(SPI_CSMC_OBJ_DIR)
