|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v8 2/7] x86: Clear AC bit in RFLAGS to protect Xen itself by SMAP
On 09/05/14 06:34, Feng Wu wrote:
> Clear AC bit in RFLAGS at the beginning of exception, interrupt, hypercall,
> so Xen itself can be protected by SMAP mechanism. This patch also sets AC
> bit at the beginning of double_fault and fatal_trap() to reduce the likelihood
> of taking a further fault while trying to dump state.
>
> Signed-off-by: Feng Wu <feng.wu@xxxxxxxxx>
Much nicer with MSR_SYSCALL_MASK!
> ---
> xen/arch/x86/acpi/suspend.c | 5 +----
> xen/arch/x86/boot/x86_64.S | 2 +-
> xen/arch/x86/traps.c | 3 +++
> xen/arch/x86/x86_64/compat/entry.S | 1 +
> xen/arch/x86/x86_64/entry.S | 13 ++++++++-----
> xen/arch/x86/x86_64/traps.c | 5 +----
> xen/include/asm-x86/asm_defns.h | 7 ++++++-
> xen/include/asm-x86/processor.h | 4 ++++
> 8 files changed, 25 insertions(+), 15 deletions(-)
>
> diff --git a/xen/arch/x86/acpi/suspend.c b/xen/arch/x86/acpi/suspend.c
> index a373e9a..1d8344c 100644
> --- a/xen/arch/x86/acpi/suspend.c
> +++ b/xen/arch/x86/acpi/suspend.c
> @@ -56,10 +56,7 @@ void restore_rest_processor_state(void)
> wrmsrl(MSR_LSTAR, saved_lstar);
> wrmsrl(MSR_CSTAR, saved_cstar);
> wrmsr(MSR_STAR, 0, (FLAT_RING3_CS32<<16) | __HYPERVISOR_CS);
> - wrmsr(MSR_SYSCALL_MASK,
> - X86_EFLAGS_VM|X86_EFLAGS_RF|X86_EFLAGS_NT|
> - X86_EFLAGS_DF|X86_EFLAGS_IF|X86_EFLAGS_TF,
> - 0U);
> + wrmsr(MSR_SYSCALL_MASK, XEN_SYSCALL_MASK, 0U);
>
> wrfsbase(saved_fs_base);
> wrgsbase(saved_gs_base);
> diff --git a/xen/arch/x86/boot/x86_64.S b/xen/arch/x86/boot/x86_64.S
> index 22645d6..67dfef9 100644
> --- a/xen/arch/x86/boot/x86_64.S
> +++ b/xen/arch/x86/boot/x86_64.S
> @@ -60,7 +60,7 @@ start_bsp:
>
> /* This is the default interrupt handler. */
> ignore_int:
> - SAVE_ALL
> + SAVE_ALL CLAC
> movq %cr2,%rsi
> leaq int_msg(%rip),%rdi
> xorl %eax,%eax
> diff --git a/xen/arch/x86/traps.c b/xen/arch/x86/traps.c
> index 5d27581..ac68a85 100644
> --- a/xen/arch/x86/traps.c
> +++ b/xen/arch/x86/traps.c
> @@ -401,6 +401,9 @@ void fatal_trap(int trapnr, struct cpu_user_regs *regs)
> {
> static DEFINE_PER_CPU(char, depth);
>
> + /* Set AC to reduce chance of further SMAP faults */
> + stac();
> +
> /*
> * In some cases, we can end up in a vicious cycle of fatal_trap()s
> * within fatal_trap()s. We give the problem a couple of iterations to
> diff --git a/xen/arch/x86/x86_64/compat/entry.S
> b/xen/arch/x86/x86_64/compat/entry.S
> index 32b3bcc..ac594c9 100644
> --- a/xen/arch/x86/x86_64/compat/entry.S
> +++ b/xen/arch/x86/x86_64/compat/entry.S
> @@ -13,6 +13,7 @@
> #include <irq_vectors.h>
>
> ENTRY(compat_hypercall)
> + ASM_CLAC
> pushq $0
> SAVE_VOLATILE type=TRAP_syscall compat=1
>
> diff --git a/xen/arch/x86/x86_64/entry.S b/xen/arch/x86/x86_64/entry.S
> index 1c81852..50b1058 100644
> --- a/xen/arch/x86/x86_64/entry.S
> +++ b/xen/arch/x86/x86_64/entry.S
> @@ -273,6 +273,7 @@ ENTRY(sysenter_entry)
> pushq $0
> pushfq
> GLOBAL(sysenter_eflags_saved)
> + ASM_CLAC
> pushq $3 /* ring 3 null cs */
> pushq $0 /* null rip */
> pushq $0
> @@ -309,6 +310,7 @@ UNLIKELY_END(sysenter_gpf)
> jmp .Lbounce_exception
>
> ENTRY(int80_direct_trap)
> + ASM_CLAC
> pushq $0
> SAVE_VOLATILE 0x80
>
> @@ -466,7 +468,7 @@ ENTRY(dom_crash_sync_extable)
> jmp asm_domain_crash_synchronous /* Does not return */
>
> ENTRY(common_interrupt)
> - SAVE_ALL
> + SAVE_ALL CLAC
> movq %rsp,%rdi
> callq do_IRQ
> jmp ret_from_intr
> @@ -485,7 +487,7 @@ ENTRY(page_fault)
> movl $TRAP_page_fault,4(%rsp)
> /* No special register assumptions. */
> GLOBAL(handle_exception)
> - SAVE_ALL
> + SAVE_ALL CLAC
> handle_exception_saved:
> testb $X86_EFLAGS_IF>>8,UREGS_eflags+1(%rsp)
> jz exception_with_ints_disabled
> @@ -614,7 +616,8 @@ ENTRY(spurious_interrupt_bug)
>
> ENTRY(double_fault)
> movl $TRAP_double_fault,4(%rsp)
> - SAVE_ALL
> + /* Set AC to reduce chance of further SMAP faults */
> + SAVE_ALL STAC
> movq %rsp,%rdi
> call do_double_fault
> ud2
> @@ -631,7 +634,7 @@ ENTRY(nmi)
> pushq $0
> movl $TRAP_nmi,4(%rsp)
> handle_ist_exception:
> - SAVE_ALL
> + SAVE_ALL CLAC
> testb $3,UREGS_cs(%rsp)
> jz 1f
> /* Interrupted guest context. Copy the context to stack bottom. */
> @@ -667,7 +670,7 @@ handle_ist_exception:
> ENTRY(nmi_crash)
> pushq $0
> movl $TRAP_nmi,4(%rsp)
> - SAVE_ALL
> + SAVE_ALL CLAC
This is also a terminal error path. STAC instead please.
~Andrew
> movq %rsp,%rdi
> callq do_nmi_crash /* Does not return */
> ud2
> diff --git a/xen/arch/x86/x86_64/traps.c b/xen/arch/x86/x86_64/traps.c
> index 90072c1..3a48478 100644
> --- a/xen/arch/x86/x86_64/traps.c
> +++ b/xen/arch/x86/x86_64/traps.c
> @@ -436,10 +436,7 @@ void __devinit subarch_percpu_traps_init(void)
>
> /* Common SYSCALL parameters. */
> wrmsr(MSR_STAR, 0, (FLAT_RING3_CS32<<16) | __HYPERVISOR_CS);
> - wrmsr(MSR_SYSCALL_MASK,
> - X86_EFLAGS_VM|X86_EFLAGS_RF|X86_EFLAGS_NT|
> - X86_EFLAGS_DF|X86_EFLAGS_IF|X86_EFLAGS_TF,
> - 0U);
> + wrmsr(MSR_SYSCALL_MASK, XEN_SYSCALL_MASK, 0U);
> }
>
> void init_int80_direct_trap(struct vcpu *v)
> diff --git a/xen/include/asm-x86/asm_defns.h b/xen/include/asm-x86/asm_defns.h
> index b75905a..db5d8f6 100644
> --- a/xen/include/asm-x86/asm_defns.h
> +++ b/xen/include/asm-x86/asm_defns.h
> @@ -190,7 +190,12 @@ static inline void stac(void)
> #endif
>
> #ifdef __ASSEMBLY__
> -.macro SAVE_ALL
> +.macro SAVE_ALL op=0
> +.if \op == CLAC
> + ASM_CLAC
> +.elseif \op == STAC
> + ASM_STAC
> +.endif
> addq $-(UREGS_error_code-UREGS_r15), %rsp
> cld
> movq %rdi,UREGS_rdi(%rsp)
> diff --git a/xen/include/asm-x86/processor.h b/xen/include/asm-x86/processor.h
> index 604f5b3..35b2433 100644
> --- a/xen/include/asm-x86/processor.h
> +++ b/xen/include/asm-x86/processor.h
> @@ -141,6 +141,10 @@
> #define PFEC_page_paged (1U<<5)
> #define PFEC_page_shared (1U<<6)
>
> +#define XEN_SYSCALL_MASK (X86_EFLAGS_AC|X86_EFLAGS_VM|X86_EFLAGS_RF| \
> + X86_EFLAGS_NT|X86_EFLAGS_DF|X86_EFLAGS_IF| \
> + X86_EFLAGS_TF)
> +
> #ifndef __ASSEMBLY__
>
> struct domain;
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |