Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[PATCH] x86-64: Fix CFI information

Being the foundation for reliable stack unwinding, this fixes CFI unwind
annotations in many low-level x86_64 routines, plus a config option
(available to all architectures, and also present in the previously sent
patch adding such annotations to i386 code) to enable them separatly
rather than only along with adding full debug information.

Signed-off-by: Jan Beulich <jbeulich@novell.com>
Signed-off-by: Andi Kleen <ak@suse.de>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

authored by

Jan Beulich and committed by
Linus Torvalds
7effaa88 b3ab8382

+220 -69
+47 -4
arch/x86_64/ia32/ia32entry.S
··· 55 55 * with the int 0x80 path. 56 56 */ 57 57 ENTRY(ia32_sysenter_target) 58 - CFI_STARTPROC 58 + CFI_STARTPROC simple 59 + CFI_DEF_CFA rsp,0 60 + CFI_REGISTER rsp,rbp 59 61 swapgs 60 62 movq %gs:pda_kernelstack, %rsp 61 63 addq $(PDA_STACKOFFSET),%rsp 62 64 sti 63 65 movl %ebp,%ebp /* zero extension */ 64 66 pushq $__USER32_DS 67 + CFI_ADJUST_CFA_OFFSET 8 68 + /*CFI_REL_OFFSET ss,0*/ 65 69 pushq %rbp 70 + CFI_ADJUST_CFA_OFFSET 8 71 + CFI_REL_OFFSET rsp,0 66 72 pushfq 73 + CFI_ADJUST_CFA_OFFSET 8 74 + /*CFI_REL_OFFSET rflags,0*/ 67 75 movl $VSYSCALL32_SYSEXIT, %r10d 76 + CFI_REGISTER rip,r10 68 77 pushq $__USER32_CS 78 + CFI_ADJUST_CFA_OFFSET 8 79 + /*CFI_REL_OFFSET cs,0*/ 69 80 movl %eax, %eax 70 81 pushq %r10 82 + CFI_ADJUST_CFA_OFFSET 8 83 + CFI_REL_OFFSET rip,0 71 84 pushq %rax 85 + CFI_ADJUST_CFA_OFFSET 8 72 86 cld 73 87 SAVE_ARGS 0,0,1 74 88 /* no need to do an access_ok check here because rbp has been ··· 93 79 .previous 94 80 GET_THREAD_INFO(%r10) 95 81 testl $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SECCOMP),threadinfo_flags(%r10) 82 + CFI_REMEMBER_STATE 96 83 jnz sysenter_tracesys 97 84 sysenter_do_call: 98 85 cmpl $(IA32_NR_syscalls),%eax ··· 109 94 andl $~0x200,EFLAGS-R11(%rsp) 110 95 RESTORE_ARGS 1,24,1,1,1,1 111 96 popfq 97 + CFI_ADJUST_CFA_OFFSET -8 98 + /*CFI_RESTORE rflags*/ 112 99 popq %rcx /* User %esp */ 100 + CFI_ADJUST_CFA_OFFSET -8 101 + CFI_REGISTER rsp,rcx 113 102 movl $VSYSCALL32_SYSEXIT,%edx /* User %eip */ 103 + CFI_REGISTER rip,rdx 114 104 swapgs 115 105 sti /* sti only takes effect after the next instruction */ 116 106 /* sysexit */ 117 107 .byte 0xf, 0x35 118 108 119 109 sysenter_tracesys: 110 + CFI_RESTORE_STATE 120 111 SAVE_REST 121 112 CLEAR_RREGS 122 113 movq $-ENOSYS,RAX(%rsp) /* really needed? */ ··· 161 140 * with the int 0x80 path. 162 141 */ 163 142 ENTRY(ia32_cstar_target) 164 - CFI_STARTPROC 143 + CFI_STARTPROC simple 144 + CFI_DEF_CFA rsp,0 145 + CFI_REGISTER rip,rcx 146 + /*CFI_REGISTER rflags,r11*/ 165 147 swapgs 166 148 movl %esp,%r8d 149 + CFI_REGISTER rsp,r8 167 150 movq %gs:pda_kernelstack,%rsp 168 151 sti 169 152 SAVE_ARGS 8,1,1 170 153 movl %eax,%eax /* zero extension */ 171 154 movq %rax,ORIG_RAX-ARGOFFSET(%rsp) 172 155 movq %rcx,RIP-ARGOFFSET(%rsp) 156 + CFI_REL_OFFSET rip,RIP-ARGOFFSET 173 157 movq %rbp,RCX-ARGOFFSET(%rsp) /* this lies slightly to ptrace */ 174 158 movl %ebp,%ecx 175 159 movq $__USER32_CS,CS-ARGOFFSET(%rsp) 176 160 movq $__USER32_DS,SS-ARGOFFSET(%rsp) 177 161 movq %r11,EFLAGS-ARGOFFSET(%rsp) 162 + /*CFI_REL_OFFSET rflags,EFLAGS-ARGOFFSET*/ 178 163 movq %r8,RSP-ARGOFFSET(%rsp) 164 + CFI_REL_OFFSET rsp,RSP-ARGOFFSET 179 165 /* no need to do an access_ok check here because r8 has been 180 166 32bit zero extended */ 181 167 /* hardware stack frame is complete now */ ··· 192 164 .previous 193 165 GET_THREAD_INFO(%r10) 194 166 testl $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SECCOMP),threadinfo_flags(%r10) 167 + CFI_REMEMBER_STATE 195 168 jnz cstar_tracesys 196 169 cstar_do_call: 197 170 cmpl $IA32_NR_syscalls,%eax ··· 206 177 jnz int_ret_from_sys_call 207 178 RESTORE_ARGS 1,-ARG_SKIP,1,1,1 208 179 movl RIP-ARGOFFSET(%rsp),%ecx 180 + CFI_REGISTER rip,rcx 209 181 movl EFLAGS-ARGOFFSET(%rsp),%r11d 182 + /*CFI_REGISTER rflags,r11*/ 210 183 movl RSP-ARGOFFSET(%rsp),%esp 184 + CFI_RESTORE rsp 211 185 swapgs 212 186 sysretl 213 187 214 188 cstar_tracesys: 189 + CFI_RESTORE_STATE 215 190 SAVE_REST 216 191 CLEAR_RREGS 217 192 movq $-ENOSYS,RAX(%rsp) /* really needed? */ ··· 259 226 */ 260 227 261 228 ENTRY(ia32_syscall) 262 - CFI_STARTPROC 229 + CFI_STARTPROC simple 230 + CFI_DEF_CFA rsp,SS+8-RIP 231 + /*CFI_REL_OFFSET ss,SS-RIP*/ 232 + CFI_REL_OFFSET rsp,RSP-RIP 233 + /*CFI_REL_OFFSET rflags,EFLAGS-RIP*/ 234 + /*CFI_REL_OFFSET cs,CS-RIP*/ 235 + CFI_REL_OFFSET rip,RIP-RIP 263 236 swapgs 264 237 sti 265 238 movl %eax,%eax 266 239 pushq %rax 240 + CFI_ADJUST_CFA_OFFSET 8 267 241 cld 268 242 /* note the registers are not zero extended to the sf. 269 243 this could be a problem. */ ··· 318 278 jmp ia32_ptregs_common 319 279 .endm 320 280 281 + CFI_STARTPROC 282 + 321 283 PTREGSCALL stub32_rt_sigreturn, sys32_rt_sigreturn, %rdi 322 284 PTREGSCALL stub32_sigreturn, sys32_sigreturn, %rdi 323 285 PTREGSCALL stub32_sigaltstack, sys32_sigaltstack, %rdx ··· 332 290 PTREGSCALL stub32_rt_sigsuspend, sys_rt_sigsuspend, %rdx 333 291 334 292 ENTRY(ia32_ptregs_common) 335 - CFI_STARTPROC 336 293 popq %r11 294 + CFI_ADJUST_CFA_OFFSET -8 295 + CFI_REGISTER rip, r11 337 296 SAVE_REST 338 297 call *%rax 339 298 RESTORE_REST
+150 -57
arch/x86_64/kernel/entry.S
··· 79 79 xorl %eax, %eax 80 80 pushq %rax /* ss */ 81 81 CFI_ADJUST_CFA_OFFSET 8 82 + /*CFI_REL_OFFSET ss,0*/ 82 83 pushq %rax /* rsp */ 83 84 CFI_ADJUST_CFA_OFFSET 8 84 - CFI_OFFSET rip,0 85 + CFI_REL_OFFSET rsp,0 85 86 pushq $(1<<9) /* eflags - interrupts on */ 86 87 CFI_ADJUST_CFA_OFFSET 8 88 + /*CFI_REL_OFFSET rflags,0*/ 87 89 pushq $__KERNEL_CS /* cs */ 88 90 CFI_ADJUST_CFA_OFFSET 8 91 + /*CFI_REL_OFFSET cs,0*/ 89 92 pushq \child_rip /* rip */ 90 93 CFI_ADJUST_CFA_OFFSET 8 91 - CFI_OFFSET rip,0 94 + CFI_REL_OFFSET rip,0 92 95 pushq %rax /* orig rax */ 93 96 CFI_ADJUST_CFA_OFFSET 8 94 97 .endm ··· 101 98 CFI_ADJUST_CFA_OFFSET -(6*8) 102 99 .endm 103 100 104 - .macro CFI_DEFAULT_STACK 105 - CFI_ADJUST_CFA_OFFSET (SS) 106 - CFI_OFFSET r15,R15-SS 107 - CFI_OFFSET r14,R14-SS 108 - CFI_OFFSET r13,R13-SS 109 - CFI_OFFSET r12,R12-SS 110 - CFI_OFFSET rbp,RBP-SS 111 - CFI_OFFSET rbx,RBX-SS 112 - CFI_OFFSET r11,R11-SS 113 - CFI_OFFSET r10,R10-SS 114 - CFI_OFFSET r9,R9-SS 115 - CFI_OFFSET r8,R8-SS 116 - CFI_OFFSET rax,RAX-SS 117 - CFI_OFFSET rcx,RCX-SS 118 - CFI_OFFSET rdx,RDX-SS 119 - CFI_OFFSET rsi,RSI-SS 120 - CFI_OFFSET rdi,RDI-SS 121 - CFI_OFFSET rsp,RSP-SS 122 - CFI_OFFSET rip,RIP-SS 101 + .macro CFI_DEFAULT_STACK start=1 102 + .if \start 103 + CFI_STARTPROC simple 104 + CFI_DEF_CFA rsp,SS+8 105 + .else 106 + CFI_DEF_CFA_OFFSET SS+8 107 + .endif 108 + CFI_REL_OFFSET r15,R15 109 + CFI_REL_OFFSET r14,R14 110 + CFI_REL_OFFSET r13,R13 111 + CFI_REL_OFFSET r12,R12 112 + CFI_REL_OFFSET rbp,RBP 113 + CFI_REL_OFFSET rbx,RBX 114 + CFI_REL_OFFSET r11,R11 115 + CFI_REL_OFFSET r10,R10 116 + CFI_REL_OFFSET r9,R9 117 + CFI_REL_OFFSET r8,R8 118 + CFI_REL_OFFSET rax,RAX 119 + CFI_REL_OFFSET rcx,RCX 120 + CFI_REL_OFFSET rdx,RDX 121 + CFI_REL_OFFSET rsi,RSI 122 + CFI_REL_OFFSET rdi,RDI 123 + CFI_REL_OFFSET rip,RIP 124 + /*CFI_REL_OFFSET cs,CS*/ 125 + /*CFI_REL_OFFSET rflags,EFLAGS*/ 126 + CFI_REL_OFFSET rsp,RSP 127 + /*CFI_REL_OFFSET ss,SS*/ 123 128 .endm 124 129 /* 125 130 * A newly forked process directly context switches into this. 126 131 */ 127 132 /* rdi: prev */ 128 133 ENTRY(ret_from_fork) 129 - CFI_STARTPROC 130 134 CFI_DEFAULT_STACK 131 135 call schedule_tail 132 136 GET_THREAD_INFO(%rcx) ··· 182 172 */ 183 173 184 174 ENTRY(system_call) 185 - CFI_STARTPROC 175 + CFI_STARTPROC simple 176 + CFI_DEF_CFA rsp,0 177 + CFI_REGISTER rip,rcx 178 + /*CFI_REGISTER rflags,r11*/ 186 179 swapgs 187 180 movq %rsp,%gs:pda_oldrsp 188 181 movq %gs:pda_kernelstack,%rsp 189 182 sti 190 183 SAVE_ARGS 8,1 191 184 movq %rax,ORIG_RAX-ARGOFFSET(%rsp) 192 - movq %rcx,RIP-ARGOFFSET(%rsp) 185 + movq %rcx,RIP-ARGOFFSET(%rsp) 186 + CFI_REL_OFFSET rip,RIP-ARGOFFSET 193 187 GET_THREAD_INFO(%rcx) 194 188 testl $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SECCOMP),threadinfo_flags(%rcx) 189 + CFI_REMEMBER_STATE 195 190 jnz tracesys 196 191 cmpq $__NR_syscall_max,%rax 197 192 ja badsys ··· 216 201 cli 217 202 movl threadinfo_flags(%rcx),%edx 218 203 andl %edi,%edx 204 + CFI_REMEMBER_STATE 219 205 jnz sysret_careful 220 206 movq RIP-ARGOFFSET(%rsp),%rcx 207 + CFI_REGISTER rip,rcx 221 208 RESTORE_ARGS 0,-ARG_SKIP,1 209 + /*CFI_REGISTER rflags,r11*/ 222 210 movq %gs:pda_oldrsp,%rsp 223 211 swapgs 224 212 sysretq ··· 229 211 /* Handle reschedules */ 230 212 /* edx: work, edi: workmask */ 231 213 sysret_careful: 214 + CFI_RESTORE_STATE 232 215 bt $TIF_NEED_RESCHED,%edx 233 216 jnc sysret_signal 234 217 sti 235 218 pushq %rdi 219 + CFI_ADJUST_CFA_OFFSET 8 236 220 call schedule 237 221 popq %rdi 222 + CFI_ADJUST_CFA_OFFSET -8 238 223 jmp sysret_check 239 224 240 225 /* Handle a signal */ ··· 255 234 1: movl $_TIF_NEED_RESCHED,%edi 256 235 jmp sysret_check 257 236 237 + badsys: 238 + movq $-ENOSYS,RAX-ARGOFFSET(%rsp) 239 + jmp ret_from_sys_call 240 + 258 241 /* Do syscall tracing */ 259 242 tracesys: 243 + CFI_RESTORE_STATE 260 244 SAVE_REST 261 245 movq $-ENOSYS,RAX(%rsp) 262 246 FIXUP_TOP_OF_STACK %rdi ··· 280 254 RESTORE_TOP_OF_STACK %rbx 281 255 RESTORE_REST 282 256 jmp ret_from_sys_call 257 + CFI_ENDPROC 283 258 284 - badsys: 285 - movq $-ENOSYS,RAX-ARGOFFSET(%rsp) 286 - jmp ret_from_sys_call 287 - 288 259 /* 289 260 * Syscall return path ending with IRET. 290 261 * Has correct top of stack, but partial stack frame. 291 262 */ 292 - ENTRY(int_ret_from_sys_call) 263 + ENTRY(int_ret_from_sys_call) 264 + CFI_STARTPROC simple 265 + CFI_DEF_CFA rsp,SS+8-ARGOFFSET 266 + /*CFI_REL_OFFSET ss,SS-ARGOFFSET*/ 267 + CFI_REL_OFFSET rsp,RSP-ARGOFFSET 268 + /*CFI_REL_OFFSET rflags,EFLAGS-ARGOFFSET*/ 269 + /*CFI_REL_OFFSET cs,CS-ARGOFFSET*/ 270 + CFI_REL_OFFSET rip,RIP-ARGOFFSET 271 + CFI_REL_OFFSET rdx,RDX-ARGOFFSET 272 + CFI_REL_OFFSET rcx,RCX-ARGOFFSET 273 + CFI_REL_OFFSET rax,RAX-ARGOFFSET 274 + CFI_REL_OFFSET rdi,RDI-ARGOFFSET 275 + CFI_REL_OFFSET rsi,RSI-ARGOFFSET 276 + CFI_REL_OFFSET r8,R8-ARGOFFSET 277 + CFI_REL_OFFSET r9,R9-ARGOFFSET 278 + CFI_REL_OFFSET r10,R10-ARGOFFSET 279 + CFI_REL_OFFSET r11,R11-ARGOFFSET 293 280 cli 294 281 testl $3,CS-ARGOFFSET(%rsp) 295 282 je retint_restore_args ··· 323 284 jnc int_very_careful 324 285 sti 325 286 pushq %rdi 287 + CFI_ADJUST_CFA_OFFSET 8 326 288 call schedule 327 289 popq %rdi 290 + CFI_ADJUST_CFA_OFFSET -8 328 291 cli 329 292 jmp int_with_check 330 293 ··· 338 297 testl $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SINGLESTEP),%edx 339 298 jz int_signal 340 299 pushq %rdi 300 + CFI_ADJUST_CFA_OFFSET 8 341 301 leaq 8(%rsp),%rdi # &ptregs -> arg1 342 302 call syscall_trace_leave 343 303 popq %rdi 304 + CFI_ADJUST_CFA_OFFSET -8 344 305 andl $~(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SINGLESTEP),%edi 345 306 cli 346 307 jmp int_restore_rest ··· 372 329 jmp ptregscall_common 373 330 .endm 374 331 332 + CFI_STARTPROC 333 + 375 334 PTREGSCALL stub_clone, sys_clone, %r8 376 335 PTREGSCALL stub_fork, sys_fork, %rdi 377 336 PTREGSCALL stub_vfork, sys_vfork, %rdi ··· 382 337 PTREGSCALL stub_iopl, sys_iopl, %rsi 383 338 384 339 ENTRY(ptregscall_common) 385 - CFI_STARTPROC 386 340 popq %r11 387 - CFI_ADJUST_CFA_OFFSET -8 341 + CFI_ADJUST_CFA_OFFSET -8 342 + CFI_REGISTER rip, r11 388 343 SAVE_REST 389 344 movq %r11, %r15 345 + CFI_REGISTER rip, r15 390 346 FIXUP_TOP_OF_STACK %r11 391 347 call *%rax 392 348 RESTORE_TOP_OF_STACK %r11 393 349 movq %r15, %r11 350 + CFI_REGISTER rip, r11 394 351 RESTORE_REST 395 352 pushq %r11 396 - CFI_ADJUST_CFA_OFFSET 8 353 + CFI_ADJUST_CFA_OFFSET 8 354 + CFI_REL_OFFSET rip, 0 397 355 ret 398 356 CFI_ENDPROC 399 357 400 358 ENTRY(stub_execve) 401 359 CFI_STARTPROC 402 360 popq %r11 403 - CFI_ADJUST_CFA_OFFSET -8 361 + CFI_ADJUST_CFA_OFFSET -8 362 + CFI_REGISTER rip, r11 404 363 SAVE_REST 405 364 movq %r11, %r15 365 + CFI_REGISTER rip, r15 406 366 FIXUP_TOP_OF_STACK %r11 407 367 call sys_execve 408 368 GET_THREAD_INFO(%rcx) 409 369 bt $TIF_IA32,threadinfo_flags(%rcx) 370 + CFI_REMEMBER_STATE 410 371 jc exec_32bit 411 372 RESTORE_TOP_OF_STACK %r11 412 373 movq %r15, %r11 374 + CFI_REGISTER rip, r11 413 375 RESTORE_REST 414 - push %r11 376 + pushq %r11 377 + CFI_ADJUST_CFA_OFFSET 8 378 + CFI_REL_OFFSET rip, 0 415 379 ret 416 380 417 381 exec_32bit: 418 - CFI_ADJUST_CFA_OFFSET REST_SKIP 382 + CFI_RESTORE_STATE 419 383 movq %rax,RAX(%rsp) 420 384 RESTORE_REST 421 385 jmp int_ret_from_sys_call ··· 436 382 */ 437 383 ENTRY(stub_rt_sigreturn) 438 384 CFI_STARTPROC 439 - addq $8, %rsp 385 + addq $8, %rsp 386 + CFI_ADJUST_CFA_OFFSET -8 440 387 SAVE_REST 441 388 movq %rsp,%rdi 442 389 FIXUP_TOP_OF_STACK %r11 ··· 446 391 RESTORE_REST 447 392 jmp int_ret_from_sys_call 448 393 CFI_ENDPROC 394 + 395 + /* 396 + * initial frame state for interrupts and exceptions 397 + */ 398 + .macro _frame ref 399 + CFI_STARTPROC simple 400 + CFI_DEF_CFA rsp,SS+8-\ref 401 + /*CFI_REL_OFFSET ss,SS-\ref*/ 402 + CFI_REL_OFFSET rsp,RSP-\ref 403 + /*CFI_REL_OFFSET rflags,EFLAGS-\ref*/ 404 + /*CFI_REL_OFFSET cs,CS-\ref*/ 405 + CFI_REL_OFFSET rip,RIP-\ref 406 + .endm 407 + 408 + /* initial frame state for interrupts (and exceptions without error code) */ 409 + #define INTR_FRAME _frame RIP 410 + /* initial frame state for exceptions with error code (and interrupts with 411 + vector already pushed) */ 412 + #define XCPT_FRAME _frame ORIG_RAX 449 413 450 414 /* 451 415 * Interrupt entry/exit. ··· 476 402 477 403 /* 0(%rsp): interrupt number */ 478 404 .macro interrupt func 479 - CFI_STARTPROC simple 480 - CFI_DEF_CFA rsp,(SS-RDI) 481 - CFI_REL_OFFSET rsp,(RSP-ORIG_RAX) 482 - CFI_REL_OFFSET rip,(RIP-ORIG_RAX) 483 405 cld 484 406 #ifdef CONFIG_DEBUG_INFO 485 407 SAVE_ALL ··· 495 425 swapgs 496 426 1: incl %gs:pda_irqcount # RED-PEN should check preempt count 497 427 movq %gs:pda_irqstackptr,%rax 498 - cmoveq %rax,%rsp 428 + cmoveq %rax,%rsp /*todo This needs CFI annotation! */ 499 429 pushq %rdi # save old stack 430 + CFI_ADJUST_CFA_OFFSET 8 500 431 call \func 501 432 .endm 502 433 503 434 ENTRY(common_interrupt) 435 + XCPT_FRAME 504 436 interrupt do_IRQ 505 437 /* 0(%rsp): oldrsp-ARGOFFSET */ 506 - ret_from_intr: 438 + ret_from_intr: 507 439 popq %rdi 440 + CFI_ADJUST_CFA_OFFSET -8 508 441 cli 509 442 decl %gs:pda_irqcount 510 443 #ifdef CONFIG_DEBUG_INFO 511 444 movq RBP(%rdi),%rbp 445 + CFI_DEF_CFA_REGISTER rsp 512 446 #endif 513 - leaq ARGOFFSET(%rdi),%rsp 514 - exit_intr: 447 + leaq ARGOFFSET(%rdi),%rsp /*todo This needs CFI annotation! */ 448 + exit_intr: 515 449 GET_THREAD_INFO(%rcx) 516 450 testl $3,CS-ARGOFFSET(%rsp) 517 451 je retint_kernel ··· 527 453 */ 528 454 retint_with_reschedule: 529 455 movl $_TIF_WORK_MASK,%edi 530 - retint_check: 456 + retint_check: 531 457 movl threadinfo_flags(%rcx),%edx 532 458 andl %edi,%edx 459 + CFI_REMEMBER_STATE 533 460 jnz retint_careful 534 461 retint_swapgs: 535 462 swapgs ··· 551 476 jmp do_exit 552 477 .previous 553 478 554 - /* edi: workmask, edx: work */ 479 + /* edi: workmask, edx: work */ 555 480 retint_careful: 481 + CFI_RESTORE_STATE 556 482 bt $TIF_NEED_RESCHED,%edx 557 483 jnc retint_signal 558 484 sti 559 485 pushq %rdi 486 + CFI_ADJUST_CFA_OFFSET 8 560 487 call schedule 561 488 popq %rdi 489 + CFI_ADJUST_CFA_OFFSET -8 562 490 GET_THREAD_INFO(%rcx) 563 491 cli 564 492 jmp retint_check ··· 601 523 * APIC interrupts. 602 524 */ 603 525 .macro apicinterrupt num,func 526 + INTR_FRAME 604 527 pushq $\num-256 528 + CFI_ADJUST_CFA_OFFSET 8 605 529 interrupt \func 606 530 jmp ret_from_intr 607 531 CFI_ENDPROC ··· 649 569 * Exception entry points. 650 570 */ 651 571 .macro zeroentry sym 572 + INTR_FRAME 652 573 pushq $0 /* push error code/oldrax */ 574 + CFI_ADJUST_CFA_OFFSET 8 653 575 pushq %rax /* push real oldrax to the rdi slot */ 576 + CFI_ADJUST_CFA_OFFSET 8 654 577 leaq \sym(%rip),%rax 655 578 jmp error_entry 579 + CFI_ENDPROC 656 580 .endm 657 581 658 582 .macro errorentry sym 583 + XCPT_FRAME 659 584 pushq %rax 585 + CFI_ADJUST_CFA_OFFSET 8 660 586 leaq \sym(%rip),%rax 661 587 jmp error_entry 588 + CFI_ENDPROC 662 589 .endm 663 590 664 591 /* error code is on the stack already */ ··· 692 605 * and the exception handler in %rax. 693 606 */ 694 607 ENTRY(error_entry) 695 - CFI_STARTPROC simple 696 - CFI_DEF_CFA rsp,(SS-RDI) 697 - CFI_REL_OFFSET rsp,(RSP-RDI) 698 - CFI_REL_OFFSET rip,(RIP-RDI) 608 + _frame RDI 699 609 /* rdi slot contains rax, oldrax contains error code */ 700 610 cld 701 611 subq $14*8,%rsp ··· 774 690 /* Reload gs selector with exception handling */ 775 691 /* edi: new selector */ 776 692 ENTRY(load_gs_index) 693 + CFI_STARTPROC 777 694 pushf 695 + CFI_ADJUST_CFA_OFFSET 8 778 696 cli 779 697 swapgs 780 698 gs_change: ··· 784 698 2: mfence /* workaround */ 785 699 swapgs 786 700 popf 701 + CFI_ADJUST_CFA_OFFSET -8 787 702 ret 703 + CFI_ENDPROC 788 704 789 705 .section __ex_table,"a" 790 706 .align 8 ··· 898 810 899 811 /* runs on exception stack */ 900 812 KPROBE_ENTRY(debug) 901 - CFI_STARTPROC 813 + INTR_FRAME 902 814 pushq $0 903 815 CFI_ADJUST_CFA_OFFSET 8 904 816 paranoidentry do_debug ··· 908 820 909 821 /* runs on exception stack */ 910 822 ENTRY(nmi) 911 - CFI_STARTPROC 823 + INTR_FRAME 912 824 pushq $-1 913 - CFI_ADJUST_CFA_OFFSET 8 825 + CFI_ADJUST_CFA_OFFSET 8 914 826 paranoidentry do_nmi 915 827 /* 916 828 * "Paranoid" exit path from exception stack. ··· 976 888 977 889 /* runs on exception stack */ 978 890 ENTRY(double_fault) 979 - CFI_STARTPROC 891 + XCPT_FRAME 980 892 paranoidentry do_double_fault 981 893 jmp paranoid_exit 982 894 CFI_ENDPROC ··· 989 901 990 902 /* runs on exception stack */ 991 903 ENTRY(stack_segment) 992 - CFI_STARTPROC 904 + XCPT_FRAME 993 905 paranoidentry do_stack_segment 994 906 jmp paranoid_exit 995 907 CFI_ENDPROC ··· 1010 922 #ifdef CONFIG_X86_MCE 1011 923 /* runs on exception stack */ 1012 924 ENTRY(machine_check) 1013 - CFI_STARTPROC 925 + INTR_FRAME 1014 926 pushq $0 1015 927 CFI_ADJUST_CFA_OFFSET 8 1016 928 paranoidentry do_machine_check ··· 1022 934 zeroentry do_call_debug 1023 935 1024 936 ENTRY(call_softirq) 937 + CFI_STARTPROC 1025 938 movq %gs:pda_irqstackptr,%rax 1026 939 pushq %r15 940 + CFI_ADJUST_CFA_OFFSET 8 1027 941 movq %rsp,%r15 942 + CFI_DEF_CFA_REGISTER r15 1028 943 incl %gs:pda_irqcount 1029 944 cmove %rax,%rsp 1030 945 call __do_softirq 1031 946 movq %r15,%rsp 947 + CFI_DEF_CFA_REGISTER rsp 1032 948 decl %gs:pda_irqcount 1033 949 popq %r15 950 + CFI_ADJUST_CFA_OFFSET -8 1034 951 ret 1035 - 952 + CFI_ENDPROC
+15 -8
include/asm-x86_64/calling.h
··· 65 65 .if \skipr11 66 66 .else 67 67 movq (%rsp),%r11 68 + CFI_RESTORE r11 68 69 .endif 69 70 .if \skipr8910 70 71 .else 71 72 movq 1*8(%rsp),%r10 73 + CFI_RESTORE r10 72 74 movq 2*8(%rsp),%r9 75 + CFI_RESTORE r9 73 76 movq 3*8(%rsp),%r8 77 + CFI_RESTORE r8 74 78 .endif 75 79 .if \skiprax 76 80 .else 77 81 movq 4*8(%rsp),%rax 82 + CFI_RESTORE rax 78 83 .endif 79 84 .if \skiprcx 80 85 .else 81 86 movq 5*8(%rsp),%rcx 87 + CFI_RESTORE rcx 82 88 .endif 83 89 .if \skiprdx 84 90 .else 85 91 movq 6*8(%rsp),%rdx 92 + CFI_RESTORE rdx 86 93 .endif 87 94 movq 7*8(%rsp),%rsi 95 + CFI_RESTORE rsi 88 96 movq 8*8(%rsp),%rdi 97 + CFI_RESTORE rdi 89 98 .if ARG_SKIP+\addskip > 0 90 99 addq $ARG_SKIP+\addskip,%rsp 91 100 CFI_ADJUST_CFA_OFFSET -(ARG_SKIP+\addskip) ··· 133 124 134 125 .macro RESTORE_REST 135 126 movq (%rsp),%r15 127 + CFI_RESTORE r15 136 128 movq 1*8(%rsp),%r14 129 + CFI_RESTORE r14 137 130 movq 2*8(%rsp),%r13 131 + CFI_RESTORE r13 138 132 movq 3*8(%rsp),%r12 133 + CFI_RESTORE r12 139 134 movq 4*8(%rsp),%rbp 135 + CFI_RESTORE rbp 140 136 movq 5*8(%rsp),%rbx 137 + CFI_RESTORE rbx 141 138 addq $REST_SKIP,%rsp 142 139 CFI_ADJUST_CFA_OFFSET -(REST_SKIP) 143 140 .endm ··· 161 146 .macro icebp 162 147 .byte 0xf1 163 148 .endm 164 - 165 - #ifdef CONFIG_FRAME_POINTER 166 - #define ENTER enter 167 - #define LEAVE leave 168 - #else 169 - #define ENTER 170 - #define LEAVE 171 - #endif
+8
include/asm-x86_64/dwarf2.h
··· 24 24 #define CFI_ADJUST_CFA_OFFSET .cfi_adjust_cfa_offset 25 25 #define CFI_OFFSET .cfi_offset 26 26 #define CFI_REL_OFFSET .cfi_rel_offset 27 + #define CFI_REGISTER .cfi_register 28 + #define CFI_RESTORE .cfi_restore 29 + #define CFI_REMEMBER_STATE .cfi_remember_state 30 + #define CFI_RESTORE_STATE .cfi_restore_state 27 31 28 32 #else 29 33 ··· 40 36 #define CFI_ADJUST_CFA_OFFSET # 41 37 #define CFI_OFFSET # 42 38 #define CFI_REL_OFFSET # 39 + #define CFI_REGISTER # 40 + #define CFI_RESTORE # 41 + #define CFI_REMEMBER_STATE # 42 + #define CFI_RESTORE_STATE # 43 43 44 44 #endif 45 45