import os
import re
Import('env')

env = env.Clone()
#------------------------------------------------------------------------------
# VK FUNC
#------------------------------------------------------------------------------
def VK_LOGD(str):
  print("[VK_DBG] " + str)

CHIPSET = env['CHIPSET']
if CHIPSET == "saipan":
  CHIPSET = "sm7250"
if CHIPSET == "kamorta":
  CHIPSET = "sm6115"
if CHIPSET == "lahaina":
  CHIPSET = "sm8350"
if CHIPSET == "rennell":
  CHIPSET = "sm7125"
if CHIPSET == "sdm855":
  CHIPSET = "sm8150"
if CHIPSET == "bitra":
  CHIPSET = "sm7225"

TARGET_BUILD_VARIANT = os.environ['TARGET_BUILD_VARIANT']
PLATFORM_VERSION = os.environ['PLATFORM_VERSION'] # Release version
PLATFORM_SDK_VERSION = os.environ['PLATFORM_SDK_VERSION'] # API level
SHIPPING_API_LEVEL = os.environ['PRODUCT_SHIPPING_API_LEVEL']
TA_BUILD_FACTORY = os.environ['TA_BUILD_FACTORY']
TA_TARGET_ARCH = "32"
SEC_QUICKBUILD_BUILD_TYPE = os.environ['SEC_QUICKBUILD_BUILD_TYPE']

if TARGET_BUILD_VARIANT == "eng":
  VK_LOGD("VK_PROCA_ENABLE : " + os.environ['VK_PROCA_ENABLE'])

#------------------------------------------------------------------------------
# COMMON BUILD OPTION
#------------------------------------------------------------------------------
if os.getenv('SUPPORT_NEW_TA_BUILD', 'false') == 'true':
  env.Append(LINKFLAGS=' -no-threads ') # deterministic 

#------------------------------------------------------------------------------
# OUT DIR
#------------------------------------------------------------------------------
if os.path.exists(env['BUILD_ROOT'] + '/ssg'):
  QSEE_APP_DIR = env['BUILD_ROOT'] + "/ssg"
else:
  QSEE_APP_DIR = env['BUILD_ROOT'] + "/core"

if not hasattr(env, 'IMAGE_ALIASES'):
  aliases = []
  aliases = ['vaultkeeper',]
  env.Replace(OUT_DIR = QSEE_APP_DIR + "/bsp/trustzone/qsapps/vaultkeeper/build")
  env.Replace(LIB_OUT_DIR = QSEE_APP_DIR + "/bsp/trustzone/qsapps/vaultkeeper/build/" + "${SHORT_BUILDPATH}")

#------------------------------------------------------------------------------
# VK Source PATH
#------------------------------------------------------------------------------
VK_ROOT_PATH = QSEE_APP_DIR + "/securemsm/trustzone/qsapps/vaultkeeper/"

#------------------------------------------------------------------------------
# VK Defines
#------------------------------------------------------------------------------
# Common
env.Append(CPPDEFINES = [
  "USE_QSEE",
])

if TARGET_BUILD_VARIANT != "user":
  if SEC_QUICKBUILD_BUILD_TYPE == "PBS":
    env.Append(CCFLAGS = ' -D__VK_TEST__')

# CHIPSET dependency
# QC, LSI 9810 9820 9830 7885 7904, MTK  : VK_VERSION_2, LSI 7870 7880 7570 8890 : VK_VERSION_1
env.Append(CPPDEFINES = [
  "VK_SWD_QSEE",
  "VK_VERSION_2",
])

## We need to specify "neon" to generate SIMD instructions in 32-bit mode
if 'scorpion' in env['PROC']:
  env.Append(CCFLAGS = " -mfpu=neon ")

env.Append(CFLAGS = ' -fPIC -Werror -Wno-macro-redefined -Wbuiltin-macro-redefined')
env.Replace(ARM_OPT_STACK_GUARD = ' -fstack-protector-strong')

env.Append(CFLAGS = ' -fstack-protector -fstack-protector-all')
env.Append(CCFLAGS = ' -D_GNU_SOURCE')
env.Append(CCFLAGS = ' -DVK_QSEE_%s' % re.findall("\d+",CHIPSET)[0])

# PRODUCT_SHIPPING_API_LEVEL
if SHIPPING_API_LEVEL == "28":
  env.Append(CCFLAGS = ' -DVK_SHIPPING_API_LEVEL_P')
if SHIPPING_API_LEVEL == "29":
  env.Append(CCFLAGS = ' -DVK_SHIPPING_API_LEVEL_Q')
if SHIPPING_API_LEVEL == "30":
  env.Append(CCFLAGS = ' -DVK_SHIPPING_API_LEVEL_R')
if SHIPPING_API_LEVEL == "31":
  env.Append(CCFLAGS = ' -DVK_SHIPPING_API_LEVEL_S')
if SHIPPING_API_LEVEL == "32":
  env.Append(CCFLAGS = ' -DVK_SHIPPING_API_LEVEL_T')
if SHIPPING_API_LEVEL == "33":
  env.Append(CCFLAGS = ' -DVK_SHIPPING_API_LEVEL_U')

# PLATFORM_SDK_VERSION
if PLATFORM_SDK_VERSION == "30":
  env.Append(CCFLAGS = ' -DVK_PLATFORM_SDK_VERSION_30')
if PLATFORM_SDK_VERSION == "31":
  env.Append(CCFLAGS = ' -DVK_PLATFORM_SDK_VERSION_31')
if PLATFORM_SDK_VERSION == "32":
  env.Append(CCFLAGS = ' -DVK_PLATFORM_SDK_VERSION_32')
if PLATFORM_SDK_VERSION == "33":
  env.Append(CCFLAGS = ' -DVK_PLATFORM_SDK_VERSION_33')

# TARGET_BUILD_VARIANT
if TARGET_BUILD_VARIANT == "eng":
  env.Append(CCFLAGS = ' -DVK_TARGET_BUILD_VARIANT_ENG')

# TA_BUILD_FACTORY
if TA_BUILD_FACTORY == "TRUE":
  env.Append(CCFLAGS = ' -DVK_BUILD_FACTORY_BIN')

if CHIPSET == "sm8350":
  env.Append(CCFLAGS = ' -DNO_NEED_TO_MIGRATION01')
  env.Append(CCFLAGS = ' -DVK_RPMB_TRANSFER_MLT_BLK')
if CHIPSET == "sm8250":
  env.Append(CCFLAGS = ' -DNO_NEED_TO_MIGRATION01')
  env.Append(CCFLAGS = ' -DVK_RPMB_TRANSFER_MLT_BLK')
if CHIPSET == "sm7250":
  env.Append(CCFLAGS = ' -DNO_NEED_TO_MIGRATION01')
  env.Append(CCFLAGS = ' -DVK_RPMB_TRANSFER_MLT_BLK')
if CHIPSET == "sm6115":
  env.Append(CCFLAGS = ' -DNO_NEED_TO_MIGRATION01')
  env.Append(CCFLAGS = ' -DVK_RPMB_TRANSFER_MLT_BLK')
if CHIPSET == "sm7125":
  env.Append(CCFLAGS = ' -DNO_NEED_TO_MIGRATION01')
  env.Append(CCFLAGS = ' -DVK_RPMB_TRANSFER_MLT_BLK')
if CHIPSET == "sm7225":
  env.Append(CCFLAGS = ' -DNO_NEED_TO_MIGRATION01')
  env.Append(CCFLAGS = ' -DVK_RPMB_TRANSFER_MLT_BLK')
if CHIPSET == "sm8150":
  env.Append(CCFLAGS = ' -DVK_RPMB_TRANSFER_MLT_BLK')
if CHIPSET == "sm6150":
  env.Append(CCFLAGS = ' -DVK_RPMB_TRANSFER_MLT_BLK')
if CHIPSET == "sm7150":
  env.Append(CCFLAGS = ' -DVK_RPMB_TRANSFER_MLT_BLK')
if CHIPSET == "sdm660":
  env.Append(CPPDEFINES = 'VAULTKEEPER=1')
if CHIPSET == "sdm450":
  env.Append(CCFLAGS = ' -DQSEE_OLD_INIT_INVOCATION_STYLE')
if CHIPSET == "msm8953":
  env.Append(CPPDEFINES = 'VAULTKEEPER=1')
  env.Append(CCFLAGS = ' -DQSEE_OLD_INIT_INVOCATION_STYLE')
if CHIPSET == "sdm439":
  env.Append(CPPDEFINES = 'VAULTKEEPER=1')
  env.Append(CCFLAGS = ' -DQSEE_OLD_INIT_INVOCATION_STYLE')
  env.Append(CCFLAGS = ' -DNO_NEED_TO_MIGRATION01')

libs = []
if os.environ['VK_PROCA_ENABLE'] == 'TRUE':
  env.Append(CCFLAGS = ' -DVK_PROCA_ENABLE')
  if TA_TARGET_ARCH == "32":
    PROCA_LIB = os.environ['TZ_PROCA_LIB32']
  else:
    PROCA_LIB = os.environ['TZ_PROCA_LIB64']
  libs.append(env.File(PROCA_LIB.split()))
  VK_LOGD("PROCA_LIB : " + PROCA_LIB)

VK_LOGD("CCFLAG: " + env['CCFLAGS'])

#------------------------------------------------------------------------------
# VK includes
#------------------------------------------------------------------------------
includes = [
  "${INC_ROOT}/core/api/services",
  "${INC_ROOT}/core/api/boot/qfprom",
  QSEE_APP_DIR + "/api/securemsm/trustzone/qsee",
  VK_ROOT_PATH + "inc",
  VK_ROOT_PATH + "inc/qsee",
  os.environ['TZ_SCRYPTO_HEADER_PATH'],
  VK_ROOT_PATH + "inc/vk_client_worker",
  VK_ROOT_PATH + "inc/crypto",
  os.environ['TZ_PROCA_HEADER_PATH'],
]

VK_LOGD("TZ_SCRYPTO_HEADER_PATH:" + os.environ['TZ_SCRYPTO_HEADER_PATH'])

if CHIPSET in ['sdm439', 'sdm450', 'msm8953']:
  includes.append(QSEE_APP_DIR + "/securemsm/trustzone/qsapps/libs/applib/qsee/src")
  includes.append(QSEE_APP_DIR + "/api/boot/qfprom")

#------------------------------------------------------------------------------
# VK APP_CORE_ENTRY_SOURCES
#------------------------------------------------------------------------------
APP_CORE_ENTRY_SOURCES = [
  VK_ROOT_PATH + "app_main.c",
  VK_ROOT_PATH + "vkqsee_rpmb.c",
  VK_ROOT_PATH + "vkqsee_crypto.c",
  VK_ROOT_PATH + "vkqsee_fuse.c",
  VK_ROOT_PATH + "vk_cmd_listener.c",
  VK_ROOT_PATH + "vk_utils.c",
  VK_ROOT_PATH + "vk_packet_maker.c",
  VK_ROOT_PATH + "vk_vault_manager.c",
  VK_ROOT_PATH + "crypto/vk_crypto.c",
  VK_ROOT_PATH + "crypto/vk_crypto_cert.c",
  VK_ROOT_PATH + "crypto/vk_crypto_rsa.c",
  VK_ROOT_PATH + "crypto/vk_crypto_aes.c",
  VK_ROOT_PATH + "vk_client_worker/vk_cp_cmd_worker.c",
  VK_ROOT_PATH + "vk_client_worker/vk_kg_cmd_worker.c",
  VK_ROOT_PATH + "vk_client_worker/vk_everyman_cmd_worker.c",
  VK_ROOT_PATH + "qsee_printk.c",
  VK_ROOT_PATH + "vk_migration.c",
  VK_ROOT_PATH + "vk_prepare_service.c",
  VK_ROOT_PATH + "call_by_qseecom_uefi.c",
]

#------------------------------------------------------------------------------
# Library
#------------------------------------------------------------------------------
if CHIPSET in ['sdm439','msm8953']:
  SCRYPTO_LIB = VK_ROOT_PATH + "qualcomm_msm8953_scrypto_v2.1_x32_release.a"
else:
  SCRYPTO_LIB = os.environ['TZ_SCRYPTO_LIB32']

VK_LOGD("SCRYPTO_LIB:" + SCRYPTO_LIB)
libs.append(env.File(SCRYPTO_LIB.split()))

VK_LOGD("PROC:" + env['PROC'][0])
if 'scorpion' in env['PROC']:
  LIBC_PATH = "${MUSL32PATH}/lib/libc.a"
else:
  LIBC_PATH = "${MUSLPATH}/lib/libc.a"
libs.append(env.File(LIBC_PATH.split()))

#------------------------------------------------------------------------------
# Add command to Imprint HMAC
#------------------------------------------------------------------------------
if CHIPSET in ['sdm439', 'msm8953']:
  SCRYPTO_TOOL_IMPRINT = VK_ROOT_PATH + "imprint"
else:
  SCRYPTO_TOOL_IMPRINT = os.environ['TZ_SCRYPTO_TOOLS_IMPRINT']

VK_LOGD("SCRYPTO_TOOL_IMPRINT:" + os.environ['TZ_SCRYPTO_TOOLS_IMPRINT'])

VK_ELF_PATH = env.subst('${OUT_DIR}/' + '${SHORT_BUILDPATH}/' + "vaultkeeper.elf")
if CHIPSET in ['sm7250', 'sm7225']:
  VK_ELF_PATH = env.subst('${OUT_DIR}/' + '${SHORT_BUILDPATH}/scorpion/' + "vaultkeeper.elf")
if CHIPSET in ['sm8350', 'sm6115']:
  VK_ELF_PATH = env.subst('${OUT_DIR}/' + "vaultkeeper.elf")

VK_LOGD("VK_ELF_PATH:" + VK_ELF_PATH)

if os.path.exists(os.environ['TOPDIR']):
  RUN_SHELL_COMMAND = "size " + VK_ELF_PATH + " > " + os.environ['TOPDIR'] + "/android/vaultkeeper_elf.out"
  env.Append(LINKCOM = " && ")
  env.Append(LINKCOM = RUN_SHELL_COMMAND)

VK_RUN_FIPS_TOOLS_COMMAND =  SCRYPTO_TOOL_IMPRINT + " " + VK_ELF_PATH

env.Append(LINKCOM = " && ")
env.Append(LINKCOM = VK_RUN_FIPS_TOOLS_COMMAND)
env.Replace(VK_RUN_FIPS_TOOLS_COMMAND = SCRYPTO_TOOL_IMPRINT + " " + VK_ELF_PATH)

#------------------------------------------------------------------------------
# Add metadata to image
#------------------------------------------------------------------------------
md = {
  'appName':    'vaultkeeper',
  'privileges': ['default',
                 'HWFuse',
                ],
}

if os.environ['VK_PROCA_ENABLE'] == 'TRUE':
  md['privileges'].append('ProcessAuthenticator')

if 'scorpion' in env['PROC']:
  md['memoryType'] = 'Unprotected'

if CHIPSET in ['sm8350', 'sdm845', 'sdm670', 'sdm855', 'sm6150', 'sm7150', 'sm7250', 'sm8250', 'sm6115' , 'sm7125', 'sm8150', 'sm7225']:
  md['heapSize'] = 0x4a000
  md['stackSize'] = 0x4a000
  if CHIPSET in ['sm8350', 'sm7250', 'sm6115', 'sm7225']:
    md['privileges'].append('System')

  vaultkeeper_units = env.SecureAppBuilder(
    sources = [ APP_CORE_ENTRY_SOURCES ],
    includes = includes,
    user_libs = libs,
    metadata = md,
    image = 'vaultkeeper',
  )
else:
  vaultkeeper_units = env.SecureAppBuilder(
    sources = [ APP_CORE_ENTRY_SOURCES ],
    includes = includes,
    user_libs = libs,
    metadata = md,
    image = 'vaultkeeper',
    heap_size = '0x4a000',
  )

if hasattr(env, 'IMAGE_ALIASES'):
  for image in env['IMAGE_ALIASES']:
    env.Alias(image, vaultkeeper_units)
else:
  env.Alias(aliases, vaultkeeper_units)
