|
@@ -299,17 +299,21 @@ ENDPROC(native_usergs_sysret64)
|
|
|
ENTRY(save_args)
|
|
|
XCPT_FRAME
|
|
|
cld
|
|
|
- movq_cfi rdi, RDI+16-ARGOFFSET
|
|
|
- movq_cfi rsi, RSI+16-ARGOFFSET
|
|
|
- movq_cfi rdx, RDX+16-ARGOFFSET
|
|
|
- movq_cfi rcx, RCX+16-ARGOFFSET
|
|
|
- movq_cfi rax, RAX+16-ARGOFFSET
|
|
|
- movq_cfi r8, R8+16-ARGOFFSET
|
|
|
- movq_cfi r9, R9+16-ARGOFFSET
|
|
|
- movq_cfi r10, R10+16-ARGOFFSET
|
|
|
- movq_cfi r11, R11+16-ARGOFFSET
|
|
|
-
|
|
|
- leaq -ARGOFFSET+16(%rsp),%rdi /* arg1 for handler */
|
|
|
+ /*
|
|
|
+ * 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 */
|
|
|
testl $3, CS(%rdi)
|
|
@@ -782,8 +786,9 @@ END(interrupt)
|
|
|
|
|
|
/* 0(%rsp): ~(interrupt number) */
|
|
|
.macro interrupt func
|
|
|
- subq $ORIG_RAX-ARGOFFSET+8, %rsp
|
|
|
- CFI_ADJUST_CFA_OFFSET ORIG_RAX-ARGOFFSET+8
|
|
|
+ /* reserve pt_regs for scratch regs and rbp */
|
|
|
+ subq $ORIG_RAX-RBP, %rsp
|
|
|
+ CFI_ADJUST_CFA_OFFSET ORIG_RAX-RBP
|
|
|
call save_args
|
|
|
PARTIAL_FRAME 0
|
|
|
call \func
|
|
@@ -808,9 +813,14 @@ ret_from_intr:
|
|
|
TRACE_IRQS_OFF
|
|
|
decl PER_CPU_VAR(irq_count)
|
|
|
leaveq
|
|
|
+
|
|
|
CFI_RESTORE rbp
|
|
|
CFI_DEF_CFA_REGISTER rsp
|
|
|
CFI_ADJUST_CFA_OFFSET -8
|
|
|
+
|
|
|
+ /* 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)
|