lguest: fix 'unhandled trap 13' with CONFIG_CC_STACKPROTECTOR
We don't set up the canary; let's disable stack protector on boot.c so we can get into lguest_init, then set it up. As a side effect, switch_to_new_gdt() sets up %fs for us properly too. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au> Acked-by: Tejun Heo <tj@kernel.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Родитель
9fa7eb283c
Коммит
2cb7878a3a
|
@ -1 +1,2 @@
|
|||
obj-y := i386_head.o boot.o
|
||||
CFLAGS_boot.o := $(call cc-option, -fno-stack-protector)
|
||||
|
|
|
@ -67,6 +67,7 @@
|
|||
#include <asm/mce.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/i387.h>
|
||||
#include <asm/stackprotector.h>
|
||||
#include <asm/reboot.h> /* for struct machine_ops */
|
||||
|
||||
/*G:010 Welcome to the Guest!
|
||||
|
@ -1088,13 +1089,21 @@ __init void lguest_init(void)
|
|||
* lguest_init() where the rest of the fairly chaotic boot setup
|
||||
* occurs. */
|
||||
|
||||
/* The stack protector is a weird thing where gcc places a canary
|
||||
* value on the stack and then checks it on return. This file is
|
||||
* compiled with -fno-stack-protector it, so we got this far without
|
||||
* problems. The value of the canary is kept at offset 20 from the
|
||||
* %gs register, so we need to set that up before calling C functions
|
||||
* in other files. */
|
||||
setup_stack_canary_segment(0);
|
||||
/* We could just call load_stack_canary_segment(), but we might as
|
||||
* call switch_to_new_gdt() which loads the whole table and sets up
|
||||
* the per-cpu segment descriptor register %fs as well. */
|
||||
switch_to_new_gdt(0);
|
||||
|
||||
/* As described in head_32.S, we map the first 128M of memory. */
|
||||
max_pfn_mapped = (128*1024*1024) >> PAGE_SHIFT;
|
||||
|
||||
/* Load the %fs segment register (the per-cpu segment register) with
|
||||
* the normal data segment to get through booting. */
|
||||
asm volatile ("mov %0, %%fs" : : "r" (__KERNEL_DS) : "memory");
|
||||
|
||||
/* The Host<->Guest Switcher lives at the top of our address space, and
|
||||
* the Host told us how big it is when we made LGUEST_INIT hypercall:
|
||||
* it put the answer in lguest_data.reserve_mem */
|
||||
|
|
Загрузка…
Ссылка в новой задаче