1 /* 2 * linux/asm-arm/proc-armo/assembler.h 3 * 4 * Copyright (C) 1996 Russell King 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License version 2 as 8 * published by the Free Software Foundation. 9 * 10 * This file contains arm architecture specific defines 11 * for the different processors 12 */ 13 #define MODE_USR USR26_MODE 14 #define MODE_FIQ FIQ26_MODE 15 #define MODE_IRQ IRQ26_MODE 16 #define MODE_SVC SVC26_MODE 17 18 #define DEFAULT_FIQ MODE_FIQ 19 20 #ifdef __STDC__ 21 #define LOADREGS(cond, base, reglist...)\ 22 ldm##cond base,reglist^ 23 24 #define RETINSTR(instr, regs...)\ 25 instr##s regs 26 #else 27 #define LOADREGS(cond, base, reglist...)\ 28 ldm/**/cond base,reglist^ 29 30 #define RETINSTR(instr, regs...)\ 31 instr/**/s regs 32 #endif 33 34 #define MODENOP\ 35 mov r0, r0 36 37 #define MODE(savereg,tmpreg,mode) \ 38 mov savereg, pc; \ 39 bic tmpreg, savereg, $0x0c000003; \ 40 orr tmpreg, tmpreg, $mode; \ 41 teqp tmpreg, $0 42 43 #define RESTOREMODE(savereg) \ 44 teqp savereg, $0 45 46 #define SAVEIRQS(tmpreg) 47 48 #define RESTOREIRQS(tmpreg) 49 50 #define DISABLEIRQS(tmpreg)\ 51 teqp pc, $0x08000003 52 53 #define ENABLEIRQS(tmpreg)\ 54 teqp pc, $0x00000003 55 56 #define USERMODE(tmpreg)\ 57 teqp pc, $0x00000000;\ 58 mov r0, r0 59 60 #define SVCMODE(tmpreg)\ 61 teqp pc, $0x00000003;\ 62 mov r0, r0 63 64 65 /* 66 * Save the current IRQ state and disable IRQs 67 * Note that this macro assumes FIQs are enabled, and 68 * that the processor is in SVC mode. 69 */ 70 .macro save_and_disable_irqs, oldcpsr, temp 71 mov \oldcpsr, pc 72 orr \temp, \oldcpsr, #0x08000000 73 teqp \temp, #0 74 .endm 75 76 /* 77 * Restore interrupt state previously stored in 78 * a register 79 * ** Actually do nothing on Arc - hope that the caller uses a MOVS PC soon 80 * after! 81 */ 82 .macro restore_irqs, oldcpsr 83 @ This be restore_irqs 84 .endm 85 86 /* 87 * These two are used to save LR/restore PC over a user-based access. 88 * The old 26-bit architecture requires that we do. On 32-bit 89 * architecture, we can safely ignore this requirement. 90 */ 91 .macro save_lr 92 str lr, [sp, #-4]! 93 .endm 94 95 .macro restore_pc 96 ldmfd sp!, {pc}^ 97 .endm 98 99 #define USER(x...) \ 100 9999: x; \ 101 .section __ex_table,"a"; \ 102 .align 3; \ 103 .long 9999b,9001f; \ 104 .previous 105 106 107