Move initial stack-pointer adjustment into assembly

bootstrap code. Avoids need for indirection thru
reset_stack_and_jump() in C code (which was incorrect for
secondary CPUs since nothing was pushed on the stack on
that initial call, hence the masking operation had no
effect and we ended up running on a bogus stack pointer).

Signed-off-by: Keir Fraser <keir@xensource.com>
This commit is contained in:
kaf24@firebug.cl.cam.ac.uk committed 2005-12-30 17:02:30 +01:00
1 parent aafd5e14e1
commit e9ac3bbcca
4 files changed
+14 -29

No files matched your search

+4 -2
View File
@@ -1,5 +1,6 @@
#include <xen/config.h>
#include <public/xen.h>
#include <asm/asm_defns.h>
#include <asm/desc.h>
#include <asm/page.h>
#include <asm/msr.h>
@@ -53,6 +54,7 @@ __start:
mov %ecx,%gs
ljmp $(__HYPERVISOR_CS),$(1f)-__PAGE_OFFSET
1: lss stack_start-__PAGE_OFFSET,%esp
add $(STACK_SIZE-CPUINFO_sizeof-__PAGE_OFFSET),%esp
/* Reset EFLAGS (subsumes CLI and CLD). */
pushl $0
@@ -167,7 +169,7 @@ no_execute_disable:
lidt idt_descr
cmp $(SECONDARY_CPU_FLAG),%ebx
je init_secondary
je start_secondary
/* Call into main C routine. This should never return.*/
call __start_xen
@@ -189,7 +191,7 @@ ignore_int:
/*** STACK LOCATION ***/
ENTRY(stack_start)
.long cpu0_stack + STACK_SIZE - __PAGE_OFFSET
.long cpu0_stack
.long __HYPERVISOR_DS
/*** DESCRIPTOR TABLES ***/
+6 -4
View File
@@ -1,5 +1,6 @@
#include <xen/config.h>
#include <public/xen.h>
#include <asm/asm_defns.h>
#include <asm/desc.h>
#include <asm/page.h>
#include <asm/msr.h>
@@ -121,7 +122,8 @@ skip_boot_checks:
mov %rcx,%cr4
mov stack_start(%rip),%rsp
or $(STACK_SIZE-CPUINFO_sizeof),%rsp
/* Reset EFLAGS (subsumes CLI and CLD). */
pushq $0
popf
@@ -140,9 +142,9 @@ __high_start:
mov %ecx,%ss
lidt idt_descr(%rip)
cmp $(SECONDARY_CPU_FLAG),%ebx
je init_secondary
je start_secondary
/* Initialize BSS (no nasty surprises!) */
lea __bss_start(%rip),%rdi
@@ -219,7 +221,7 @@ idt:
.quad idt_table
ENTRY(stack_start)
.quad cpu0_stack + STACK_SIZE
.quad cpu0_stack
high_start:
.quad __high_start
+1 -9
View File
@@ -142,9 +142,7 @@ static void __init do_initcalls(void)
static struct e820entry e820_raw[E820MAX];
static multiboot_info_t *mbi;
void __init start_of_day(void)
void __init __start_xen(multiboot_info_t *mbi)
{
unsigned long vgdt, gdt_pfn;
char *cmdline;
@@ -561,12 +559,6 @@ void __init start_of_day(void)
startup_cpu_idle_loop();
}
void __init __start_xen(multiboot_info_t *__mbi)
{
mbi = __mbi;
reset_stack_and_jump(start_of_day);
}
void arch_get_xen_caps(xen_capabilities_info_t info)
{
char *p = info;
+3 -14
View File
@@ -429,7 +429,7 @@ static void construct_percpu_idt(unsigned int cpu)
/*
* Activate a secondary processor.
*/
void __init start_secondary(void)
void __init start_secondary(void *unused)
{
unsigned int cpu = cpucount;
@@ -472,11 +472,6 @@ void __init start_secondary(void)
startup_cpu_idle_loop();
}
void __init init_secondary(void)
{
reset_stack_and_jump(start_secondary);
}
extern struct {
void * esp;
unsigned short ss;
@@ -768,7 +763,6 @@ static int __init do_boot_cpu(int apicid)
{
struct domain *idle;
struct vcpu *v;
void *stack;
unsigned long boot_error;
int timeout, cpu;
unsigned long start_eip;
@@ -791,15 +785,10 @@ static int __init do_boot_cpu(int apicid)
/* So we see what's up */
printk("Booting processor %d/%d eip %lx\n", cpu, apicid, start_eip);
stack = alloc_xenheap_pages(STACK_ORDER);
#if defined(__i386__)
stack_start.esp = (void *)__pa(stack) + STACK_SIZE;
#elif defined(__x86_64__)
stack_start.esp = stack + STACK_SIZE;
#endif
stack_start.esp = alloc_xenheap_pages(STACK_ORDER);
/* Debug build: detect stack overflow by setting up a guard page. */
memguard_guard_stack(stack);
memguard_guard_stack(stack_start.esp);
/*
* This grunge runs the startup process for
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.