1 /* 2 * linux/arch/unicore32/include/asm/assembler.h 3 * 4 * Code specific to PKUnity SoC and UniCore ISA 5 * 6 * Copyright (C) 2001-2010 GUAN Xue-tao 7 * 8 * This program is free software; you can redistribute it and/or modify 9 * it under the terms of the GNU General Public License version 2 as 10 * published by the Free Software Foundation. 11 * 12 * Do not include any C declarations in this file - it is included by 13 * assembler source. 14 */ 15 #ifndef __ASSEMBLY__ 16 #error "Only include this from assembly code" 17 #endif 18 19 #include <asm/ptrace.h> 20 21 /* 22 * Little Endian independent macros for shifting bytes within registers. 23 */ 24 #define pull >> 25 #define push << 26 #define get_byte_0 << #0 27 #define get_byte_1 >> #8 28 #define get_byte_2 >> #16 29 #define get_byte_3 >> #24 30 #define put_byte_0 << #0 31 #define put_byte_1 << #8 32 #define put_byte_2 << #16 33 #define put_byte_3 << #24 34 35 #define cadd cmpadd 36 #define cand cmpand 37 #define csub cmpsub 38 #define cxor cmpxor 39 40 /* 41 * Enable and disable interrupts 42 */ 43 .macro disable_irq, temp 44 mov \temp, asr 45 andn \temp, \temp, #0xFF 46 or \temp, \temp, #PSR_I_BIT | PRIV_MODE 47 mov.a asr, \temp 48 .endm 49 50 .macro enable_irq, temp 51 mov \temp, asr 52 andn \temp, \temp, #0xFF 53 or \temp, \temp, #PRIV_MODE 54 mov.a asr, \temp 55 .endm 56 57 #define USER(x...) \ 58 9999: x; \ 59 .pushsection __ex_table, "a"; \ 60 .align 3; \ 61 .long 9999b, 9001f; \ 62 .popsection 63 64 .macro notcond, cond, nexti = .+8 65 .ifc \cond, eq 66 bne \nexti 67 .else; .ifc \cond, ne 68 beq \nexti 69 .else; .ifc \cond, ea 70 bub \nexti 71 .else; .ifc \cond, ub 72 bea \nexti 73 .else; .ifc \cond, fs 74 bns \nexti 75 .else; .ifc \cond, ns 76 bfs \nexti 77 .else; .ifc \cond, fv 78 bnv \nexti 79 .else; .ifc \cond, nv 80 bfv \nexti 81 .else; .ifc \cond, ua 82 beb \nexti 83 .else; .ifc \cond, eb 84 bua \nexti 85 .else; .ifc \cond, eg 86 bsl \nexti 87 .else; .ifc \cond, sl 88 beg \nexti 89 .else; .ifc \cond, sg 90 bel \nexti 91 .else; .ifc \cond, el 92 bsg \nexti 93 .else; .ifnc \cond, al 94 .error "Unknown cond in notcond macro argument" 95 .endif; .endif; .endif; .endif; .endif; .endif; .endif 96 .endif; .endif; .endif; .endif; .endif; .endif; .endif 97 .endif 98 .endm 99 100 .macro usracc, instr, reg, ptr, inc, cond, rept, abort 101 .rept \rept 102 notcond \cond, .+8 103 9999 : 104 .if \inc == 1 105 \instr\()b.u \reg, [\ptr], #\inc 106 .elseif \inc == 4 107 \instr\()w.u \reg, [\ptr], #\inc 108 .else 109 .error "Unsupported inc macro argument" 110 .endif 111 112 .pushsection __ex_table, "a" 113 .align 3 114 .long 9999b, \abort 115 .popsection 116 .endr 117 .endm 118 119 .macro strusr, reg, ptr, inc, cond = al, rept = 1, abort = 9001f 120 usracc st, \reg, \ptr, \inc, \cond, \rept, \abort 121 .endm 122 123 .macro ldrusr, reg, ptr, inc, cond = al, rept = 1, abort = 9001f 124 usracc ld, \reg, \ptr, \inc, \cond, \rept, \abort 125 .endm 126 127 .macro nop8 128 .rept 8 129 nop 130 .endr 131 .endm 132