Mercurial > ecos
diff packages/hal/arm/arch/current/src/vectors.S @ 80:2085233a121a ecos-sw-2000-04-07
Merge from eCos master repository on 2000-04-07-07:52:29-BST
| author | jlarmour |
|---|---|
| date | Fri, 07 Apr 2000 07:45:04 +0000 |
| parents | 435cced73e2f |
| children | b15c60e34c84 |
line wrap: on
line diff
--- a/packages/hal/arm/arch/current/src/vectors.S +++ b/packages/hal/arm/arch/current/src/vectors.S @@ -37,8 +37,8 @@ // # Purpose: ARM exception vectors // # Description: This file defines the code placed into the exception // # vectors. It also contains the first level default VSRs -// # that save and restore state for both exceptions and -// # interrupts. +// # that save and restore state for both exceptions and +// # interrupts. // # // #####DESCRIPTIONEND#### // # @@ -61,12 +61,54 @@ #include "arm.inc" -#define FUNC_START(name) \ - .globl _name; \ -_name: +#ifdef __thumb__ +// Switch to thumb mode +#define THUMB_MODE(_r_, _l_) \ + ldr _r_,=_l_ ## f+1 ;\ + bx _r_ ;\ + .pool ;\ + .code 16 ;\ + .thumb_func ;\ + _l_: + +// Switch to ARM mode +#define ARM_MODE(_r_, _l_) \ + ldr _r_,=_l_ ## f ;\ + bx _r_ ;\ + .pool ;\ + .code 32 ;\ + _l_: -#define PTR(name) \ -.##name: .word name +// Function definition, start executing body in ARM mode +#define FUNC_START_ARM(_name_, _r_) \ + .code 16 ;\ + .thumb_func ;\ + .globl _name_ ;\ +_name_: ;\ + ldr _r_,=_name_ ## _ARM ;\ + bx _r_ ;\ + .code 32 ;\ +_name_ ## _ARM: + +#else + +// Switch to thumb mode +#define THUMB_MODE(_r_, _l_) + +// Switch to ARM mode +#define ARM_MODE(_r_, _l_) + +// Function definition, start executing body in ARM mode +#define FUNC_START_ARM(_name_, _r_) \ + .globl _name_; \ +_name_: + +#endif + + + +#define PTR(name) \ +.##name: .word name #ifdef CYGHWR_HAL_ARM_HAS_MMU #define UNMAPPED(x) ((x)-__exception_handlers) @@ -74,11 +116,11 @@ #define UNMAPPED(x) (x) #endif -#define UNMAPPED_PTR(name) \ -.##name: .word UNMAPPED(name) +#define UNMAPPED_PTR(name) \ +.##name: .word UNMAPPED(name) - .file "vectors.S" + .file "vectors.S" // CYGHWR_LED_MACRO can be defined in hal_platform_setup.h. It's free to @@ -89,7 +131,7 @@ #ifndef CYGHWR_LED_MACRO #define CYGHWR_LED_MACRO #endif - + .macro LED x CYGHWR_LED_MACRO .endm @@ -99,137 +141,137 @@ // Hardware exception vectors. // This entire section will be copied to location 0x0000 at startup time. // - .code 32 - .section ".vectors","ax" - .global __exception_handlers + .code 32 + .section ".vectors","ax" + .global __exception_handlers __exception_handlers: - ldr pc,.reset_vector // 0x00 - ldr pc,.undefined_instruction // 0x04 - ldr pc,.software_interrupt // 0x08 start && software int - ldr pc,.abort_prefetch // 0x0C - ldr pc,.abort_data // 0x10 - .word 0 // unused - ldr pc,.IRQ // 0x18 - ldr pc,.FIQ // 0x1C + ldr pc,.reset_vector // 0x00 + ldr pc,.undefined_instruction // 0x04 + ldr pc,.software_interrupt // 0x08 start && software int + ldr pc,.abort_prefetch // 0x0C + ldr pc,.abort_data // 0x10 + .word 0 // unused + ldr pc,.IRQ // 0x18 + ldr pc,.FIQ // 0x1C // The layout of these pointers should match the vector table above since // they are copied in pairs. - .global vectors + .global vectors vectors: -UNMAPPED_PTR(reset_vector) // 0x20 -PTR(undefined_instruction) // 0x24 -PTR(software_interrupt) // 0x28 -PTR(abort_prefetch) // 0x2C -PTR(abort_data) // 0x30 - .word 0 // 0x34 -PTR(IRQ) // 0x38 -PTR(FIQ) // 0x3c +UNMAPPED_PTR(reset_vector) // 0x20 +PTR(undefined_instruction) // 0x24 +PTR(software_interrupt) // 0x28 +PTR(abort_prefetch) // 0x2C +PTR(abort_data) // 0x30 + .word 0 // 0x34 +PTR(IRQ) // 0x38 +PTR(FIQ) // 0x3c PTR(start) // This is copied to 0x28 for bootup // 0x40 - // location 0x40 is used for storing DRAM size if known - // for some platforms. + // location 0x40 is used for storing DRAM size if known + // for some platforms. // Other vectors - .balign 16 // Should be at 0x50 - .balign 32 + .balign 16 // Should be at 0x50 + .balign 32 - .text + .text // Startup code which will get the machine into supervisor mode - .global reset_vector - .type reset_vector,function + .global reset_vector + .type reset_vector,function reset_vector: - PLATFORM_SETUP1 // Early stage platform initialization - // which can set DRAM size at 0x40 - // see <cyg/hal/hal_platform_setup.h> + PLATFORM_SETUP1 // Early stage platform initialization + // which can set DRAM size at 0x40 + // see <cyg/hal/hal_platform_setup.h> // Come here to reset board warm_reset: #if defined(CYG_HAL_STARTUP_RAM) && \ !defined(CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS) - mrs r7,cpsr // move back to IRQ mode - and r7,r7,#CPSR_MODE_BITS - cmp r7,#CPSR_SUPERVISOR_MODE - beq start + mrs r7,cpsr // move back to IRQ mode + and r7,r7,#CPSR_MODE_BITS + cmp r7,#CPSR_SUPERVISOR_MODE + beq start #endif - // We cannot access any LED registers until after PLATFORM_SETUP1 - LED 7 + // We cannot access any LED registers until after PLATFORM_SETUP1 + LED 7 - mov r0,#0 // move vectors - // We cannot perform a store until after PLATFORM_SETUP1 + mov r0,#0 // move vectors + // We cannot perform a store until after PLATFORM_SETUP1 #ifndef CYGPKG_HAL_ARM_EBSA285 // EBSA285 sets the DRAM size above - str r0, [r0,#0x40] // DRAM size to zero => unknown + str r0, [r0,#0x40] // DRAM size to zero => unknown #endif - ldr r1,=__exception_handlers + ldr r1,=__exception_handlers #ifndef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS - // Wait with this if stubs are included (see further down). - ldr r2,[r1,#0x04] // undefined instruction - str r2,[r0,#0x04] - ldr r2,[r1,#0x24] - str r2,[r0,#0x24] + // Wait with this if stubs are included (see further down). + ldr r2,[r1,#0x04] // undefined instruction + str r2,[r0,#0x04] + ldr r2,[r1,#0x24] + str r2,[r0,#0x24] #endif - ldr r2,[r1,#0x08] // software interrupt - str r2,[r0,#0x08] + ldr r2,[r1,#0x08] // software interrupt + str r2,[r0,#0x08] #if defined(CYG_HAL_STARTUP_RAM) // Ugly hack to get into supervisor mode - ldr r2,[r1,#0x40] - str r2,[r0,#0x28] + ldr r2,[r1,#0x40] + str r2,[r0,#0x28] - LED 6 - - swi // switch to supervisor mode + LED 6 + + swi // switch to supervisor mode #endif // ========================================================================= // Real startup code. We jump here from the reset vector to set up the world. - .globl start -start: + .globl start +start: - LED 5 + LED 5 #if defined(CYG_HAL_STARTUP_RAM) && \ !defined(CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS) // If we get restarted, hang here to avoid corrupting memory - ldr r0,.init_flag - ldr r1,[r0] -1: cmp r1,#0 - bne 1b - ldr r1,init_done - str r1,[r0] + ldr r0,.init_flag + ldr r1,[r0] +1: cmp r1,#0 + bne 1b + ldr r1,init_done + str r1,[r0] #endif - // Reset software interrupt pointer - mov r0,#0 // move vectors - ldr r1,.__exception_handlers + // Reset software interrupt pointer + mov r0,#0 // move vectors + ldr r1,.__exception_handlers #if defined(CYG_HAL_STARTUP_RAM) && \ !defined(CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS) - cmp r7,#CPSR_SUPERVISOR_MODE - beq 10f + cmp r7,#CPSR_SUPERVISOR_MODE + beq 10f #endif - ldr r2,[r1,#0x28] // software interrupt - str r2,[r0,#0x28] + ldr r2,[r1,#0x28] // software interrupt + str r2,[r0,#0x28] 10: - ldr r2,[r1,#0x18] // IRQ - str r2,[r0,#0x18] - ldr r2,[r1,#0x38] - str r2,[r0,#0x38] - ldr r2,[r1,#0x1C] // FIQ - str r2,[r0,#0x1C] - ldr r2,[r1,#0x3C] - str r2,[r0,#0x3C] - ldr r2,[r1,#0x0C] // abort (prefetch) - str r2,[r0,#0x0C] - ldr r2,[r1,#0x2C] - str r2,[r0,#0x2C] - ldr r2,[r1,#0x10] // abort (data) - str r2,[r0,#0x10] - ldr r2,[r1,#0x30] - str r2,[r0,#0x30] + ldr r2,[r1,#0x18] // IRQ + str r2,[r0,#0x18] + ldr r2,[r1,#0x38] + str r2,[r0,#0x38] + ldr r2,[r1,#0x1C] // FIQ + str r2,[r0,#0x1C] + ldr r2,[r1,#0x3C] + str r2,[r0,#0x3C] + ldr r2,[r1,#0x0C] // abort (prefetch) + str r2,[r0,#0x0C] + ldr r2,[r1,#0x2C] + str r2,[r0,#0x2C] + ldr r2,[r1,#0x10] // abort (data) + str r2,[r0,#0x10] + ldr r2,[r1,#0x30] + str r2,[r0,#0x30] - LED 4 + LED 4 #if defined(CYG_HAL_STARTUP_ROM) // Set up reset vector @@ -237,108 +279,101 @@ 10: str r2,[r0,#0x00] ldr r2,=warm_reset str r2,[r0,#0x20] - // Relocate [copy] data from ROM to RAM - ldr r3,.__rom_data_start - ldr r4,.__ram_data_start - ldr r5,.__ram_data_end - cmp r4,r5 // jump if no data to move - beq 2f - sub r3,r3,#4 // loop adjustments - sub r4,r4,#4 -1: ldr r0,[r3,#4]! // copy info - str r0,[r4,#4]! - cmp r4,r5 - bne 1b + // Relocate [copy] data from ROM to RAM + ldr r3,.__rom_data_start + ldr r4,.__ram_data_start + ldr r5,.__ram_data_end + cmp r4,r5 // jump if no data to move + beq 2f + sub r3,r3,#4 // loop adjustments + sub r4,r4,#4 +1: ldr r0,[r3,#4]! // copy info + str r0,[r4,#4]! + cmp r4,r5 + bne 1b 2: #endif - // initialize interrupt/exception environments - ldr sp,.__startup_stack - mov r0,#(CPSR_IRQ_DISABLE|CPSR_FIQ_DISABLE|CPSR_IRQ_MODE) - msr cpsr,r0 - ldr sp,.__exception_stack - mov r0,#(CPSR_IRQ_DISABLE|CPSR_FIQ_DISABLE|CPSR_FIQ_MODE) - msr cpsr,r0 - ldr sp,.__FIQ_exception_stack - mov r0,#(CPSR_IRQ_DISABLE|CPSR_FIQ_DISABLE|CPSR_UNDEF_MODE) - msr cpsr,r0 - ldr sp,.__exception_stack + // initialize interrupt/exception environments + ldr sp,.__startup_stack + mov r0,#(CPSR_IRQ_DISABLE|CPSR_FIQ_DISABLE|CPSR_IRQ_MODE) + msr cpsr,r0 + ldr sp,.__exception_stack + mov r0,#(CPSR_IRQ_DISABLE|CPSR_FIQ_DISABLE|CPSR_FIQ_MODE) + msr cpsr,r0 + ldr sp,.__FIQ_exception_stack + mov r0,#(CPSR_IRQ_DISABLE|CPSR_FIQ_DISABLE|CPSR_UNDEF_MODE) + msr cpsr,r0 + ldr sp,.__exception_stack - // initialize CPSR (machine state register) - mov r0,#(CPSR_IRQ_DISABLE|CPSR_FIQ_DISABLE|CPSR_SUPERVISOR_MODE) - msr cpsr,r0 + // initialize CPSR (machine state register) + mov r0,#(CPSR_IRQ_DISABLE|CPSR_FIQ_DISABLE|CPSR_SUPERVISOR_MODE) + msr cpsr,r0 - // Note: some functions in LIBGCC1 will cause a "restore from SPSR"!! - msr spsr,r0 + // Note: some functions in LIBGCC1 will cause a "restore from SPSR"!! + msr spsr,r0 - // initialize stack - ldr sp,.__startup_stack + // initialize stack + ldr sp,.__startup_stack - // clear BSS - ldr r1,.__bss_start - ldr r2,.__bss_end - mov r0,#0 - cmp r1,r2 - beq 2f -1: str r0,[r1],#4 - cmp r1,r2 - bne 1b + // clear BSS + ldr r1,.__bss_start + ldr r2,.__bss_end + mov r0,#0 + cmp r1,r2 + beq 2f +1: str r0,[r1],#4 + cmp r1,r2 + bne 1b 2: -#ifdef __thumb__ -// Run kernel + application in THUMB mode - ldr r1,=10f+1 - bx r1 - .pool - .code 16 - .thumb_func -10: -#endif + // Run kernel + application in THUMB mode + THUMB_MODE(r1,10) - LED 3 - - // Call platform specific hardware initialization - bl hal_hardware_init + LED 3 + + // Call platform specific hardware initialization + bl hal_hardware_init #ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS - bl initialize_stub + bl initialize_stub - // Now that stub is initialized, change vector. It is possible - // to single-step through most of the init code, except the below. - // Put a breakpoint at the call to cyg_hal_invoke_constructors to - // pass over this bit (s-s depends on internal state in the stub). + // Now that stub is initialized, change vector. It is possible + // to single-step through most of the init code, except the below. + // Put a breakpoint at the call to cyg_hal_invoke_constructors to + // pass over this bit (s-s depends on internal state in the stub). #endif #if defined(CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS) || \ defined(CYGIMP_HAL_PROCESS_ALL_EXCEPTIONS) - mov r0,#0 // move vectors - ldr r1,=__exception_handlers - ldr r2,[r1,#0x04] // undefined instruction - str r2,[r0,#0x04] - ldr r2,[r1,#0x24] - str r2,[r0,#0x24] + mov r0,#0 // move vectors + ldr r1,=__exception_handlers + ldr r2,[r1,#0x04] // undefined instruction + str r2,[r0,#0x04] + ldr r2,[r1,#0x24] + str r2,[r0,#0x24] #endif - LED 2 - - // Run through static constructors - bl cyg_hal_invoke_constructors + LED 2 + + // Run through static constructors + bl cyg_hal_invoke_constructors - LED 1 - - // This starts up the eCos kernel - bl cyg_start + LED 1 + + // This starts up the eCos kernel + bl cyg_start _start_hang: - b _start_hang - .code 32 + b _start_hang + .code 32 .global reset_platform .type reset_platform,function reset_platform: #ifdef CYGSEM_HAL_ROM_MONITOR - // initialize CPSR (machine state register) - mov r0,#(CPSR_IRQ_DISABLE|CPSR_FIQ_DISABLE|CPSR_SUPERVISOR_MODE) - msr cpsr,r0 + // initialize CPSR (machine state register) + mov r0,#(CPSR_IRQ_DISABLE|CPSR_FIQ_DISABLE|CPSR_SUPERVISOR_MODE) + msr cpsr,r0 b warm_reset #else mov r0,#0 @@ -346,543 +381,448 @@ reset_platform: #endif init_done: - .long 0xDEADB00B + .long 0xDEADB00B // // Exception handlers // Assumption: get here from a Supervisor context [mode] // - .code 32 + .code 32 undefined_instruction: - ldr sp,.__undef_exception_stack // get good stack - stmfd sp!,{r0,fp,ip,lr} - mrs r0,spsr - stmfd sp!,{r0} - mov ip,sp // save SP which will vanish with + ldr sp,.__undef_exception_stack // get good stack + stmfd sp!,{r0,fp,ip,lr} + mrs r0,spsr + stmfd sp!,{r0} + mov ip,sp // save SP which will vanish with // mode switch - mrs r0,cpsr // switch to Supervisor Mode - bic r0,r0,#CPSR_MODE_BITS - orr r0,r0,#CPSR_SUPERVISOR_MODE - msr cpsr,r0 // sp,lr are now old values - mov fp,sp + mrs r0,cpsr // switch to Supervisor Mode + bic r0,r0,#CPSR_MODE_BITS + orr r0,r0,#CPSR_SUPERVISOR_MODE + msr cpsr,r0 // sp,lr are now old values + mov fp,sp #ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS - ldr sp,.__GDB_stack - cmp fp,sp // already on GDB stack? - bhi 10f - ldr r0,.__GDB_stack_base - cmp fp,r0 - bls 10f // no - switch to GDB stack + ldr sp,.__GDB_stack + cmp fp,sp // already on GDB stack? + bhi 10f + ldr r0,.__GDB_stack_base + cmp fp,r0 + bls 10f // no - switch to GDB stack // (already in sp) - mov sp,fp // yes - no switch + mov sp,fp // yes - no switch 10: #endif - sub sp,sp,#ARMREG_SIZE // make space for frame - stmea sp,{r0-r10,fp} // save immediately visible registers - ldmfd ip,{r0-r4} // saved registers -#if 1 + sub sp,sp,#ARMREG_SIZE // make space for frame + stmea sp,{r0-r10,fp} // save immediately visible registers + ldmfd ip,{r0-r4} // saved registers // Adjust PC according to CPU mode - tst r0,#CPSR_THUMB_ENABLE - subeq r4,r4,#4 // PC at time of interrupt (ARM) - subne r4,r4,#2 // PC at time of interrupt (thumb) -#else - sub r4,r4,#4 // PC at time of interrupt + tst r0,#CPSR_THUMB_ENABLE + subeq r4,r4,#4 // PC at time of interrupt (ARM) + subne r4,r4,#2 // PC at time of interrupt (thumb) + str r0,[sp,#armreg_cpsr] // CPSR at time of interrupt + str r1,[sp,#armreg_r0] // saved R0 + str r2,[sp,#armreg_fp] // saved FP + str r3,[sp,#armreg_ip] // saved IP + str r4,[sp,#armreg_pc] // PC at time of interrupt + str lr,[sp,#armreg_lr] // LR at time of interrupt + add r0,ip,#ARMREG_SIZE + str fp,[sp,#armreg_sp] // SP at time of interrupt +#ifdef CYGHWR_HAL_ARM_DUMP_EXCEPTIONS + mov r0,sp + bl cyg_hal_report_undefined_instruction #endif - str r0,[sp,#armreg_cpsr] // CPSR at time of interrupt - str r1,[sp,#armreg_r0] // saved R0 - str r2,[sp,#armreg_fp] // saved FP - str r3,[sp,#armreg_ip] // saved IP - str r4,[sp,#armreg_pc] // PC at time of interrupt - str lr,[sp,#armreg_lr] // LR at time of interrupt - add r0,ip,#ARMREG_SIZE - str fp,[sp,#armreg_sp] // SP at time of interrupt -#ifdef CYGHWR_HAL_ARM_DUMP_EXCEPTIONS - mov r0,sp - bl cyg_hal_report_undefined_instruction -#endif - mov v1,#CYGNUM_HAL_EXCEPTION_ILLEGAL_INSTRUCTION - b call_exception_handler + mov v1,#CYGNUM_HAL_EXCEPTION_ILLEGAL_INSTRUCTION + b call_exception_handler - .code 32 + .code 32 software_interrupt: - sub sp,sp,#ARMREG_SIZE+16 // make space for frame - stmea sp,{r0-r10,fp} // save immediately visible registers - mrs r0,spsr -#if 1 + sub sp,sp,#ARMREG_SIZE+16 // make space for frame + stmea sp,{r0-r10,fp} // save immediately visible registers + mrs r0,spsr // Adjust PC according to CPU mode - tst r0,#CPSR_THUMB_ENABLE - subeq r3,lr,#4 // PC at time of interrupt (ARM) - subne r3,lr,#2 // PC at time of interrupt (thumb) -#else - sub r3,lr,#4 // PC at time of interrupt + tst r0,#CPSR_THUMB_ENABLE + subeq r3,lr,#4 // PC at time of interrupt (ARM) + subne r3,lr,#2 // PC at time of interrupt (thumb) + str r0,[sp,#armreg_cpsr] // CPSR at time of interrupt + str ip,[sp,#armreg_ip] // saved IP + str r3,[sp,#armreg_pc] // PC at time of interrupt + str lr,[sp,#armreg_lr] // LR at time of interrupt + add r0,sp,#ARMREG_SIZE+16 + str r0,[sp,#armreg_sp] // SP at time of interrupt +#ifdef CYGHWR_HAL_ARM_DUMP_EXCEPTIONS + mov r0,sp + bl cyg_hal_report_software_interrupt #endif - str r0,[sp,#armreg_cpsr] // CPSR at time of interrupt - str ip,[sp,#armreg_ip] // saved IP - str r3,[sp,#armreg_pc] // PC at time of interrupt - str lr,[sp,#armreg_lr] // LR at time of interrupt - add r0,sp,#ARMREG_SIZE+16 - str r0,[sp,#armreg_sp] // SP at time of interrupt -#ifdef CYGHWR_HAL_ARM_DUMP_EXCEPTIONS - mov r0,sp - bl cyg_hal_report_software_interrupt -#endif - mov v1,#CYGNUM_HAL_EXCEPTION_INTERRUPT - b call_exception_handler + mov v1,#CYGNUM_HAL_EXCEPTION_INTERRUPT + b call_exception_handler - .code 32 + .code 32 abort_prefetch: - ldr sp,.__undef_exception_stack // get good stack - sub lr,lr,#4 // PC at time of interrupt - stmfd sp!,{r0,fp,ip,lr} - mrs r0,spsr - stmfd sp!,{r0} - mov ip,sp // save SP which will vanish with + ldr sp,.__undef_exception_stack // get good stack + sub lr,lr,#4 // PC at time of interrupt + stmfd sp!,{r0,fp,ip,lr} + mrs r0,spsr + stmfd sp!,{r0} + mov ip,sp // save SP which will vanish with // mode switch - mrs r0,cpsr // switch to Supervisor Mode - bic r0,r0,#CPSR_MODE_BITS - orr r0,r0,#CPSR_SUPERVISOR_MODE - msr cpsr,r0 // sp,lr are now old values - mov fp,sp + mrs r0,cpsr // switch to Supervisor Mode + bic r0,r0,#CPSR_MODE_BITS + orr r0,r0,#CPSR_SUPERVISOR_MODE + msr cpsr,r0 // sp,lr are now old values + mov fp,sp #ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS - ldr sp,.__GDB_stack - cmp fp,sp // already on GDB stack? - bhi 10f - ldr r0,.__GDB_stack_base - cmp fp,r0 - bls 10f // no - switch to GDB stack + ldr sp,.__GDB_stack + cmp fp,sp // already on GDB stack? + bhi 10f + ldr r0,.__GDB_stack_base + cmp fp,r0 + bls 10f // no - switch to GDB stack // (already in sp) - mov sp,fp // yes - no switch + mov sp,fp // yes - no switch 10: #endif - sub sp,sp,#ARMREG_SIZE // make space for frame - stmea sp,{r0-r10,fp} // save immediately visible registers - ldmfd ip,{r0-r4} // saved registers - str r0,[sp,#armreg_cpsr] // CPSR at time of interrupt - str r1,[sp,#armreg_r0] // saved R0 - str r2,[sp,#armreg_fp] // saved FP - str r3,[sp,#armreg_ip] // saved IP - str r4,[sp,#armreg_pc] // PC at time of interrupt - str lr,[sp,#armreg_lr] // LR at time of interrupt - add r0,ip,#ARMREG_SIZE - str fp,[sp,#armreg_sp] // SP at time of interrupt + sub sp,sp,#ARMREG_SIZE // make space for frame + stmea sp,{r0-r10,fp} // save immediately visible registers + ldmfd ip,{r0-r4} // saved registers + str r0,[sp,#armreg_cpsr] // CPSR at time of interrupt + str r1,[sp,#armreg_r0] // saved R0 + str r2,[sp,#armreg_fp] // saved FP + str r3,[sp,#armreg_ip] // saved IP + str r4,[sp,#armreg_pc] // PC at time of interrupt + str lr,[sp,#armreg_lr] // LR at time of interrupt + add r0,ip,#ARMREG_SIZE + str fp,[sp,#armreg_sp] // SP at time of interrupt #ifdef CYGHWR_HAL_ARM_DUMP_EXCEPTIONS - mov r0,sp - bl cyg_hal_report_abort_prefetch + mov r0,sp + bl cyg_hal_report_abort_prefetch #endif - mov v1,#CYGNUM_HAL_EXCEPTION_CODE_ACCESS - b call_exception_handler + mov v1,#CYGNUM_HAL_EXCEPTION_CODE_ACCESS + b call_exception_handler - .code 32 + .code 32 abort_data: - ldr sp,.__undef_exception_stack // get good stack - sub lr,lr,#4 // PC at time of interrupt - stmfd sp!,{r0,fp,ip,lr} - mrs r0,spsr - stmfd sp!,{r0} - mov ip,sp // save SP which will vanish with + ldr sp,.__undef_exception_stack // get good stack + sub lr,lr,#4 // PC at time of interrupt + stmfd sp!,{r0,fp,ip,lr} + mrs r0,spsr + stmfd sp!,{r0} + mov ip,sp // save SP which will vanish with // mode switch - mrs r0,cpsr // switch to Supervisor Mode - bic r0,r0,#CPSR_MODE_BITS - orr r0,r0,#CPSR_SUPERVISOR_MODE - msr cpsr,r0 // sp,lr are now old values - mov fp,sp + mrs r0,cpsr // switch to Supervisor Mode + bic r0,r0,#CPSR_MODE_BITS + orr r0,r0,#CPSR_SUPERVISOR_MODE + msr cpsr,r0 // sp,lr are now old values + mov fp,sp #ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS - ldr sp,.__GDB_stack - cmp fp,sp // already on GDB stack? - bhi 10f - ldr r0,.__GDB_stack_base - cmp fp,r0 - bls 10f // no - switch to GDB stack + ldr sp,.__GDB_stack + cmp fp,sp // already on GDB stack? + bhi 10f + ldr r0,.__GDB_stack_base + cmp fp,r0 + bls 10f // no - switch to GDB stack // (already in sp) - mov sp,fp // yes - no switch + mov sp,fp // yes - no switch 10: #endif - sub sp,sp,#ARMREG_SIZE // make space for frame - stmea sp,{r0-r10,fp} // save immediately visible registers - ldmfd ip,{r0-r4} // saved registers - str r0,[sp,#armreg_cpsr] // CPSR at time of interrupt - str r1,[sp,#armreg_r0] // saved R0 - str r2,[sp,#armreg_fp] // saved FP - str r3,[sp,#armreg_ip] // saved IP - str r4,[sp,#armreg_pc] // PC at time of interrupt - str lr,[sp,#armreg_lr] // LR at time of interrupt - add r0,ip,#ARMREG_SIZE - str fp,[sp,#armreg_sp] // SP at time of interrupt + sub sp,sp,#ARMREG_SIZE // make space for frame + stmea sp,{r0-r10,fp} // save immediately visible registers + ldmfd ip,{r0-r4} // saved registers + str r0,[sp,#armreg_cpsr] // CPSR at time of interrupt + str r1,[sp,#armreg_r0] // saved R0 + str r2,[sp,#armreg_fp] // saved FP + str r3,[sp,#armreg_ip] // saved IP + str r4,[sp,#armreg_pc] // PC at time of interrupt + str lr,[sp,#armreg_lr] // LR at time of interrupt + add r0,ip,#ARMREG_SIZE + str fp,[sp,#armreg_sp] // SP at time of interrupt #ifdef CYGHWR_HAL_ARM_DUMP_EXCEPTIONS - mov r0,sp - bl cyg_hal_report_abort_data + mov r0,sp + bl cyg_hal_report_abort_data #endif - mov v1,#CYGNUM_HAL_EXCEPTION_DATA_ACCESS - b call_exception_handler + mov v1,#CYGNUM_HAL_EXCEPTION_DATA_ACCESS + b call_exception_handler // // Dispatch an exception handler. - .code 32 + .code 32 call_exception_handler: - str v1,[sp,#armreg_vector] - mov r0,sp -#ifdef __thumb__ -// Switch to thumb mode - ldr r9,=10f+1 - bx r9 - .pool - .code 16 - .thumb_func -10: -#endif - bl exception_handler + str v1,[sp,#armreg_vector] + mov r0,sp + + THUMB_MODE(r9,10) + + bl exception_handler #ifdef CYGHWR_HAL_ARM_DUMP_EXCEPTIONS - mov r0,sp - bl cyg_hal_report_exception_handler_returned -#endif -#ifdef __thumb__ -// Switch back to ARM mode - ldr r1,=10f - bx r1 - .pool - .code 32 - .thumb_func -10: + mov r0,sp + bl cyg_hal_report_exception_handler_returned #endif -// Restore [interrupted] context - mov ip,sp // get stack pointer + ARM_MODE(r1,10) - mrs r0,cpsr // move back to IRQ mode - orr r0,r0,#CPSR_IRQ_DISABLE|CPSR_FIQ_DISABLE - msr cpsr,r0 +// Restore [interrupted] context + mov ip,sp // get stack pointer + + mrs r0,cpsr // move back to IRQ mode + orr r0,r0,#CPSR_IRQ_DISABLE|CPSR_FIQ_DISABLE + msr cpsr,r0 nop nop - ldr lr,[ip,#armreg_lr] - ldr sp,[sp,#armreg_sp] + ldr lr,[ip,#armreg_lr] + ldr sp,[sp,#armreg_sp] - bic r0,r0,#CPSR_MODE_BITS - orr r0,r0,#CPSR_IRQ_MODE - msr cpsr,r0 + bic r0,r0,#CPSR_MODE_BITS + orr r0,r0,#CPSR_IRQ_MODE + msr cpsr,r0 - mov sp,ip - ldr lr,[sp,#armreg_pc] - ldr r0,[sp,#armreg_cpsr] - ldr ip,[sp,#armreg_ip] - msr spsr,r0 - ldmfd sp,{r0-r10,fp} + mov sp,ip + ldr lr,[sp,#armreg_pc] + ldr r0,[sp,#armreg_cpsr] + ldr ip,[sp,#armreg_ip] + msr spsr,r0 + ldmfd sp,{r0-r10,fp} - movs pc,lr // restore PC from LR, CPSR from SPSR + movs pc,lr // restore PC from LR, CPSR from SPSR // Handle device interrupts // This is slightly more complicated than the other exception handlers because // it needs to interface with the kernel (if present). - .code 32 + .code 32 FIQ: - // Note: I use this exception stack while saving the context because - // the current SP does not seem to be always valid in this CPU mode. - ldr sp,.__FIQ_exception_stack // get good stack - sub lr,lr,#4 // PC at time of interrupt - stmfd sp!,{r0,fp,ip,lr} - mrs r0,spsr - stmfd sp!,{r0} + // Note: I use this exception stack while saving the context because + // the current SP does not seem to be always valid in this CPU mode. + ldr sp,.__FIQ_exception_stack // get good stack + sub lr,lr,#4 // PC at time of interrupt + stmfd sp!,{r0,fp,ip,lr} + mrs r0,spsr + stmfd sp!,{r0} b handle_IRQ_or_FIQ IRQ: - // Note: I use this exception stack while saving the context because - // the current SP does not seem to be always valid in this CPU mode. - ldr sp,.__exception_stack // get good stack - sub lr,lr,#4 // PC at time of interrupt - stmfd sp!,{r0,fp,ip,lr} - mrs r0,spsr - stmfd sp!,{r0} + // Note: I use this exception stack while saving the context because + // the current SP does not seem to be always valid in this CPU mode. + ldr sp,.__exception_stack // get good stack + sub lr,lr,#4 // PC at time of interrupt + stmfd sp!,{r0,fp,ip,lr} + mrs r0,spsr + stmfd sp!,{r0} handle_IRQ_or_FIQ: - mov ip,sp // save SP which will vanish with + mov ip,sp // save SP which will vanish with // mode switch - mrs r0,cpsr // switch to Supervisor Mode - bic r0,r0,#CPSR_MODE_BITS - orr r0,r0,#CPSR_SUPERVISOR_MODE|CPSR_FIQ_DISABLE|CPSR_IRQ_DISABLE - msr cpsr,r0 // sp,lr are now old values - mov fp,sp // save old SP - sub sp,sp,#ARMREG_SIZE // make space for frame - stmea sp,{r0-r10,fp} // save immediately visible registers - ldmfd ip,{r0-r4} // saved registers - str r0,[sp,#armreg_cpsr] // CPSR at time of interrupt - str r1,[sp,#armreg_r0] // saved R0 - str r2,[sp,#armreg_fp] // saved FP - str r3,[sp,#armreg_ip] // saved IP - str r4,[sp,#armreg_pc] // PC at time of interrupt - str lr,[sp,#armreg_lr] // LR at time of interrupt - str fp,[sp,#armreg_sp] // SP at time of interrupt - mov v6,sp // Save pointer to register frame + mrs r0,cpsr // switch to Supervisor Mode + bic r0,r0,#CPSR_MODE_BITS + orr r0,r0,#CPSR_SUPERVISOR_MODE|CPSR_FIQ_DISABLE|CPSR_IRQ_DISABLE + msr cpsr,r0 // sp,lr are now old values + mov fp,sp // save old SP + sub sp,sp,#ARMREG_SIZE // make space for frame + stmea sp,{r0-r10,fp} // save immediately visible registers + ldmfd ip,{r0-r4} // saved registers + str r0,[sp,#armreg_cpsr] // CPSR at time of interrupt + str r1,[sp,#armreg_r0] // saved R0 + str r2,[sp,#armreg_fp] // saved FP + str r3,[sp,#armreg_ip] // saved IP + str r4,[sp,#armreg_pc] // PC at time of interrupt + str lr,[sp,#armreg_lr] // LR at time of interrupt + str fp,[sp,#armreg_sp] // SP at time of interrupt + mov v6,sp // Save pointer to register frame -// mov r0,sp -// bl _show_frame_in +// mov r0,sp +// bl _show_frame_in #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK - // Switch to interrupt stack - ldr r2,.irq_level // current number of nested interrupts - ldr r0,[r2] - add r1,r0,#1 - str r1,[r2] // if was zero, switch stacks - cmp r0,#0 - moveq r1,sp // save old stack pointer - ldreq sp,.__interrupt_stack - stmeqfd sp!,{r1} + // Switch to interrupt stack + ldr r2,.irq_level // current number of nested interrupts + ldr r0,[r2] + add r1,r0,#1 + str r1,[r2] // if was zero, switch stacks + cmp r0,#0 + moveq r1,sp // save old stack pointer + ldreq sp,.__interrupt_stack + stmeqfd sp!,{r1} 10: #endif - // The entire CPU state is now stashed on the stack, - // increment the scheduler lock and handle the interrupt + // The entire CPU state is now stashed on the stack, + // increment the scheduler lock and handle the interrupt -#ifdef CYGFUN_HAL_COMMON_KERNEL_SUPPORT - .extern cyg_scheduler_sched_lock - ldr r3,.cyg_scheduler_sched_lock - ldr r4,[r3] - add r4,r4,#1 - str r4,[r3] +#ifdef CYGFUN_HAL_COMMON_KERNEL_SUPPORT + .extern cyg_scheduler_sched_lock + ldr r3,.cyg_scheduler_sched_lock + ldr r4,[r3] + add r4,r4,#1 + str r4,[r3] #endif -#ifdef __thumb__ -// Switch to thumb mode - ldr r3,=10f+1 - bx r3 - .pool - .code 16 - .thumb_func -10: -#endif - mov r0,v6 - bl hal_IRQ_handler // determine interrupt source - mov v1,r0 // returned vector # + THUMB_MODE(r3,10) + + mov r0,v6 + bl hal_IRQ_handler // determine interrupt source + mov v1,r0 // returned vector # #if defined(CYGPKG_KERNEL_INSTRUMENT) && \ defined(CYGDBG_KERNEL_INSTRUMENT_INTR) - ldr r0,=RAISE_INTR // arg0 = type = INTR,RAISE - mov r1,v1 // arg1 = vector - mov r2,#0 // arg2 = 0 - bl cyg_instrument // call instrument function + ldr r0,=RAISE_INTR // arg0 = type = INTR,RAISE + mov r1,v1 // arg1 = vector + mov r2,#0 // arg2 = 0 + bl cyg_instrument // call instrument function #endif -#ifdef __thumb__ -// Switch to ARM mode - ldr r0,=10f - bx r0 - .pool - .code 32 -10: -#endif - mov r0,v1 // vector # -#ifdef CYGIMP_HAL_COMMON_INTERRUPTS_IGNORE_SPURIOUS + ARM_MODE(r0,10) + + mov r0,v1 // vector # +#ifdef CYGIMP_HAL_COMMON_INTERRUPTS_IGNORE_SPURIOUS cmp r0,#0 // ignore spurious interrupts beq spurious_IRQ #endif // CYGIMP_HAL_COMMON_INTERRUPTS_IGNORE_SPURIOUS - ldr r1,.hal_interrupt_data - ldr r1,[r1,v1,lsl #2] // handler data - ldr r2,.hal_interrupt_handlers - ldr v3,[r2,v1,lsl #2] // handler (indexed by vector #) - mov r2,v6 // register frame (this is necessary - // for the ISR too, for ^C detection) + ldr r1,.hal_interrupt_data + ldr r1,[r1,v1,lsl #2] // handler data + ldr r2,.hal_interrupt_handlers + ldr v3,[r2,v1,lsl #2] // handler (indexed by vector #) + mov r2,v6 // register frame (this is necessary + // for the ISR too, for ^C detection) #ifdef __thumb__ - ldr lr,=10f - bx v3 // invoke handler (thumb mode) + ldr lr,=10f + bx v3 // invoke handler (thumb mode) .pool - .code 16 - .thumb_func + .code 16 + .thumb_func IRQ_10T: -10: ldr r2,=15f - bx r2 // switch back to ARM mode +10: ldr r2,=15f + bx r2 // switch back to ARM mode .pool - .code 32 + .code 32 15: IRQ_15A: #else - mov lr,pc // invoke handler (call indirect - mov pc,v3 // thru v3) + mov lr,pc // invoke handler (call indirect + mov pc,v3 // thru v3) #endif -#ifdef CYGIMP_HAL_COMMON_INTERRUPTS_IGNORE_SPURIOUS +#ifdef CYGIMP_HAL_COMMON_INTERRUPTS_IGNORE_SPURIOUS spurious_IRQ: -#endif // CYGIMP_HAL_COMMON_INTERRUPTS_IGNORE_SPURIOUS +#endif // CYGIMP_HAL_COMMON_INTERRUPTS_IGNORE_SPURIOUS #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK - // If we are returning from the last nested interrupt, move back - // to the thread stack. interrupt_end() must be called on the - // thread stack since it potentially causes a context switch. - ldr r2,.irq_level - ldr r3,[r2] - subs r1,r3,#1 - str r1,[r2] - ldreq sp,[sp] // This should be the saved stack pointer + // If we are returning from the last nested interrupt, move back + // to the thread stack. interrupt_end() must be called on the + // thread stack since it potentially causes a context switch. + ldr r2,.irq_level + ldr r3,[r2] + subs r1,r3,#1 + str r1,[r2] + ldreq sp,[sp] // This should be the saved stack pointer #endif #ifdef CYGFUN_HAL_COMMON_KERNEL_SUPPORT - // The return value from the handler (in r0) will indicate whether a - // DSR is to be posted. Pass this together with a pointer to the - // interrupt object we have just used to the interrupt tidy up routine. + // The return value from the handler (in r0) will indicate whether a + // DSR is to be posted. Pass this together with a pointer to the + // interrupt object we have just used to the interrupt tidy up routine. - ldr r1,.hal_interrupt_objects - ldr r1,[r1,v1,lsl #2] - mov r2,v6 // register frame -#ifdef __thumb__ -// Switch to thumb mode - ldr r3,=10f+1 - bx r3 - .pool - .code 16 - .thumb_func -10: -IRQ_20T: -#endif - bl interrupt_end // post any bottom layer handler + ldr r1,.hal_interrupt_objects + ldr r1,[r1,v1,lsl #2] + mov r2,v6 // register frame + + THUMB_MODE(r3,10) + + bl interrupt_end // post any bottom layer handler // threads and call scheduler #endif -#ifdef __thumb__ -// Switch to ARM mode - ldr r1,=10f - bx r1 - .pool - .code 32 -10: -IRQ_20A: -#endif + ARM_MODE(r1,10) + +// mov r0,sp +// bl show_frame_out -// mov r0,sp -// bl show_frame_out + mov ip,sp // get stack pointer - mov ip,sp // get stack pointer - - mrs r0,cpsr // move back to IRQ mode - orr r0,r0,#CPSR_IRQ_DISABLE|CPSR_FIQ_DISABLE - msr cpsr,r0 + mrs r0,cpsr // move back to IRQ mode + orr r0,r0,#CPSR_IRQ_DISABLE|CPSR_FIQ_DISABLE + msr cpsr,r0 nop nop - ldr lr,[ip,#armreg_lr] - ldr sp,[sp,#armreg_sp] + ldr lr,[ip,#armreg_lr] + ldr sp,[sp,#armreg_sp] - bic r0,r0,#CPSR_MODE_BITS - orr r0,r0,#CPSR_IRQ_MODE - msr cpsr,r0 + bic r0,r0,#CPSR_MODE_BITS + orr r0,r0,#CPSR_IRQ_MODE + msr cpsr,r0 - mov sp,ip - ldr lr,[sp,#armreg_pc] - ldr r0,[sp,#armreg_cpsr] - ldr ip,[sp,#armreg_ip] - msr spsr,r0 - ldmfd sp,{r0-r10,fp} - movs pc,lr // restore PC from LR, CPSR from SPSR + mov sp,ip + ldr lr,[sp,#armreg_pc] + ldr r0,[sp,#armreg_cpsr] + ldr ip,[sp,#armreg_ip] + msr spsr,r0 + ldmfd sp,{r0-r10,fp} + movs pc,lr // restore PC from LR, CPSR from SPSR #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK // Execute pending DSRs the interrupt stack // Note: this can only be called from code running on a thread stack - .global hal_interrupt_stack_call_pending_DSRs -#ifdef __thumb__ - .code 16 - .thumb_func -#endif -hal_interrupt_stack_call_pending_DSRs: -#ifdef __thumb__ - ldr r1,=10f - bx r1 - .pool - .code 32 -10: -hal_interrupt_stack_call_pending_DSRs_ARM: -#endif - stmfd sp!,{r4,r5,lr} - // Disable interrupts - mrs r4,cpsr // disable IRQ's - orr r2,r4,#CPSR_IRQ_DISABLE|CPSR_FIQ_DISABLE - bic r5,r4,#CPSR_IRQ_DISABLE|CPSR_FIQ_DISABLE - msr cpsr,r2 - // Switch to interrupt stack - mov r3,sp // save old stack pointer - ldr sp,.__interrupt_stack - stmfd sp!,{r3} // stored at top of interrupt stack - ldr r2,.irq_level // current number of nested interrupts - ldr r3,[r2] - add r3,r3,#1 // bump nesting level - str r3,[r2] - msr cpsr,r5 // enable interrupts +FUNC_START_ARM(hal_interrupt_stack_call_pending_DSRs, r1) + stmfd sp!,{r4,r5,lr} + // Disable interrupts + mrs r4,cpsr // disable IRQ's + orr r2,r4,#CPSR_IRQ_DISABLE|CPSR_FIQ_DISABLE + bic r5,r4,#CPSR_IRQ_DISABLE|CPSR_FIQ_DISABLE + msr cpsr,r2 + // Switch to interrupt stack + mov r3,sp // save old stack pointer + ldr sp,.__interrupt_stack + stmfd sp!,{r3} // stored at top of interrupt stack + ldr r2,.irq_level // current number of nested interrupts + ldr r3,[r2] + add r3,r3,#1 // bump nesting level + str r3,[r2] + msr cpsr,r5 // enable interrupts + + THUMB_MODE(r1,20) + + bl cyg_interrupt_call_pending_DSRs + + + ARM_MODE(r1,22) + + // Disable interrupts + mrs r1,cpsr // disable IRQ's + orr r2,r1,#CPSR_IRQ_DISABLE|CPSR_FIQ_DISABLE + msr cpsr,r2 + + // Move back to the thread stack. + ldr r2,.irq_level + ldr r3,[r2] + sub r3,r3,#1 // decrement nesting level + str r3,[r2] + ldr sp,[sp] // This should be the saved stack pointer + msr cpsr,r4 // restore interrupts to original state #ifdef __thumb__ - ldr r1,=20f+1 - bx r1 - .pool - .code 16 - .thumb_func -20: -#endif - bl cyg_interrupt_call_pending_DSRs -#ifdef __thumb__ - ldr r1,=22f - bx r1 - .pool - .code 32 -22: -#endif - - // Disable interrupts - mrs r1,cpsr // disable IRQ's - orr r2,r1,#CPSR_IRQ_DISABLE|CPSR_FIQ_DISABLE - msr cpsr,r2 - - // Move back to the thread stack. - ldr r2,.irq_level - ldr r3,[r2] - sub r3,r3,#1 // decrement nesting level - str r3,[r2] - ldr sp,[sp] // This should be the saved stack pointer - msr cpsr,r4 // restore interrupts to original state - -#ifdef __thumb__ - ldmfd sp!,{r4,r5,lr} // return - bx lr + ldmfd sp!,{r4,r5,lr} // return + bx lr #else - ldmfd sp!,{r4,r5,pc} // return + ldmfd sp!,{r4,r5,pc} // return #endif // __thumb__ #endif // CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK // Thumb-only support functions #ifdef __thumb__ - .global hal_disable_interrupts - .code 16 - .thumb_func -hal_disable_interrupts: - ldr r1,=hal_disable_interrupts_ARM - bx r1 // switch to 32 bit mode - .pool - .code 32 -hal_disable_interrupts_ARM: + +FUNC_START_ARM(hal_disable_interrupts, r1) mrs r0,cpsr // current state orr r1,r0,#0xC0 // mask both FIQ and IRQ msr cpsr,r1 bx lr // exit, _old_ in r0 - .global hal_enable_interrupts - .code 16 - .thumb_func -hal_enable_interrupts: - ldr r1,=hal_enable_interrupts_ARM - bx r1 // switch to 32 bit mode - .pool - .code 32 -hal_enable_interrupts_ARM: +FUNC_START_ARM(hal_enable_interrupts, r1) mrs r0,cpsr // current state bic r1,r0,#0xC0 // mask both FIQ and IRQ msr cpsr,r1 bx lr // exit - .global hal_restore_interrupts - .code 16 - .thumb_func -hal_restore_interrupts: - ldr r1,=hal_restore_interrupts_ARM - bx r1 // switch to 32 bit mode - .pool - .code 32 -hal_restore_interrupts_ARM: +FUNC_START_ARM(hal_restore_interrupts, r1) mrs r1,cpsr // current state bic r1,r1,#0xC0 // mask out FIQ/IRQ bits and r0,r0,#0xC0 // keep only FIQ/IRQ @@ -890,15 +830,7 @@ hal_restore_interrupts_ARM: msr cpsr,r1 bx lr // exit - .global hal_query_interrupts - .code 16 - .thumb_func -hal_query_interrupts: - ldr r1,=hal_query_interrupts_ARM - bx r1 // switch to 32 bit mode - .pool - .code 32 -hal_query_interrupts_ARM: +FUNC_START_ARM(hal_query_interrupts, r1) mrs r0,cpsr // current state bx lr // exit, state in r0 @@ -906,43 +838,39 @@ hal_query_interrupts_ARM: // Dummy/support functions - .global __gccmain - .global _psr - .global _sp + .global __gccmain + .global _psr + .global _sp #ifdef __thumb__ .code 16 .thumb_func __gccmain: - bx lr + bx lr .code 16 .thumb_func _psr: - ldr r1,=_psr_ARM - bx r1 - .pool - .code 32 -_psr_ARM: - mrs r0,cpsr + ARM_MODE(r1,10) + mrs r0,cpsr bx lr .code 16 .thumb_func _sp: - mov r0,sp - bx lr + mov r0,sp + bx lr #else __gccmain: - mov pc,lr + mov pc,lr _psr: - mrs r0,cpsr - mov pc,lr + mrs r0,cpsr + mov pc,lr _sp: - mov r0,sp - mov pc,lr + mov r0,sp + mov pc,lr #endif @@ -979,7 +907,7 @@ PTR(__interrupt_stack) // // Identification - useful to find out when a system was configured _eCos_id: - .asciz "eCos : " __DATE__ + .asciz "eCos : " __DATE__ // ------------------------------------------------------------------------- @@ -991,30 +919,30 @@ PTR(__interrupt_stack) // generated by magic without proper dependencies in arm.inc // Recompiling will not DTRT without manual intervention. - .data + .data init_flag: - .long 0 + .long 0 - .extern hal_default_isr + .extern hal_default_isr - .globl hal_interrupt_handlers + .globl hal_interrupt_handlers hal_interrupt_handlers: - .rept CYGNUM_HAL_ISR_COUNT - .long hal_default_isr - .endr + .rept CYGNUM_HAL_ISR_COUNT + .long hal_default_isr + .endr - .globl hal_interrupt_data + .globl hal_interrupt_data hal_interrupt_data: - .rept CYGNUM_HAL_ISR_COUNT - .long 0 - .endr + .rept CYGNUM_HAL_ISR_COUNT + .long 0 + .endr - .globl hal_interrupt_objects + .globl hal_interrupt_objects hal_interrupt_objects: - .rept CYGNUM_HAL_ISR_COUNT - .long 0 - .endr + .rept CYGNUM_HAL_ISR_COUNT + .long 0 + .endr // ------------------------------------------------------------------------- // Temporary interrupt stack @@ -1041,30 +969,30 @@ hal_interrupt_objects: #define CYGNUM_HAL_COMMON_INTERRUPTS_STACK_SIZE 4096 #endif #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK - .balign 16 - .global cyg_interrupt_stack_base + .balign 16 + .global cyg_interrupt_stack_base cyg_interrupt_stack_base: __interrupt_stack_base: .rept CYGNUM_HAL_COMMON_INTERRUPTS_STACK_SIZE .byte 0 .endr - .balign 16 - .global cyg_interrupt_stack + .balign 16 + .global cyg_interrupt_stack cyg_interrupt_stack: __interrupt_stack: irq_level: - .long 0 + .long 0 #endif #ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS - .balign 16 + .balign 16 __GDB_stack_base: .rept 0x400 .byte 0 .endr __GDB_stack: #endif - .balign 16 + .balign 16 __startup_stack_base: #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK .rept 512 @@ -1073,7 +1001,7 @@ irq_level: #endif .byte 0 .endr - .balign 16 + .balign 16 __startup_stack: #ifdef PLATFORM_EXTRAS
