Beispiel #1
0
/*!
 @brief _fta_manage_check_exportable

 check data for exportable

 @param [out] fta_manager  check data
 @param [in]  limit_size   data size

 @retval     TRUE : data is exportable
 @retval     FALSE: data is not exportable

*/
boolean _fta_manage_check_exportable(fta_manager_store_header *fta_manager, uint32 limit_size)
{
  if(fta_manager == NULL) return FALSE;

  if(!(fta_manager->cmn.tag    == FTA_TAG_MANAGER &&
       fta_manager->cmn.size   >= FTA_CALC_MANAGER_SIZE(fta_manager->count) &&
       fta_manager->cmn.size   <= limit_size &&
       fta_manager->cmn.offset == FTA_MANAGER_STORE_HEADER_LEN &&
       fta_manager->reclen     == FTA_MANAGER_STORE_ITEM_LEN &&
       fta_manager->count      >  0)) {
    return FALSE;
  }

  if(fta_lib_check_parity16((uint16 *)fta_manager, fta_manager->cmn.size / 2, 0) != 0) {
    return FALSE;
  }

  if(!(fta_manager->cmn.enabled == FTA_STORE_ENABLED_TRUE &&
       FTA_LIB_CHECKBIT(fta_manager->cmn.statbit, FTA_STORE_STATBIT_RECORDING))) {
    return FALSE;
  }

  FTA_LIB_CHANGEBIT_CLR(fta_manager->cmn.statbit, FTA_STORE_STATBIT_RECORDING);
  fta_manager->parity = fta_lib_check_parity16(
                                (uint16 *)fta_manager,
                                fta_manager->cmn.size / 2,
                                fta_manager->parity);

  return TRUE;
}
Beispiel #2
0
/*!
 @brief fta_stop

 FTA stop function

 @param      none

 @retval     none
*/
void fta_stop(fta_stop_reason_enum reason)
{

  if(fta_manager == NULL) return;

  FTA_ENTER_LOCK();

  if(fta_lock_keeper.manager_status == FTA_MANAGER_STATUS_ENABLED) {
    fta_lock_keeper.manager_status = FTA_MANAGER_STATUS_STOP;
    /* - - - - - - - - */
    switch(reason) {
    case FTA_STOP_REASON_NORMAL:
      FTA_LIB_CHANGEBIT_CLR(fta_manager->cmn.statbit, FTA_STORE_STATBIT_RECORDING);
      fta_manager->cmn.enabled = FTA_STORE_ENABLED_FALSE;
      fta_manager->parity      = fta_lib_check_parity16((uint16 *)fta_manager, fta_manager->cmn.size / 2, fta_manager->parity);
      break;
    case FTA_STOP_REASON_ABNORMAL:
      break;
    case FTA_STOP_REASON_INTENTIONAL:
      FTA_LIB_CHANGEBIT_SET(fta_manager->cmn.statbit, FTA_STORE_STATBIT_INTENTIONAL);
      fta_manager->parity      = fta_lib_check_parity16((uint16 *)fta_manager, fta_manager->cmn.size / 2, fta_manager->parity);
    }
    /* - - - - - - - - */
    FTA_MEMORY_FLUSH();
  }

  FTA_LEAVE_LOCK();

  _fta_manage_terminate_store_items(fta_manager);
  fta_reference = fta_reference_null;

  return;
}
Beispiel #3
0
/*!
 @brief fta_initialize

 FTA initialize function

 @param      none

 @retval     none
*/
void fta_initialize(void)
{
  boolean dofirst = (fta_manager == NULL ? TRUE : FALSE);

  if(!dofirst) {
    memset(&fta_lock_keeper, 0, sizeof(fta_lock_keeper));
    memset(&fta_reference, 0, sizeof(fta_reference));
  }

  memset(fta_log_area,0,FTA_CONFIG_STORE_MEMORY_SIZE);
  fta_manager = (fta_manager_store_header *)fta_log_area;
  fta_manager_initializer.fta_manager = fta_manager;
  fta_manager_initializer.memory_addr = FTA_LIB_OFFSET_ADDR(((uint8 *)fta_manager), FTA_CALC_MANAGER_SIZE(FTA_CONFIG_STORE_INITIAL_COUNT));
  if(_fta_manage_initialize(&fta_manager_initializer)) {

    _fta_manage_initialize_store_items(fta_manager);

    fta_manager->cmn.enabled = FTA_STORE_ENABLED_TRUE;
    FTA_LIB_CHANGEBIT_SET(fta_manager->cmn.statbit, FTA_STORE_STATBIT_RECORDING);
    fta_manager->parity      = fta_lib_check_parity16((uint16 *)fta_manager, fta_manager->cmn.size / 2, fta_manager->parity);
    FTA_MEMORY_FLUSH();

    fta_lock_keeper.manager_status = FTA_MANAGER_STATUS_ENABLED;

    /* start logging */
    FTA_LOG_MESSAGE(FTA_ADMIN, FTA_LOG_LEVEL_NOTICE, "*** FTA INITIALIZED %x %x", fta_log_area, virt_to_phys(fta_log_area),0);
  }

  return;
}
Beispiel #4
0
/*!
 @brief fta_terminate

 FTA terminate function

 @param      none

 @retval     none
*/
void fta_terminate(void)
{

  if(fta_manager == NULL) return;

  FTA_ENTER_LOCK();

  fta_lock_keeper.manager_status = FTA_MANAGER_STATUS_STOP;
  FTA_LIB_CHANGEBIT_CLR(fta_manager->cmn.statbit, FTA_STORE_STATBIT_RECORDING);
  fta_manager->cmn.enabled = FTA_STORE_ENABLED_FALSE;
  fta_manager->parity      = fta_lib_check_parity16((uint16 *)fta_manager, fta_manager->cmn.size / 2, fta_manager->parity);
  FTA_MEMORY_FLUSH();

  FTA_LEAVE_LOCK();

  _fta_manage_terminate_store_items(fta_manager);
  fta_reference = fta_reference_null;

  return;
}
Beispiel #5
0
/*!
 @brief _fta_manage_initialize

 initialize manage area

 @param [in]  manager_initializer   pointer of the manage area

 @retval      TRUE : success
 @retval      FALSE: failed

*/
boolean _fta_manage_initialize(const fta_manager_initializer_info *manager_initializer)
{
  fta_manager_store_header *fta_manager;
  const fta_manager_config_store_item * const *p_config_items;
  fta_manager_store_item *store_items;

  uint32 manager_size;
  fta_common_store_header *store_addr;
  uint32 var_size;
  uint32 var_num;
  uint32 i;
  uint16 config_cnt;
  boolean config_err = FALSE;

  if(manager_initializer == NULL) return FALSE;

  if(manager_initializer->fta_manager    == NULL ||
     manager_initializer->p_config_items == NULL ||
     manager_initializer->lock_keeper    == NULL ||
     (manager_initializer->memory_size & 3) != 0) {
    return FALSE;
  }

  fta_manager = manager_initializer->fta_manager;
  p_config_items = manager_initializer->p_config_items;
  store_items = (fta_manager_store_item *) FTA_LIB_OFFSET_ADDR(fta_manager, FTA_MANAGER_STORE_HEADER_LEN);

  manager_size = FTA_CALC_MANAGER_SIZE(manager_initializer->config_count);
  memset(fta_manager, 0, manager_size);
  fta_manager->cmn.tag     = FTA_TAG_MANAGER;
  fta_manager->cmn.size    = manager_size;
  fta_manager->cmn.enabled = FTA_STORE_ENABLED_FALSE;
  FTA_LIB_SETBITVALUE(fta_manager->cmn.statbit, FTA_STORE_STATBIT_ALLCLEAR);
  fta_manager->cmn.offset  = FTA_MANAGER_STORE_HEADER_LEN;
  fta_manager->id          = FTA_MANAGER_ID_DEFAULT;
  fta_manager->reclen      = FTA_MANAGER_STORE_ITEM_LEN;
  fta_manager->count       = 0;
  fta_manager->parity      = fta_lib_check_parity16((uint16 *)fta_manager, fta_manager->cmn.size / 2, fta_manager->parity);

  manager_initializer->lock_keeper->fta_manager    = fta_manager;
  manager_initializer->lock_keeper->manager_status = FTA_MANAGER_STATUS_UNINIT;

  /* set the manage info from the config table */
  store_addr = (fta_common_store_header *)(manager_initializer->memory_addr);
  var_size = manager_initializer->memory_size;
  /* calcurate the variable size */
  config_cnt = 0;
  var_num = 0;
  /* - - - - - - - - */
  for(i = 0; i < manager_initializer->config_count; i++) {
    if(p_config_items[i] != NULL) {
      if(p_config_items[i]->tag != FTA_CONFIG_UNDEFINED) {
        if(config_cnt == 0) {
          var_num = i;
        } else {
          if(var_size < p_config_items[i]->size)                  config_err = TRUE;
          if((p_config_items[i]->size & 3) != 0)                  config_err = TRUE;
          if(p_config_items[i]->offset > p_config_items[i]->size) config_err = TRUE;
          var_size -= p_config_items[i]->size;
        }
        config_cnt++;
      }
    }
  }
  if(config_cnt > 0) {
    if(p_config_items[var_num]->offset > var_size) config_err = TRUE;
  }
  /* - - - - - - - - */
  config_cnt = 0;
  /* - - - - - - - - */
  for(i = 0; i < manager_initializer->config_count; i++) {
    if(p_config_items[i] != NULL) {
      if(p_config_items[i]->tag != FTA_CONFIG_UNDEFINED) {
        store_items[config_cnt].addr        = store_addr;
        store_items[config_cnt].tag         = p_config_items[i]->tag;
        store_items[config_cnt].size        = (i == var_num ? var_size : p_config_items[i]->size);
        store_items[config_cnt].def         = p_config_items[i];
        store_items[config_cnt].lock_keeper = manager_initializer->lock_keeper;
        if(p_config_items[i]->set_to != FTA_CONFIG_UNDEFINED) {
          *(p_config_items[i]->set_to) = &store_items[config_cnt];
        }
        store_addr = (fta_common_store_header *) FTA_LIB_OFFSET_ADDR(store_addr, store_items[config_cnt].size);
        config_cnt++;
      }
    }
  }
  /* - - - - - - - - */

  fta_manager->count       = config_cnt;
  fta_manager->parity      = fta_lib_check_parity16((uint16 *)fta_manager, fta_manager->cmn.size / 2, fta_manager->parity);

  /* cannot use FTA when configuration is unrecongnized */
  if(config_err) {
    return FALSE;
  }

  return TRUE;
}