ChangeSet 1.1449.1.1, 2005/05/18 17:36:44+01:00, kaf24@xxxxxxxxxxxxxxxxxxxx
Re-factor current.h. It now requires no sub-architecture portions, and
stack offset calculations are cleaned up by introduction of a
cpu_info structure.
Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>
b/xen/arch/x86/setup.c | 3 +
b/xen/arch/x86/smpboot.c | 6 ++-
b/xen/include/asm-x86/current.h | 60 ++++++++++++++++++++++++++++--
b/xen/include/asm-x86/smp.h | 3 +
xen/include/asm-x86/x86_32/current.h | 66 ---------------------------------
xen/include/asm-x86/x86_64/current.h | 68 -----------------------------------
6 files changed, 64 insertions(+), 142 deletions(-)
diff -Nru a/xen/arch/x86/setup.c b/xen/arch/x86/setup.c
--- a/xen/arch/x86/setup.c 2005-05-18 13:03:56 -04:00
+++ b/xen/arch/x86/setup.c 2005-05-18 13:03:56 -04:00
@@ -317,6 +317,8 @@
t->ss0 = __HYPERVISOR_DS;
t->esp0 = get_stack_bottom();
#elif defined(CONFIG_X86_64)
+ /* Bottom-of-stack must be 16-byte aligned or CPU will force it! :-o */
+ BUG_ON((get_stack_bottom() & 15) != 0);
t->rsp0 = get_stack_bottom();
#endif
set_tss_desc(nr,t);
@@ -483,6 +485,7 @@
/* Must do this early -- e.g., spinlocks rely on get_current(). */
set_current(&idle0_exec_domain);
+ set_processor_id(0);
/* We initialise the serial devices very early so we can get debugging. */
serial_init_stage1();
diff -Nru a/xen/arch/x86/smpboot.c b/xen/arch/x86/smpboot.c
--- a/xen/arch/x86/smpboot.c 2005-05-18 13:03:56 -04:00
+++ b/xen/arch/x86/smpboot.c 2005-05-18 13:03:56 -04:00
@@ -402,6 +402,7 @@
extern void cpu_init(void);
set_current(idle_task[cpu]);
+ set_processor_id(cpu);
percpu_traps_init();
@@ -677,10 +678,11 @@
stack = (void *)alloc_xenheap_pages(STACK_ORDER);
#if defined(__i386__)
- stack_start.esp = __pa(stack) + STACK_SIZE - STACK_RESERVED;
+ stack_start.esp = __pa(stack);
#elif defined(__x86_64__)
- stack_start.esp = (unsigned long)stack + STACK_SIZE - STACK_RESERVED;
+ stack_start.esp = (unsigned long)stack;
#endif
+ stack_start.esp += STACK_SIZE - sizeof(struct cpu_info);
/* Debug build: detect stack overflow by setting up a guard page. */
memguard_guard_stack(stack);
diff -Nru a/xen/include/asm-x86/current.h b/xen/include/asm-x86/current.h
--- a/xen/include/asm-x86/current.h 2005-05-18 13:03:56 -04:00
+++ b/xen/include/asm-x86/current.h 2005-05-18 13:03:56 -04:00
@@ -1,6 +1,56 @@
+/******************************************************************************
+ * current.h
+ *
+ * Information structure that lives at the bottom of the per-cpu Xen stack.
+ */
-#ifdef __x86_64__
-#include <asm/x86_64/current.h>
-#else
-#include <asm/x86_32/current.h>
-#endif
+#ifndef __X86_CURRENT_H__
+#define __X86_CURRENT_H__
+
+#include <xen/config.h>
+#include <public/xen.h>
+#include <asm/page.h>
+
+struct exec_domain;
+
+struct cpu_info {
+ struct cpu_user_regs guest_cpu_user_regs;
+ unsigned int processor_id;
+ struct exec_domain *current_ed;
+};
+
+static inline struct cpu_info *get_cpu_info(void)
+{
+ struct cpu_info *cpu_info;
+ __asm__ ( "and %%"__OP"sp,%0; or %2,%0"
+ : "=r" (cpu_info)
+ : "0" (~(STACK_SIZE-1)), "i" (STACK_SIZE-sizeof(struct cpu_info))
+ );
+ return cpu_info;
+}
+
+#define get_current() (get_cpu_info()->current_ed)
+#define set_current(_ed) (get_cpu_info()->current_ed = (_ed))
+#define current (get_current())
+
+#define get_processor_id() (get_cpu_info()->processor_id)
+#define set_processor_id(_id) (get_cpu_info()->processor_id = (_id))
+
+#define guest_cpu_user_regs() (&get_cpu_info()->guest_cpu_user_regs)
+
+/*
+ * Get the bottom-of-stack, as stored in the per-CPU TSS. This actually points
+ * into the middle of cpu_info.guest_cpu_user_regs, at the section that
+ * precisely corresponds to a CPU trap frame.
+ */
+#define get_stack_bottom() \
+ ((unsigned long)&get_cpu_info()->guest_cpu_user_regs.es)
+
+#define reset_stack_and_jump(__fn) \
+ __asm__ __volatile__ ( \
+ "mov %0,%%"__OP"sp; jmp "STR(__fn) \
+ : : "r" (guest_cpu_user_regs()) )
+
+#define schedule_tail(_ed) (((_ed)->arch.schedule_tail)(_ed))
+
+#endif /* __X86_CURRENT_H__ */
diff -Nru a/xen/include/asm-x86/smp.h b/xen/include/asm-x86/smp.h
--- a/xen/include/asm-x86/smp.h 2005-05-18 13:03:56 -04:00
+++ b/xen/include/asm-x86/smp.h 2005-05-18 13:03:56 -04:00
@@ -8,6 +8,7 @@
#include <xen/config.h>
#include <xen/kernel.h>
#include <xen/cpumask.h>
+#include <asm/current.h>
#endif
#ifdef CONFIG_X86_LOCAL_APIC
@@ -48,7 +49,7 @@
* from the initial startup. We map APIC_BASE very early in page_setup(),
* so this is correct in the x86 case.
*/
-#define __smp_processor_id() (current->processor)
+#define __smp_processor_id() (get_processor_id())
extern cpumask_t cpu_callout_map;
extern cpumask_t cpu_callin_map;
diff -Nru a/xen/include/asm-x86/x86_32/current.h
b/xen/include/asm-x86/x86_32/current.h
--- a/xen/include/asm-x86/x86_32/current.h 2005-05-18 13:03:56 -04:00
+++ /dev/null Wed Dec 31 16:00:00 196900
@@ -1,66 +0,0 @@
-
-#ifndef _X86_CURRENT_H
-#define _X86_CURRENT_H
-
-struct domain;
-
-#define STACK_RESERVED \
- (sizeof(struct cpu_user_regs) + sizeof(struct domain *))
-
-static inline struct exec_domain *get_current(void)
-{
- struct exec_domain *ed;
- __asm__ ( "orl %%esp,%0; andl $~3,%0; movl (%0),%0"
- : "=r" (ed) : "0" (STACK_SIZE-4) );
- return ed;
-}
-
-#define current get_current()
-
-static inline void set_current(struct exec_domain *ed)
-{
- __asm__ ( "orl %%esp,%0; andl $~3,%0; movl %1,(%0)"
- : : "r" (STACK_SIZE-4), "r" (ed) );
-}
-
-static inline struct cpu_user_regs *guest_cpu_user_regs(void)
-{
- struct cpu_user_regs *cpu_user_regs;
- __asm__ ( "andl %%esp,%0; addl %2,%0"
- : "=r" (cpu_user_regs)
- : "0" (~(STACK_SIZE-1)), "i" (STACK_SIZE-STACK_RESERVED) );
- return cpu_user_regs;
-}
-
-/*
- * Get the bottom-of-stack, as stored in the per-CPU TSS. This is actually
- * 20 bytes before the real bottom of the stack to allow space for:
- * domain pointer, DS, ES, FS, GS.
- */
-static inline unsigned long get_stack_bottom(void)
-{
- unsigned long p;
- __asm__ ( "andl %%esp,%0; addl %2,%0"
- : "=r" (p)
- : "0" (~(STACK_SIZE-1)), "i" (STACK_SIZE-20) );
- return p;
-}
-
-#define reset_stack_and_jump(__fn) \
- __asm__ __volatile__ ( \
- "movl %0,%%esp; jmp "STR(__fn) \
- : : "r" (guest_cpu_user_regs()) )
-
-#define schedule_tail(_ed) ((_ed)->arch.schedule_tail)(_ed)
-
-#endif /* _X86_CURRENT_H */
-
-/*
- * Local variables:
- * mode: C
- * c-set-style: "BSD"
- * c-basic-offset: 4
- * tab-width: 4
- * indent-tabs-mode: nil
- * End:
- */
diff -Nru a/xen/include/asm-x86/x86_64/current.h
b/xen/include/asm-x86/x86_64/current.h
--- a/xen/include/asm-x86/x86_64/current.h 2005-05-18 13:03:56 -04:00
+++ /dev/null Wed Dec 31 16:00:00 196900
@@ -1,68 +0,0 @@
-
-#ifndef _X86_64_CURRENT_H
-#define _X86_64_CURRENT_H
-
-struct domain;
-
-#define STACK_RESERVED \
- (sizeof(struct cpu_user_regs) + sizeof(struct domain *) + 8)
-
-static inline struct exec_domain *get_current(void)
-{
- struct exec_domain *ed;
- __asm__ ( "orq %%rsp,%0; andq $~7,%0; movq (%0),%0"
- : "=r" (ed) : "0" (STACK_SIZE-8) );
- return ed;
-}
-
-#define current get_current()
-
-static inline void set_current(struct exec_domain *ed)
-{
- __asm__ ( "orq %%rsp,%0; andq $~7,%0; movq %1,(%0)"
- : : "r" (STACK_SIZE-8), "r" (ed) );
-}
-
-static inline struct cpu_user_regs *guest_cpu_user_regs(void)
-{
- struct cpu_user_regs *cpu_user_regs;
- __asm__( "andq %%rsp,%0; addq %2,%0"
- : "=r" (cpu_user_regs)
- : "0" (~(STACK_SIZE-1)), "i" (STACK_SIZE-STACK_RESERVED) );
- return cpu_user_regs;
-}
-
-/*
- * Get the bottom-of-stack, as stored in the per-CPU TSS. This is actually
- * 48 bytes before the real bottom of the stack to allow space for:
- * domain pointer, padding, DS, ES, FS, GS. The padding is required to
- * have the stack pointer 16-byte aligned: the amount we subtract from
- * STACK_SIZE *must* be a multiple of 16.
- */
-static inline unsigned long get_stack_bottom(void)
-{
- unsigned long p;
- __asm__( "andq %%rsp,%0; addq %2,%0"
- : "=r" (p)
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|