;****************************************************************************** ;* BOOT v4.6.1 * ;* Copyright (c) 1996-2009 Texas Instruments Incorporated * ;****************************************************************************** ;**************************************************************************** ;* BOOT.ASM ;* ;* THIS IS THE INITAL BOOT ROUTINE FOR TMS470 C++ PROGRAMS. ;* IT MUST BE LINKED AND LOADED WITH ALL C++ PROGRAMS. ;* ;* THIS MODULE PERFORMS THE FOLLOWING ACTIONS: ;* 1) ALLOCATES THE STACK AND INITIALIZES THE STACK POINTER ;* 2) CALLS AUTO-INITIALIZATION ROUTINE ;* 3) CALLS THE FUNCTION MAIN TO START THE C++ PROGRAM ;* 4) CALLS THE STANDARD EXIT ROUTINE ;* ;* THIS MODULE DEFINES THE FOLLOWING GLOBAL SYMBOLS: ;* 1) __stack STACK MEMORY AREA ;* 2) _c_int00 BOOT ROUTINE ;* ;**************************************************************************** .if __TI_TMS470_V7M3__ .thumbfunc _c_int00 .else .armfunc _c_int00 .endif ;**************************************************************************** ; Accomodate different lowerd names in different ABIs ;**************************************************************************** .if __TI_EABI_ASSEMBLER .asg _args_main, ARGS_MAIN_RTN .asg exit, EXIT_RTN .asg main_func_sp, MAIN_FUNC_SP .elseif __TI_ARM9ABI_ASSEMBLER | .TMS470_32BIS .asg __args_main, ARGS_MAIN_RTN .asg _exit, EXIT_RTN .asg _main_func_sp, MAIN_FUNC_SP .else .asg $_args_main, ARGS_MAIN_RTN .asg $exit, EXIT_RTN .asg _main_func_sp, MAIN_FUNC_SP .endif .if .TMS470_16BIS ;**************************************************************************** ;* 16 BIT STATE BOOT ROUTINE * ;**************************************************************************** .if __TI_TMS470_V7M3__ .state16 .else .state32 .endif .global __stack ;*************************************************************** ;* DEFINE THE USER MODE STACK (DEFAULT SIZE IS 512) ;*************************************************************** __stack:.usect ".stack", 0, 4 .global _c_int00 ;*************************************************************** ;* FUNCTION DEF: _c_int00 ;*************************************************************** _c_int00: .asmfunc .if !__TI_TMS470_V7M3__ ;================================================================== ; Global Enable for Cortex-A8 Instruction and Data Caching ;================================================================== MRC p15, #0, r0, c1, c0, #0 ; read CP15 register 1 into r0 ORR r0, r0, #(0x1 <<12) ; enable I Cache ORR r0, r0, #(0x1 <<2) ; enable D Cache MCR p15, #0, r0, c1, c0, #0 ; write CP15 register 1 ;================================================================== ; Enable Cortex-A8 Level2 Unified Cache ;================================================================== MRC p15, #0, r0, c1, c0, #1 ; Read Auxiliary Control Register ORR r0, r0, #2 ; L2EN bit, disable L2 cache MCR p15, #0, r0, c1, c0, #1 ; Write Auxiliary Control Register ;================================================================== ; Cortex-A8 program flow prediction ;================================================================== MRC p15, #0, r0, c1, c0, #0 ; read CP15 register 1 into r0 ORR r0, r0, #(0x1 <<11) ; Enable all forms of branch prediction MCR p15, #0, r0, c1, c0, #0 ; write CP15 register 1 ;================================================================== ;------------------------------------------------------ ;* SET TO USER MODE ;*------------------------------------------------------ ;MRS r0, cpsr ;BIC r0, r0, #0x1F ; CLEAR MODES ;ORR r0, r0, #0x10 ; SET USER MODE ;MSR cpsr_cf, r0 ;*------------------------------------------------------ ;* CHANGE TO 16 BIT STATE ;*------------------------------------------------------ ADD r0, pc, #1 BX r0 .state16 .endif ;*------------------------------------------------------ ;* INITIALIZE THE USER MODE STACK ;*------------------------------------------------------ LDR r0, c_stack MOV sp, r0 LDR r0, c_STACK_SIZE ADD sp, r0 ;*----------------------------------------------------- ;* ALIGN THE STACK TO 64-BITS IF EABI. ;*----------------------------------------------------- .if __TI_EABI_ASSEMBLER MOV r7, sp MOV r0, #0x07 BIC r7, r0 ; Clear upper 3 bits for 64-bit alignment. MOV sp, r7 .endif ;*----------------------------------------------------- ;* SAVE CURRENT STACK POINTER FOR SDP ANALYSIS ;*----------------------------------------------------- LDR r0, c_mf_sp MOV r7, sp STR r7, [r0] ;*------------------------------------------------------ ;* Perform all the required initilizations: ;* - Process BINIT Table ;* - Perform C auto initialization ;* - Call global constructors ;*------------------------------------------------------ BL __TI_auto_init ;*------------------------------------------------------ ;* CALL APPLICATION ;*------------------------------------------------------ BL ARGS_MAIN_RTN ;*------------------------------------------------------ ;* IF APPLICATION DIDN'T CALL EXIT, CALL EXIT(1) ;*------------------------------------------------------ MOV r0, #1 BL EXIT_RTN ;*------------------------------------------------------ ;* DONE, LOOP FOREVER ;*------------------------------------------------------ L1: B L1 .endasmfunc .else ; !.TMS470_16BIS ;**************************************************************************** ;* 32 BIT STATE BOOT ROUTINE * ;**************************************************************************** .global __stack ;*************************************************************** ;* DEFINE THE USER MODE STACK (DEFAULT SIZE IS 512) ;*************************************************************** __stack:.usect ".stack", 0, 4 .global _c_int00 ;*************************************************************** ;* FUNCTION DEF: _c_int00 ;*************************************************************** _c_int00: .asmfunc ;================================================================== ; Global Enable for Cortex-A8 Instruction and Data Caching ;================================================================== MRC p15, #0, r0, c1, c0, #0 ; read CP15 register 1 into r0 ORR r0, r0, #(0x1 <<12) ; enable I Cache ORR r0, r0, #(0x1 <<2) ; enable D Cache MCR p15, #0, r0, c1, c0, #0 ; write CP15 register 1 ;================================================================== ; Enable Cortex-A8 Level2 Unified Cache ;================================================================== MRC p15, #0, r0, c1, c0, #1 ; Read Auxiliary Control Register ORR r0, r0, #2 ; L2EN bit, disable L2 cache MCR p15, #0, r0, c1, c0, #1 ; Write Auxiliary Control Register ;================================================================== ; Cortex-A8 program flow prediction ;================================================================== MRC p15, #0, r0, c1, c0, #0 ; read CP15 register 1 into r0 ORR r0, r0, #(0x1 <<11) ; Enable all forms of branch prediction MCR p15, #0, r0, c1, c0, #0 ; write CP15 register 1 ;================================================================== ;*------------------------------------------------------ ;* SET TO USER MODE ;*------------------------------------------------------ ;MRS r0, cpsr ;BIC r0, r0, #0x1F ; CLEAR MODES ;ORR r0, r0, #0x10 ; SET USER MODE ;MSR cpsr_cf, r0 ;*------------------------------------------------------ ;* INITIALIZE THE USER MODE STACK ;*------------------------------------------------------ LDR sp, c_stack LDR r0, c_STACK_SIZE ADD sp, sp, r0 ;*----------------------------------------------------- ;* ALIGN THE STACK TO 64-BITS IF EABI. ;*----------------------------------------------------- .if __TI_EABI_ASSEMBLER BIC sp, sp, #0x07 ; Clear upper 3 bits for 64-bit alignment. .endif ;*----------------------------------------------------- ;* SAVE CURRENT STACK POINTER FOR SDP ANALYSIS ;*----------------------------------------------------- LDR r0, c_mf_sp STR sp, [r0] ;*------------------------------------------------------ ;* Perform all the required initilizations: ;* - Process BINIT Table ;* - Perform C auto initialization ;* - Call global constructors ;*------------------------------------------------------ BL __TI_auto_init ;*------------------------------------------------------ ;* CALL APPLICATION ;*------------------------------------------------------ BL ARGS_MAIN_RTN ;*------------------------------------------------------ ;* IF APPLICATION DIDN'T CALL EXIT, CALL EXIT(1) ;*------------------------------------------------------ MOV R0, #1 BL EXIT_RTN ;*------------------------------------------------------ ;* DONE, LOOP FOREVER ;*------------------------------------------------------ L1: B L1 .endasmfunc .endif ; !.TMS470_16BIS ;*************************************************************** ;* CONSTANTS USED BY THIS MODULE ;*************************************************************** c_stack .long __stack c_STACK_SIZE .long __STACK_SIZE c_mf_sp .long MAIN_FUNC_SP .if __TI_EABI_ASSEMBLER .data .align 4 _stkchk_called: .field 0,32 .else .sect ".cinit" .align 4 .field 4,32 .field _stkchk_called+0,32 .field 0,32 .bss _stkchk_called,4,4 .symdepend ".cinit", ".bss" .symdepend ".cinit", ".text" .symdepend ".bss", ".text" .endif ;****************************************************** ;* UNDEFINED REFERENCES * ;****************************************************** .global _stkchk_called .global __STACK_SIZE .global ARGS_MAIN_RTN .global MAIN_FUNC_SP .global EXIT_RTN .global __TI_auto_init .end