aboutsummaryrefslogtreecommitdiffstats
path: root/xen/include/asm-x86/x86_64
diff options
context:
space:
mode:
authorJan Beulich <jbeulich@suse.com>2012-10-30 16:44:43 +0100
committerJan Beulich <jbeulich@suse.com>2012-10-30 16:44:43 +0100
commit4d246723a85a03406e4969a260291e11b8e05960 (patch)
tree751253390a81fff3466e53780d5883816a50da81 /xen/include/asm-x86/x86_64
parentf8189da5cb099a90bf5d5b41cce2b187531d8bce (diff)
downloadxen-4d246723a85a03406e4969a260291e11b8e05960.tar.gz
xen-4d246723a85a03406e4969a260291e11b8e05960.tar.bz2
xen-4d246723a85a03406e4969a260291e11b8e05960.zip
x86: use MOV instead of PUSH/POP when saving/restoring register state
Signed-off-by: Jan Beulich <jbeulich@suse.com> Acked-by: Keir Fraser <keir@xen.org>
Diffstat (limited to 'xen/include/asm-x86/x86_64')
-rw-r--r--xen/include/asm-x86/x86_64/asm_defns.h81
1 files changed, 45 insertions, 36 deletions
diff --git a/xen/include/asm-x86/x86_64/asm_defns.h b/xen/include/asm-x86/x86_64/asm_defns.h
index 27d7205601..d1660b24c8 100644
--- a/xen/include/asm-x86/x86_64/asm_defns.h
+++ b/xen/include/asm-x86/x86_64/asm_defns.h
@@ -5,11 +5,11 @@
#ifdef CONFIG_FRAME_POINTER
/* Indicate special exception stack frame by inverting the frame pointer. */
-#define SETUP_EXCEPTION_FRAME_POINTER \
- movq %rsp,%rbp; \
+#define SETUP_EXCEPTION_FRAME_POINTER(offs) \
+ leaq offs(%rsp),%rbp; \
notq %rbp
#else
-#define SETUP_EXCEPTION_FRAME_POINTER
+#define SETUP_EXCEPTION_FRAME_POINTER(offs)
#endif
#ifndef NDEBUG
@@ -27,40 +27,49 @@
#define ASSERT_INTERRUPTS_DISABLED ASSERT_INTERRUPT_STATUS(z)
#define SAVE_ALL \
+ addq $-(UREGS_error_code-UREGS_r15), %rsp; \
cld; \
- pushq %rdi; \
- pushq %rsi; \
- pushq %rdx; \
- pushq %rcx; \
- pushq %rax; \
- pushq %r8; \
- pushq %r9; \
- pushq %r10; \
- pushq %r11; \
- pushq %rbx; \
- pushq %rbp; \
- SETUP_EXCEPTION_FRAME_POINTER; \
- pushq %r12; \
- pushq %r13; \
- pushq %r14; \
- pushq %r15;
+ movq %rdi,UREGS_rdi(%rsp); \
+ movq %rsi,UREGS_rsi(%rsp); \
+ movq %rdx,UREGS_rdx(%rsp); \
+ movq %rcx,UREGS_rcx(%rsp); \
+ movq %rax,UREGS_rax(%rsp); \
+ movq %r8,UREGS_r8(%rsp); \
+ movq %r9,UREGS_r9(%rsp); \
+ movq %r10,UREGS_r10(%rsp); \
+ movq %r11,UREGS_r11(%rsp); \
+ movq %rbx,UREGS_rbx(%rsp); \
+ movq %rbp,UREGS_rbp(%rsp); \
+ SETUP_EXCEPTION_FRAME_POINTER(UREGS_rbp); \
+ movq %r12,UREGS_r12(%rsp); \
+ movq %r13,UREGS_r13(%rsp); \
+ movq %r14,UREGS_r14(%rsp); \
+ movq %r15,UREGS_r15(%rsp); \
+
+#ifdef __ASSEMBLY__
+.macro LOAD_C_CLOBBERED
+ movq UREGS_r11(%rsp),%r11
+ movq UREGS_r10(%rsp),%r10
+ movq UREGS_r9(%rsp),%r9
+ movq UREGS_r8(%rsp),%r8
+ movq UREGS_rax(%rsp),%rax
+ movq UREGS_rcx(%rsp),%rcx
+ movq UREGS_rdx(%rsp),%rdx
+ movq UREGS_rsi(%rsp),%rsi
+ movq UREGS_rdi(%rsp),%rdi
+.endm
-#define RESTORE_ALL \
- popq %r15; \
- popq %r14; \
- popq %r13; \
- popq %r12; \
- popq %rbp; \
- popq %rbx; \
- popq %r11; \
- popq %r10; \
- popq %r9; \
- popq %r8; \
- popq %rax; \
- popq %rcx; \
- popq %rdx; \
- popq %rsi; \
- popq %rdi;
+.macro RESTORE_ALL adj=0
+ movq UREGS_r15(%rsp),%r15
+ movq UREGS_r14(%rsp),%r14
+ movq UREGS_r13(%rsp),%r13
+ movq UREGS_r12(%rsp),%r12
+ movq UREGS_rbp(%rsp),%rbp
+ movq UREGS_rbx(%rsp),%rbx
+ LOAD_C_CLOBBERED
+ subq $-(UREGS_error_code-UREGS_r15+\adj), %rsp
+.endm
+#endif
#ifdef PERF_COUNTERS
#define PERFC_INCR(_name,_idx,_cur) \
@@ -94,7 +103,7 @@
__asm__( \
"\n" __ALIGN_STR"\n" \
"common_interrupt:\n\t" \
- STR(SAVE_ALL) \
+ STR(SAVE_ALL) "\n\t" \
"movq %rsp,%rdi\n\t" \
"callq " STR(do_IRQ) "\n\t" \
"jmp ret_from_intr\n");