Blame view

include/asm-arm26/assembler.h 2.03 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
  /*
f30c22695   Uwe Zeisberger   fix file specific...
2
   * linux/include/asm-arm26/assembler.h
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
   *
   * This file contains arm architecture specific defines
   * for the different processors.
   *
   * 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
  
  /*
   * Endian independent macros for shifting bytes within registers.
   */
  #define pull            lsr
  #define push            lsl
  #define byte(x)         (x*8)
  
  #ifdef __STDC__
  #define LOADREGS(cond, base, reglist...)\
  	ldm##cond	base,reglist^
  
  #define RETINSTR(instr, regs...)\
  	instr##s	regs
  #else
  #define LOADREGS(cond, base, reglist...)\
  	ldm/**/cond	base,reglist^
  
  #define RETINSTR(instr, regs...)\
  	instr/**/s	regs
  #endif
  
  #define MODENOP\
  	mov	r0, r0
  
  #define MODE(savereg,tmpreg,mode) \
  	mov	savereg, pc; \
  	bic	tmpreg, savereg, $0x0c000003; \
  	orr	tmpreg, tmpreg, $mode; \
  	teqp	tmpreg, $0
  
  #define RESTOREMODE(savereg) \
  	teqp	savereg, $0
  
  #define SAVEIRQS(tmpreg)
  
  #define RESTOREIRQS(tmpreg)
  
  #define DISABLEIRQS(tmpreg)\
  	teqp	pc, $0x08000003
  
  #define ENABLEIRQS(tmpreg)\
  	teqp	pc, $0x00000003
  
  #define USERMODE(tmpreg)\
  	teqp	pc, $0x00000000;\
  	mov	r0, r0
  
  #define SVCMODE(tmpreg)\
  	teqp	pc, $0x00000003;\
  	mov	r0, r0
  
  
  /*
   * Save the current IRQ state and disable IRQs
   * Note that this macro assumes FIQs are enabled, and
   * that the processor is in SVC mode.
   */
  	.macro	save_and_disable_irqs, oldcpsr, temp
    mov \oldcpsr, pc
    orr \temp, \oldcpsr, #0x08000000
    teqp \temp, #0
    .endm
  
  /*
   * Restore interrupt state previously stored in
   * a register
   * ** Actually do nothing on Arc - hope that the caller uses a MOVS PC soon
   * after!
   */
  	.macro	restore_irqs, oldcpsr
    @ This be restore_irqs
    .endm
  
  /*
   * These two are used to save LR/restore PC over a user-based access.
   * The old 26-bit architecture requires that we save lr (R14)
   */
  	.macro	save_lr
  	str	lr, [sp, #-4]!
  	.endm
  
  	.macro	restore_pc
  	ldmfd	sp!, {pc}^
  	.endm
  
  #define USER(x...)				\
  9999:	x;					\
  	.section __ex_table,"a";		\
  	.align	3;				\
  	.long	9999b,9001f;			\
  	.previous