106 lines · 2.0 KB · C
RawDownload
/* * linux/include/asm-arm26/assembler.h * * 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	9999b,9001f;			\	.previous