2005-04-16 15:20:36 -07:00
/*
2006-10-03 23:01:26 +02:00
* linux / include / asm - arm26 / assembler . h
2005-04-16 15:20:36 -07:00
*
* This file contains arm architecture specific defines
* for the different processors .
*
* Do not include any C declarations in this file - it is included by
* assembler source .
*/
# ifndef __ASSEMBLY__
# error "Only include this from assembly code"
# endif
/*
* Endian independent macros for shifting bytes within registers .
*/
# define pull lsr
# define push lsl
# define byte(x) (x*8)
# ifdef __STDC__
# define LOADREGS(cond, base, reglist...)\
ldm # # cond base , reglist ^
# define RETINSTR(instr, regs...)\
instr # # s regs
# else
# define LOADREGS(cond, base, reglist...)\
ldm /**/ cond base , reglist ^
# define RETINSTR(instr, regs...)\
instr /**/ s regs
# endif
# define MODENOP\
mov r0 , r0
# define MODE(savereg,tmpreg,mode) \
mov savereg , pc ; \
bic tmpreg , savereg , $ 0x0c000003 ; \
orr tmpreg , tmpreg , $ mode ; \
teqp tmpreg , $ 0
# define RESTOREMODE(savereg) \
teqp savereg , $ 0
# define SAVEIRQS(tmpreg)
# define RESTOREIRQS(tmpreg)
# define DISABLEIRQS(tmpreg)\
teqp pc , $ 0x08000003
# define ENABLEIRQS(tmpreg)\
teqp pc , $ 0x00000003
# define USERMODE(tmpreg)\
teqp pc , $ 0x00000000 ; \
mov r0 , r0
# define SVCMODE(tmpreg)\
teqp pc , $ 0x00000003 ; \
mov r0 , r0
/*
* Save the current IRQ state and disable IRQs
* Note that this macro assumes FIQs are enabled , and
* that the processor is in SVC mode .
*/
. macro save_and_disable_irqs , oldcpsr , temp
mov \ oldcpsr , pc
orr \ temp , \ oldcpsr , # 0x08000000
teqp \ temp , # 0
. endm
/*
* Restore interrupt state previously stored in
* a register
* * * Actually do nothing on Arc - hope that the caller uses a MOVS PC soon
* after !
*/
. macro restore_irqs , oldcpsr
@ This be restore_irqs
. endm
/*
* These two are used to save LR / restore PC over a user - based access .
* The old 26 - bit architecture requires that we save lr ( R14 )
*/
. macro save_lr
str lr , [ sp , # - 4 ] !
. endm
. macro restore_pc
ldmfd sp ! , { pc } ^
. endm
# define USER(x...) \
9999 : x ; \
. section __ex_table , " a " ; \
. align 3 ; \
. long 9999 b , 9001f ; \
. previous