| /* | |
| * 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 | |