- Update Xen patches to c/s 1011.
[opensuse:kernel-source.git] / patches.xen / xen3-auto-arch-i386.diff
1 Subject: xen3 arch-i386
2 From: http://xenbits.xensource.com/linux-2.6.18-xen.hg (tip 1011:11175e60d393)
3 Patch-mainline: obsolete
4 Acked-by: jbeulich@novell.com
5
6 --- sle11sp1-2010-03-01.orig/arch/x86/kernel/asm-offsets_32.c   2010-03-01 14:09:07.000000000 +0100
7 +++ sle11sp1-2010-03-01/arch/x86/kernel/asm-offsets_32.c        2009-12-04 10:44:46.000000000 +0100
8 @@ -93,9 +93,14 @@ void foo(void)
9         OFFSET(pbe_orig_address, pbe, orig_address);
10         OFFSET(pbe_next, pbe, next);
11  
12 +#ifndef CONFIG_X86_NO_TSS
13         /* Offset from the sysenter stack to tss.sp0 */
14 -       DEFINE(TSS_sysenter_sp0, offsetof(struct tss_struct, x86_tss.sp0) -
15 +       DEFINE(SYSENTER_stack_sp0, offsetof(struct tss_struct, x86_tss.sp0) -
16                  sizeof(struct tss_struct));
17 +#else
18 +       /* sysenter stack points directly to sp0 */
19 +       DEFINE(SYSENTER_stack_sp0, 0);
20 +#endif
21  
22         DEFINE(PAGE_SIZE_asm, PAGE_SIZE);
23         DEFINE(PAGE_SHIFT_asm, PAGE_SHIFT);
24 --- sle11sp1-2010-03-01.orig/arch/x86/kernel/entry_32.S 2010-03-01 14:09:07.000000000 +0100
25 +++ sle11sp1-2010-03-01/arch/x86/kernel/entry_32.S      2009-12-04 10:44:46.000000000 +0100
26 @@ -393,7 +393,7 @@ ENTRY(ia32_sysenter_target)
27         CFI_SIGNAL_FRAME
28         CFI_DEF_CFA esp, 0
29         CFI_REGISTER esp, ebp
30 -       movl TSS_sysenter_sp0(%esp),%esp
31 +       movl SYSENTER_stack_sp0(%esp),%esp
32  sysenter_past_esp:
33         /*
34          * Interrupts are disabled here, but we can't trace it until
35 @@ -1325,7 +1325,7 @@ END(page_fault)
36   * that sets up the real kernel stack. Check here, since we can't
37   * allow the wrong stack to be used.
38   *
39 - * "TSS_sysenter_sp0+12" is because the NMI/debug handler will have
40 + * "SYSENTER_stack_sp0+12" is because the NMI/debug handler will have
41   * already pushed 3 words if it hits on the sysenter instruction:
42   * eflags, cs and eip.
43   *
44 @@ -1337,7 +1337,7 @@ END(page_fault)
45         cmpw $__KERNEL_CS, 4(%esp)
46         jne \ok
47  \label:
48 -       movl TSS_sysenter_sp0 + \offset(%esp), %esp
49 +       movl SYSENTER_stack_sp0 + \offset(%esp), %esp
50         CFI_DEF_CFA esp, 0
51         CFI_UNDEFINED eip
52         pushfl
53 --- sle11sp1-2010-03-01.orig/arch/x86/kernel/machine_kexec_32.c 2009-04-21 10:33:15.000000000 +0200
54 +++ sle11sp1-2010-03-01/arch/x86/kernel/machine_kexec_32.c      2009-12-04 10:44:46.000000000 +0100
55 @@ -26,6 +26,10 @@
56  #include <asm/system.h>
57  #include <asm/cacheflush.h>
58  
59 +#ifdef CONFIG_XEN
60 +#include <xen/interface/kexec.h>
61 +#endif
62 +
63  static void machine_kexec_free_page_tables(struct kimage *image)
64  {
65         free_page((unsigned long)image->arch.pgd);
66 @@ -96,6 +100,55 @@ static void machine_kexec_prepare_page_t
67                 __pa(control_page), __pa(control_page));
68  }
69  
70 +#ifdef CONFIG_XEN
71 +
72 +#define __ma(x) (pfn_to_mfn(__pa((x)) >> PAGE_SHIFT) << PAGE_SHIFT)
73 +
74 +#if PAGES_NR > KEXEC_XEN_NO_PAGES
75 +#error PAGES_NR is greater than KEXEC_XEN_NO_PAGES - Xen support will break
76 +#endif
77 +
78 +#if PA_CONTROL_PAGE != 0
79 +#error PA_CONTROL_PAGE is non zero - Xen support will break
80 +#endif
81 +
82 +void machine_kexec_setup_load_arg(xen_kexec_image_t *xki, struct kimage *image)
83 +{
84 +       void *control_page;
85 +
86 +       memset(xki->page_list, 0, sizeof(xki->page_list));
87 +
88 +       control_page = page_address(image->control_code_page);
89 +       memcpy(control_page, relocate_kernel, PAGE_SIZE);
90 +
91 +       xki->page_list[PA_CONTROL_PAGE] = __ma(control_page);
92 +       xki->page_list[PA_PGD] = __ma(kexec_pgd);
93 +#ifdef CONFIG_X86_PAE
94 +       xki->page_list[PA_PMD_0] = __ma(kexec_pmd0);
95 +       xki->page_list[PA_PMD_1] = __ma(kexec_pmd1);
96 +#endif
97 +       xki->page_list[PA_PTE_0] = __ma(kexec_pte0);
98 +       xki->page_list[PA_PTE_1] = __ma(kexec_pte1);
99 +
100 +}
101 +
102 +int __init machine_kexec_setup_resources(struct resource *hypervisor,
103 +                                        struct resource *phys_cpus,
104 +                                        int nr_phys_cpus)
105 +{
106 +       int k;
107 +
108 +       /* The per-cpu crash note resources belong to the hypervisor resource */
109 +       for (k = 0; k < nr_phys_cpus; k++)
110 +               request_resource(hypervisor, phys_cpus + k);
111 +
112 +       return 0;
113 +}
114 +
115 +void machine_kexec_register_resources(struct resource *res) { ; }
116 +
117 +#endif /* CONFIG_XEN */
118 +
119  /*
120   * A architecture hook called to validate the
121   * proposed image and prepare the control pages
122 @@ -135,6 +188,7 @@ void machine_kexec_cleanup(struct kimage
123         machine_kexec_free_page_tables(image);
124  }
125  
126 +#ifndef CONFIG_XEN
127  /*
128   * Do not allocate memory (or fail in any way) in machine_kexec().
129   * We are past the point of no return, committed to rebooting now.
130 @@ -199,6 +253,7 @@ void machine_kexec(struct kimage *image)
131  
132         __ftrace_enabled_restore(save_ftrace_enabled);
133  }
134 +#endif
135  
136  void arch_crash_save_vmcoreinfo(void)
137  {
138 --- sle11sp1-2010-03-01.orig/arch/x86/kernel/vm86_32.c  2010-03-01 14:09:07.000000000 +0100
139 +++ sle11sp1-2010-03-01/arch/x86/kernel/vm86_32.c       2009-12-04 10:44:46.000000000 +0100
140 @@ -125,7 +125,9 @@ static int copy_vm86_regs_from_user(stru
141  
142  struct pt_regs *save_v86_state(struct kernel_vm86_regs *regs)
143  {
144 +#ifndef CONFIG_X86_NO_TSS
145         struct tss_struct *tss;
146 +#endif
147         struct pt_regs *ret;
148         unsigned long tmp;
149  
150 @@ -148,12 +150,16 @@ struct pt_regs *save_v86_state(struct ke
151                 do_exit(SIGSEGV);
152         }
153  
154 +#ifndef CONFIG_X86_NO_TSS
155         tss = &per_cpu(init_tss, get_cpu());
156 +#endif
157         current->thread.sp0 = current->thread.saved_sp0;
158         current->thread.sysenter_cs = __KERNEL_CS;
159         load_sp0(tss, &current->thread);
160         current->thread.saved_sp0 = 0;
161 +#ifndef CONFIG_X86_NO_TSS
162         put_cpu();
163 +#endif
164  
165         ret = KVM86->regs32;
166  
167 @@ -280,7 +286,9 @@ out:
168  
169  static void do_sys_vm86(struct kernel_vm86_struct *info, struct task_struct *tsk)
170  {
171 +#ifndef CONFIG_X86_NO_TSS
172         struct tss_struct *tss;
173 +#endif
174  /*
175   * make sure the vm86() system call doesn't try to do anything silly
176   */
177 @@ -324,12 +332,16 @@ static void do_sys_vm86(struct kernel_vm
178         tsk->thread.saved_fs = info->regs32->fs;
179         tsk->thread.saved_gs = get_user_gs(info->regs32);
180  
181 +#ifndef CONFIG_X86_NO_TSS
182         tss = &per_cpu(init_tss, get_cpu());
183 +#endif
184         tsk->thread.sp0 = (unsigned long) &info->VM86_TSS_ESP0;
185         if (cpu_has_sep)
186                 tsk->thread.sysenter_cs = 0;
187         load_sp0(tss, &tsk->thread);
188 +#ifndef CONFIG_X86_NO_TSS
189         put_cpu();
190 +#endif
191  
192         tsk->thread.screen_bitmap = info->screen_bitmap;
193         if (info->flags & VM86_SCREEN_BITMAP)