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; } } }
/*=========================================================================== 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 */