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