diff options
Diffstat (limited to 'arch/unicore32/include/asm/assembler.h')
| -rw-r--r-- | arch/unicore32/include/asm/assembler.h | 131 | 
1 files changed, 131 insertions, 0 deletions
diff --git a/arch/unicore32/include/asm/assembler.h b/arch/unicore32/include/asm/assembler.h new file mode 100644 index 00000000000..8e87ed7faeb --- /dev/null +++ b/arch/unicore32/include/asm/assembler.h @@ -0,0 +1,131 @@ +/* + * linux/arch/unicore32/include/asm/assembler.h + * + * Code specific to PKUnity SoC and UniCore ISA + * + * Copyright (C) 2001-2010 GUAN Xue-tao + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + *  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 + +#include <asm/ptrace.h> + +/* + * Little Endian independent macros for shifting bytes within registers. + */ +#define pull            >> +#define push            << +#define get_byte_0      << #0 +#define get_byte_1	>> #8 +#define get_byte_2	>> #16 +#define get_byte_3	>> #24 +#define put_byte_0      << #0 +#define put_byte_1	<< #8 +#define put_byte_2	<< #16 +#define put_byte_3	<< #24 + +#define cadd		cmpadd +#define cand		cmpand +#define csub		cmpsub +#define cxor		cmpxor + +/* + * Enable and disable interrupts + */ +	.macro disable_irq, temp +	mov	\temp, asr +	andn     \temp, \temp, #0xFF +	or	\temp, \temp, #PSR_I_BIT | PRIV_MODE +	mov.a	asr, \temp +	.endm + +	.macro enable_irq, temp +	mov	\temp, asr +	andn     \temp, \temp, #0xFF +	or	\temp, \temp, #PRIV_MODE +	mov.a	asr, \temp +	.endm + +#define USER(x...)				\ +9999:	x;					\ +	.pushsection __ex_table, "a";		\ +	.align	3;				\ +	.long	9999b, 9001f;			\ +	.popsection + +	.macro	notcond, cond, nexti = .+8 +	.ifc	\cond, eq +		bne	\nexti +	.else;	.ifc	\cond, ne +		beq	\nexti +	.else;	.ifc	\cond, ea +		bub	\nexti +	.else;	.ifc	\cond, ub +		bea	\nexti +	.else;	.ifc	\cond, fs +		bns	\nexti +	.else;	.ifc	\cond, ns +		bfs	\nexti +	.else;	.ifc	\cond, fv +		bnv	\nexti +	.else;	.ifc	\cond, nv +		bfv	\nexti +	.else;	.ifc	\cond, ua +		beb	\nexti +	.else;	.ifc	\cond, eb +		bua	\nexti +	.else;	.ifc	\cond, eg +		bsl	\nexti +	.else;	.ifc	\cond, sl +		beg	\nexti +	.else;	.ifc	\cond, sg +		bel	\nexti +	.else;	.ifc	\cond, el +		bsg	\nexti +	.else;	.ifnc	\cond, al +		.error  "Unknown cond in notcond macro argument" +	.endif;	.endif;	.endif;	.endif;	.endif;	.endif;	.endif +	.endif;	.endif;	.endif;	.endif;	.endif;	.endif;	.endif +	.endif +	.endm + +	.macro	usracc, instr, reg, ptr, inc, cond, rept, abort +	.rept	\rept +	notcond	\cond, .+8 +9999 : +	.if	\inc == 1 +	\instr\()b.u \reg, [\ptr], #\inc +	.elseif	\inc == 4 +	\instr\()w.u \reg, [\ptr], #\inc +	.else +	.error	"Unsupported inc macro argument" +	.endif + +	.pushsection __ex_table, "a" +	.align	3 +	.long	9999b, \abort +	.popsection +	.endr +	.endm + +	.macro	strusr, reg, ptr, inc, cond = al, rept = 1, abort = 9001f +	usracc	st, \reg, \ptr, \inc, \cond, \rept, \abort +	.endm + +	.macro	ldrusr, reg, ptr, inc, cond = al, rept = 1, abort = 9001f +	usracc	ld, \reg, \ptr, \inc, \cond, \rept, \abort +	.endm + +	.macro	nop8 +	.rept	8 +		nop +	.endr +	.endm  | 
