134 lines
2.7 KiB
C
134 lines
2.7 KiB
C
/* macros to align and unalign the stack on 8 byte boundary for ABI compliance */
|
|
.macro stack_align, tempreg
|
|
/* make sure the stack is aligned */
|
|
mov \tempreg, sp
|
|
tst sp, #4
|
|
subeq sp, #4
|
|
push { \tempreg }
|
|
|
|
/* tempreg holds the original stack */
|
|
.endm
|
|
|
|
.macro stack_restore, tempreg
|
|
/* restore the potentially unaligned stack */
|
|
pop { \tempreg }
|
|
mov sp, \tempreg
|
|
.endm
|
|
|
|
/* save and disable the vfp unit */
|
|
.macro vfp_save, temp1
|
|
/* save old fpexc */
|
|
vmrs \temp1, fpexc
|
|
|
|
push { \temp1 }
|
|
|
|
/* hard disable the vfp unit */
|
|
bic \temp1, #(1<<30)
|
|
vmsr fpexc, \temp1
|
|
.endm
|
|
|
|
/* restore the vfp enable/disable state */
|
|
.macro vfp_restore, temp1
|
|
/* restore fpexc */
|
|
pop { \temp1 }
|
|
|
|
vmsr fpexc, \temp1
|
|
.endm
|
|
|
|
/* Save callee trashed registers.
|
|
* At exit r0 contains a pointer to the register frame.
|
|
*/
|
|
.macro save
|
|
/* save spsr and r14 onto the svc stack */
|
|
srsdb #0x13!
|
|
|
|
/* switch to svc mode, interrupts disabled */
|
|
cpsid i, #0x13
|
|
|
|
/* save callee trashed regs and lr */
|
|
push { r0-r3, r12, lr }
|
|
|
|
#if 0
|
|
#if (defined(__VFP_FP__) && !defined(__SOFTFP__))
|
|
/* save and disable the vfp unit */
|
|
vfp_save r0
|
|
#endif
|
|
#endif
|
|
|
|
/* make sure the stack is 8 byte aligned */
|
|
stack_align r0
|
|
|
|
/* r0 now holds the pointer to the original iframe (before alignment) */
|
|
.endm
|
|
|
|
.macro save_offset, offset
|
|
sub lr, \offset
|
|
save
|
|
.endm
|
|
|
|
.macro restore
|
|
/* undo the stack alignment we did before */
|
|
stack_restore r0
|
|
|
|
#if 0
|
|
#if (defined(__VFP_FP__) && !defined(__SOFTFP__))
|
|
/* restore the old state of the vfp unit */
|
|
vfp_restore r0
|
|
#endif
|
|
#endif
|
|
|
|
pop { r0-r3, r12, lr }
|
|
|
|
/* return to whence we came from */
|
|
rfeia sp!
|
|
.endm
|
|
|
|
/* Save all registers.
|
|
* At exit r0 contains a pointer to the register frame.
|
|
*/
|
|
.macro saveall
|
|
/* save spsr and r14 onto the svc stack */
|
|
srsdb #0x13!
|
|
|
|
/* switch to svc mode, interrupts disabled */
|
|
cpsid i,#0x13
|
|
|
|
/* save all regs */
|
|
push { r0-r12, lr }
|
|
|
|
#if 0
|
|
#if (defined(__VFP_FP__) && !defined(__SOFTFP__))
|
|
/* save and disable the vfp unit */
|
|
vfp_save r0
|
|
#endif
|
|
#endif
|
|
|
|
/* make sure the stack is 8 byte aligned */
|
|
stack_align r0
|
|
|
|
/* r0 now holds the pointer to the original iframe (before alignment) */
|
|
.endm
|
|
|
|
.macro saveall_offset, offset
|
|
sub lr, \offset
|
|
saveall
|
|
.endm
|
|
|
|
.macro restoreall
|
|
/* undo the stack alignment we did before */
|
|
stack_restore r0
|
|
|
|
#if 0
|
|
#if (defined(__VFP_FP__) && !defined(__SOFTFP__))
|
|
/* restore the old state of the vfp unit */
|
|
vfp_restore r0
|
|
#endif
|
|
#endif
|
|
|
|
pop { r0-r12, r14 }
|
|
|
|
/* return to whence we came from */
|
|
rfeia sp!
|
|
.endm
|
|
|