|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v4 03/10] x86: merge stuff from asm-x86/x86_64/asm_defns.h to asm-x86/asm_defns.h
>>> On 05.05.14 at 10:20, <feng.wu@xxxxxxxxx> wrote:
> This patch move stuff unchanged from asm-x86/x86_64/asm_defns.h to
> asm-x86/asm_defns.h
>
> Signed-off-by: Feng Wu <feng.wu@xxxxxxxxx>
Acked-by: Jan Beulich <jbeulich@xxxxxxxx>
> ---
> xen/include/asm-x86/asm_defns.h | 217 +++++++++++++++++++++++++++++++-
> xen/include/asm-x86/x86_64/asm_defns.h | 222
> ---------------------------------
> 2 files changed, 216 insertions(+), 223 deletions(-)
> delete mode 100644 xen/include/asm-x86/x86_64/asm_defns.h
>
> diff --git a/xen/include/asm-x86/asm_defns.h b/xen/include/asm-x86/asm_defns.h
> index 3babbe2..852d92a 100644
> --- a/xen/include/asm-x86/asm_defns.h
> +++ b/xen/include/asm-x86/asm_defns.h
> @@ -7,12 +7,65 @@
> #include <asm/asm-offsets.h>
> #endif
> #include <asm/processor.h>
> +#include <asm/percpu.h>
>
> #ifndef __ASSEMBLY__
> void ret_from_intr(void);
> #endif
>
> -#include <asm/x86_64/asm_defns.h>
> +#ifdef CONFIG_FRAME_POINTER
> +/* Indicate special exception stack frame by inverting the frame pointer.
> */
> +#define SETUP_EXCEPTION_FRAME_POINTER(offs) \
> + leaq offs(%rsp),%rbp; \
> + notq %rbp
> +#else
> +#define SETUP_EXCEPTION_FRAME_POINTER(offs)
> +#endif
> +
> +#ifndef NDEBUG
> +#define ASSERT_INTERRUPT_STATUS(x) \
> + pushf; \
> + testb $X86_EFLAGS_IF>>8,1(%rsp); \
> + j##x 1f; \
> + ud2a; \
> +1: addq $8,%rsp;
> +#else
> +#define ASSERT_INTERRUPT_STATUS(x)
> +#endif
> +
> +#define ASSERT_INTERRUPTS_ENABLED ASSERT_INTERRUPT_STATUS(nz)
> +#define ASSERT_INTERRUPTS_DISABLED ASSERT_INTERRUPT_STATUS(z)
> +
> +/*
> + * This flag is set in an exception frame when registers R12-R15 did not get
> + * saved.
> + */
> +#define _TRAP_regs_partial 16
> +#define TRAP_regs_partial (1 << _TRAP_regs_partial)
> +/*
> + * This flag gets set in an exception frame when registers R12-R15 possibly
> + * get modified from their originally saved values and hence need to be
> + * restored even if the normal call flow would restore register values.
> + *
> + * The flag being set implies _TRAP_regs_partial to be unset. Restoring
> + * R12-R15 thus is
> + * - required when this flag is set,
> + * - safe when _TRAP_regs_partial is unset.
> + */
> +#define _TRAP_regs_dirty 17
> +#define TRAP_regs_dirty (1 << _TRAP_regs_dirty)
> +
> +#define mark_regs_dirty(r) ({ \
> + struct cpu_user_regs *r__ = (r); \
> + ASSERT(!((r__)->entry_vector & TRAP_regs_partial)); \
> + r__->entry_vector |= TRAP_regs_dirty; \
> +})
> +
> +#ifdef __ASSEMBLY__
> +# define _ASM_EX(p) p-.
> +#else
> +# define _ASM_EX(p) #p "-."
> +#endif
>
> /* Exception table entry */
> #ifdef __ASSEMBLY__
> @@ -109,4 +162,166 @@ void ret_from_intr(void);
> __stringify(CPUINFO_features)")"
> #endif
>
> +#ifdef __ASSEMBLY__
> +.macro SAVE_ALL
> + addq $-(UREGS_error_code-UREGS_r15), %rsp
> + cld
> + 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)
> +.endm
> +
> +/*
> + * Save all registers not preserved by C code or used in entry/exit code.
> Mark
> + * the frame as partial.
> + *
> + * @type: exception type
> + * @compat: R8-R15 don't need saving, and the frame nevertheless is complete
> + */
> +.macro SAVE_VOLATILE type compat=0
> +.if \compat
> + movl $\type,UREGS_entry_vector-UREGS_error_code(%rsp)
> +.else
> + movl $\type|TRAP_regs_partial,\
> + UREGS_entry_vector-UREGS_error_code(%rsp)
> +.endif
> + addq $-(UREGS_error_code-UREGS_r15),%rsp
> + cld
> + 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)
> +.if !\compat
> + movq %r8,UREGS_r8(%rsp)
> + movq %r9,UREGS_r9(%rsp)
> + movq %r10,UREGS_r10(%rsp)
> + movq %r11,UREGS_r11(%rsp)
> +.endif
> + movq %rbx,UREGS_rbx(%rsp)
> + movq %rbp,UREGS_rbp(%rsp)
> + SETUP_EXCEPTION_FRAME_POINTER(UREGS_rbp)
> +.endm
> +
> +/*
> + * Complete a frame potentially only partially saved.
> + */
> +.macro SAVE_PRESERVED
> + btrl $_TRAP_regs_partial,UREGS_entry_vector(%rsp)
> + jnc 987f
> + movq %r12,UREGS_r12(%rsp)
> + movq %r13,UREGS_r13(%rsp)
> + movq %r14,UREGS_r14(%rsp)
> + movq %r15,UREGS_r15(%rsp)
> +987:
> +.endm
> +
> +/*
> + * Reload registers not preserved by C code from frame.
> + *
> + * @compat: R8-R11 don't need reloading
> + *
> + * For the way it is used in RESTORE_ALL, this macro must preserve
> EFLAGS.ZF.
> + */
> +.macro LOAD_C_CLOBBERED compat=0
> +.if !\compat
> + movq UREGS_r11(%rsp),%r11
> + movq UREGS_r10(%rsp),%r10
> + movq UREGS_r9(%rsp),%r9
> + movq UREGS_r8(%rsp),%r8
> +.endif
> + 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
> +
> +/*
> + * Restore all previously saved registers.
> + *
> + * @adj: extra stack pointer adjustment to be folded into the adjustment
> done
> + * anyway at the end of the macro
> + * @compat: R8-R15 don't need reloading
> + */
> +.macro RESTORE_ALL adj=0 compat=0
> +.if !\compat
> + testl $TRAP_regs_dirty,UREGS_entry_vector(%rsp)
> +.endif
> + LOAD_C_CLOBBERED \compat
> +.if !\compat
> + jz 987f
> + movq UREGS_r15(%rsp),%r15
> + movq UREGS_r14(%rsp),%r14
> + movq UREGS_r13(%rsp),%r13
> + movq UREGS_r12(%rsp),%r12
> +#ifndef NDEBUG
> + .subsection 1
> +987: testl $TRAP_regs_partial,UREGS_entry_vector(%rsp)
> + jnz 987f
> + cmpq UREGS_r15(%rsp),%r15
> + jne 789f
> + cmpq UREGS_r14(%rsp),%r14
> + jne 789f
> + cmpq UREGS_r13(%rsp),%r13
> + jne 789f
> + cmpq UREGS_r12(%rsp),%r12
> + je 987f
> +789: ud2
> + .subsection 0
> +#endif
> +.endif
> +987: movq UREGS_rbp(%rsp),%rbp
> + movq UREGS_rbx(%rsp),%rbx
> + subq $-(UREGS_error_code-UREGS_r15+\adj), %rsp
> +.endm
> +
> +#endif
> +
> +#ifdef PERF_COUNTERS
> +#define PERFC_INCR(_name,_idx,_cur) \
> + pushq _cur; \
> + movslq VCPU_processor(_cur),_cur; \
> + pushq %rdx; \
> + leaq __per_cpu_offset(%rip),%rdx; \
> + movq (%rdx,_cur,8),_cur; \
> + leaq per_cpu__perfcounters(%rip),%rdx; \
> + addq %rdx,_cur; \
> + popq %rdx; \
> + incl ASM_PERFC_##_name*4(_cur,_idx,4); \
> + popq _cur
> +#else
> +#define PERFC_INCR(_name,_idx,_cur)
> +#endif
> +
> +/* Work around AMD erratum #88 */
> +#define safe_swapgs \
> + "mfence; swapgs;"
> +
> +#ifdef __sun__
> +#define REX64_PREFIX "rex64\\"
> +#elif defined(__clang__)
> +#define REX64_PREFIX ".byte 0x48; "
> +#else
> +#define REX64_PREFIX "rex64/"
> +#endif
> +
> +#define BUILD_IRQ(nr) \
> + "pushq $0\n\t" \
> + "movl $"#nr",4(%rsp)\n\t" \
> + "jmp common_interrupt"
> +
> #endif /* __X86_ASM_DEFNS_H__ */
> diff --git a/xen/include/asm-x86/x86_64/asm_defns.h
> b/xen/include/asm-x86/x86_64/asm_defns.h
> deleted file mode 100644
> index aedb2da..0000000
> --- a/xen/include/asm-x86/x86_64/asm_defns.h
> +++ /dev/null
> @@ -1,222 +0,0 @@
> -#ifndef __X86_64_ASM_DEFNS_H__
> -#define __X86_64_ASM_DEFNS_H__
> -
> -#include <asm/percpu.h>
> -
> -#ifdef CONFIG_FRAME_POINTER
> -/* Indicate special exception stack frame by inverting the frame pointer. */
> -#define SETUP_EXCEPTION_FRAME_POINTER(offs) \
> - leaq offs(%rsp),%rbp; \
> - notq %rbp
> -#else
> -#define SETUP_EXCEPTION_FRAME_POINTER(offs)
> -#endif
> -
> -#ifndef NDEBUG
> -#define ASSERT_INTERRUPT_STATUS(x) \
> - pushf; \
> - testb $X86_EFLAGS_IF>>8,1(%rsp); \
> - j##x 1f; \
> - ud2a; \
> -1: addq $8,%rsp;
> -#else
> -#define ASSERT_INTERRUPT_STATUS(x)
> -#endif
> -
> -#define ASSERT_INTERRUPTS_ENABLED ASSERT_INTERRUPT_STATUS(nz)
> -#define ASSERT_INTERRUPTS_DISABLED ASSERT_INTERRUPT_STATUS(z)
> -
> -/*
> - * This flag is set in an exception frame when registers R12-R15 did not get
> - * saved.
> - */
> -#define _TRAP_regs_partial 16
> -#define TRAP_regs_partial (1 << _TRAP_regs_partial)
> -/*
> - * This flag gets set in an exception frame when registers R12-R15 possibly
> - * get modified from their originally saved values and hence need to be
> - * restored even if the normal call flow would restore register values.
> - *
> - * The flag being set implies _TRAP_regs_partial to be unset. Restoring
> - * R12-R15 thus is
> - * - required when this flag is set,
> - * - safe when _TRAP_regs_partial is unset.
> - */
> -#define _TRAP_regs_dirty 17
> -#define TRAP_regs_dirty (1 << _TRAP_regs_dirty)
> -
> -#define mark_regs_dirty(r) ({ \
> - struct cpu_user_regs *r__ = (r); \
> - ASSERT(!((r__)->entry_vector & TRAP_regs_partial)); \
> - r__->entry_vector |= TRAP_regs_dirty; \
> -})
> -
> -#ifdef __ASSEMBLY__
> -.macro SAVE_ALL
> - addq $-(UREGS_error_code-UREGS_r15), %rsp
> - cld
> - 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)
> -.endm
> -
> -/*
> - * Save all registers not preserved by C code or used in entry/exit code.
> Mark
> - * the frame as partial.
> - *
> - * @type: exception type
> - * @compat: R8-R15 don't need saving, and the frame nevertheless is complete
> - */
> -.macro SAVE_VOLATILE type compat=0
> -.if \compat
> - movl $\type,UREGS_entry_vector-UREGS_error_code(%rsp)
> -.else
> - movl $\type|TRAP_regs_partial,\
> - UREGS_entry_vector-UREGS_error_code(%rsp)
> -.endif
> - addq $-(UREGS_error_code-UREGS_r15),%rsp
> - cld
> - 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)
> -.if !\compat
> - movq %r8,UREGS_r8(%rsp)
> - movq %r9,UREGS_r9(%rsp)
> - movq %r10,UREGS_r10(%rsp)
> - movq %r11,UREGS_r11(%rsp)
> -.endif
> - movq %rbx,UREGS_rbx(%rsp)
> - movq %rbp,UREGS_rbp(%rsp)
> - SETUP_EXCEPTION_FRAME_POINTER(UREGS_rbp)
> -.endm
> -
> -/*
> - * Complete a frame potentially only partially saved.
> - */
> -.macro SAVE_PRESERVED
> - btrl $_TRAP_regs_partial,UREGS_entry_vector(%rsp)
> - jnc 987f
> - movq %r12,UREGS_r12(%rsp)
> - movq %r13,UREGS_r13(%rsp)
> - movq %r14,UREGS_r14(%rsp)
> - movq %r15,UREGS_r15(%rsp)
> -987:
> -.endm
> -
> -/*
> - * Reload registers not preserved by C code from frame.
> - *
> - * @compat: R8-R11 don't need reloading
> - *
> - * For the way it is used in RESTORE_ALL, this macro must preserve
> EFLAGS.ZF.
> - */
> -.macro LOAD_C_CLOBBERED compat=0
> -.if !\compat
> - movq UREGS_r11(%rsp),%r11
> - movq UREGS_r10(%rsp),%r10
> - movq UREGS_r9(%rsp),%r9
> - movq UREGS_r8(%rsp),%r8
> -.endif
> - 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
> -
> -/*
> - * Restore all previously saved registers.
> - *
> - * @adj: extra stack pointer adjustment to be folded into the adjustment
> done
> - * anyway at the end of the macro
> - * @compat: R8-R15 don't need reloading
> - */
> -.macro RESTORE_ALL adj=0 compat=0
> -.if !\compat
> - testl $TRAP_regs_dirty,UREGS_entry_vector(%rsp)
> -.endif
> - LOAD_C_CLOBBERED \compat
> -.if !\compat
> - jz 987f
> - movq UREGS_r15(%rsp),%r15
> - movq UREGS_r14(%rsp),%r14
> - movq UREGS_r13(%rsp),%r13
> - movq UREGS_r12(%rsp),%r12
> -#ifndef NDEBUG
> - .subsection 1
> -987: testl $TRAP_regs_partial,UREGS_entry_vector(%rsp)
> - jnz 987f
> - cmpq UREGS_r15(%rsp),%r15
> - jne 789f
> - cmpq UREGS_r14(%rsp),%r14
> - jne 789f
> - cmpq UREGS_r13(%rsp),%r13
> - jne 789f
> - cmpq UREGS_r12(%rsp),%r12
> - je 987f
> -789: ud2
> - .subsection 0
> -#endif
> -.endif
> -987: movq UREGS_rbp(%rsp),%rbp
> - movq UREGS_rbx(%rsp),%rbx
> - subq $-(UREGS_error_code-UREGS_r15+\adj), %rsp
> -.endm
> -
> -#endif
> -
> -#ifdef PERF_COUNTERS
> -#define PERFC_INCR(_name,_idx,_cur) \
> - pushq _cur; \
> - movslq VCPU_processor(_cur),_cur; \
> - pushq %rdx; \
> - leaq __per_cpu_offset(%rip),%rdx; \
> - movq (%rdx,_cur,8),_cur; \
> - leaq per_cpu__perfcounters(%rip),%rdx; \
> - addq %rdx,_cur; \
> - popq %rdx; \
> - incl ASM_PERFC_##_name*4(_cur,_idx,4); \
> - popq _cur
> -#else
> -#define PERFC_INCR(_name,_idx,_cur)
> -#endif
> -
> -/* Work around AMD erratum #88 */
> -#define safe_swapgs \
> - "mfence; swapgs;"
> -
> -#ifdef __sun__
> -#define REX64_PREFIX "rex64\\"
> -#elif defined(__clang__)
> -#define REX64_PREFIX ".byte 0x48; "
> -#else
> -#define REX64_PREFIX "rex64/"
> -#endif
> -
> -#define BUILD_IRQ(nr) \
> - "pushq $0\n\t" \
> - "movl $"#nr",4(%rsp)\n\t" \
> - "jmp common_interrupt"
> -
> -#ifdef __ASSEMBLY__
> -# define _ASM_EX(p) p-.
> -#else
> -# define _ASM_EX(p) #p "-."
> -#endif
> -
> -#endif /* __X86_64_ASM_DEFNS_H__ */
> --
> 1.8.3.1
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |