|
@@ -297,27 +297,26 @@ ENDPROC(native_usergs_sysret64)
|
|
|
.endm
|
|
|
|
|
|
/* save partial stack frame */
|
|
|
- .pushsection .kprobes.text, "ax"
|
|
|
-ENTRY(save_args)
|
|
|
- XCPT_FRAME
|
|
|
+ .macro SAVE_ARGS_IRQ
|
|
|
cld
|
|
|
- /*
|
|
|
- * start from rbp in pt_regs and jump over
|
|
|
- * return address.
|
|
|
- */
|
|
|
- movq_cfi rdi, RDI+8-RBP
|
|
|
- movq_cfi rsi, RSI+8-RBP
|
|
|
- movq_cfi rdx, RDX+8-RBP
|
|
|
- movq_cfi rcx, RCX+8-RBP
|
|
|
- movq_cfi rax, RAX+8-RBP
|
|
|
- movq_cfi r8, R8+8-RBP
|
|
|
- movq_cfi r9, R9+8-RBP
|
|
|
- movq_cfi r10, R10+8-RBP
|
|
|
- movq_cfi r11, R11+8-RBP
|
|
|
-
|
|
|
- leaq -RBP+8(%rsp),%rdi /* arg1 for handler */
|
|
|
- movq_cfi rbp, 8 /* push %rbp */
|
|
|
- leaq 8(%rsp), %rbp /* mov %rsp, %ebp */
|
|
|
+ /* start from rbp in pt_regs and jump over */
|
|
|
+ movq_cfi rdi, RDI-RBP
|
|
|
+ movq_cfi rsi, RSI-RBP
|
|
|
+ movq_cfi rdx, RDX-RBP
|
|
|
+ movq_cfi rcx, RCX-RBP
|
|
|
+ movq_cfi rax, RAX-RBP
|
|
|
+ movq_cfi r8, R8-RBP
|
|
|
+ movq_cfi r9, R9-RBP
|
|
|
+ movq_cfi r10, R10-RBP
|
|
|
+ movq_cfi r11, R11-RBP
|
|
|
+
|
|
|
+ /* Save rbp so that we can unwind from get_irq_regs() */
|
|
|
+ movq_cfi rbp, 0
|
|
|
+
|
|
|
+ /* Save previous stack value */
|
|
|
+ movq %rsp, %rsi
|
|
|
+
|
|
|
+ leaq -RBP(%rsp),%rdi /* arg1 for handler */
|
|
|
testl $3, CS(%rdi)
|
|
|
je 1f
|
|
|
SWAPGS
|
|
@@ -329,19 +328,14 @@ ENTRY(save_args)
|
|
|
*/
|
|
|
1: incl PER_CPU_VAR(irq_count)
|
|
|
jne 2f
|
|
|
- popq_cfi %rax /* move return address... */
|
|
|
mov PER_CPU_VAR(irq_stack_ptr),%rsp
|
|
|
EMPTY_FRAME 0
|
|
|
- pushq_cfi %rbp /* backlink for unwinder */
|
|
|
- pushq_cfi %rax /* ... to the new stack */
|
|
|
- /*
|
|
|
- * We entered an interrupt context - irqs are off:
|
|
|
- */
|
|
|
-2: TRACE_IRQS_OFF
|
|
|
- ret
|
|
|
- CFI_ENDPROC
|
|
|
-END(save_args)
|
|
|
- .popsection
|
|
|
+
|
|
|
+2: /* Store previous stack value */
|
|
|
+ pushq %rsi
|
|
|
+ /* We entered an interrupt context - irqs are off: */
|
|
|
+ TRACE_IRQS_OFF
|
|
|
+ .endm
|
|
|
|
|
|
ENTRY(save_rest)
|
|
|
PARTIAL_FRAME 1 REST_SKIP+8
|
|
@@ -791,7 +785,7 @@ END(interrupt)
|
|
|
/* reserve pt_regs for scratch regs and rbp */
|
|
|
subq $ORIG_RAX-RBP, %rsp
|
|
|
CFI_ADJUST_CFA_OFFSET ORIG_RAX-RBP
|
|
|
- call save_args
|
|
|
+ SAVE_ARGS_IRQ
|
|
|
PARTIAL_FRAME 0
|
|
|
call \func
|
|
|
.endm
|
|
@@ -814,15 +808,14 @@ ret_from_intr:
|
|
|
DISABLE_INTERRUPTS(CLBR_NONE)
|
|
|
TRACE_IRQS_OFF
|
|
|
decl PER_CPU_VAR(irq_count)
|
|
|
- leaveq
|
|
|
|
|
|
- CFI_RESTORE rbp
|
|
|
+ /* Restore saved previous stack */
|
|
|
+ popq %rsi
|
|
|
+ leaq 16(%rsi), %rsp
|
|
|
+
|
|
|
CFI_DEF_CFA_REGISTER rsp
|
|
|
- CFI_ADJUST_CFA_OFFSET -8
|
|
|
+ CFI_ADJUST_CFA_OFFSET -16
|
|
|
|
|
|
- /* we did not save rbx, restore only from ARGOFFSET */
|
|
|
- addq $8, %rsp
|
|
|
- CFI_ADJUST_CFA_OFFSET -8
|
|
|
exit_intr:
|
|
|
GET_THREAD_INFO(%rcx)
|
|
|
testl $3,CS-ARGOFFSET(%rsp)
|