FreeCalypso > hg > fc-tourmaline
view src/gpf/inc/p_mem.h @ 268:f2e52cab0a73
abb_inth.c: check all interrupt causes, not just one
The original code used if - else if - else if etc constructs, thus
the first detected interrupt was the only one handled. However,
Iota ITSTATREG is a clear-on-read register, thus if we only handle
the first detected interrupt and skip checking the others, then the
other interrupts will be lost, if more than one interrupt happened
to occur in one ABB interrupt handling cycle - a form of rare race
condition. Change the code to check all interrupts that were read
in this cycle.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 13 Jun 2021 18:17:53 +0000 |
parents | 4e78acac3d88 |
children |
line wrap: on
line source
/* +------------------------------------------------------------------------------ | File: mem.h +------------------------------------------------------------------------------ | Copyright Condat AG 1999-2000, Berlin | All rights reserved. | | This file is confidential and a trade secret of Condat 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 | Condat AG. +------------------------------------------------------------------------------ | Purpose: Definitions for the entity MEM. | $Identity:$ +------------------------------------------------------------------------------ */ #ifndef MEM_H #define MEM_H /*==== INCLUDES ==============================================================*/ #include "typedefs.h" #include "vsi.h" #include "pei.h" #include "tools.h" /*==== GENERATED CONTENT ======================================================*/ /* +--------------------------------------------------------------------------+ | PROJECT : PROTOCOL STACK | | FILE : p_8010_112_mem_sap.val | | SOURCE : "s:\g23m\condat\ms\DFILE\PRIM\8010_112_mem_sap.pdf" | | LastModified : "12 February, 2003 by Gert Z. Srensen (GSO)" | | IdAndVersion : "8010.112.02.002" | | SrcFileTime : "Wed Nov 26 14:28:02 2003" | | Generated by CCDGEN_2.4.11 on Tue Sep 21 10:40:12 2004 | | !!DO NOT MODIFY!!DO NOT MODIFY!!DO NOT MODIFY!! | +--------------------------------------------------------------------------+ */ /* PRAGMAS * PREFIX : MEM * COMPATIBILITY_DEFINES : NO * ALWAYS_ENUM_IN_VAL_FILE: YES * ENABLE_GROUP: NO * CAPITALIZE_TYPENAME: NO */ #ifndef P_8010_112_MEM_SAP_VAL #define P_8010_112_MEM_SAP_VAL #define CDG_ENTER__P_8010_112_MEM_SAP_VAL #define CDG_ENTER__FILENAME _P_8010_112_MEM_SAP_VAL #define CDG_ENTER__P_8010_112_MEM_SAP_VAL__FILE_TYPE CDGINC #define CDG_ENTER__P_8010_112_MEM_SAP_VAL__LAST_MODIFIED _12_February_2003_by_Gert_Z_Srensen_GSO #define CDG_ENTER__P_8010_112_MEM_SAP_VAL__ID_AND_VERSION _8010_112_02_002 #define CDG_ENTER__P_8010_112_MEM_SAP_VAL__SRC_FILE_TIME _Wed_Nov_26_14_28_02_2003 #include "CDG_ENTER.h" #undef CDG_ENTER__P_8010_112_MEM_SAP_VAL #undef CDG_ENTER__FILENAME /* * user defined constants */ #define MEM_MAX_NUMBER_OF_BUFFERS (0x40) #define MEM_MAX_NUMBER_OF_USERS (0x40) #define MEM_UNORDERED_BUFFER (0x0) #define MEM_FIFO_BUFFER (0x1) #define MEM_MAX_RAB_ID (0x10) #define MEM_MAX_MEMORY_POOL_SIZE (0xffffff) #define MEM_INVALID_USER_HANDLE (0x0) #define MEM_INVALID_BUFFER_HANDLE (0x0) #define MEM_RLC_UL_AM_MODE (0x0) #define MEM_RLC_UL_UM_MODE (0x1) #define MEM_RLC_UL_TM_MODE (0x2) #define MEM_INVALID_MEMORY_HANDLE (0x0) #include "CDG_LEAVE.h" #endif /* +--------------------------------------------------------------------------+ | PROJECT : PROTOCOL STACK | | FILE : p_8010_112_mem_sap.h | | SOURCE : "s:\g23m\condat\ms\DFILE\PRIM\8010_112_mem_sap.pdf" | | LastModified : "12 February, 2003 by Gert Z. Srensen (GSO)" | | IdAndVersion : "8010.112.02.002" | | SrcFileTime : "Wed Nov 26 14:28:02 2003" | | Generated by CCDGEN_2.4.11 on Tue Sep 21 10:40:12 2004 | | !!DO NOT MODIFY!!DO NOT MODIFY!!DO NOT MODIFY!! | +--------------------------------------------------------------------------+ */ /* PRAGMAS * PREFIX : MEM * COMPATIBILITY_DEFINES : NO * ALWAYS_ENUM_IN_VAL_FILE: YES * ENABLE_GROUP: NO * CAPITALIZE_TYPENAME: NO */ #ifndef P_8010_112_MEM_SAP_H #define P_8010_112_MEM_SAP_H #define CDG_ENTER__P_8010_112_MEM_SAP_H #define CDG_ENTER__FILENAME _P_8010_112_MEM_SAP_H #define CDG_ENTER__P_8010_112_MEM_SAP_H__FILE_TYPE CDGINC #define CDG_ENTER__P_8010_112_MEM_SAP_H__LAST_MODIFIED _12_February_2003_by_Gert_Z_Srensen_GSO #define CDG_ENTER__P_8010_112_MEM_SAP_H__ID_AND_VERSION _8010_112_02_002 #define CDG_ENTER__P_8010_112_MEM_SAP_H__SRC_FILE_TIME _Wed_Nov_26_14_28_02_2003 #include "CDG_ENTER.h" #undef CDG_ENTER__P_8010_112_MEM_SAP_H #undef CDG_ENTER__FILENAME #ifndef __T_MEM_no_parms__ #define __T_MEM_no_parms__ /* * No parameters. * CCDGEN:WriteStruct_Count==14836 */ typedef struct { U8 none; /*< 0: 1> No parameters */ U8 zzz_align0; /*< 1: 1> alignment */ U8 zzz_align1; /*< 2: 1> alignment */ U8 zzz_align2; /*< 3: 1> alignment */ } T_MEM_no_parms; #endif #ifndef __T_MEM_uplink_buffer_users_info__ #define __T_MEM_uplink_buffer_users_info__ /* * No parameters. * CCDGEN:WriteStruct_Count==14839 */ typedef struct { U8 rab_id; /*< 0: 1> Radio access identifier */ U8 rlc_mode; /*< 1: 1> RLC Mode */ U8 zzz_align0; /*< 2: 1> alignment */ U8 zzz_align1; /*< 3: 1> alignment */ U32 bits_per_tti; /*< 4: 4> Bits per TTI */ U16 rlc_tx_window_size; /*< 8: 2> RLC window size */ U8 zzz_align2; /*< 10: 1> alignment */ U8 zzz_align3; /*< 11: 1> alignment */ } T_MEM_uplink_buffer_users_info; #endif /* * End of substructure section, begin of primitive definition section */ #ifndef __T_MEM_READY_IND__ #define __T_MEM_READY_IND__ /* * * CCDGEN:WriteStruct_Count==14842 */ typedef struct { U8 user_handle; /*< 0: 1> User Handle */ U8 user_parameter; /*< 1: 1> User parameter */ U8 zzz_align0; /*< 2: 1> alignment */ U8 zzz_align1; /*< 3: 1> alignment */ } T_MEM_READY_IND; #endif #ifndef __T_MEM_BUFFER__ #define __T_MEM_BUFFER__ /* * * CCDGEN:WriteStruct_Count==14845 */ typedef struct { U32 memory_pool_size; /*< 0: 4> Memory pool size */ U32 allocated; /*< 4: 4> Parameter */ U8 ordering; /*< 8: 1> Ordering */ U8 delete_pending; /*< 9: 1> Parameter */ U8 zzz_align0; /*< 10: 1> alignment */ U8 zzz_align1; /*< 11: 1> alignment */ U32 max_allocated; /*< 12: 4> Parameter */ U32 fifo_read_index; /*< 16: 4> Parameter */ U32 fifo_write_index; /*< 20: 4> Parameter */ } T_MEM_BUFFER; #endif #include "CDG_LEAVE.h" #endif /*==== CONSTS ================================================================*/ #define MEM_READY_IND (0x8000408b) #define MEM_BUFFER (0x8001408b) #ifdef ENTITY_MEM #define VSI_CALLER mem_handle, #define VSI_CALLER_SINGLE mem_handle #endif #define MEM_STATISTICS #define MAX_UPLINK_USERS 11 /* Maximum number of uplink buffer users. Corresponds */ /* maxim number of available rab identifiers */ #define MAX_RAB_ID 16 /* Maximum RAB identifier. Used in array declarations. 15+1 */ #define RAB_TRANSMIT_BUFFER_SIZE_BYTES 500000 /* Uplink buffer size */ #define MAX_SDU_SIZE 1520 /*==== TYPES =================================================================*/ typedef struct { T_HANDLE comm_handle; /* Communication handle to user */ U8 user_parameter; /* User defined parameter */ U8 buffer_id; /* Id of buffer used by this user */ U32 low; /* Flow control low */ U32 high; /* Flow control high */ U32 max; /* Flow control max */ U32 allocated; /* Allocated number of octets */ #ifdef MEM_STATISTICS U32 max_allocated; /* Max number of octets allocated by user */ #endif /* STATISTICS */ U16 space_before; /* Extra space to allocate before user data */ U8 space_after; /* Extra space to allocate after user data */ U8 ready; /* TRUE if ready to receive data from this user */ U8 delete_pending; /* TRUE if user is to be deleted when all freed */ } T_MEM_USER; typedef struct { U8* (*get_user_data) (U32 memory_handle, U16 *ptr_length); U8 (*create_user) (U8 buffer_handle, U8 user_parameter, char *task_name); U8 (*create_buffer) (U8 ordering, U32 memory_pool_size); U8* (*alloc) (U8 user_handle, U16 length, U32 *ptr_handle); void (*dealloc) (U32 memory_handle); void (*delete_user) (U8 user_handle); void (*delete_buffer) (U8 buffer_handle); } T_MEM_PROPERTIES; /*==== EXPORTS ===============================================================*/ #ifdef MEM_PEI_C /* Task handle for MEM */ T_HANDLE mem_handle; /* Semaphore used to guarantee exclusive access at critical points */ T_HANDLE mem_semaphore_handle; /*T_MEM_BUFFER *mem_buffer[MEM_MAX_NUMBER_OF_BUFFERS];*/ T_MEM_USER *mem_user[MEM_MAX_NUMBER_OF_USERS]; #else /* MEM_PEI_C */ extern T_HANDLE mem_handle; extern T_HANDLE mem_semaphore_handle; extern T_MEM_BUFFER *mem_buffer[MEM_MAX_NUMBER_OF_BUFFERS]; extern T_MEM_USER *mem_user[MEM_MAX_NUMBER_OF_USERS]; #endif /* MEM_PEI_C */ extern U8 mem_create_buffer(U8 ordering, U32 memory_pool_size); extern void mem_delete_buffer(U8 buffer_handle); extern U8 mem_create_user(U8 buffer_handle, U8 user_parameter, char *task_name); extern void mem_init(void); extern void mem_delete_user(U8 user_handle); extern U8 mem_create_uplink_user(char* task_name, U8 mem_rab_id); extern void mem_delete_uplink_user(U8 user_handle); extern void mem_adjust_uplink_users_flow_control(T_MEM_uplink_buffer_users_info *users_info[MEM_MAX_RAB_ID]); extern void mem_configure_flow_control(U8 user_handle, U32 low, U32 high, U32 max); extern void mem_configure_extra_space(U8 user_handle, U16 space_before, U8 space_after); extern BOOL mem_ready(U8 user_handle); extern U8 *mem_alloc(U8 user_handle, U16 length, U32 *ptr_handle); extern void mem_dealloc(U32 memory_handle); extern void mem_realloc(U32 memory_handle, U16 length); extern U8 *mem_get_user_data(U32 memory_handle, U16 *ptr_length); extern U16 mem_get_space_before(U32 memory_handle); extern U8 mem_get_space_after(U32 memory_handle); extern U8 *mem_decrease_space_before(U32 memory_handle, U16 delta_space_before, U16 *ptr_length); extern void mem_increase_space_before(U32 memory_handle, U16 delta_space_before); extern void mem_decrease_space_after(U32 memory_handle, U8 delta_space_after); extern void mem_increase_space_after(U32 memory_handle, U8 delta_space_after); extern void mem_send_ready_ind(T_HANDLE com_handle, U8 user_handle, U8 user_paramaeter); #endif /* MEM_H */