Annotation of /trunk/kernel26-alx/patches-2.6.23-r1/0102-2.6.23.3-all-fixes.patch
Parent Directory | Revision Log
Revision 658 -
(hide annotations)
(download)
Mon Jun 23 21:39:39 2008 UTC (16 years, 3 months ago) by niro
File size: 30816 byte(s)
Mon Jun 23 21:39:39 2008 UTC (16 years, 3 months ago) by niro
File size: 30816 byte(s)
2.6.23-alx-r1: new default as we fix the via epia clocksource=tsc quircks -linux-2.6.23.17 -fbcondecor-0.9.4 -squashfs-3.3 -unionfs-2.3.3 -ipw3945-1.2.2 -mptbase-vmware fix
1 | niro | 658 | diff --git a/arch/i386/boot/boot.h b/arch/i386/boot/boot.h |
2 | index 20bab94..3eeb9e5 100644 | ||
3 | --- a/arch/i386/boot/boot.h | ||
4 | +++ b/arch/i386/boot/boot.h | ||
5 | @@ -17,6 +17,8 @@ | ||
6 | #ifndef BOOT_BOOT_H | ||
7 | #define BOOT_BOOT_H | ||
8 | |||
9 | +#define STACK_SIZE 512 /* Minimum number of bytes for stack */ | ||
10 | + | ||
11 | #ifndef __ASSEMBLY__ | ||
12 | |||
13 | #include <stdarg.h> | ||
14 | @@ -198,8 +200,6 @@ static inline int isdigit(int ch) | ||
15 | } | ||
16 | |||
17 | /* Heap -- available for dynamic lists. */ | ||
18 | -#define STACK_SIZE 512 /* Minimum number of bytes for stack */ | ||
19 | - | ||
20 | extern char _end[]; | ||
21 | extern char *HEAP; | ||
22 | extern char *heap_end; | ||
23 | @@ -216,9 +216,9 @@ static inline char *__get_heap(size_t s, size_t a, size_t n) | ||
24 | #define GET_HEAP(type, n) \ | ||
25 | ((type *)__get_heap(sizeof(type),__alignof__(type),(n))) | ||
26 | |||
27 | -static inline int heap_free(void) | ||
28 | +static inline bool heap_free(size_t n) | ||
29 | { | ||
30 | - return heap_end-HEAP; | ||
31 | + return (int)(heap_end-HEAP) >= (int)n; | ||
32 | } | ||
33 | |||
34 | /* copy.S */ | ||
35 | diff --git a/arch/i386/boot/header.S b/arch/i386/boot/header.S | ||
36 | index f3140e5..fff7059 100644 | ||
37 | --- a/arch/i386/boot/header.S | ||
38 | +++ b/arch/i386/boot/header.S | ||
39 | @@ -173,7 +173,8 @@ ramdisk_size: .long 0 # its size in bytes | ||
40 | bootsect_kludge: | ||
41 | .long 0 # obsolete | ||
42 | |||
43 | -heap_end_ptr: .word _end+1024 # (Header version 0x0201 or later) | ||
44 | +heap_end_ptr: .word _end+STACK_SIZE-512 | ||
45 | + # (Header version 0x0201 or later) | ||
46 | # space from here (exclusive) down to | ||
47 | # end of setup code can be used by setup | ||
48 | # for local heap purposes. | ||
49 | @@ -225,28 +226,53 @@ start_of_setup: | ||
50 | int $0x13 | ||
51 | #endif | ||
52 | |||
53 | -# We will have entered with %cs = %ds+0x20, normalize %cs so | ||
54 | -# it is on par with the other segments. | ||
55 | - pushw %ds | ||
56 | - pushw $setup2 | ||
57 | - lretw | ||
58 | - | ||
59 | -setup2: | ||
60 | # Force %es = %ds | ||
61 | movw %ds, %ax | ||
62 | movw %ax, %es | ||
63 | cld | ||
64 | |||
65 | -# Stack paranoia: align the stack and make sure it is good | ||
66 | -# for both 16- and 32-bit references. In particular, if we | ||
67 | -# were meant to have been using the full 16-bit segment, the | ||
68 | -# caller might have set %sp to zero, which breaks %esp-based | ||
69 | -# references. | ||
70 | - andw $~3, %sp # dword align (might as well...) | ||
71 | - jnz 1f | ||
72 | - movw $0xfffc, %sp # Make sure we're not zero | ||
73 | -1: movzwl %sp, %esp # Clear upper half of %esp | ||
74 | - sti | ||
75 | +# Apparently some ancient versions of LILO invoked the kernel | ||
76 | +# with %ss != %ds, which happened to work by accident for the | ||
77 | +# old code. If the CAN_USE_HEAP flag is set in loadflags, or | ||
78 | +# %ss != %ds, then adjust the stack pointer. | ||
79 | + | ||
80 | + # Smallest possible stack we can tolerate | ||
81 | + movw $(_end+STACK_SIZE), %cx | ||
82 | + | ||
83 | + movw heap_end_ptr, %dx | ||
84 | + addw $512, %dx | ||
85 | + jnc 1f | ||
86 | + xorw %dx, %dx # Wraparound - whole segment available | ||
87 | +1: testb $CAN_USE_HEAP, loadflags | ||
88 | + jnz 2f | ||
89 | + | ||
90 | + # No CAN_USE_HEAP | ||
91 | + movw %ss, %dx | ||
92 | + cmpw %ax, %dx # %ds == %ss? | ||
93 | + movw %sp, %dx | ||
94 | + # If so, assume %sp is reasonably set, otherwise use | ||
95 | + # the smallest possible stack. | ||
96 | + jne 4f # -> Smallest possible stack... | ||
97 | + | ||
98 | + # Make sure the stack is at least minimum size. Take a value | ||
99 | + # of zero to mean "full segment." | ||
100 | +2: | ||
101 | + andw $~3, %dx # dword align (might as well...) | ||
102 | + jnz 3f | ||
103 | + movw $0xfffc, %dx # Make sure we're not zero | ||
104 | +3: cmpw %cx, %dx | ||
105 | + jnb 5f | ||
106 | +4: movw %cx, %dx # Minimum value we can possibly use | ||
107 | +5: movw %ax, %ss | ||
108 | + movzwl %dx, %esp # Clear upper half of %esp | ||
109 | + sti # Now we should have a working stack | ||
110 | + | ||
111 | +# We will have entered with %cs = %ds+0x20, normalize %cs so | ||
112 | +# it is on par with the other segments. | ||
113 | + pushw %ds | ||
114 | + pushw $6f | ||
115 | + lretw | ||
116 | +6: | ||
117 | |||
118 | # Check signature at end of setup | ||
119 | cmpl $0x5a5aaa55, setup_sig | ||
120 | diff --git a/arch/i386/boot/video-bios.c b/arch/i386/boot/video-bios.c | ||
121 | index 68e65d9..ed0672a 100644 | ||
122 | --- a/arch/i386/boot/video-bios.c | ||
123 | +++ b/arch/i386/boot/video-bios.c | ||
124 | @@ -79,7 +79,7 @@ static int bios_probe(void) | ||
125 | video_bios.modes = GET_HEAP(struct mode_info, 0); | ||
126 | |||
127 | for (mode = 0x14; mode <= 0x7f; mode++) { | ||
128 | - if (heap_free() < sizeof(struct mode_info)) | ||
129 | + if (!heap_free(sizeof(struct mode_info))) | ||
130 | break; | ||
131 | |||
132 | if (mode_defined(VIDEO_FIRST_BIOS+mode)) | ||
133 | diff --git a/arch/i386/boot/video-vesa.c b/arch/i386/boot/video-vesa.c | ||
134 | index 1921907..4716b9a 100644 | ||
135 | --- a/arch/i386/boot/video-vesa.c | ||
136 | +++ b/arch/i386/boot/video-vesa.c | ||
137 | @@ -57,7 +57,7 @@ static int vesa_probe(void) | ||
138 | while ((mode = rdfs16(mode_ptr)) != 0xffff) { | ||
139 | mode_ptr += 2; | ||
140 | |||
141 | - if (heap_free() < sizeof(struct mode_info)) | ||
142 | + if (!heap_free(sizeof(struct mode_info))) | ||
143 | break; /* Heap full, can't save mode info */ | ||
144 | |||
145 | if (mode & ~0x1ff) | ||
146 | diff --git a/arch/i386/boot/video.c b/arch/i386/boot/video.c | ||
147 | index e4ba897..ad9712f 100644 | ||
148 | --- a/arch/i386/boot/video.c | ||
149 | +++ b/arch/i386/boot/video.c | ||
150 | @@ -371,7 +371,7 @@ static void save_screen(void) | ||
151 | saved.curx = boot_params.screen_info.orig_x; | ||
152 | saved.cury = boot_params.screen_info.orig_y; | ||
153 | |||
154 | - if (heap_free() < saved.x*saved.y*sizeof(u16)+512) | ||
155 | + if (!heap_free(saved.x*saved.y*sizeof(u16)+512)) | ||
156 | return; /* Not enough heap to save the screen */ | ||
157 | |||
158 | saved.data = GET_HEAP(u16, saved.x*saved.y); | ||
159 | diff --git a/arch/i386/kernel/tsc.c b/arch/i386/kernel/tsc.c | ||
160 | index a39280b..7f6add1 100644 | ||
161 | --- a/arch/i386/kernel/tsc.c | ||
162 | +++ b/arch/i386/kernel/tsc.c | ||
163 | @@ -137,7 +137,7 @@ unsigned long native_calculate_cpu_khz(void) | ||
164 | { | ||
165 | unsigned long long start, end; | ||
166 | unsigned long count; | ||
167 | - u64 delta64; | ||
168 | + u64 delta64 = (u64)ULLONG_MAX; | ||
169 | int i; | ||
170 | unsigned long flags; | ||
171 | |||
172 | @@ -149,6 +149,7 @@ unsigned long native_calculate_cpu_khz(void) | ||
173 | rdtscll(start); | ||
174 | mach_countup(&count); | ||
175 | rdtscll(end); | ||
176 | + delta64 = min(delta64, (end - start)); | ||
177 | } | ||
178 | /* | ||
179 | * Error: ECTCNEVERSET | ||
180 | @@ -159,8 +160,6 @@ unsigned long native_calculate_cpu_khz(void) | ||
181 | if (count <= 1) | ||
182 | goto err; | ||
183 | |||
184 | - delta64 = end - start; | ||
185 | - | ||
186 | /* cpu freq too fast: */ | ||
187 | if (delta64 > (1ULL<<32)) | ||
188 | goto err; | ||
189 | diff --git a/arch/i386/xen/enlighten.c b/arch/i386/xen/enlighten.c | ||
190 | index f01bfcd..1ba2408 100644 | ||
191 | --- a/arch/i386/xen/enlighten.c | ||
192 | +++ b/arch/i386/xen/enlighten.c | ||
193 | @@ -56,7 +56,23 @@ DEFINE_PER_CPU(enum paravirt_lazy_mode, xen_lazy_mode); | ||
194 | |||
195 | DEFINE_PER_CPU(struct vcpu_info *, xen_vcpu); | ||
196 | DEFINE_PER_CPU(struct vcpu_info, xen_vcpu_info); | ||
197 | -DEFINE_PER_CPU(unsigned long, xen_cr3); | ||
198 | + | ||
199 | +/* | ||
200 | + * Note about cr3 (pagetable base) values: | ||
201 | + * | ||
202 | + * xen_cr3 contains the current logical cr3 value; it contains the | ||
203 | + * last set cr3. This may not be the current effective cr3, because | ||
204 | + * its update may be being lazily deferred. However, a vcpu looking | ||
205 | + * at its own cr3 can use this value knowing that it everything will | ||
206 | + * be self-consistent. | ||
207 | + * | ||
208 | + * xen_current_cr3 contains the actual vcpu cr3; it is set once the | ||
209 | + * hypercall to set the vcpu cr3 is complete (so it may be a little | ||
210 | + * out of date, but it will never be set early). If one vcpu is | ||
211 | + * looking at another vcpu's cr3 value, it should use this variable. | ||
212 | + */ | ||
213 | +DEFINE_PER_CPU(unsigned long, xen_cr3); /* cr3 stored as physaddr */ | ||
214 | +DEFINE_PER_CPU(unsigned long, xen_current_cr3); /* actual vcpu cr3 */ | ||
215 | |||
216 | struct start_info *xen_start_info; | ||
217 | EXPORT_SYMBOL_GPL(xen_start_info); | ||
218 | @@ -100,7 +116,7 @@ static void __init xen_vcpu_setup(int cpu) | ||
219 | info.mfn = virt_to_mfn(vcpup); | ||
220 | info.offset = offset_in_page(vcpup); | ||
221 | |||
222 | - printk(KERN_DEBUG "trying to map vcpu_info %d at %p, mfn %x, offset %d\n", | ||
223 | + printk(KERN_DEBUG "trying to map vcpu_info %d at %p, mfn %llx, offset %d\n", | ||
224 | cpu, vcpup, info.mfn, info.offset); | ||
225 | |||
226 | /* Check to see if the hypervisor will put the vcpu_info | ||
227 | @@ -632,32 +648,36 @@ static unsigned long xen_read_cr3(void) | ||
228 | return x86_read_percpu(xen_cr3); | ||
229 | } | ||
230 | |||
231 | +static void set_current_cr3(void *v) | ||
232 | +{ | ||
233 | + x86_write_percpu(xen_current_cr3, (unsigned long)v); | ||
234 | +} | ||
235 | + | ||
236 | static void xen_write_cr3(unsigned long cr3) | ||
237 | { | ||
238 | + struct mmuext_op *op; | ||
239 | + struct multicall_space mcs; | ||
240 | + unsigned long mfn = pfn_to_mfn(PFN_DOWN(cr3)); | ||
241 | + | ||
242 | BUG_ON(preemptible()); | ||
243 | |||
244 | - if (cr3 == x86_read_percpu(xen_cr3)) { | ||
245 | - /* just a simple tlb flush */ | ||
246 | - xen_flush_tlb(); | ||
247 | - return; | ||
248 | - } | ||
249 | + mcs = xen_mc_entry(sizeof(*op)); /* disables interrupts */ | ||
250 | |||
251 | + /* Update while interrupts are disabled, so its atomic with | ||
252 | + respect to ipis */ | ||
253 | x86_write_percpu(xen_cr3, cr3); | ||
254 | |||
255 | + op = mcs.args; | ||
256 | + op->cmd = MMUEXT_NEW_BASEPTR; | ||
257 | + op->arg1.mfn = mfn; | ||
258 | |||
259 | - { | ||
260 | - struct mmuext_op *op; | ||
261 | - struct multicall_space mcs = xen_mc_entry(sizeof(*op)); | ||
262 | - unsigned long mfn = pfn_to_mfn(PFN_DOWN(cr3)); | ||
263 | - | ||
264 | - op = mcs.args; | ||
265 | - op->cmd = MMUEXT_NEW_BASEPTR; | ||
266 | - op->arg1.mfn = mfn; | ||
267 | + MULTI_mmuext_op(mcs.mc, op, 1, NULL, DOMID_SELF); | ||
268 | |||
269 | - MULTI_mmuext_op(mcs.mc, op, 1, NULL, DOMID_SELF); | ||
270 | + /* Update xen_update_cr3 once the batch has actually | ||
271 | + been submitted. */ | ||
272 | + xen_mc_callback(set_current_cr3, (void *)cr3); | ||
273 | |||
274 | - xen_mc_issue(PARAVIRT_LAZY_CPU); | ||
275 | - } | ||
276 | + xen_mc_issue(PARAVIRT_LAZY_CPU); /* interrupts restored */ | ||
277 | } | ||
278 | |||
279 | /* Early in boot, while setting up the initial pagetable, assume | ||
280 | @@ -1113,6 +1133,7 @@ asmlinkage void __init xen_start_kernel(void) | ||
281 | /* keep using Xen gdt for now; no urgent need to change it */ | ||
282 | |||
283 | x86_write_percpu(xen_cr3, __pa(pgd)); | ||
284 | + x86_write_percpu(xen_current_cr3, __pa(pgd)); | ||
285 | |||
286 | #ifdef CONFIG_SMP | ||
287 | /* Don't do the full vcpu_info placement stuff until we have a | ||
288 | diff --git a/arch/i386/xen/mmu.c b/arch/i386/xen/mmu.c | ||
289 | index 874db0c..c476dfa 100644 | ||
290 | --- a/arch/i386/xen/mmu.c | ||
291 | +++ b/arch/i386/xen/mmu.c | ||
292 | @@ -515,20 +515,43 @@ static void drop_other_mm_ref(void *info) | ||
293 | |||
294 | if (__get_cpu_var(cpu_tlbstate).active_mm == mm) | ||
295 | leave_mm(smp_processor_id()); | ||
296 | + | ||
297 | + /* If this cpu still has a stale cr3 reference, then make sure | ||
298 | + it has been flushed. */ | ||
299 | + if (x86_read_percpu(xen_current_cr3) == __pa(mm->pgd)) { | ||
300 | + load_cr3(swapper_pg_dir); | ||
301 | + arch_flush_lazy_cpu_mode(); | ||
302 | + } | ||
303 | } | ||
304 | |||
305 | static void drop_mm_ref(struct mm_struct *mm) | ||
306 | { | ||
307 | + cpumask_t mask; | ||
308 | + unsigned cpu; | ||
309 | + | ||
310 | if (current->active_mm == mm) { | ||
311 | if (current->mm == mm) | ||
312 | load_cr3(swapper_pg_dir); | ||
313 | else | ||
314 | leave_mm(smp_processor_id()); | ||
315 | + arch_flush_lazy_cpu_mode(); | ||
316 | + } | ||
317 | + | ||
318 | + /* Get the "official" set of cpus referring to our pagetable. */ | ||
319 | + mask = mm->cpu_vm_mask; | ||
320 | + | ||
321 | + /* It's possible that a vcpu may have a stale reference to our | ||
322 | + cr3, because its in lazy mode, and it hasn't yet flushed | ||
323 | + its set of pending hypercalls yet. In this case, we can | ||
324 | + look at its actual current cr3 value, and force it to flush | ||
325 | + if needed. */ | ||
326 | + for_each_online_cpu(cpu) { | ||
327 | + if (per_cpu(xen_current_cr3, cpu) == __pa(mm->pgd)) | ||
328 | + cpu_set(cpu, mask); | ||
329 | } | ||
330 | |||
331 | - if (!cpus_empty(mm->cpu_vm_mask)) | ||
332 | - xen_smp_call_function_mask(mm->cpu_vm_mask, drop_other_mm_ref, | ||
333 | - mm, 1); | ||
334 | + if (!cpus_empty(mask)) | ||
335 | + xen_smp_call_function_mask(mask, drop_other_mm_ref, mm, 1); | ||
336 | } | ||
337 | #else | ||
338 | static void drop_mm_ref(struct mm_struct *mm) | ||
339 | diff --git a/arch/i386/xen/multicalls.c b/arch/i386/xen/multicalls.c | ||
340 | index c837e8e..ce9c4b4 100644 | ||
341 | --- a/arch/i386/xen/multicalls.c | ||
342 | +++ b/arch/i386/xen/multicalls.c | ||
343 | @@ -32,7 +32,11 @@ | ||
344 | struct mc_buffer { | ||
345 | struct multicall_entry entries[MC_BATCH]; | ||
346 | u64 args[MC_ARGS]; | ||
347 | - unsigned mcidx, argidx; | ||
348 | + struct callback { | ||
349 | + void (*fn)(void *); | ||
350 | + void *data; | ||
351 | + } callbacks[MC_BATCH]; | ||
352 | + unsigned mcidx, argidx, cbidx; | ||
353 | }; | ||
354 | |||
355 | static DEFINE_PER_CPU(struct mc_buffer, mc_buffer); | ||
356 | @@ -43,6 +47,7 @@ void xen_mc_flush(void) | ||
357 | struct mc_buffer *b = &__get_cpu_var(mc_buffer); | ||
358 | int ret = 0; | ||
359 | unsigned long flags; | ||
360 | + int i; | ||
361 | |||
362 | BUG_ON(preemptible()); | ||
363 | |||
364 | @@ -51,8 +56,6 @@ void xen_mc_flush(void) | ||
365 | local_irq_save(flags); | ||
366 | |||
367 | if (b->mcidx) { | ||
368 | - int i; | ||
369 | - | ||
370 | if (HYPERVISOR_multicall(b->entries, b->mcidx) != 0) | ||
371 | BUG(); | ||
372 | for (i = 0; i < b->mcidx; i++) | ||
373 | @@ -65,6 +68,13 @@ void xen_mc_flush(void) | ||
374 | |||
375 | local_irq_restore(flags); | ||
376 | |||
377 | + for(i = 0; i < b->cbidx; i++) { | ||
378 | + struct callback *cb = &b->callbacks[i]; | ||
379 | + | ||
380 | + (*cb->fn)(cb->data); | ||
381 | + } | ||
382 | + b->cbidx = 0; | ||
383 | + | ||
384 | BUG_ON(ret); | ||
385 | } | ||
386 | |||
387 | @@ -88,3 +98,16 @@ struct multicall_space __xen_mc_entry(size_t args) | ||
388 | |||
389 | return ret; | ||
390 | } | ||
391 | + | ||
392 | +void xen_mc_callback(void (*fn)(void *), void *data) | ||
393 | +{ | ||
394 | + struct mc_buffer *b = &__get_cpu_var(mc_buffer); | ||
395 | + struct callback *cb; | ||
396 | + | ||
397 | + if (b->cbidx == MC_BATCH) | ||
398 | + xen_mc_flush(); | ||
399 | + | ||
400 | + cb = &b->callbacks[b->cbidx++]; | ||
401 | + cb->fn = fn; | ||
402 | + cb->data = data; | ||
403 | +} | ||
404 | diff --git a/arch/i386/xen/multicalls.h b/arch/i386/xen/multicalls.h | ||
405 | index e6f7530..e3ed9c8 100644 | ||
406 | --- a/arch/i386/xen/multicalls.h | ||
407 | +++ b/arch/i386/xen/multicalls.h | ||
408 | @@ -42,4 +42,7 @@ static inline void xen_mc_issue(unsigned mode) | ||
409 | local_irq_restore(x86_read_percpu(xen_mc_irq_flags)); | ||
410 | } | ||
411 | |||
412 | +/* Set up a callback to be called when the current batch is flushed */ | ||
413 | +void xen_mc_callback(void (*fn)(void *), void *data); | ||
414 | + | ||
415 | #endif /* _XEN_MULTICALLS_H */ | ||
416 | diff --git a/arch/i386/xen/xen-ops.h b/arch/i386/xen/xen-ops.h | ||
417 | index b9aaea4..c69708b 100644 | ||
418 | --- a/arch/i386/xen/xen-ops.h | ||
419 | +++ b/arch/i386/xen/xen-ops.h | ||
420 | @@ -11,6 +11,7 @@ void xen_copy_trap_info(struct trap_info *traps); | ||
421 | |||
422 | DECLARE_PER_CPU(struct vcpu_info *, xen_vcpu); | ||
423 | DECLARE_PER_CPU(unsigned long, xen_cr3); | ||
424 | +DECLARE_PER_CPU(unsigned long, xen_current_cr3); | ||
425 | |||
426 | extern struct start_info *xen_start_info; | ||
427 | extern struct shared_info *HYPERVISOR_shared_info; | ||
428 | diff --git a/arch/mips/mm/c-r4k.c b/arch/mips/mm/c-r4k.c | ||
429 | index bad5719..9da2a42 100644 | ||
430 | --- a/arch/mips/mm/c-r4k.c | ||
431 | +++ b/arch/mips/mm/c-r4k.c | ||
432 | @@ -360,11 +360,26 @@ static void r4k___flush_cache_all(void) | ||
433 | r4k_on_each_cpu(local_r4k___flush_cache_all, NULL, 1, 1); | ||
434 | } | ||
435 | |||
436 | +static inline int has_valid_asid(const struct mm_struct *mm) | ||
437 | +{ | ||
438 | +#if defined(CONFIG_MIPS_MT_SMP) || defined(CONFIG_MIPS_MT_SMTC) | ||
439 | + int i; | ||
440 | + | ||
441 | + for_each_online_cpu(i) | ||
442 | + if (cpu_context(i, mm)) | ||
443 | + return 1; | ||
444 | + | ||
445 | + return 0; | ||
446 | +#else | ||
447 | + return cpu_context(smp_processor_id(), mm); | ||
448 | +#endif | ||
449 | +} | ||
450 | + | ||
451 | static inline void local_r4k_flush_cache_range(void * args) | ||
452 | { | ||
453 | struct vm_area_struct *vma = args; | ||
454 | |||
455 | - if (!(cpu_context(smp_processor_id(), vma->vm_mm))) | ||
456 | + if (!(has_valid_asid(vma->vm_mm))) | ||
457 | return; | ||
458 | |||
459 | r4k_blast_dcache(); | ||
460 | @@ -383,7 +398,7 @@ static inline void local_r4k_flush_cache_mm(void * args) | ||
461 | { | ||
462 | struct mm_struct *mm = args; | ||
463 | |||
464 | - if (!cpu_context(smp_processor_id(), mm)) | ||
465 | + if (!has_valid_asid(mm)) | ||
466 | return; | ||
467 | |||
468 | /* | ||
469 | @@ -434,7 +449,7 @@ static inline void local_r4k_flush_cache_page(void *args) | ||
470 | * If ownes no valid ASID yet, cannot possibly have gotten | ||
471 | * this page into the cache. | ||
472 | */ | ||
473 | - if (cpu_context(smp_processor_id(), mm) == 0) | ||
474 | + if (!has_valid_asid(mm)) | ||
475 | return; | ||
476 | |||
477 | addr &= PAGE_MASK; | ||
478 | diff --git a/arch/powerpc/math-emu/math.c b/arch/powerpc/math-emu/math.c | ||
479 | index 69058b2..381306b 100644 | ||
480 | --- a/arch/powerpc/math-emu/math.c | ||
481 | +++ b/arch/powerpc/math-emu/math.c | ||
482 | @@ -407,11 +407,16 @@ do_mathemu(struct pt_regs *regs) | ||
483 | |||
484 | case XE: | ||
485 | idx = (insn >> 16) & 0x1f; | ||
486 | - if (!idx) | ||
487 | - goto illegal; | ||
488 | - | ||
489 | op0 = (void *)¤t->thread.fpr[(insn >> 21) & 0x1f]; | ||
490 | - op1 = (void *)(regs->gpr[idx] + regs->gpr[(insn >> 11) & 0x1f]); | ||
491 | + if (!idx) { | ||
492 | + if (((insn >> 1) & 0x3ff) == STFIWX) | ||
493 | + op1 = (void *)(regs->gpr[(insn >> 11) & 0x1f]); | ||
494 | + else | ||
495 | + goto illegal; | ||
496 | + } else { | ||
497 | + op1 = (void *)(regs->gpr[idx] + regs->gpr[(insn >> 11) & 0x1f]); | ||
498 | + } | ||
499 | + | ||
500 | break; | ||
501 | |||
502 | case XEU: | ||
503 | diff --git a/arch/powerpc/platforms/cell/axon_msi.c b/arch/powerpc/platforms/cell/axon_msi.c | ||
504 | index 4c9ab5b..c767065 100644 | ||
505 | --- a/arch/powerpc/platforms/cell/axon_msi.c | ||
506 | +++ b/arch/powerpc/platforms/cell/axon_msi.c | ||
507 | @@ -126,7 +126,7 @@ static struct axon_msic *find_msi_translator(struct pci_dev *dev) | ||
508 | const phandle *ph; | ||
509 | struct axon_msic *msic = NULL; | ||
510 | |||
511 | - dn = pci_device_to_OF_node(dev); | ||
512 | + dn = of_node_get(pci_device_to_OF_node(dev)); | ||
513 | if (!dn) { | ||
514 | dev_dbg(&dev->dev, "axon_msi: no pci_dn found\n"); | ||
515 | return NULL; | ||
516 | @@ -183,7 +183,7 @@ static int setup_msi_msg_address(struct pci_dev *dev, struct msi_msg *msg) | ||
517 | int len; | ||
518 | const u32 *prop; | ||
519 | |||
520 | - dn = pci_device_to_OF_node(dev); | ||
521 | + dn = of_node_get(pci_device_to_OF_node(dev)); | ||
522 | if (!dn) { | ||
523 | dev_dbg(&dev->dev, "axon_msi: no pci_dn found\n"); | ||
524 | return -ENODEV; | ||
525 | diff --git a/arch/sparc64/kernel/sys_sparc.c b/arch/sparc64/kernel/sys_sparc.c | ||
526 | index d108eeb..6bf7bcd 100644 | ||
527 | --- a/arch/sparc64/kernel/sys_sparc.c | ||
528 | +++ b/arch/sparc64/kernel/sys_sparc.c | ||
529 | @@ -319,7 +319,7 @@ unsigned long get_fb_unmapped_area(struct file *filp, unsigned long orig_addr, u | ||
530 | |||
531 | if (flags & MAP_FIXED) { | ||
532 | /* Ok, don't mess with it. */ | ||
533 | - return get_unmapped_area(NULL, addr, len, pgoff, flags); | ||
534 | + return get_unmapped_area(NULL, orig_addr, len, pgoff, flags); | ||
535 | } | ||
536 | flags &= ~MAP_SHARED; | ||
537 | |||
538 | diff --git a/arch/sparc64/lib/xor.S b/arch/sparc64/lib/xor.S | ||
539 | index a79c888..f44f58f 100644 | ||
540 | --- a/arch/sparc64/lib/xor.S | ||
541 | +++ b/arch/sparc64/lib/xor.S | ||
542 | @@ -491,12 +491,12 @@ xor_niagara_4: /* %o0=bytes, %o1=dest, %o2=src1, %o3=src2, %o4=src3 */ | ||
543 | ldda [%i1 + 0x10] %asi, %i2 /* %i2/%i3 = src1 + 0x10 */ | ||
544 | xor %g2, %i4, %g2 | ||
545 | xor %g3, %i5, %g3 | ||
546 | - ldda [%i7 + 0x10] %asi, %i4 /* %i4/%i5 = src2 + 0x10 */ | ||
547 | + ldda [%l7 + 0x10] %asi, %i4 /* %i4/%i5 = src2 + 0x10 */ | ||
548 | xor %l0, %g2, %l0 | ||
549 | xor %l1, %g3, %l1 | ||
550 | stxa %l0, [%i0 + 0x00] %asi | ||
551 | stxa %l1, [%i0 + 0x08] %asi | ||
552 | - ldda [%i6 + 0x10] %asi, %g2 /* %g2/%g3 = src3 + 0x10 */ | ||
553 | + ldda [%l6 + 0x10] %asi, %g2 /* %g2/%g3 = src3 + 0x10 */ | ||
554 | ldda [%i0 + 0x10] %asi, %l0 /* %l0/%l1 = dest + 0x10 */ | ||
555 | |||
556 | xor %i4, %i2, %i4 | ||
557 | @@ -504,12 +504,12 @@ xor_niagara_4: /* %o0=bytes, %o1=dest, %o2=src1, %o3=src2, %o4=src3 */ | ||
558 | ldda [%i1 + 0x20] %asi, %i2 /* %i2/%i3 = src1 + 0x20 */ | ||
559 | xor %g2, %i4, %g2 | ||
560 | xor %g3, %i5, %g3 | ||
561 | - ldda [%i7 + 0x20] %asi, %i4 /* %i4/%i5 = src2 + 0x20 */ | ||
562 | + ldda [%l7 + 0x20] %asi, %i4 /* %i4/%i5 = src2 + 0x20 */ | ||
563 | xor %l0, %g2, %l0 | ||
564 | xor %l1, %g3, %l1 | ||
565 | stxa %l0, [%i0 + 0x10] %asi | ||
566 | stxa %l1, [%i0 + 0x18] %asi | ||
567 | - ldda [%i6 + 0x20] %asi, %g2 /* %g2/%g3 = src3 + 0x20 */ | ||
568 | + ldda [%l6 + 0x20] %asi, %g2 /* %g2/%g3 = src3 + 0x20 */ | ||
569 | ldda [%i0 + 0x20] %asi, %l0 /* %l0/%l1 = dest + 0x20 */ | ||
570 | |||
571 | xor %i4, %i2, %i4 | ||
572 | @@ -517,12 +517,12 @@ xor_niagara_4: /* %o0=bytes, %o1=dest, %o2=src1, %o3=src2, %o4=src3 */ | ||
573 | ldda [%i1 + 0x30] %asi, %i2 /* %i2/%i3 = src1 + 0x30 */ | ||
574 | xor %g2, %i4, %g2 | ||
575 | xor %g3, %i5, %g3 | ||
576 | - ldda [%i7 + 0x30] %asi, %i4 /* %i4/%i5 = src2 + 0x30 */ | ||
577 | + ldda [%l7 + 0x30] %asi, %i4 /* %i4/%i5 = src2 + 0x30 */ | ||
578 | xor %l0, %g2, %l0 | ||
579 | xor %l1, %g3, %l1 | ||
580 | stxa %l0, [%i0 + 0x20] %asi | ||
581 | stxa %l1, [%i0 + 0x28] %asi | ||
582 | - ldda [%i6 + 0x30] %asi, %g2 /* %g2/%g3 = src3 + 0x30 */ | ||
583 | + ldda [%l6 + 0x30] %asi, %g2 /* %g2/%g3 = src3 + 0x30 */ | ||
584 | ldda [%i0 + 0x30] %asi, %l0 /* %l0/%l1 = dest + 0x30 */ | ||
585 | |||
586 | prefetch [%i1 + 0x40], #one_read | ||
587 | diff --git a/arch/um/Makefile b/arch/um/Makefile | ||
588 | index 989224f..c3a399e 100644 | ||
589 | --- a/arch/um/Makefile | ||
590 | +++ b/arch/um/Makefile | ||
591 | @@ -60,7 +60,8 @@ SYS_DIR := $(ARCH_DIR)/include/sysdep-$(SUBARCH) | ||
592 | |||
593 | CFLAGS += $(CFLAGS-y) -D__arch_um__ -DSUBARCH=\"$(SUBARCH)\" \ | ||
594 | $(ARCH_INCLUDE) $(MODE_INCLUDE) -Dvmap=kernel_vmap \ | ||
595 | - -Din6addr_loopback=kernel_in6addr_loopback | ||
596 | + -Din6addr_loopback=kernel_in6addr_loopback \ | ||
597 | + -Din6addr_any=kernel_in6addr_any | ||
598 | |||
599 | AFLAGS += $(ARCH_INCLUDE) | ||
600 | |||
601 | diff --git a/arch/um/include/common-offsets.h b/arch/um/include/common-offsets.h | ||
602 | index 6eee343..2378ff4 100644 | ||
603 | --- a/arch/um/include/common-offsets.h | ||
604 | +++ b/arch/um/include/common-offsets.h | ||
605 | @@ -10,6 +10,7 @@ OFFSET(HOST_TASK_PID, task_struct, pid); | ||
606 | |||
607 | DEFINE(UM_KERN_PAGE_SIZE, PAGE_SIZE); | ||
608 | DEFINE(UM_KERN_PAGE_MASK, PAGE_MASK); | ||
609 | +DEFINE(UM_KERN_PAGE_SHIFT, PAGE_SHIFT); | ||
610 | DEFINE(UM_NSEC_PER_SEC, NSEC_PER_SEC); | ||
611 | |||
612 | DEFINE_STR(UM_KERN_EMERG, KERN_EMERG); | ||
613 | diff --git a/arch/um/include/sysdep-i386/stub.h b/arch/um/include/sysdep-i386/stub.h | ||
614 | index 4fffae7..19c85f3 100644 | ||
615 | --- a/arch/um/include/sysdep-i386/stub.h | ||
616 | +++ b/arch/um/include/sysdep-i386/stub.h | ||
617 | @@ -9,7 +9,6 @@ | ||
618 | #include <sys/mman.h> | ||
619 | #include <asm/ptrace.h> | ||
620 | #include <asm/unistd.h> | ||
621 | -#include <asm/page.h> | ||
622 | #include "stub-data.h" | ||
623 | #include "kern_constants.h" | ||
624 | #include "uml-config.h" | ||
625 | @@ -19,7 +18,7 @@ extern void stub_clone_handler(void); | ||
626 | |||
627 | #define STUB_SYSCALL_RET EAX | ||
628 | #define STUB_MMAP_NR __NR_mmap2 | ||
629 | -#define MMAP_OFFSET(o) ((o) >> PAGE_SHIFT) | ||
630 | +#define MMAP_OFFSET(o) ((o) >> UM_KERN_PAGE_SHIFT) | ||
631 | |||
632 | static inline long stub_syscall0(long syscall) | ||
633 | { | ||
634 | diff --git a/arch/um/kernel/skas/clone.c b/arch/um/kernel/skas/clone.c | ||
635 | index 47b812b..885a125 100644 | ||
636 | --- a/arch/um/kernel/skas/clone.c | ||
637 | +++ b/arch/um/kernel/skas/clone.c | ||
638 | @@ -3,7 +3,6 @@ | ||
639 | #include <sys/mman.h> | ||
640 | #include <sys/time.h> | ||
641 | #include <asm/unistd.h> | ||
642 | -#include <asm/page.h> | ||
643 | #include "ptrace_user.h" | ||
644 | #include "skas.h" | ||
645 | #include "stub-data.h" | ||
646 | diff --git a/arch/um/os-Linux/main.c b/arch/um/os-Linux/main.c | ||
647 | index e85f499..919c25b 100644 | ||
648 | --- a/arch/um/os-Linux/main.c | ||
649 | +++ b/arch/um/os-Linux/main.c | ||
650 | @@ -12,7 +12,6 @@ | ||
651 | #include <sys/resource.h> | ||
652 | #include <sys/mman.h> | ||
653 | #include <sys/user.h> | ||
654 | -#include <asm/page.h> | ||
655 | #include "kern_util.h" | ||
656 | #include "as-layout.h" | ||
657 | #include "mem_user.h" | ||
658 | diff --git a/arch/um/os-Linux/skas/mem.c b/arch/um/os-Linux/skas/mem.c | ||
659 | index 0f7df4e..9fbf210 100644 | ||
660 | --- a/arch/um/os-Linux/skas/mem.c | ||
661 | +++ b/arch/um/os-Linux/skas/mem.c | ||
662 | @@ -9,7 +9,6 @@ | ||
663 | #include <unistd.h> | ||
664 | #include <sys/mman.h> | ||
665 | #include <sys/wait.h> | ||
666 | -#include <asm/page.h> | ||
667 | #include <asm/unistd.h> | ||
668 | #include "mem_user.h" | ||
669 | #include "mem.h" | ||
670 | diff --git a/arch/um/os-Linux/skas/process.c b/arch/um/os-Linux/skas/process.c | ||
671 | index ba9af8d..607d2b8 100644 | ||
672 | --- a/arch/um/os-Linux/skas/process.c | ||
673 | +++ b/arch/um/os-Linux/skas/process.c | ||
674 | @@ -182,7 +182,7 @@ static int userspace_tramp(void *stack) | ||
675 | |||
676 | ptrace(PTRACE_TRACEME, 0, 0, 0); | ||
677 | |||
678 | - init_new_thread_signals(); | ||
679 | + signal(SIGTERM, SIG_DFL); | ||
680 | err = set_interval(1); | ||
681 | if(err) | ||
682 | panic("userspace_tramp - setting timer failed, errno = %d\n", | ||
683 | diff --git a/arch/um/os-Linux/start_up.c b/arch/um/os-Linux/start_up.c | ||
684 | index 46f6139..f4f2981 100644 | ||
685 | --- a/arch/um/os-Linux/start_up.c | ||
686 | +++ b/arch/um/os-Linux/start_up.c | ||
687 | @@ -19,7 +19,6 @@ | ||
688 | #include <sys/mman.h> | ||
689 | #include <sys/resource.h> | ||
690 | #include <asm/unistd.h> | ||
691 | -#include <asm/page.h> | ||
692 | #include <sys/types.h> | ||
693 | #include "kern_util.h" | ||
694 | #include "user.h" | ||
695 | diff --git a/arch/um/os-Linux/tt.c b/arch/um/os-Linux/tt.c | ||
696 | index bcf9359..5dc113d 100644 | ||
697 | --- a/arch/um/os-Linux/tt.c | ||
698 | +++ b/arch/um/os-Linux/tt.c | ||
699 | @@ -17,7 +17,6 @@ | ||
700 | #include <sys/mman.h> | ||
701 | #include <asm/ptrace.h> | ||
702 | #include <asm/unistd.h> | ||
703 | -#include <asm/page.h> | ||
704 | #include "kern_util.h" | ||
705 | #include "user.h" | ||
706 | #include "signal_kern.h" | ||
707 | diff --git a/arch/um/os-Linux/util.c b/arch/um/os-Linux/util.c | ||
708 | index 7cbcf48..ef09543 100644 | ||
709 | --- a/arch/um/os-Linux/util.c | ||
710 | +++ b/arch/um/os-Linux/util.c | ||
711 | @@ -105,6 +105,44 @@ int setjmp_wrapper(void (*proc)(void *, void *), ...) | ||
712 | |||
713 | void os_dump_core(void) | ||
714 | { | ||
715 | + int pid; | ||
716 | + | ||
717 | signal(SIGSEGV, SIG_DFL); | ||
718 | + | ||
719 | + /* | ||
720 | + * We are about to SIGTERM this entire process group to ensure that | ||
721 | + * nothing is around to run after the kernel exits. The | ||
722 | + * kernel wants to abort, not die through SIGTERM, so we | ||
723 | + * ignore it here. | ||
724 | + */ | ||
725 | + | ||
726 | + signal(SIGTERM, SIG_IGN); | ||
727 | + kill(0, SIGTERM); | ||
728 | + /* | ||
729 | + * Most of the other processes associated with this UML are | ||
730 | + * likely sTopped, so give them a SIGCONT so they see the | ||
731 | + * SIGTERM. | ||
732 | + */ | ||
733 | + kill(0, SIGCONT); | ||
734 | + | ||
735 | + /* | ||
736 | + * Now, having sent signals to everyone but us, make sure they | ||
737 | + * die by ptrace. Processes can survive what's been done to | ||
738 | + * them so far - the mechanism I understand is receiving a | ||
739 | + * SIGSEGV and segfaulting immediately upon return. There is | ||
740 | + * always a SIGSEGV pending, and (I'm guessing) signals are | ||
741 | + * processed in numeric order so the SIGTERM (signal 15 vs | ||
742 | + * SIGSEGV being signal 11) is never handled. | ||
743 | + * | ||
744 | + * Run a waitpid loop until we get some kind of error. | ||
745 | + * Hopefully, it's ECHILD, but there's not a lot we can do if | ||
746 | + * it's something else. Tell os_kill_ptraced_process not to | ||
747 | + * wait for the child to report its death because there's | ||
748 | + * nothing reasonable to do if that fails. | ||
749 | + */ | ||
750 | + | ||
751 | + while ((pid = waitpid(-1, NULL, WNOHANG)) > 0) | ||
752 | + os_kill_ptraced_process(pid, 0); | ||
753 | + | ||
754 | abort(); | ||
755 | } | ||
756 | diff --git a/arch/um/sys-i386/user-offsets.c b/arch/um/sys-i386/user-offsets.c | ||
757 | index 29118cf..5142415 100644 | ||
758 | --- a/arch/um/sys-i386/user-offsets.c | ||
759 | +++ b/arch/um/sys-i386/user-offsets.c | ||
760 | @@ -2,9 +2,9 @@ | ||
761 | #include <stddef.h> | ||
762 | #include <signal.h> | ||
763 | #include <sys/poll.h> | ||
764 | +#include <sys/user.h> | ||
765 | #include <sys/mman.h> | ||
766 | #include <asm/ptrace.h> | ||
767 | -#include <asm/user.h> | ||
768 | |||
769 | #define DEFINE(sym, val) \ | ||
770 | asm volatile("\n->" #sym " %0 " #val : : "i" (val)) | ||
771 | @@ -48,8 +48,8 @@ void foo(void) | ||
772 | OFFSET(HOST_SC_FP_ST, _fpstate, _st); | ||
773 | OFFSET(HOST_SC_FXSR_ENV, _fpstate, _fxsr_env); | ||
774 | |||
775 | - DEFINE_LONGS(HOST_FP_SIZE, sizeof(struct user_i387_struct)); | ||
776 | - DEFINE_LONGS(HOST_XFP_SIZE, sizeof(struct user_fxsr_struct)); | ||
777 | + DEFINE_LONGS(HOST_FP_SIZE, sizeof(struct user_fpregs_struct)); | ||
778 | + DEFINE_LONGS(HOST_XFP_SIZE, sizeof(struct user_fpxregs_struct)); | ||
779 | |||
780 | DEFINE(HOST_IP, EIP); | ||
781 | DEFINE(HOST_SP, UESP); | ||
782 | diff --git a/arch/um/sys-x86_64/user-offsets.c b/arch/um/sys-x86_64/user-offsets.c | ||
783 | index 0d5fd76..f1ef2a8 100644 | ||
784 | --- a/arch/um/sys-x86_64/user-offsets.c | ||
785 | +++ b/arch/um/sys-x86_64/user-offsets.c | ||
786 | @@ -3,17 +3,10 @@ | ||
787 | #include <signal.h> | ||
788 | #include <sys/poll.h> | ||
789 | #include <sys/mman.h> | ||
790 | +#include <sys/user.h> | ||
791 | #define __FRAME_OFFSETS | ||
792 | #include <asm/ptrace.h> | ||
793 | #include <asm/types.h> | ||
794 | -/* For some reason, x86_64 defines u64 and u32 only in <pci/types.h>, which I | ||
795 | - * refuse to include here, even though they're used throughout the headers. | ||
796 | - * These are used in asm/user.h, and that include can't be avoided because of | ||
797 | - * the sizeof(struct user_regs_struct) below. | ||
798 | - */ | ||
799 | -typedef __u64 u64; | ||
800 | -typedef __u32 u32; | ||
801 | -#include <asm/user.h> | ||
802 | |||
803 | #define DEFINE(sym, val) \ | ||
804 | asm volatile("\n->" #sym " %0 " #val : : "i" (val)) | ||
805 | diff --git a/arch/x86_64/mm/init.c b/arch/x86_64/mm/init.c | ||
806 | index 458893b..e2d6bad 100644 | ||
807 | --- a/arch/x86_64/mm/init.c | ||
808 | +++ b/arch/x86_64/mm/init.c | ||
809 | @@ -734,12 +734,6 @@ int in_gate_area_no_task(unsigned long addr) | ||
810 | return (addr >= VSYSCALL_START) && (addr < VSYSCALL_END); | ||
811 | } | ||
812 | |||
813 | -void * __init alloc_bootmem_high_node(pg_data_t *pgdat, unsigned long size) | ||
814 | -{ | ||
815 | - return __alloc_bootmem_core(pgdat->bdata, size, | ||
816 | - SMP_CACHE_BYTES, (4UL*1024*1024*1024), 0); | ||
817 | -} | ||
818 | - | ||
819 | const char *arch_vma_name(struct vm_area_struct *vma) | ||
820 | { | ||
821 | if (vma->vm_mm && vma->vm_start == (long)vma->vm_mm->context.vdso) | ||
822 | diff --git a/arch/x86_64/mm/pageattr.c b/arch/x86_64/mm/pageattr.c | ||
823 | index 10b9809..0416ffb 100644 | ||
824 | --- a/arch/x86_64/mm/pageattr.c | ||
825 | +++ b/arch/x86_64/mm/pageattr.c | ||
826 | @@ -229,9 +229,14 @@ void global_flush_tlb(void) | ||
827 | struct page *pg, *next; | ||
828 | struct list_head l; | ||
829 | |||
830 | - down_read(&init_mm.mmap_sem); | ||
831 | + /* | ||
832 | + * Write-protect the semaphore, to exclude two contexts | ||
833 | + * doing a list_replace_init() call in parallel and to | ||
834 | + * exclude new additions to the deferred_pages list: | ||
835 | + */ | ||
836 | + down_write(&init_mm.mmap_sem); | ||
837 | list_replace_init(&deferred_pages, &l); | ||
838 | - up_read(&init_mm.mmap_sem); | ||
839 | + up_write(&init_mm.mmap_sem); | ||
840 | |||
841 | flush_map(&l); | ||
842 | |||
843 | diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c | ||
844 | index b0f0e58..be9e65b 100644 | ||
845 | --- a/fs/xfs/linux-2.6/xfs_buf.c | ||
846 | +++ b/fs/xfs/linux-2.6/xfs_buf.c | ||
847 | @@ -187,6 +187,19 @@ free_address( | ||
848 | { | ||
849 | a_list_t *aentry; | ||
850 | |||
851 | +#ifdef CONFIG_XEN | ||
852 | + /* | ||
853 | + * Xen needs to be able to make sure it can get an exclusive | ||
854 | + * RO mapping of pages it wants to turn into a pagetable. If | ||
855 | + * a newly allocated page is also still being vmap()ed by xfs, | ||
856 | + * it will cause pagetable construction to fail. This is a | ||
857 | + * quick workaround to always eagerly unmap pages so that Xen | ||
858 | + * is happy. | ||
859 | + */ | ||
860 | + vunmap(addr); | ||
861 | + return; | ||
862 | +#endif | ||
863 | + | ||
864 | aentry = kmalloc(sizeof(a_list_t), GFP_NOWAIT); | ||
865 | if (likely(aentry)) { | ||
866 | spin_lock(&as_lock); | ||
867 | diff --git a/include/asm-mips/hazards.h b/include/asm-mips/hazards.h | ||
868 | index 6a5fa32..684f622 100644 | ||
869 | --- a/include/asm-mips/hazards.h | ||
870 | +++ b/include/asm-mips/hazards.h | ||
871 | @@ -10,11 +10,12 @@ | ||
872 | #ifndef _ASM_HAZARDS_H | ||
873 | #define _ASM_HAZARDS_H | ||
874 | |||
875 | - | ||
876 | #ifdef __ASSEMBLY__ | ||
877 | #define ASMMACRO(name, code...) .macro name; code; .endm | ||
878 | #else | ||
879 | |||
880 | +#include <asm/cpu-features.h> | ||
881 | + | ||
882 | #define ASMMACRO(name, code...) \ | ||
883 | __asm__(".macro " #name "; " #code "; .endm"); \ | ||
884 | \ | ||
885 | @@ -86,6 +87,57 @@ do { \ | ||
886 | : "=r" (tmp)); \ | ||
887 | } while (0) | ||
888 | |||
889 | +#elif defined(CONFIG_CPU_MIPSR1) | ||
890 | + | ||
891 | +/* | ||
892 | + * These are slightly complicated by the fact that we guarantee R1 kernels to | ||
893 | + * run fine on R2 processors. | ||
894 | + */ | ||
895 | +ASMMACRO(mtc0_tlbw_hazard, | ||
896 | + _ssnop; _ssnop; _ehb | ||
897 | + ) | ||
898 | +ASMMACRO(tlbw_use_hazard, | ||
899 | + _ssnop; _ssnop; _ssnop; _ehb | ||
900 | + ) | ||
901 | +ASMMACRO(tlb_probe_hazard, | ||
902 | + _ssnop; _ssnop; _ssnop; _ehb | ||
903 | + ) | ||
904 | +ASMMACRO(irq_enable_hazard, | ||
905 | + _ssnop; _ssnop; _ssnop; _ehb | ||
906 | + ) | ||
907 | +ASMMACRO(irq_disable_hazard, | ||
908 | + _ssnop; _ssnop; _ssnop; _ehb | ||
909 | + ) | ||
910 | +ASMMACRO(back_to_back_c0_hazard, | ||
911 | + _ssnop; _ssnop; _ssnop; _ehb | ||
912 | + ) | ||
913 | +/* | ||
914 | + * gcc has a tradition of misscompiling the previous construct using the | ||
915 | + * address of a label as argument to inline assembler. Gas otoh has the | ||
916 | + * annoying difference between la and dla which are only usable for 32-bit | ||
917 | + * rsp. 64-bit code, so can't be used without conditional compilation. | ||
918 | + * The alterantive is switching the assembler to 64-bit code which happens | ||
919 | + * to work right even for 32-bit code ... | ||
920 | + */ | ||
921 | +#define __instruction_hazard() \ | ||
922 | +do { \ | ||
923 | + unsigned long tmp; \ | ||
924 | + \ | ||
925 | + __asm__ __volatile__( \ | ||
926 | + " .set mips64r2 \n" \ | ||
927 | + " dla %0, 1f \n" \ | ||
928 | + " jr.hb %0 \n" \ | ||
929 | + " .set mips0 \n" \ | ||
930 | + "1: \n" \ | ||
931 | + : "=r" (tmp)); \ | ||
932 | +} while (0) | ||
933 | + | ||
934 | +#define instruction_hazard() \ | ||
935 | +do { \ | ||
936 | + if (cpu_has_mips_r2) \ | ||
937 | + __instruction_hazard(); \ | ||
938 | +} while (0) | ||
939 | + | ||
940 | #elif defined(CONFIG_CPU_R10000) | ||
941 | |||
942 | /* | ||
943 | diff --git a/include/linux/bootmem.h b/include/linux/bootmem.h | ||
944 | index c83534e..0365ec9 100644 | ||
945 | --- a/include/linux/bootmem.h | ||
946 | +++ b/include/linux/bootmem.h | ||
947 | @@ -59,7 +59,6 @@ extern void *__alloc_bootmem_core(struct bootmem_data *bdata, | ||
948 | unsigned long align, | ||
949 | unsigned long goal, | ||
950 | unsigned long limit); | ||
951 | -extern void *alloc_bootmem_high_node(pg_data_t *pgdat, unsigned long size); | ||
952 | |||
953 | #ifndef CONFIG_HAVE_ARCH_BOOTMEM_NODE | ||
954 | extern void reserve_bootmem(unsigned long addr, unsigned long size); | ||
955 | diff --git a/include/xen/interface/vcpu.h b/include/xen/interface/vcpu.h | ||
956 | index ff61ea3..b05d8a6 100644 | ||
957 | --- a/include/xen/interface/vcpu.h | ||
958 | +++ b/include/xen/interface/vcpu.h | ||
959 | @@ -160,8 +160,9 @@ struct vcpu_set_singleshot_timer { | ||
960 | */ | ||
961 | #define VCPUOP_register_vcpu_info 10 /* arg == struct vcpu_info */ | ||
962 | struct vcpu_register_vcpu_info { | ||
963 | - uint32_t mfn; /* mfn of page to place vcpu_info */ | ||
964 | - uint32_t offset; /* offset within page */ | ||
965 | + uint64_t mfn; /* mfn of page to place vcpu_info */ | ||
966 | + uint32_t offset; /* offset within page */ | ||
967 | + uint32_t rsvd; /* unused */ | ||
968 | }; | ||
969 | |||
970 | #endif /* __XEN_PUBLIC_VCPU_H__ */ | ||
971 | diff --git a/mm/sparse.c b/mm/sparse.c | ||
972 | index 239f5a7..1facdff 100644 | ||
973 | --- a/mm/sparse.c | ||
974 | +++ b/mm/sparse.c | ||
975 | @@ -215,12 +215,6 @@ static int __meminit sparse_init_one_section(struct mem_section *ms, | ||
976 | return 1; | ||
977 | } | ||
978 | |||
979 | -__attribute__((weak)) __init | ||
980 | -void *alloc_bootmem_high_node(pg_data_t *pgdat, unsigned long size) | ||
981 | -{ | ||
982 | - return NULL; | ||
983 | -} | ||
984 | - | ||
985 | static struct page __init *sparse_early_mem_map_alloc(unsigned long pnum) | ||
986 | { | ||
987 | struct page *map; | ||
988 | @@ -231,11 +225,6 @@ static struct page __init *sparse_early_mem_map_alloc(unsigned long pnum) | ||
989 | if (map) | ||
990 | return map; | ||
991 | |||
992 | - map = alloc_bootmem_high_node(NODE_DATA(nid), | ||
993 | - sizeof(struct page) * PAGES_PER_SECTION); | ||
994 | - if (map) | ||
995 | - return map; | ||
996 | - | ||
997 | map = alloc_bootmem_node(NODE_DATA(nid), | ||
998 | sizeof(struct page) * PAGES_PER_SECTION); | ||
999 | if (map) |