|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 4/5] x86/setup: Move CPU0s stack out of the Xen text/data/bss virtual region
Currently, the BSP's stack is the BSS symbol cpu0_stack. In builds using
memguard_stack(), a page gets shot out of the mappings.
To avoid shattering the superpage which will eventually map the BSS, use the
directmap virtual address of cpu0_stack, while still using the same underlying
physical memory. (Xen has an order 21 physical relocation requirement meaning
that the order 3 alignment requirement for cpu0_stack will be honoured even
via its diretmap mapping.)
In addition, fix two issues exposed by the changes.
* do_invalid_op() should use is_active_kernel_text() rather than having its
own, different, idea of when to search through the bugframes.
* Setting of system_state to active needs to be deferred until after code has
left .init.text, for bugframes/backtraces to function in reinit_bsp_stack().
Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
CC: Jan Beulich <JBeulich@xxxxxxxx>
---
xen/arch/x86/setup.c | 34 ++++++++++++++++++++++++++--------
xen/arch/x86/traps.c | 3 +--
2 files changed, 27 insertions(+), 10 deletions(-)
diff --git a/xen/arch/x86/setup.c b/xen/arch/x86/setup.c
index d3c1817..c32e49f 100644
--- a/xen/arch/x86/setup.c
+++ b/xen/arch/x86/setup.c
@@ -507,6 +507,10 @@ static void __init kexec_reserve_area(struct e820map *e820)
static void noinline init_done(void)
{
+ system_state = SYS_STATE_active;
+
+ domain_unpause_by_systemcontroller(hardware_domain);
+
/* Free (or page-protect) the init areas. */
memset(__init_begin, 0xcc, __init_end - __init_begin); /* int3 poison */
free_xen_data(__init_begin, __init_end);
@@ -515,6 +519,23 @@ static void noinline init_done(void)
startup_cpu_idle_loop();
}
+/* Reinitalise all state referring to the old virtual address of the stack. */
+static void __init noreturn reinit_bsp_stack(void)
+{
+ unsigned long *stack = (void*)(get_stack_bottom() & ~(STACK_SIZE - 1));
+
+ /* Update TSS and ISTs */
+ load_system_tables();
+
+ /* Update SYSCALL trampolines */
+ percpu_traps_init();
+
+ stack_base[0] = stack;
+ memguard_guard_stack(stack);
+
+ reset_stack_and_jump(init_done);
+}
+
static bool_t __init loader_is_grub2(const char *loader_name)
{
/* GRUB1="GNU GRUB 0.xx"; GRUB2="GRUB 1.xx" */
@@ -1210,9 +1231,6 @@ void __init noreturn __start_xen(unsigned long mbi_p)
tboot_probe();
- /* Unmap the first page of CPU0's stack. */
- memguard_guard_stack(cpu0_stack);
-
open_softirq(NEW_TLBFLUSH_CLOCK_PERIOD_SOFTIRQ, new_tlbflush_clock_period);
if ( opt_watchdog )
@@ -1454,11 +1472,11 @@ void __init noreturn __start_xen(unsigned long mbi_p)
setup_io_bitmap(dom0);
- system_state = SYS_STATE_active;
-
- domain_unpause_by_systemcontroller(dom0);
-
- reset_stack_and_jump(init_done);
+ /* Jump to the 1:1 virtual mappings of cpu0_stack. */
+ asm volatile ("mov %[stk], %%rsp; jmp %c[fn]" ::
+ [stk] "g" (__va(__pa(get_stack_bottom()))),
+ [fn] "i" (reinit_bsp_stack) : "memory");
+ unreachable();
}
void arch_get_xen_caps(xen_capabilities_info_t *info)
diff --git a/xen/arch/x86/traps.c b/xen/arch/x86/traps.c
index 91701a2..080c0c1 100644
--- a/xen/arch/x86/traps.c
+++ b/xen/arch/x86/traps.c
@@ -1072,8 +1072,7 @@ void do_invalid_op(struct cpu_user_regs *regs)
return;
}
- if ( (!is_kernel_text(eip) &&
- (system_state > SYS_STATE_boot || !is_kernel_inittext(eip))) ||
+ if ( !is_active_kernel_text(regs->eip) ||
__copy_from_user(bug_insn, eip, sizeof(bug_insn)) ||
memcmp(bug_insn, "\xf\xb", sizeof(bug_insn)) )
goto die;
--
1.7.10.4
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |