blob: 2bc162e0ec6eb3bd02c685d80e99c24762a002b7 [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
Roland McGrathd4d67152008-07-09 02:38:07 -0700107 .macro LOAD_ARGS offset, skiprax=0
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
Roland McGrathd4d67152008-07-09 02:38:07 -0700116 .if \skiprax
117 .else
Ingo Molnar0c2bd5a2008-01-30 13:32:49 +0100118 movq \offset+72(%rsp), %rax
Roland McGrathd4d67152008-07-09 02:38:07 -0700119 .endif
Linus Torvalds1da177e2005-04-16 15:20:36 -0700120 .endm
Ingo Molnar0c2bd5a2008-01-30 13:32:49 +0100121
122#define REST_SKIP 6*8
123
Linus Torvalds1da177e2005-04-16 15:20:36 -0700124 .macro SAVE_REST
Ingo Molnar0c2bd5a2008-01-30 13:32:49 +0100125 subq $REST_SKIP, %rsp
Linus Torvalds1da177e2005-04-16 15:20:36 -0700126 CFI_ADJUST_CFA_OFFSET REST_SKIP
Ingo Molnar0c2bd5a2008-01-30 13:32:49 +0100127 movq %rbx, 5*8(%rsp)
128 CFI_REL_OFFSET rbx, 5*8
129 movq %rbp, 4*8(%rsp)
130 CFI_REL_OFFSET rbp, 4*8
131 movq %r12, 3*8(%rsp)
132 CFI_REL_OFFSET r12, 3*8
133 movq %r13, 2*8(%rsp)
134 CFI_REL_OFFSET r13, 2*8
135 movq %r14, 1*8(%rsp)
136 CFI_REL_OFFSET r14, 1*8
137 movq %r15, (%rsp)
138 CFI_REL_OFFSET r15, 0*8
139 .endm
Linus Torvalds1da177e2005-04-16 15:20:36 -0700140
141 .macro RESTORE_REST
Ingo Molnar0c2bd5a2008-01-30 13:32:49 +0100142 movq (%rsp), %r15
Jan Beulich7effaa82005-09-12 18:49:24 +0200143 CFI_RESTORE r15
Ingo Molnar0c2bd5a2008-01-30 13:32:49 +0100144 movq 1*8(%rsp), %r14
Jan Beulich7effaa82005-09-12 18:49:24 +0200145 CFI_RESTORE r14
Ingo Molnar0c2bd5a2008-01-30 13:32:49 +0100146 movq 2*8(%rsp), %r13
Jan Beulich7effaa82005-09-12 18:49:24 +0200147 CFI_RESTORE r13
Ingo Molnar0c2bd5a2008-01-30 13:32:49 +0100148 movq 3*8(%rsp), %r12
Jan Beulich7effaa82005-09-12 18:49:24 +0200149 CFI_RESTORE r12
Ingo Molnar0c2bd5a2008-01-30 13:32:49 +0100150 movq 4*8(%rsp), %rbp
Jan Beulich7effaa82005-09-12 18:49:24 +0200151 CFI_RESTORE rbp
Ingo Molnar0c2bd5a2008-01-30 13:32:49 +0100152 movq 5*8(%rsp), %rbx
Jan Beulich7effaa82005-09-12 18:49:24 +0200153 CFI_RESTORE rbx
Ingo Molnar0c2bd5a2008-01-30 13:32:49 +0100154 addq $REST_SKIP, %rsp
Linus Torvalds1da177e2005-04-16 15:20:36 -0700155 CFI_ADJUST_CFA_OFFSET -(REST_SKIP)
156 .endm
Ingo Molnar0c2bd5a2008-01-30 13:32:49 +0100157
Linus Torvalds1da177e2005-04-16 15:20:36 -0700158 .macro SAVE_ALL
159 SAVE_ARGS
160 SAVE_REST
161 .endm
Ingo Molnar0c2bd5a2008-01-30 13:32:49 +0100162
Linus Torvalds1da177e2005-04-16 15:20:36 -0700163 .macro RESTORE_ALL addskip=0
164 RESTORE_REST
Ingo Molnar0c2bd5a2008-01-30 13:32:49 +0100165 RESTORE_ARGS 0, \addskip
Linus Torvalds1da177e2005-04-16 15:20:36 -0700166 .endm
167
168 .macro icebp
169 .byte 0xf1
170 .endm