at v5.2 2.6 kB view raw
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...) \ 559999: 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 1009999 : 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