1 /* 2 * Some macros to handle stack frames in assembly. 3 */ 4 5 #define R15 0 6 #define R14 8 7 #define R13 16 8 #define R12 24 9 #define RBP 32 10 #define RBX 40 11 12 /* arguments: interrupts/non tracing syscalls only save upto here*/ 13 #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 */ 24 25 /* 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 37 CFI_ADJUST_CFA_OFFSET 9*8+\addskip 38 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 44 .if \norcx 45 .else 46 movq %rcx, 5*8(%rsp) 47 CFI_REL_OFFSET rcx, 5*8 48 .endif 49 movq %rax, 4*8(%rsp) 50 CFI_REL_OFFSET rax, 4*8 51 .if \nor891011 52 .else 53 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 61 .endif 62 .endm 63 64 #define ARG_SKIP 9*8 65 66 .macro RESTORE_ARGS skiprax=0, addskip=0, skiprcx=0, skipr11=0, \ 67 skipr8910=0, skiprdx=0 68 .if \skipr11 69 .else 70 movq (%rsp), %r11 71 CFI_RESTORE r11 72 .endif 73 .if \skipr8910 74 .else 75 movq 1*8(%rsp), %r10 76 CFI_RESTORE r10 77 movq 2*8(%rsp), %r9 78 CFI_RESTORE r9 79 movq 3*8(%rsp), %r8 80 CFI_RESTORE r8 81 .endif 82 .if \skiprax 83 .else 84 movq 4*8(%rsp), %rax 85 CFI_RESTORE rax 86 .endif 87 .if \skiprcx 88 .else 89 movq 5*8(%rsp), %rcx 90 CFI_RESTORE rcx 91 .endif 92 .if \skiprdx 93 .else 94 movq 6*8(%rsp), %rdx 95 CFI_RESTORE rdx 96 .endif 97 movq 7*8(%rsp), %rsi 98 CFI_RESTORE rsi 99 movq 8*8(%rsp), %rdi 100 CFI_RESTORE rdi 101 .if ARG_SKIP+\addskip > 0 102 addq $ARG_SKIP+\addskip, %rsp 103 CFI_ADJUST_CFA_OFFSET -(ARG_SKIP+\addskip) 104 .endif 105 .endm 106 107 .macro LOAD_ARGS offset, skiprax=0 108 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 .if \skiprax 117 .else 118 movq \offset+72(%rsp), %rax 119 .endif 120 .endm 121 122 #define REST_SKIP 6*8 123 124 .macro SAVE_REST 125 subq $REST_SKIP, %rsp 126 CFI_ADJUST_CFA_OFFSET REST_SKIP 127 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 140 141 .macro RESTORE_REST 142 movq (%rsp), %r15 143 CFI_RESTORE r15 144 movq 1*8(%rsp), %r14 145 CFI_RESTORE r14 146 movq 2*8(%rsp), %r13 147 CFI_RESTORE r13 148 movq 3*8(%rsp), %r12 149 CFI_RESTORE r12 150 movq 4*8(%rsp), %rbp 151 CFI_RESTORE rbp 152 movq 5*8(%rsp), %rbx 153 CFI_RESTORE rbx 154 addq $REST_SKIP, %rsp 155 CFI_ADJUST_CFA_OFFSET -(REST_SKIP) 156 .endm 157 158 .macro SAVE_ALL 159 SAVE_ARGS 160 SAVE_REST 161 .endm 162 163 .macro RESTORE_ALL addskip=0 164 RESTORE_REST 165 RESTORE_ARGS 0, \addskip 166 .endm 167 168 .macro icebp 169 .byte 0xf1 170 .endm 171