Example #1
0
static void parse_elf_symbols(uintptr_t mem, size_t size, Phdr_t *load,
		struct vdso_symtable *t, uintptr_t dynsymbol_names,
		Hash_t *hash, Dyn_t *dyn_symtab)
{
	const char *vdso_symbols[VDSO_SYMBOL_MAX] = {
		ARCH_VDSO_SYMBOLS
	};
	const size_t vdso_symbol_length = sizeof(t->symbols[0].name);

	Hash_t nbucket, nchain;
	Hash_t *bucket, *chain;

	unsigned int i, j, k;
	uintptr_t addr;

	nbucket = hash[0];
	nchain = hash[1];
	bucket = &hash[2];
	chain = &hash[nbucket + 2];

	pr_debug("nbucket %lx nchain %lx bucket %lx chain %lx\n",
		 (long)nbucket, (long)nchain, (unsigned long)bucket, (unsigned long)chain);

	for (i = 0; i < VDSO_SYMBOL_MAX; i++) {
		const char * symbol = vdso_symbols[i];
		k = elf_hash((const unsigned char *)symbol);

		for (j = bucket[k % nbucket]; j < nchain && chain[j] != STN_UNDEF; j = chain[j]) {
			addr = mem + dyn_symtab->d_un.d_ptr - load->p_vaddr;
			Sym_t *sym;
			char *name;

			addr += sizeof(Sym_t)*j;
			if (__ptr_struct_oob(addr, sizeof(Sym_t), mem, size))
				continue;
			sym = (void *)addr;

			if (ELF_ST_TYPE(sym->st_info) != STT_FUNC &&
			    ELF_ST_BIND(sym->st_info) != STB_GLOBAL)
				continue;

			addr = dynsymbol_names + sym->st_name;
			if (__ptr_struct_oob(addr, vdso_symbol_length, mem, size))
				continue;
			name = (void *)addr;

			if (std_strncmp(name, symbol, vdso_symbol_length))
				continue;

			memcpy(t->symbols[i].name, name, vdso_symbol_length);
			t->symbols[i].offset = (unsigned long)sym->st_value - load->p_vaddr;
			break;
		}
	}
}
Example #2
0
File: cmnv.c Project: bgtwoigu/1110
/*===========================================================================

FUNCTION cmnv_read_wait

DESCRIPTION
  Read an item from the NV memory.

  Note that NV reads are done in a synchronous fashion; that is, this
  function only returns  after the NV read is done being serviced by the
  NV task.

DEPENDENCIES
  mc_task_start() must have already been called.

RETURN VALUE
  none

SIDE EFFECTS
  none

===========================================================================*/
void cmnv_read_wait(

    nv_items_enum_type  nv_item,
        /* NV item to read */

    nv_item_type        *data_ptr
        /* pointer to buffer to place data associated with the NV item */
)
{
  /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */

  CM_ASSERT(data_ptr != NULL); 

  /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */

  /* Prepare the NV read command
  */
  cmnv_cmd_sync.item       = nv_item;       /* Item to read */
  cmnv_cmd_sync.cmd        = NV_READ_F;     /* NV operation */
  cmnv_cmd_sync.data_ptr   = data_ptr;      /* Read into this buffer */
  cmnv_cmd_sync.tcb_ptr    = rex_self();    /* Notify CM task when done */
  cmnv_cmd_sync.sigs       = CM_NV_SYNC_SIG;/* Signal with this sig when done */
  cmnv_cmd_sync.done_q_ptr = NULL;          /* Return cmd to NO Q when done */

  /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/

  /* Read from NV by:
  ** 1. Clearing the NV signal
  ** 2. Queuing a read command to the NV task
  ** 3. Waiting for NV task to finish servicing the read command.
  */
  (void) rex_clr_sigs( rex_self(), CM_NV_SYNC_SIG );

  cmnv_cmd_sync.tcb_ptr = rex_self();

  #ifdef FEATURE_NV_RPC_SUPPORT
  if (0 == std_strncmp ((cmnv_cmd_sync.tcb_ptr)->task_name,"ONCR", 4))
  {
    (void)nv_cmd_remote(cmnv_cmd_sync.cmd,
                        cmnv_cmd_sync.item,
                        cmnv_cmd_sync.data_ptr
                        );
  }
  else
  #endif
  {
    nv_cmd( &cmnv_cmd_sync );
  }

  cm_wait( CM_NV_SYNC_SIG );
  (void) rex_clr_sigs( rex_self(), CM_NV_SYNC_SIG );

  /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/

  /* If NV read failed, substitute a default value.
  */
  if( cmnv_cmd_sync.status != NV_DONE_S )
  {
    CM_MSG_HIGH( "NV read failed, item=%d, stat=%d",
             cmnv_cmd_sync.item, cmnv_cmd_sync.status, 0 );

    /*lint -save -e641 */
    switch( cmnv_cmd_sync.item )
    {
      case NV_PREF_MODE_I:

        /* If this target supports ACP, default the mode preference
        ** to automatic. Else, default mode preference to digital only.
        */
        #ifdef FEATURE_ACP
#error code not present
        #else
          data_ptr->pref_mode.mode = NV_MODE_DIGITAL_ONLY;
        #endif
        break;

      /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/

      case NV_SYSTEM_PREF_I:
        data_ptr->system_pref.sys = NV_SP_STANDARD;
        break;

      /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/

      case NV_BAND_PREF_I:
        data_ptr->band_pref.band = (nv_band_pref_enum_type)CM_BAND_PREF_ANY;
        break;

      /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/

      case NV_BAND_PREF_16_31_I:
        data_ptr->band_pref.band = (nv_band_pref_enum_type)(CM_BAND_PREF_ANY >> 16) ;
                                               //(NV_BAND_PREF_ANY & 0xFFFF);
        break;

      /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/

      case NV_BAND_PREF_32_63_I:
        data_ptr->band_pref_32_63.band = (uint32)(CM_BAND_PREF_ANY >> 32 );

        break;


      /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/

      case NV_ROAM_PREF_I:
        data_ptr->roam_pref.roam = NV_ROAM_PREF_ANY;
        break;

      #if (defined (FEATURE_HDR_HYBRID) || defined(FEATURE_HYBR_GW))
#error code not present
      #endif /* FEATURE_HDR_HYBRID */

      /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/

      case NV_CURR_NAM_I:
        data_ptr->curr_nam = (int)CM_NAM_1;
        break;

      /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/

      case NV_FTM_MODE_I:
        #if defined( FEATURE_CDMA_800 ) || defined( FEATURE_CDMA_1900 )
        data_ptr->ftm_mode = DMSS_MODE;
        #else
        data_ptr->ftm_mode = AMSS_MODE;
        #endif /* defined( FEATURE_CDMA_800 ) || defined( FEATURE_CDMA_1900 ) */
        break;

      /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/

       case NV_AUTO_NAM_I:
         data_ptr->auto_nam = FALSE;
         break;

      /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/

      case NV_SRDA_ENABLED_I:
        data_ptr->srda_enabled = FALSE;
        break;

      /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/

      case NV_SEC_CODE_I:
        (void) memset( (byte*) data_ptr->sec_code.digits,
                       '0',
                       sizeof(data_ptr->sec_code.digits) );
        return;

      /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
      case NV_ACQ_ORDER_PREF_I:
      #ifdef FEATURE_WCDMA
#error code not present
      #else
        data_ptr->acq_order_pref.acq_order = CM_GW_ACQ_ORDER_PREF_GSM_WCDMA;
      #endif
        break;

     /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/

      case NV_NET_SEL_MODE_PREF_I:
        data_ptr->net_sel_mode_pref.net_sel_mode = CM_NETWORK_SEL_MODE_PREF_AUTOMATIC;
        break;

     /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/

      case NV_SERVICE_DOMAIN_PREF_I:
        data_ptr->service_domain_pref.srv_domain = CM_SRV_DOMAIN_PREF_CS_ONLY;
        break;

     /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/

      #if (defined(FEATURE_UIM_RUIM) && defined(FEATURE_UIM_RUN_TIME_ENABLE))
      case NV_RTRE_CONFIG_I:
        data_ptr->rtre_config = NV_RTRE_CONFIG_NV_ONLY;
        break;
      #endif /* (defined(FEATURE_UIM_RUIM) && defined(FEATURE_UIM_RUN_TIME_ENABLE)) */

     /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/

      #if ( defined(FEATURE_DUAL_SLOTS) )
      case NV_UIM_CDMA_PREF_SLOT_I:
        data_ptr->uim_cdma_pref_slot = NV_UIM_SLOT_NONE;
        break;

      case NV_UIM_GSM_PREF_SLOT_I:
        data_ptr->uim_gsm_pref_slot = NV_UIM_SLOT_NONE;
        break;
      #endif /* ( defined(FEATURE_DUAL_SLOTS) ) */

     /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
      case NV_PS_DATA_ORIG_PREF_I:
        data_ptr->ps_data_orig_pref = NV_PS_DATA_ORIG_PREF_ANY;
        break;

     /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/

     case NV_GSM_AMR_CALL_CONFIG_I:
        data_ptr->gsm_amr_call_config = FALSE;
        break;

     /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/

      case NV_PRL_PREF_I:
        data_ptr->prl_pref.prl = CM_PRL_PREF_ANY;
        break;

      /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/

      case NV_WLAN_TECH_PREF_I:
        data_ptr->wlan_tech_pref.tech_pref = CM_WLAN_TECH_PREF_ANY;
        break;

      /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/

      case NV_WLAN_BSS_TYPE_PREF_I:
        data_ptr->wlan_bss_type_pref.bss_type_pref = CM_WLAN_BSS_TYPE_PREF_ANY;
        break;

      /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/

      case NV_WLAN_SCAN_PREF_I:
        data_ptr->wlan_scan_pref.scan_mode = CM_WLAN_SCAN_PREF_AUTO;
      break;

      /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/

      case NV_WLAN_NET_SEL_MODE_PREF_I:
        data_ptr->wlan_net_sel_mode_pref.net_sel_mode =
                                  CM_NETWORK_SEL_MODE_PREF_AUTOMATIC;
      break;

      /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/

      case NV_ACCOLC_I:

        (void) memset( (byte*)  data_ptr->accolc.ACCOLCpClass,
                       0,
                       sizeof( data_ptr->accolc.ACCOLCpClass) );
        return;

      /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/

      #ifdef FEATURE_DDTM_CNTL
      case NV_DDTM_SETTINGS_I:

        /* Return error, the calling function should write the
        ** correct values to NV
        */
        data_ptr->ddtm_settings.num_srv_opt = CM_INVALID_DDTM_NUM_SRV_OPT;
        return;
      #endif


      /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/     

      case NV_GPRS_ANITE_GCF_I:
        data_ptr->gprs_anite_gcf = FALSE;
        break;

      /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/    

      case NV_UMTS_CALL_VT_CODEC_LIST_I:
        data_ptr->umts_call_vt_codec_list = FALSE;
        break;

      /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/

      case NV_MOB_CAI_REV_I:
        #if defined( FEATURE_CDMA_800 ) || defined( FEATURE_CDMA_1900 )
        /* P_REV_IS2000 (6) is the default suggested by CP
        */
        data_ptr->mob_cai_rev = P_REV_IS2000;
        #else
        data_ptr->mob_cai_rev = 0;
        #endif
        break;

      case NV_ENS_ENABLED_I:
        #if defined(FEATURE_GSM) || defined(FEATURE_WCDMA)
#error code not present
        #endif
        break;
      /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/

      case NV_HOME_MCC_I:
        data_ptr->home_mcc = CM_INVALID_MOBILE_COUNTRY_CODE;
        break;

      /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/

      case NV_USR_SID_TO_MCC_ASSOC_TBL_I:
        data_ptr->usr_sid_to_mcc_assoc_tbl.tbl_len = 0;
        break;

      /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/

      case NV_HS_BASED_PLUS_DIAL_SETTING_I:
        data_ptr->hs_based_plus_dial_setting = CM_HS_BASED_PLUS_DIAL_DISABLED;
        break;

      /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/

      case NV_IMSI_MCC_I:
        data_ptr->imsi_mcc.imsi_mcc = CM_INVALID_MOBILE_COUNTRY_CODE;
        break;

      /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/

      case NV_DISABLE_CM_CALL_TYPE_I:
        data_ptr->disable_cm_call_type = CM_CALL_TYPE_NONE_MASK;
        break;

     /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/

      default:
        CM_SWITCH_ERR( "Unexpected NV item=%d",cmnv_cmd_sync.item,0,0 );
        break;

    } /* switch */
    /*lint -restore */

  } /* if */