This commit was manufactured by cvs2svn to create tag
[linux-2.6.git] / include / asm-i386 / processor.h
index 9d49ea2..3651a3b 100644 (file)
@@ -259,14 +259,8 @@ static inline void clear_in_cr4 (unsigned long mask)
 
 /*
  * Bus types (default is ISA, but people can check others with these..)
- * pc98 indicates PC98 systems (CBUS)
  */
 extern int MCA_bus;
-#ifdef CONFIG_X86_PC9800
-#define pc98 1
-#else
-#define pc98 0
-#endif
 
 static inline void __monitor(const void *eax, unsigned long ecx,
                unsigned long edx)
@@ -292,15 +286,15 @@ extern unsigned int machine_submodel_id;
 extern unsigned int BIOS_revision;
 extern unsigned int mca_pentium_flag;
 
-/*
- * User space process size: 3GB (default).
- */
-#define TASK_SIZE      (PAGE_OFFSET)
-
 /* This decides where the kernel will search for a free chunk of vm
  * space during mmap's.
  */
-#define TASK_UNMAPPED_BASE     (PAGE_ALIGN(TASK_SIZE / 3))
+#define TASK_UNMAPPED_BASE     PAGE_ALIGN(TASK_SIZE/3)
+
+#define __HAVE_ARCH_ALIGN_STACK
+extern unsigned long arch_align_stack(unsigned long sp);
+
+#define HAVE_ARCH_PICK_MMAP_LAYOUT
 
 /*
  * Size of io_bitmap, covering ports 0 to 0x3ff.
@@ -406,9 +400,16 @@ struct tss_struct {
 
 #define ARCH_MIN_TASKALIGN     16
 
+#if ((1<<CONFIG_STACK_SIZE_SHIFT) < PAGE_SIZE)
+#error (1<<CONFIG_STACK_SIZE_SHIFT) must be at least PAGE_SIZE
+#endif
+#define STACK_PAGE_COUNT       ((1<<CONFIG_STACK_SIZE_SHIFT)/PAGE_SIZE)
+
+
 struct thread_struct {
 /* cached TLS descriptors. */
        struct desc_struct tls_array[GDT_ENTRY_TLS_ENTRIES];
+       void *stack_page[STACK_PAGE_COUNT];
        unsigned long   esp0;
        unsigned long   sysenter_cs;
        unsigned long   eip;
@@ -452,7 +453,8 @@ struct thread_struct {
        .io_bitmap      = { [ 0 ... IO_BITMAP_LONGS] = ~0 },            \
 }
 
-static inline void load_esp0(struct tss_struct *tss, struct thread_struct *thread)
+static inline void
+load_esp0(struct tss_struct *tss, struct thread_struct *thread)
 {
        tss->esp0 = thread->esp0;
        /* This can only happen when SEP is enabled, no need to test "SEP"arately */
@@ -471,6 +473,7 @@ static inline void load_esp0(struct tss_struct *tss, struct thread_struct *threa
        regs->xcs = __USER_CS;                                  \
        regs->eip = new_eip;                                    \
        regs->esp = new_esp;                                    \
+       load_user_cs_desc(smp_processor_id(), current->mm);     \
 } while (0)
 
 /* Forward declaration, a strange C thing */
@@ -488,6 +491,23 @@ extern void prepare_to_copy(struct task_struct *tsk);
  */
 extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
 
+#ifdef CONFIG_X86_HIGH_ENTRY
+#define virtual_esp0(tsk) \
+       ((unsigned long)(tsk)->thread_info->virtual_stack + ((tsk)->thread.esp0 - (unsigned long)(tsk)->thread_info->real_stack))
+#else
+# define virtual_esp0(tsk) ((tsk)->thread.esp0)
+#endif
+
+#define load_virtual_esp0(tss, task)                                   \
+       do {                                                            \
+               tss->esp0 = virtual_esp0(task);                         \
+               if (likely(cpu_has_sep) && unlikely(tss->ss1 != task->thread.sysenter_cs)) {    \
+                       tss->ss1 = task->thread.sysenter_cs;            \
+                       wrmsr(MSR_IA32_SYSENTER_CS,                     \
+                               task->thread.sysenter_cs, 0);           \
+               }                                                       \
+       } while (0)
+
 extern unsigned long thread_saved_pc(struct task_struct *tsk);
 void show_trace(struct task_struct *task, unsigned long *stack);