FreeCalypso > hg > fc-magnetite
view src/cs/system/main/mem_load.c @ 575:0198ac1e1a4f
cfile_symlink for GPF: a more robust approach
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Thu, 24 Jan 2019 23:43:00 +0000 |
parents | 838eeafb0051 |
children |
line wrap: on
line source
/************* Revision Controle System Header ************* * GSM Layer 1 software * MEM_LOAD.C * * Filename mem_load.c * Version 1.6 * Date 06/20/01 * ************* Revision Controle System Header *************/ #ifndef _WINDOWS #include "chipset.cfg" #include "board.cfg" #include "swconfig.cfg" #endif #include "l1sw.cfg" /* OP_L1_STANDALONE definition */ #if ((((CHIPSET == 3) || (CHIPSET == 4) || (CHIPSET == 5) || (CHIPSET == 6) || (CHIPSET == 7) || \ (CHIPSET == 8) || (CHIPSET == 9) || (CHIPSET == 10) || (CHIPSET == 11)) && (LONG_JUMP != 0)) || \ (CHIPSET == 12) ||(CHIPSET == 15)) /* * USE_GZIP flag is used by modem binaries compression feature on P2. * For P2 build variants it is defined globally - either in master.cfg (HBB) * or P2's configdef *.xml files (UBB). * The following definition is for all other platforms - just to * suppress compilation warnings. */ #ifndef USE_GZIP #define USE_GZIP 0 #endif #if (OP_L1_STANDALONE == 1) #define D_LOAD_START _470_INT_MEM_out_call_load_start #define D_RUN_START _470_INT_MEM_out_call_run_start #define D_RUN_END _470_INT_MEM_out_call_run_end #else #define D_LOAD_START _470_S_MEM_out_call_load_start #define D_RUN_START _470_S_MEM_out_call_run_start #define D_RUN_END _470_S_MEM_out_call_run_end #endif typedef unsigned char UWORD8; typedef unsigned short int UWORD16; typedef unsigned long int UWORD32; UWORD16 d_checksum1; UWORD16 d_checksum2; /* NEW COMPILER MANAGEMENT * INT_memset and INT_memcpy, respectively identical to memset and * memcpy from the rts library of compiler V2.51, are defined in int.s. * They are used to make the initialization of the .bss section and the load * of the internal ram code not dependent to the 32-bit alignment. * The old code used for the initialization and the load used a loop with * 4-byte increment, assuming the 32-bit alignment of the .bss section. * This alignment is not true with compiler V2.51. * This change applies whatever the compiler version. * INT_memset replaces f_zero * INT_memcpy replaces f_download */ extern void INT_memset(void *s, int c, UWORD32 n); extern void INT_memcpy(void *s1, void *s2, UWORD32 n); #if (OP_L1_STANDALONE == 0) && (BOARD == 35) && (USE_GZIP == 1) extern void decompress(unsigned long input_start, unsigned long input_length, unsigned long output_start); #else UWORD16 f_checksum(UWORD8 *p_begin, UWORD32 d_length) { UWORD16 d_checksum = 0x0000; while(d_length > 0) { d_checksum += *(p_begin++); d_length --; } return(d_checksum); } #endif #if (CHIPSET == 12) || (CHIPSET == 15) /* * Load start address of the interrupt vector table from FLASH into Internal SRAM */ #define C_NUMBER_OF_INTERRUPT_VECTOR 7 #pragma DATA_SECTION(d_interrupt_load_start,".intload") const UWORD32 d_interrupt_load_start=0L; extern const UWORD32 IndirectVectorTable[C_NUMBER_OF_INTERRUPT_VECTOR * 2]; #define C_INTERRUPT_VECTOR_LOAD_START (UWORD32)((UWORD32)(&d_interrupt_load_start) + 4) #define C_INTERRUPT_VECTOR_RUN_START (UWORD32)((UWORD32)&IndirectVectorTable[0]) #define C_INTERRUPT_VECTOR_LENGTH (UWORD32)(C_NUMBER_OF_INTERRUPT_VECTOR * 2 * sizeof(UWORD32)) #endif /* (CHIPSET == 12) || (CHIPSET == 15)*/ #if ((LONG_JUMP == 3) || (((CHIPSET==15)||(CHIPSET == 12)) && (LONG_JUMP == 0))) /* * Load start address of the code downloaded from FLASH into Internal SRAM */ #pragma DATA_SECTION(d_application_load_start,".ldfl") const UWORD32 d_application_load_start=0L; #if ((OP_WCP == 0) || (OP_L1_STANDALONE == 1)) #if (TOOL_CHOICE == 0) /* NEW COMPILER MANAGEMENT * If use of VISUAL LINKER, needs to manage trampoline download. * Case of: * - TOOL_CHOICE == 0 => compiler v1.22e with vlinker v1.9902 */ #if !(((CHIPSET == 12) || (CHIPSET==15)) && (LONG_JUMP == 0)) extern UWORD8 D_LOAD_START; #endif /* (((CHIPSET == 12)||(CHIPSET==15)) && (LONG_JUMP == 0)) */ #endif /* (TOOL_CHOICE == 0) */ #endif /* (OP_WCP == 0) */ /* * Run start address of the code downloaded from FLASH into Internal SRAM */ #pragma DATA_SECTION(d_application_run_start,"S_P_Mem") const UWORD32 d_application_run_start = 0L; #if ((OP_WCP == 0) || (OP_L1_STANDALONE == 1)) #if (TOOL_CHOICE == 0) /* NEW COMPILER MANAGEMENT * If use of VISUAL LINKER, needs to manage trampoline download. * Case of: * - TOOL_CHOICE == 0 => compiler v1.22e with vlinker v1.9902 */ #if !(((CHIPSET == 12)||(CHIPSET==15)) && (LONG_JUMP == 0)) extern UWORD8 D_RUN_START; #endif /* (((CHIPSET == 12)||(CHIPSET==15)) && (LONG_JUMP == 0)) */ #endif /* (TOOL_CHOICE == 0) */ #endif /* (OP_WCP == 0) */ /* * Run end address of the code downloaded from FLASH into Internal SRAM */ #pragma DATA_SECTION(d_application_run_end,"E_P_Mem") const UWORD32 d_application_run_end = 0L; #if ((OP_WCP == 0) || (OP_L1_STANDALONE == 1)) #if (TOOL_CHOICE == 0) /* NEW COMPILER MANAGEMENT * If use of VISUAL LINKER, needs to manage trampoline download. * Case of: * - TOOL_CHOICE == 0 => compiler v1.22e with vlinker v1.9902 */ #if !(((CHIPSET == 12)||(CHIPSET==15)) && (LONG_JUMP == 0)) extern UWORD8 D_RUN_END; #endif /* (((CHIPSET == 12)||(CHIPSET==15)) && (LONG_JUMP == 0)) */ #endif /* (TOOL_CHOICE == 0) */ #endif /* (OP_WCP == 0) */ /* * Application download */ #define C_APPLICATION_LOAD_START (UWORD32)((UWORD32 *)(&d_application_load_start) + 2) #define C_APPLICATION_RUN_START (UWORD32)((UWORD32)(&d_application_run_start) + sizeof(UWORD32)) #define C_APPLICATION_RUN_END (UWORD32)((UWORD32)(&d_application_run_end) + sizeof(UWORD32)) #define C_APPLICATION_LENGTH (UWORD32)(C_APPLICATION_RUN_END - C_APPLICATION_RUN_START - sizeof(UWORD32)) #if ((OP_WCP == 0) || (OP_L1_STANDALONE == 1)) #if (TOOL_CHOICE == 0) /* NEW COMPILER MANAGEMENT * If use of VISUAL LINKER, needs to manage trampoline download. * Case of: * - TOOL_CHOICE == 0 => compiler v1.22e with vlinker v1.9902 */ #if !(((CHIPSET == 12)||(CHIPSET==15)) && (LONG_JUMP == 0)) /* * Trampoline download */ #define C_TRAMPOLINE_LOAD_START (UWORD32)(&D_LOAD_START) #define C_TRAMPOLINE_RUN_START (UWORD32)(&D_RUN_START) #define C_TRAMPOLINE_RUN_END (UWORD32)(&D_RUN_END) #define C_TRAMPOLINE_LENGTH (UWORD32)(&D_RUN_END - &D_RUN_START) #endif /* (((CHIPSET == 12)||(CHIPSET==15)) && (LONG_JUMP == 0)) */ #endif /* (TOOL_CHOICE == 0) */ #endif /* (OP_WCP == 0) */ void f_load_int_mem(void) { /* * Reset checksum of code downloaded */ d_checksum1 = 0; /* Load checksum */ d_checksum2 = 0; /* Run checksum */ /* * Reset the Internal memory where the code must be downloaded */ INT_memset((void *)(C_APPLICATION_RUN_START),0,C_APPLICATION_LENGTH); #if ((OP_WCP == 0) || (OP_L1_STANDALONE == 1)) #if (TOOL_CHOICE == 0) /* NEW COMPILER MANAGEMENT * If use of VISUAL LINKER, needs to manage trampoline download. * Case of: * - TOOL_CHOICE == 0 => compiler v1.22e with vlinker v1.9902 */ #if !(((CHIPSET == 12)||(CHIPSET==15)) && (LONG_JUMP == 0)) INT_memset((void *)(C_TRAMPOLINE_RUN_START),0,C_TRAMPOLINE_LENGTH); #endif #endif /* (TOOL_CHOICE == 0) */ #if ((CHIPSET == 12)||(CHIPSET==15)) INT_memset((void *)(C_INTERRUPT_VECTOR_RUN_START),0,C_INTERRUPT_VECTOR_LENGTH); #endif #endif /* (OP_WCP == 0) */ #if (OP_L1_STANDALONE == 0) && (BOARD == 35) && (USE_GZIP == 1) #define C_GZIP_START (C_APPLICATION_LOAD_START) #define C_GZIP_LENGTH (*(UWORD32*)C_APPLICATION_LOAD_START) #define C_GZIP_OUT (C_APPLICATION_RUN_START - sizeof(UWORD32)) /* De-compress on-the-fly and load to internal RAM */ decompress(C_GZIP_START, /* load start (compressed) */ C_GZIP_LENGTH, /* compressed length */ C_GZIP_OUT); /* run start */ #else /* * Compute checksum on code in FLASH (code and trampoline functions) */ d_checksum1 = f_checksum((UWORD8 *)(C_APPLICATION_LOAD_START), C_APPLICATION_LENGTH); #if ((OP_WCP == 0) || (OP_L1_STANDALONE == 1)) #if (TOOL_CHOICE == 0) /* NEW COMPILER MANAGEMENT * If use of VISUAL LINKER, needs to manage trampoline download. * Case of: * - TOOL_CHOICE == 0 => compiler v1.22e with vlinker v1.9902 */ #if !(((CHIPSET == 12)||(CHIPSET==15)) && (LONG_JUMP == 0)) d_checksum1 += f_checksum((UWORD8 *)(C_TRAMPOLINE_LOAD_START), C_TRAMPOLINE_LENGTH); #endif #endif /* (TOOL_CHOICE == 0) */ #if ((CHIPSET == 12)||(CHIPSET==15)) d_checksum1 += f_checksum((UWORD8 *)(C_INTERRUPT_VECTOR_LOAD_START), C_INTERRUPT_VECTOR_LENGTH); #endif #endif /* (OP_WCP == 0) */ /* * Download code from FLASH into Internal RAM (both code and trampoline functions) */ INT_memcpy((void *)(C_APPLICATION_RUN_START),(void *)(C_APPLICATION_LOAD_START),C_APPLICATION_LENGTH); #if ((OP_WCP == 0) || (OP_L1_STANDALONE == 1)) #if (TOOL_CHOICE == 0) /* NEW COMPILER MANAGEMENT * If use of VISUAL LINKER, needs to manage trampoline download. * Case of: * - TOOL_CHOICE == 0 => compiler v1.22e with vlinker v1.9902 */ #if !(((CHIPSET == 12)||(CHIPSET==15)) && (LONG_JUMP == 0)) INT_memcpy((void *)(C_TRAMPOLINE_RUN_START),(void *)(C_TRAMPOLINE_LOAD_START),C_TRAMPOLINE_LENGTH); #endif #endif /* (TOOL_CHOICE == 0) */ #if ((CHIPSET == 12)||(CHIPSET==15)) INT_memcpy((void *)(C_INTERRUPT_VECTOR_RUN_START),(void *)(C_INTERRUPT_VECTOR_LOAD_START),C_INTERRUPT_VECTOR_LENGTH); #endif #endif /* (OP_WCP == 0) */ /* * Compute checksum on code in FLASH (code and trampoline functions) */ d_checksum2 = f_checksum((UWORD8 *)(C_APPLICATION_RUN_START), C_APPLICATION_LENGTH); #if ((OP_WCP == 0) || (OP_L1_STANDALONE == 1)) #if (TOOL_CHOICE == 0) /* NEW COMPILER MANAGEMENT * If use of VISUAL LINKER, needs to manage trampoline download. * Case of: * - TOOL_CHOICE == 0 => compiler v1.22e with vlinker v1.9902 */ #if !(((CHIPSET == 12)||(CHIPSET==15)) && (LONG_JUMP == 0)) d_checksum2 += f_checksum((UWORD8 *)(C_TRAMPOLINE_RUN_START), C_TRAMPOLINE_LENGTH); #endif #endif /* (TOOL_CHOICE == 0) */ #if ((CHIPSET == 12)||(CHIPSET==15)) d_checksum2 += f_checksum((UWORD8 *)(C_INTERRUPT_VECTOR_RUN_START), C_INTERRUPT_VECTOR_LENGTH); #endif #endif /* (OP_WCP == 0) */ #endif /* (OP_L1_STANDALONE == 0) && (BOARD == 35) && (USE_GZIP == 1) */ } /* f_load_int_mem() */ #endif /* ((LONG_JUMP == 3) || (((CHIPSET == 12)||(CHIPSET==15)) && (LONG_JUMP == 0))) */ #endif /* ((((CHIPSET == 3) || (CHIPSET == 4) || ... (CHIPSET == 12) || (CHIPSET == 15)) */