FreeCalypso > hg > fc-tourmaline
view src/g23m-aci/aci/cmh_sim.h @ 220:0ed36de51973
ABB semaphore protection overhaul
The ABB semaphone protection logic that came with TCS211 from TI
was broken in several ways:
* Some semaphore-protected functions were called from Application_Initialize()
context. NU_Obtain_Semaphore() called with NU_SUSPEND fails with
NU_INVALID_SUSPEND in this context, but the return value wasn't checked,
and NU_Release_Semaphore() would be called unconditionally at the end.
The latter call would increment the semaphore count past 1, making the
semaphore no longer binary and thus no longer effective for resource
protection. The fix is to check the return value from NU_Obtain_Semaphore()
and skip the NU_Release_Semaphore() call if the semaphore wasn't properly
obtained.
* Some SPI hardware manipulation was being done before entering the semaphore-
protected critical section. The fix is to reorder the code: first obtain
the semaphore, then do everything else.
* In the corner case of L1/DSP recovery, l1_abb_power_on() would call some
non-semaphore-protected ABB & SPI init functions. The fix is to skip those
calls in the case of recovery.
* A few additional corner cases existed, all of which are fixed by making
ABB semaphore protection 100% consistent for all ABB functions and code paths.
There is still one remaining problem of priority inversion: suppose a low-
priority task calls an ABB function, and some medium-priority task just happens
to preempt right in the middle of that semaphore-protected ABB operation. Then
the high-priority SPI task is locked out for a non-deterministic time until
that medium-priority task finishes its work and goes back to sleep. This
priority inversion problem remains outstanding for now.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Mon, 26 Apr 2021 20:55:25 +0000 |
parents | fa8dc04885d8 |
children |
line wrap: on
line source
/* +----------------------------------------------------------------------------- | Project : GSM-PS (6147) | Modul : CMH +----------------------------------------------------------------------------- | Copyright 2002 Texas Instruments Berlin, AG | All rights reserved. | | This file is confidential and a trade secret of Texas | Instruments Berlin, AG | The receipt of or possession of this file does not convey | any rights to reproduce or disclose its contents or to | manufacture, use, or sell anything it may describe, in | whole, or in part, without the specific written consent of | Texas Instruments Berlin, AG. +----------------------------------------------------------------------------- | Purpose : Definitions for the command handler of the | Subscriber Identity Module ( SIM ) +----------------------------------------------------------------------------- */ #ifndef CMH_SIM_H #define CMH_SIM_H /*==== CONSTANTS ==================================================*/ #define ACI_SIZE_EF_CCP 14 #define ACI_MIN_SIZE_EF_MSISDN 14 #define ACI_MIN_SIZE_EF_PLMN_SEL 24 #define ACI_LEN_PLMN_SEL_NTRY 3 /* length of an entry in bytes */ #define ACI_LEN_PLMN_SEL_FLD MAX_PREF_PLMN /* Moved to SAP SIM to be consistent with MM */ #define ACI_LEN_LAN_NTRY 2 /* length of an entry in bytes */ #define ACI_MAX_LAN_NTRY 10 /* number of supported entries */ #define ACI_MIN_SIZE_EF_LAN 16 #define ACI_LEN_LAN_FLD (ACI_LEN_LAN_NTRY*ACI_MAX_LAN_NTRY) #define ACI_LEN_LAN_LP_NTRY 1 /* length of an entry in bytes */ #define ACI_MAX_LAN_LP_NTRY 5 /* number of supported entries */ #define ACI_LEN_LAN_LP_FLD (ACI_LEN_LAN_LP_NTRY*ACI_MAX_LAN_LP_NTRY) #define SIM_ALS_LOCK (SIM_FDN_DISABLE+1) /* To distinguish between the different operations */ #define SIM_ALS_UNLOCK (SIM_FDN_DISABLE+2) /* which require a CHV2 authentication */ #ifdef FF_CPHS_REL4 #define ACI_SIZE_EF_CFIS 16 #define ACI_SIZE_EF_MBDN 34 #define ACI_SIZE_EF_MBI 4 #define ACI_SIZE_EF_MWIS 5 #endif /* FF_CPHS_REL4 */ typedef enum { EF_STAT_UNKNWN = 0, /* status of EF unknown */ EF_STAT_READ, /* EF already read */ EF_STAT_NOT_AVAIL /* EF is not available */ } EF_STAT; typedef enum { CPOL_ACT_None = 0, /* no action */ CPOL_ACT_Write, /* write entry */ CPOL_ACT_Delete, /* delete entry */ CPOL_ACT_Read, /* read entry */ CPOL_ACT_Test /* test number of entries */ } ACI_CPOL_ACT; typedef enum { CLAN_ACT_None = 0, /* no action */ CLAN_ACT_Write, /* write entry */ CLAN_ACT_Read /* read entry */ } ACI_CLAN_ACT; /*==== TYPES ======================================================*/ /*==== PROTOTYPES =================================================*/ EXTERN void cmhSIM_SIMActivated ( void ); EXTERN void cmhSIM_PINVerified ( void ); EXTERN void cmhSIM_SIMSync ( void ); EXTERN void cmhSIM_SIMInserted ( void ); EXTERN void cmhSIM_SIMRemoved ( void ); #ifdef FF_DUAL_SIM EXTERN void cmhSIM_SIMSelected ( void ); #endif /*FF_DUAL_SIM*/ EXTERN void cmhSIM_FillInPIN ( CHAR* PINStr, CHAR* PINFld, UBYTE len ); EXTERN void cmhSIM_GetHomePLMN ( SHORT* mccBuf, SHORT* mncBuf ); GLOBAL BOOL cmhSIM_plmn_equal_sim ( SHORT bcch_mcc, SHORT bcch_mnc, SHORT sim_mcc, SHORT sim_mnc); EXTERN BOOL cmhSIM_plmn_is_hplmn ( SHORT bcch_mcc, SHORT bcch_mnc); EXTERN T_ACI_RETURN cmhSIM_ReqMsisdn ( T_ACI_CMD_SRC srcId, UBYTE record ); EXTERN void cmhSIM_CnfMsisdn ( SHORT table_id ); EXTERN T_ACI_RETURN cmhSIM_ReqCcp ( T_ACI_CMD_SRC srcId, UBYTE record ); EXTERN void cmhSIM_CnfCcp ( SHORT table_id ); EXTERN void cmhSIM_RdCnfPlmnSel ( SHORT table_id ); EXTERN void cmhSIM_WrCnfPlmnSel ( SHORT table_id ); EXTERN T_ACI_CME_ERR cmhSIM_GetCmeFromSim ( USHORT errCode ); EXTERN SHORT cmhSIM_FillPlmnSelList ( UBYTE index, T_ACI_CPOL_FRMT frmt, T_ACI_CPOL_OPDESC* operLst, UBYTE length, UBYTE* pData ); EXTERN T_ACI_RETURN getSupLangFromPCM ( T_ACI_LAN_SUP *lanlst, SHORT *lastIdx ); EXTERN BOOL checkSuppLang (T_ACI_LAN_SUP *lanlst, SHORT lastIdx, T_ACI_LAN_SUP *clng); EXTERN BOOL checkSuppLangInLP ( T_ACI_LAN_SUP *lanlst, SHORT lastIdx, T_ACI_LAN_SUP *clng); EXTERN SHORT cmhSIM_UsdPlmnSelNtry ( UBYTE length, UBYTE* pData ); EXTERN void cmhSIM_CmpctPlmnSel ( UBYTE length, UBYTE* pData ); EXTERN T_ACI_BS_SPEED cmhSIM_GetUserRate ( UBYTE userRate ); EXTERN T_ACI_CNUM_ITC cmhSIM_GetItc ( UBYTE itc ); EXTERN T_ACI_CNUM_SERV cmhSIM_GetSrvFromSync ( UBYTE sync ); EXTERN T_ACI_CNUM_SERV cmhSIM_GetSrvFromItc ( UBYTE itc ); EXTERN void cmhSIM_getMncMccFrmPLMNsel( const UBYTE* ntry, SHORT* mcc, SHORT* mnc ); EXTERN BOOL cmhSIM_GetCodedPLMN ( const CHAR *oper, T_ACI_CPOL_FRMT format, UBYTE *sim_plmn ); EXTERN T_ACI_RETURN cmhSIM_DelPlmnSel ( T_ACI_CMD_SRC srcId, SHORT index, T_ACI_CPOL_MOD mode ); EXTERN T_ACI_RETURN cmhSIM_FndEmptyPlmnSel ( T_ACI_CMD_SRC srcId, UBYTE *plmn ); EXTERN T_ACI_RETURN cmhSIM_UpdPlmnSel ( T_ACI_CMD_SRC srcId, SHORT index, UBYTE *plmn, T_ACI_CPOL_MOD mode ); EXTERN T_ACI_RETURN cmhSIM_ChgPlmnSel ( T_ACI_CMD_SRC srcId, SHORT index, SHORT index2 ); EXTERN void cmhSIM_SIMResponseData ( T_SIM_TRNS_RSP_PRM* rsp ); EXTERN void cmhSIM_RdCnfLangELP ( SHORT table_id ); EXTERN void cmhSIM_RdCnfLangPrfELP (SHORT table_id); EXTERN void cmhSIM_RdCnfLangLP ( SHORT table_id ); EXTERN void cmhSIM_RdCnfLangPrfLP (SHORT table_id); EXTERN BOOL cmhSIM_AD_Update ( int, T_SIM_FILE_UPDATE_IND *); EXTERN BOOL cmhSIM_CSP_Update ( int, T_SIM_FILE_UPDATE_IND *); EXTERN BOOL cmhSIM_ONS_Update ( int, T_SIM_FILE_UPDATE_IND *); EXTERN void cmhSIM_Read_AD_cb(SHORT table_id); EXTERN void cmhSIM_Read_AD_cb(SHORT table_id); EXTERN T_opl_field* cmhSIM_GetOPL(); EXTERN void cmhSIM_GetSrvTab( UBYTE* ptrSrvTab ); EXTERN void cmhSIM_Get_CSP_cb(SHORT table_id); EXTERN void cmhSIM_Read_CSP_cb(SHORT table_id); #ifdef FF_CPHS_REL4 EXTERN void cmhSIM_RdCnfCfis( SHORT table_id ); EXTERN void cmhSIM_WrCnfCfis( SHORT table_id ); EXTERN T_ACI_RETURN cmhSIM_WrCfis (T_ACI_CMD_SRC srcId, T_ACI_CFIS_MOD mode, UBYTE index, UBYTE mspId,UBYTE cfuStat,CHAR *number, T_ACI_TOA *type,UBYTE cc2_id); EXTERN void cmhSIM_RdCnfMwis( SHORT table_id ); EXTERN void cmhSIM_WrCnfMwis( SHORT table_id ); EXTERN T_ACI_RETURN cmhSIM_WrMwis (T_ACI_CMD_SRC srcId, T_ACI_MWIS_MOD mode, UBYTE mspId, T_ACI_MWIS_MWI *mwis); EXTERN T_ACI_RETURN cmhSIM_WrMbdn (T_ACI_CMD_SRC srcId, T_ACI_MBN_MODE mode, UBYTE index, CHAR* number, T_ACI_TOA* type, UBYTE cc2_id, T_ACI_PB_TEXT *text); EXTERN void cmhSIM_WrCnfMbdn ( SHORT table_id ); EXTERN void cmhSIM_RdCnfMbi ( SHORT table_id ); EXTERN void cmhSIM_RdCnfMbdn ( SHORT table_id ); #endif /* FF_CPHS_REL4 */ #ifdef SIM_PERS_OTA EXTERN BOOL cmhSIM_Register_Read_DCK ( int, T_SIM_FILE_UPDATE_IND *); EXTERN void cmhSIM_Read_DCK_cb(SHORT table_id); EXTERN void cmhSIM_Read_DCK_init_cb(SHORT table_id); #endif #ifdef SIM_PERS EXTERN void cmhSIM_UnlockTimeout(void); #endif /* EONS */ EXTERN void cmhSIM_OpReadOplRcdCb(SHORT table_id); EXTERN void cmhSIM_OpReadPnnRcdCb(SHORT table_id); EXTERN BOOL cmhSIM_OpUpdate(int ref, T_SIM_FILE_UPDATE_IND* fu); EXTERN void cmhSIM_InitOperatorName(); EXTERN BOOL cmhSIM_StartOperatorName(); EXTERN BOOL cmhSIM_UpdateOperatorName(USHORT reqDataFld); EXTERN void cmhSIM_AD_Updated(UBYTE ad_len, UBYTE* ad_data); #ifdef DTI EXTERN BOOL SIM_ENT_CSDconnect_dti_cb(UBYTE dti_id, T_DTI_CONN_STATE result_type); #endif #if defined (GPRS) AND defined (DTI) EXTERN BOOL SIM_SNDCP_connect_dti_cb(UBYTE dti_id, T_DTI_CONN_STATE result_type); EXTERN BOOL SIM_ENT_GPRSconnect_dti_cb(UBYTE dti_id, T_DTI_CONN_STATE result_type); #endif EXTERN T_ACI_RETURN cmhSIM_Req_or_Write_PlmnSel ( T_ACI_CMD_SRC srcId, T_SIM_ACTP accType ); EXTERN void cmhSIM_CardUnblocked_PINChanged ( BOOL PINChanged ); EXTERN void cmhSIM_PINEnabledDisabled ( void ); EXTERN BOOL cmhSIM_ReqLanguagePrf_LP_or_ELP ( USHORT reqDataFld, UBYTE recMax, UBYTE *exchData, void (*rplyCB)(SHORT) ); EXTERN T_ACI_RETURN cmhSIM_ReqLanguage_LP_or_ELP ( T_ACI_CMD_SRC srcId, USHORT reqDataFld ); /*==== EXPORT =====================================================*/ #ifdef CMH_SIMF_C GLOBAL T_ENT_STAT simEntStat; GLOBAL T_ACI_CFUN_FUN CFUNfun = CFUN_FUN_Minimum; GLOBAL UBYTE CNUMMaxRec = 0; GLOBAL T_ACI_CNUM_LST CNUMMsisdn; GLOBAL UBYTE CNUMMsisdnIdx = 0; GLOBAL UBYTE CNUMLenEfMsisdn = 0; GLOBAL UBYTE EfPLMNselStat = EF_STAT_UNKNWN; GLOBAL UBYTE CPOLSimEfDataLen; GLOBAL UBYTE CPOLSimEfData[ACI_LEN_PLMN_SEL_FLD]; GLOBAL UBYTE CLANimEfDataLen; GLOBAL UBYTE CLANSimEfData[ACI_LEN_LAN_FLD]; GLOBAL UBYTE CLANSimEfDataLP[ACI_LEN_LAN_LP_FLD]; #ifdef FF_CPHS_REL4 GLOBAL UBYTE CFISIndex = 0; GLOBAL UBYTE MWISIndex = 0; GLOBAL UBYTE MBI_Index = 0; #endif #else EXTERN T_ENT_STAT simEntStat; EXTERN T_ACI_CFUN_FUN CFUNfun; EXTERN UBYTE CNUMMaxRec; EXTERN T_ACI_CNUM_LST CNUMMsisdn; EXTERN UBYTE CNUMMsisdnIdx; EXTERN UBYTE CNUMLenEfMsisdn; EXTERN UBYTE EfPLMNselStat; EXTERN UBYTE CPOLSimEfDataLen; EXTERN UBYTE CPOLSimEfData[]; EXTERN UBYTE CLANimEfDataLen; EXTERN UBYTE CLANSimEfData[]; EXTERN UBYTE CLANSimEfDataLP[]; #ifdef FF_CPHS_REL4 EXTERN UBYTE CFISIndex ; EXTERN UBYTE MWISIndex; EXTERN UBYTE MBI_Index; #endif #endif /* CMH_SIMF_C */ #endif /* CMH_SIM_H */ /*==== EOF =======================================================*/