mirror of
https://github.com/torvalds/linux.git
synced 2024-12-25 20:32:22 +00:00
x86/xen: init %gs very early to avoid page faults with stack protector
When running as Xen pv guest %gs is initialized some time after C code is started. Depending on stack protector usage this might be too late, resulting in page faults. So setup %gs and MSR_GS_BASE in assembly code already. Cc: stable@vger.kernel.org Signed-off-by: Juergen Gross <jgross@suse.com> Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com> Tested-by: Chris Patterson <cjp256@gmail.com> Signed-off-by: Juergen Gross <jgross@suse.com>
This commit is contained in:
parent
ddb9e13af3
commit
4f277295e5
@ -9,7 +9,9 @@
|
||||
|
||||
#include <asm/boot.h>
|
||||
#include <asm/asm.h>
|
||||
#include <asm/msr.h>
|
||||
#include <asm/page_types.h>
|
||||
#include <asm/percpu.h>
|
||||
#include <asm/unwind_hints.h>
|
||||
|
||||
#include <xen/interface/elfnote.h>
|
||||
@ -35,6 +37,20 @@ ENTRY(startup_xen)
|
||||
mov %_ASM_SI, xen_start_info
|
||||
mov $init_thread_union+THREAD_SIZE, %_ASM_SP
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
/* Set up %gs.
|
||||
*
|
||||
* The base of %gs always points to the bottom of the irqstack
|
||||
* union. If the stack protector canary is enabled, it is
|
||||
* located at %gs:40. Note that, on SMP, the boot cpu uses
|
||||
* init data section till per cpu areas are set up.
|
||||
*/
|
||||
movl $MSR_GS_BASE,%ecx
|
||||
movq $INIT_PER_CPU_VAR(irq_stack_union),%rax
|
||||
cdq
|
||||
wrmsr
|
||||
#endif
|
||||
|
||||
jmp xen_start_kernel
|
||||
END(startup_xen)
|
||||
__FINIT
|
||||
|
Loading…
Reference in New Issue
Block a user