WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] Re-factor current.h. It now requires no sub-architecture

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] Re-factor current.h. It now requires no sub-architecture portions, and
From: BitKeeper Bot <riel@xxxxxxxxxxx>
Date: Wed, 18 May 2005 16:36:44 +0000
Delivery-date: Wed, 18 May 2005 17:03:18 +0000
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: Xen Development List <xen-devel@xxxxxxxxxxxxxxxxxxx>
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] Re-factor current.h. It now requires no sub-architecture portions, and, BitKeeper Bot <=