/*
 * src/property.h
 *
 * Copyright (C) 2013, Samsung Electronics Co., Ltd.
 *
 * Properties' support
 */

#ifdef __TA_PROPERTY_H__
#error "ta_property.h should be included only once"
#else
#define __TA_PROPERTY_H__

#include <stdint.h>
#include <stdbool.h>

typedef struct {
    uint32_t timeLow;
    uint16_t timeMid;
    uint16_t timeHiAndVersion;
    uint8_t clockSeqAndNode[8];
} __attribute__((packed)) uuid_t;

#define AUTHORITY_NAME_LEN  16
#define AUTHORITY_STR_LEN   (AUTHORITY_NAME_LEN + 1)

#define GPD_TA_VERSION_LEN 20
#define GPD_TA_DESCRIPTION_LEN 20
#define CA_DIG_LEN           32
#define CA_ID_LEN   (256)

#define TA_DBG_PMR_TEE_BLOCKED (-64)
#define TA_DBG_PMR_BLOCKED     0
#define TA_DBG_PMR_CODE_ONLY   32
#define TA_DBG_PMR_CODE_STATE  64
#define TA_DBG_PMR_HEAP_STACK  96
#define TA_DBG_PMR_ALL         112U

#define TA_DBG_DLM_TEE_BLOCKED (-64U)
#define TA_DBG_DLM_BLOCKED     0
#define TA_DBG_DLM_ALL         64

struct tainfo_packed {
    uuid_t uuid;
    bool singleInstance;
    bool multiSession;
    bool instanceKeepAlive;
    uint32_t dataSize;
    uint32_t stackSize;
    char version[GPD_TA_VERSION_LEN];
    char description[GPD_TA_DESCRIPTION_LEN];
    uint32_t thread_count; /* Number of threads (N) in a service depending on service type. */
    uint32_t numInstances; /* Number of simultaneously running instances */
    uint32_t threads_initial_prio; /* Initial priority for task threads */
    uint32_t threads_max_prio; /* Maximum priority for task threads */
    char ta_authority[AUTHORITY_STR_LEN]; /* Name of TA Authority */
    bool bFIPS_Mode_Enable; /* FIPS mode of CryptoCore library enable flag */
    uint32_t dbg_dlm_data_available;
    uint32_t dbg_pmr_data_available;
};

const struct tainfo_packed _TA_property
= {
  TA_PROP_UUID,
  TA_PROP_SINGLE_INSTANCE,
  TA_PROP_MULTISESSION,
  TA_PROP_INSTANCE_KEEPALIVE,
  TA_PROP_DATASIZE,
  TA_PROP_STACKSIZE,
  TA_PROP_VERSION,
  TA_PROP_DESCRIPTION,
  TA_PROP_THREAD_COUNT,
#if (TA_PROP_SINGLE_INSTANCE == 0)
  TA_PROP_NUMINSTANCES,
#elif (TA_PROP_MULTISESSION)
  TA_PROP_NUMSESSIONS,
#else
  1,
#endif
  TA_PROP_INITIAL_PRIORITY,
  TA_PROP_MAX_PRIORITY,
#ifdef TA_PROP_GROUP_ID
  TA_PROP_GROUP_ID, //TA_PROP_GROUP_ID,
#else
  "none", // FIXME: temporary workaround
#endif

#ifdef TA_FIPS_MODE_ENABLE
  TA_FIPS_MODE_ENABLE,
#else
  FALSE, // it is default setting
#endif
	TA_PROP_DBG_DLM_DATA_AVAILABLE,
	TA_PROP_DBG_PMR_DATA_AVAILABLE,
};

int __TA_PROPERTY_H_IS_INCLUDED_;

#endif /* !__TA_PROPERTY_H__ */
