blob: f13e62e2cb3e75160297459ef182921b170d0850 [file] [log] [blame]
Ingo Molnar0c2bd5a2008-01-30 13:32:49 +01001/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002 * Some macros to handle stack frames in assembly.
Ingo Molnar0c2bd5a2008-01-30 13:32:49 +01003 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07004
Ingo Molnar0c2bd5a2008-01-30 13:32:49 +01005#define R15 0
6#define R14 8
7#define R13 16
8#define R12 24
9#define RBP 32
10#define RBX 40
Linus Torvalds1da177e2005-04-16 15:20:36 -070011
Linus Torvalds1da177e2005-04-16 15:20:36 -070012/* arguments: interrupts/non tracing syscalls only save upto here*/
Ingo Molnar0c2bd5a2008-01-30 13:32:49 +010013#define R11 48
14#define R10 56
15#define R9 64
16#define R8 72
17#define RAX 80
18#define RCX 88
19#define RDX 96
20#define RSI 104
21#define RDI 112
22#define ORIG_RAX 120 /* + error_code */
23/* end of arguments */
Linus Torvalds1da177e2005-04-16 15:20:36 -070024
Ingo Molnar0c2bd5a2008-01-30 13:32:49 +010025/* cpu exception frame or undefined in case of fast syscall. */
26#define RIP 128
27#define CS 136
28#define EFLAGS 144
29#define RSP 152
30#define SS 160
31
32#define ARGOFFSET R11
33#define SWFRAME ORIG_RAX
34
35 .macro SAVE_ARGS addskip=0, norcx=0, nor891011=0
36 subq $9*8+\addskip, %rsp
Linus Torvalds1da177e2005-04-16 15:20:36 -070037 CFI_ADJUST_CFA_OFFSET 9*8+\addskip
Ingo Molnar0c2bd5a2008-01-30 13:32:49 +010038 movq %rdi, 8*8(%rsp)
39 CFI_REL_OFFSET rdi, 8*8
40 movq %rsi, 7*8(%rsp)
41 CFI_REL_OFFSET rsi, 7*8
42 movq %rdx, 6*8(%rsp)
43 CFI_REL_OFFSET rdx, 6*8
Linus Torvalds1da177e2005-04-16 15:20:36 -070044 .if \norcx
45 .else
Ingo Molnar0c2bd5a2008-01-30 13:32:49 +010046 movq %rcx, 5*8(%rsp)
47 CFI_REL_OFFSET rcx, 5*8
Linus Torvalds1da177e2005-04-16 15:20:36 -070048 .endif
Ingo Molnar0c2bd5a2008-01-30 13:32:49 +010049 movq %rax, 4*8(%rsp)
50 CFI_REL_OFFSET rax, 4*8
Linus Torvalds1da177e2005-04-16 15:20:36 -070051 .if \nor891011
52 .else
Ingo Molnar0c2bd5a2008-01-30 13:32:49 +010053 movq %r8, 3*8(%rsp)
54 CFI_REL_OFFSET r8, 3*8
55 movq %r9, 2*8(%rsp)
56 CFI_REL_OFFSET r9, 2*8
57 movq %r10, 1*8(%rsp)
58 CFI_REL_OFFSET r10, 1*8
59 movq %r11, (%rsp)
60 CFI_REL_OFFSET r11, 0*8
Linus Torvalds1da177e2005-04-16 15:20:36 -070061 .endif
62 .endm
63
Ingo Molnar0c2bd5a2008-01-30 13:32:49 +010064#define ARG_SKIP 9*8
65
66 .macro RESTORE_ARGS skiprax=0, addskip=0, skiprcx=0, skipr11=0, \
67 skipr8910=0, skiprdx=0
Linus Torvalds1da177e2005-04-16 15:20:36 -070068 .if \skipr11
69 .else
Ingo Molnar0c2bd5a2008-01-30 13:32:49 +010070 movq (%rsp), %r11
Jan Beulich7effaa82005-09-12 18:49:24 +020071 CFI_RESTORE r11
Linus Torvalds1da177e2005-04-16 15:20:36 -070072 .endif
73 .if \skipr8910
74 .else
Ingo Molnar0c2bd5a2008-01-30 13:32:49 +010075 movq 1*8(%rsp), %r10
Jan Beulich7effaa82005-09-12 18:49:24 +020076 CFI_RESTORE r10
Ingo Molnar0c2bd5a2008-01-30 13:32:49 +010077 movq 2*8(%rsp), %r9
Jan Beulich7effaa82005-09-12 18:49:24 +020078 CFI_RESTORE r9
Ingo Molnar0c2bd5a2008-01-30 13:32:49 +010079 movq 3*8(%rsp), %r8
Jan Beulich7effaa82005-09-12 18:49:24 +020080 CFI_RESTORE r8
Linus Torvalds1da177e2005-04-16 15:20:36 -070081 .endif
82 .if \skiprax
83 .else
Ingo Molnar0c2bd5a2008-01-30 13:32:49 +010084 movq 4*8(%rsp), %rax
Jan Beulich7effaa82005-09-12 18:49:24 +020085 CFI_RESTORE rax
Linus Torvalds1da177e2005-04-16 15:20:36 -070086 .endif
87 .if \skiprcx
88 .else
Ingo Molnar0c2bd5a2008-01-30 13:32:49 +010089 movq 5*8(%rsp), %rcx
Jan Beulich7effaa82005-09-12 18:49:24 +020090 CFI_RESTORE rcx
Linus Torvalds1da177e2005-04-16 15:20:36 -070091 .endif
92 .if \skiprdx
93 .else
Ingo Molnar0c2bd5a2008-01-30 13:32:49 +010094 movq 6*8(%rsp), %rdx
Jan Beulich7effaa82005-09-12 18:49:24 +020095 CFI_RESTORE rdx
Linus Torvalds1da177e2005-04-16 15:20:36 -070096 .endif
Ingo Molnar0c2bd5a2008-01-30 13:32:49 +010097 movq 7*8(%rsp), %rsi
Jan Beulich7effaa82005-09-12 18:49:24 +020098 CFI_RESTORE rsi
Ingo Molnar0c2bd5a2008-01-30 13:32:49 +010099 movq 8*8(%rsp), %rdi
Jan Beulich7effaa82005-09-12 18:49:24 +0200100 CFI_RESTORE rdi
Linus Torvalds1da177e2005-04-16 15:20:36 -0700101 .if ARG_SKIP+\addskip > 0
Ingo Molnar0c2bd5a2008-01-30 13:32:49 +0100102 addq $ARG_SKIP+\addskip, %rsp
Linus Torvalds1da177e2005-04-16 15:20:36 -0700103 CFI_ADJUST_CFA_OFFSET -(ARG_SKIP+\addskip)
104 .endif
Ingo Molnar0c2bd5a2008-01-30 13:32:49 +0100105 .endm
Linus Torvalds1da177e2005-04-16 15:20:36 -0700106
107 .macro LOAD_ARGS offset
Ingo Molnar0c2bd5a2008-01-30 13:32:49 +0100108 movq \offset(%rsp), %r11
109 movq \offset+8(%rsp), %r10
110 movq \offset+16(%rsp), %r9
111 movq \offset+24(%rsp), %r8
112 movq \offset+40(%rsp), %rcx
113 movq \offset+48(%rsp), %rdx
114 movq \offset+56(%rsp), %rsi
115 movq \offset+64(%rsp), %rdi
116 movq \offset+72(%rsp), %rax
Linus Torvalds1da177e2005-04-16 15:20:36 -0700117 .endm
Ingo Molnar0c2bd5a2008-01-30 13:32:49 +0100118
119#define REST_SKIP 6*8
120
Linus Torvalds1da177e2005-04-16 15:20:36 -0700121 .macro SAVE_REST
Ingo Molnar0c2bd5a2008-01-30 13:32:49 +0100122 subq $REST_SKIP, %rsp
Linus Torvalds1da177e2005-04-16 15:20:36 -0700123 CFI_ADJUST_CFA_OFFSET REST_SKIP
Ingo Molnar0c2bd5a2008-01-30 13:32:49 +0100124 movq %rbx, 5*8(%rsp)
125 CFI_REL_OFFSET rbx, 5*8
126 movq %rbp, 4*8(%rsp)
127 CFI_REL_OFFSET rbp, 4*8
128 movq %r12, 3*8(%rsp)
129 CFI_REL_OFFSET r12, 3*8
130 movq %r13, 2*8(%rsp)
131 CFI_REL_OFFSET r13, 2*8
132 movq %r14, 1*8(%rsp)
133 CFI_REL_OFFSET r14, 1*8
134 movq %r15, (%rsp)
135 CFI_REL_OFFSET r15, 0*8
136 .endm
Linus Torvalds1da177e2005-04-16 15:20:36 -0700137
138 .macro RESTORE_REST
Ingo Molnar0c2bd5a2008-01-30 13:32:49 +0100139 movq (%rsp), %r15
Jan Beulich7effaa82005-09-12 18:49:24 +0200140 CFI_RESTORE r15
Ingo Molnar0c2bd5a2008-01-30 13:32:49 +0100141 movq 1*8(%rsp), %r14
Jan Beulich7effaa82005-09-12 18:49:24 +0200142 CFI_RESTORE r14
Ingo Molnar0c2bd5a2008-01-30 13:32:49 +0100143 movq 2*8(%rsp), %r13
Jan Beulich7effaa82005-09-12 18:49:24 +0200144 CFI_RESTORE r13
Ingo Molnar0c2bd5a2008-01-30 13:32:49 +0100145 movq 3*8(%rsp), %r12
Jan Beulich7effaa82005-09-12 18:49:24 +0200146 CFI_RESTORE r12
Ingo Molnar0c2bd5a2008-01-30 13:32:49 +0100147 movq 4*8(%rsp), %rbp
Jan Beulich7effaa82005-09-12 18:49:24 +0200148 CFI_RESTORE rbp
Ingo Molnar0c2bd5a2008-01-30 13:32:49 +0100149 movq 5*8(%rsp), %rbx
Jan Beulich7effaa82005-09-12 18:49:24 +0200150 CFI_RESTORE rbx
Ingo Molnar0c2bd5a2008-01-30 13:32:49 +0100151 addq $REST_SKIP, %rsp
Linus Torvalds1da177e2005-04-16 15:20:36 -0700152 CFI_ADJUST_CFA_OFFSET -(REST_SKIP)
153 .endm
Ingo Molnar0c2bd5a2008-01-30 13:32:49 +0100154
Linus Torvalds1da177e2005-04-16 15:20:36 -0700155 .macro SAVE_ALL
156 SAVE_ARGS
157 SAVE_REST
158 .endm
Ingo Molnar0c2bd5a2008-01-30 13:32:49 +0100159
Linus Torvalds1da177e2005-04-16 15:20:36 -0700160 .macro RESTORE_ALL addskip=0
161 RESTORE_REST
Ingo Molnar0c2bd5a2008-01-30 13:32:49 +0100162 RESTORE_ARGS 0, \addskip
Linus Torvalds1da177e2005-04-16 15:20:36 -0700163 .endm
164
165 .macro icebp
166 .byte 0xf1
167 .endm
Ingo Molnar0c2bd5a2008-01-30 13:32:49 +0100168