include Config.mk

SEC_PRODUCT ?= $(shell echo $(TEEGRIS_BUILD_MODEL) | tr a-z A-Z)
SEC_SDK ?= sdk$(TEEGRIS_VERSION)0

ifneq ($(filter sdk20 sdk30 sdk40, $(SEC_SDK)), )
ifeq ($(CONFIG_TOOLCHAIN_ROOT),)
    $(error PLEASE CONFIGURE ENVIRONMENT - CONFIG_TOOLCHAIN_ROOT IS NOT SET)
endif
else
ifeq ($(CONFIG_TOOLCHAIN_PREFIX),)
    $(error PLEASE CONFIGURE ENVIRONMENT - CONFIG_TOOLCHAIN_PREFIX IS NOT SET)
endif
endif


TARGET          := tima_csmc_handler

MAKE_DIR         = $(PWD)
SRC_DIR         := $(MAKE_DIR)/src
LIB_DIR         := $(MAKE_DIR)/lib
INCLUDE_DIR     := $(MAKE_DIR)/include
OUT_DIR         := $(MAKE_DIR)/out
ifeq ($(SEC_SDK), sdk40)
TOOLS_DIR       := $(MAKE_DIR)/../../sdk/teegris/4.X/4.1
else ifeq ($(SEC_SDK), sdk30)
TOOLS_DIR       := $(MAKE_DIR)/../teegris_sdk_3.0.0_update4
else ifeq ($(SEC_SDK), sdk20)
TOOLS_DIR       := $(MAKE_DIR)/../blowfish-sdk-2.0
else
TOOLS_DIR       := $(MAKE_DIR)/../tools
endif

SRC_CSMC        := $(wildcard $(SRC_DIR)/*.c)
SRC_CSMC        += $(wildcard $(SRC_DIR)/*.s)
OBJ_CSMC        := $(patsubst $(SRC_DIR)/%.c,$(OUT_DIR)/%.o,$(SRC_CSMC))
OBJ_CSMC        := $(patsubst $(SRC_DIR)/%.s,$(OUT_DIR)/%.o,$(OBJ_CSMC))

HND_CSMC_BIN    := $(OUT_DIR)/$(TARGET)
HND_CSMC_ELF    := $(HND_CSMC_BIN).elf
HND_CSMC_O      := $(HND_CSMC_BIN).o
PKG_NAME        := signed_$(TARGET)
PKG_CSMC_BIN    := $(OUT_DIR)/$(PKG_NAME)
PKG_CSMC_O      := $(PKG_CSMC_BIN).o

TOOLCHAIN_PREFIX := $(CONFIG_TOOLCHAIN_PREFIX)
AS              := $(TOOLCHAIN_PREFIX)as
LD              := $(TOOLCHAIN_PREFIX)ld
CC              := $(TOOLCHAIN_PREFIX)gcc
STRIP           := $(TOOLCHAIN_PREFIX)strip
OBJCOPY         := $(TOOLCHAIN_PREFIX)objcopy
OBJDUMP         := $(TOOLCHAIN_PREFIX)objdump
ifneq ($(filter sdk20 sdk30 sdk40, $(SEC_SDK)), )
SIGNCLIENT      := $(TOOLS_DIR)/signclient.jar
else
SIGNCLIENT      := $(TOOLS_DIR)/sign_helper
endif

MKDIR           := -mkdir -p
RM              := -rm -rf
CD              := cd

LIBGCC          := $$($(CC) -print-libgcc-file-name)
LIBGCC          := $$(dirname $(LIBGCC))

ifeq ($(SEC_SDK), sdk40)
CFLAGS-y := -I$(INCLUDE_DIR) \
	-Wall -Wextra -Werror \
	-fplugin-arg-warn_override-disable \
	-Wundef -Wno-trigraphs \
	-Wstrict-prototypes -std=gnu99 \
	-Wno-format-security -Wno-pointer-arith \
	-ffunction-sections -fdata-sections \
	-fomit-frame-pointer \
	-nostdlib \
	-fno-strict-aliasing -fno-builtin \
	-pipe -fpie \
	-Os -ffreestanding \
	-fstack-protector-strong \
	-I$(CONFIG_TOOLCHAIN_ROOT)/platforms/TEEGRIS-4.0/swd/arch-arm64/usr/include/ \
	-L$(CONFIG_TOOLCHAIN_ROOT)/platforms/TEEGRIS-4.0/swd/arch-arm64/usr/lib/
CFLAGS-y += -DCONFIG_SDK40
else ifeq ($(SEC_SDK), sdk30)
CFLAGS-y := -I$(INCLUDE_DIR) \
	-Wall -Wextra -Werror \
	-Wundef -Wno-trigraphs \
	-Wstrict-prototypes -std=gnu99 \
	-Wno-format-security -Wno-pointer-arith \
	-fomit-frame-pointer \
	-nostartfiles -nodefaultlibs -nostdlib \
	-fno-strict-aliasing -fno-builtin \
	-pipe -fpie -O2 \
	-fstack-protector-strong \
	-fplugin-arg-warn_override-disable \
	-I$(CONFIG_TOOLCHAIN_ROOT)/platforms/TEEGRIS-3.0/swd/arch-arm64/usr/include/ \
	-L$(CONFIG_TOOLCHAIN_ROOT)/platforms/TEEGRIS-3.0/swd/arch-arm64/usr/lib/
CFLAGS-y += -DCONFIG_SDK30
else ifeq ($(SEC_SDK), sdk20)
CFLAGS-y := -I$(INCLUDE_DIR) \
	-Wall -Wextra -Werror \
	-Wundef -Wno-trigraphs \
	-Wstrict-prototypes -std=gnu99 \
	-Wno-format-security -Wno-pointer-arith \
	-fomit-frame-pointer \
	-nostartfiles -nodefaultlibs -nostdlib \
	-fno-strict-aliasing -fno-builtin \
	-pipe -fpie -O2 \
	-I$(CONFIG_TOOLCHAIN_ROOT)/platforms/BF-2.0/swd/arch-arm64/usr/include/ \
	-L$(CONFIG_TOOLCHAIN_ROOT)/platforms/BF-2.0/swd/arch-arm64/usr/lib/	
CFLAGS-y += -DCONFIG_SDK20
else
CFLAGS-y := -marm -march=armv7-a -I$(INCLUDE_DIR) \
	-mno-thumb-interwork \
	-Wall -Wextra -Werror \
	-Wundef -Wno-trigraphs \
	-Wstrict-prototypes -std=gnu99 \
	-Wno-format-security -Wno-pointer-arith \
	-mabi=aapcs-linux -fomit-frame-pointer \
	-nostartfiles -nodefaultlibs -nostdlib \
	-fno-strict-aliasing -fno-builtin \
	-pipe -fpie -O2

CFLAGS-y += -DSMDK7420
ASFLAGS      := -march=armv7-a
endif

ifneq ($(SEC_PRODUCT), )
CFLAGS-y += -D$(SEC_PRODUCT)
endif

ifneq ($(SECUREMEM_SIZE), )
CFLAGS-y += -D${shell echo ${SEC_PRODUCT} | tr [a-z] [A-Z]}_${SECUREMEM_SIZE}
endif

ifneq ($(BUILD_TAG), )
CFLAGS-y += -DCONFIG_BUILD_TAG=\"$(BUILD_TAG)\"
CFLAGS-y += -DCONFIG_SYNC_CL=\"$(SYNC_CL)\"
else
CFLAGS-y += -DCONFIG_BUILD_TAG=\"Local\"
CFLAGS-y += -DCONFIG_SYNC_CL=\"Unknown\"
endif
CFLAGS-y += -DCONFIG_SEC_SDK=\"$(SEC_SDK)\"
CFLAGS-y += -DCONFIG_TARGET_CHIPSET=\"$(SEC_PRODUCT)\"

#Jenkins build info
ifneq ($(BUILD_NUMBER), )
CFLAGS-y += -D_BUILD_INFO=\"$(BUILD_NUMBER)\"
else
CFLAGS-y += -D_BUILD_INFO=\"0\"
endif

ifeq ($(SEC_SDK), sdk40)
STRIPFLAGS   := -R .note -R .comment -s
LDFLAGS := \
	-nostdlib \
	-Wl,-pie \
	-Wl,-static \
	-Wl,--no-dynamic-linker \
	-fno-profile-generate \
	-Wl,--gc-sections \
	-lcsmc \
	-L$(LIB_DIR)
else ifeq ($(SEC_SDK), sdk30)
STRIPFLAGS   := -R .note -R .comment -s
LDFLAGS      := --fatal-warnings -Os -pie
else
OBJCOPYFLAGS := -O binary -R .note -R .comment -S
LDFLAGS      := --fatal-warnings -Os
endif

ifneq ($(filter sdk30 sdk40, $(SEC_SDK)), )
SIGN_MODEL   := TEEGRIS_$(shell echo $(SEC_PRODUCT) | tr [a-z] [A-Z])_CSMC
SIGN_RUNTYPE := ss_teegris_csmc
else
SIGN_MODEL   := BF_SAMSUNG_CSMC
SIGN_RUNTYPE := ss_bf_csmc
endif

VPATH += $(SRC_DIR)
VPATH += $(OUT_DIR)

all : out_dir $(HND_CSMC_BIN) copy_dist
# Step 1: Make Binary file from ELF
# Step 2: Show Assemler representation
# Step 3: Make Object file with Symbol names from binary
# Step 4: Show Symbol names
$(HND_CSMC_BIN) : $(HND_CSMC_ELF)
ifneq ($(filter sdk30 sdk40, $(SEC_SDK)), )
	$(STRIP) $(STRIPFLAGS) $< -o $@
else
	$(OBJCOPY) $(OBJCOPYFLAGS) $< $@
endif

ifneq ($(filter sdk20 sdk30 sdk40, $(SEC_SDK)), )
	java -jar $(SIGNCLIENT) -runtype $(SIGN_RUNTYPE) -model $(SIGN_MODEL) -input $(HND_CSMC_BIN) -output $(PKG_CSMC_BIN)
	cp -f $(PKG_CSMC_BIN) $(OUT_DIR)/$(TARGET).bin
	cd $(OUT_DIR); $(OBJCOPY) -I binary -O elf64-littleaarch64 -B aarch64 $(TARGET) $(HND_CSMC_O)
	cd $(OUT_DIR); $(OBJCOPY) -I binary -O elf64-littleaarch64 -B aarch64 $(PKG_NAME) $(PKG_CSMC_O)
else
	$(OBJDUMP) -b binary -m arm -s -D $@
	$(SIGNCLIENT) -k $(TOOLS_DIR)/csmc_dev_key.txt -i $(HND_CSMC_BIN) -p $(PKG_CSMC_BIN) sign
	cd $(OUT_DIR); $(OBJCOPY) -I binary -B arm -O elf32-littlearm $(TARGET) $(HND_CSMC_O)
	cd $(OUT_DIR); $(OBJCOPY) -I binary -B arm -O elf32-littlearm $(PKG_NAME) $(PKG_CSMC_O)
endif	
	$(OBJDUMP) $(HND_CSMC_O) -x
	$(OBJDUMP) $(PKG_CSMC_O) -x

$(HND_CSMC_ELF) : $(OBJ_CSMC)
ifeq ($(SEC_SDK), sdk40)
	$(CC) -o $@ $(LDFLAGS) $(OBJ_CSMC)
else ifeq ($(SEC_SDK), sdk30)
	$(LD) -T $(SRC_DIR)/handler_TEE30.ld -o $@ $(LDFLAGS) $(OBJ_CSMC)
else ifeq ($(SEC_SDK), sdk20)
	$(LD) -T $(SRC_DIR)/handler64.ld -o $@ $(LDFLAGS) $(OBJ_CSMC)
else
	$(LD) -T $(SRC_DIR)/handler.ld -o $@ $(LDFLAGS) $(OBJ_CSMC)
endif

out_dir:
	@$(MKDIR) $(OUT_DIR)

$(OUT_DIR)/%.o : $(SRC_DIR)/%.s
	$(AS) $(ASFLAGS) -o $@ $<

$(OUT_DIR)/%.o : $(SRC_DIR)/%.c
	$(CC) $(CFLAGS-y) -c -o $@ $<

copy_dist: out_dir $(HND_CSMC_BIN)
	@echo Copy $(HND_CSMC_BIN).bin $(TEEGRIS_TA_DIST_PATH)
	@cp -f $(HND_CSMC_BIN).bin $(TEEGRIS_TA_DIST_PATH)

clean:
	@$(RM) $(OUT_DIR)

.PHONY: all clean out_dir
