aboutsummaryrefslogtreecommitdiffstats
path: root/arch/i386
diff options
context:
space:
mode:
Diffstat (limited to 'arch/i386')
-rw-r--r--arch/i386/boot/pm.c6
-rw-r--r--arch/i386/boot/video-vesa.c34
-rw-r--r--arch/i386/kernel/alternative.c6
-rw-r--r--arch/i386/kernel/cpu/intel_cacheinfo.c4
-rw-r--r--arch/i386/kernel/cpu/perfctr-watchdog.c28
-rw-r--r--arch/i386/kernel/nmi.c2
-rw-r--r--arch/i386/kernel/ptrace.c1
-rw-r--r--arch/i386/kernel/traps.c33
-rw-r--r--arch/i386/mach-generic/Makefile2
-rw-r--r--arch/i386/mach-voyager/Makefile2
-rw-r--r--arch/i386/mm/highmem.c7
-rw-r--r--arch/i386/mm/hugetlbpage.c2
-rw-r--r--arch/i386/pci/irq.c1
-rw-r--r--arch/i386/pci/pcbios.c2
14 files changed, 83 insertions, 47 deletions
diff --git a/arch/i386/boot/pm.c b/arch/i386/boot/pm.c
index 6be9ca811d17..09fb342cc62e 100644
--- a/arch/i386/boot/pm.c
+++ b/arch/i386/boot/pm.c
@@ -122,7 +122,11 @@ static void setup_gdt(void)
122 /* DS: data, read/write, 4 GB, base 0 */ 122 /* DS: data, read/write, 4 GB, base 0 */
123 [GDT_ENTRY_BOOT_DS] = GDT_ENTRY(0xc093, 0, 0xfffff), 123 [GDT_ENTRY_BOOT_DS] = GDT_ENTRY(0xc093, 0, 0xfffff),
124 }; 124 };
125 struct gdt_ptr gdt; 125 /* Xen HVM incorrectly stores a pointer to the gdt_ptr, instead
126 of the gdt_ptr contents. Thus, make it static so it will
127 stay in memory, at least long enough that we switch to the
128 proper kernel GDT. */
129 static struct gdt_ptr gdt;
126 130
127 gdt.len = sizeof(boot_gdt)-1; 131 gdt.len = sizeof(boot_gdt)-1;
128 gdt.ptr = (u32)&boot_gdt + (ds() << 4); 132 gdt.ptr = (u32)&boot_gdt + (ds() << 4);
diff --git a/arch/i386/boot/video-vesa.c b/arch/i386/boot/video-vesa.c
index f1bc71e948cf..192190710710 100644
--- a/arch/i386/boot/video-vesa.c
+++ b/arch/i386/boot/video-vesa.c
@@ -29,7 +29,7 @@ static void vesa_store_mode_params_graphics(void);
29static int vesa_probe(void) 29static int vesa_probe(void)
30{ 30{
31#if defined(CONFIG_VIDEO_VESA) || defined(CONFIG_FIRMWARE_EDID) 31#if defined(CONFIG_VIDEO_VESA) || defined(CONFIG_FIRMWARE_EDID)
32 u16 ax; 32 u16 ax, cx, di;
33 u16 mode; 33 u16 mode;
34 addr_t mode_ptr; 34 addr_t mode_ptr;
35 struct mode_info *mi; 35 struct mode_info *mi;
@@ -39,9 +39,11 @@ static int vesa_probe(void)
39 39
40 vginfo.signature = VBE2_MAGIC; 40 vginfo.signature = VBE2_MAGIC;
41 41
42 /* Optimistically assume a VESA BIOS is register-clean... */
43 ax = 0x4f00; 42 ax = 0x4f00;
44 asm("int $0x10" : "+a" (ax), "=m" (vginfo) : "D" (&vginfo)); 43 di = (size_t)&vginfo;
44 asm(INT10
45 : "+a" (ax), "+D" (di), "=m" (vginfo)
46 : : "ebx", "ecx", "edx", "esi");
45 47
46 if (ax != 0x004f || 48 if (ax != 0x004f ||
47 vginfo.signature != VESA_MAGIC || 49 vginfo.signature != VESA_MAGIC ||
@@ -64,9 +66,11 @@ static int vesa_probe(void)
64 memset(&vminfo, 0, sizeof vminfo); /* Just in case... */ 66 memset(&vminfo, 0, sizeof vminfo); /* Just in case... */
65 67
66 ax = 0x4f01; 68 ax = 0x4f01;
67 asm("int $0x10" 69 cx = mode;
68 : "+a" (ax), "=m" (vminfo) 70 di = (size_t)&vminfo;
69 : "c" (mode), "D" (&vminfo)); 71 asm(INT10
72 : "+a" (ax), "+c" (cx), "+D" (di), "=m" (vminfo)
73 : : "ebx", "edx", "esi");
70 74
71 if (ax != 0x004f) 75 if (ax != 0x004f)
72 continue; 76 continue;
@@ -102,16 +106,18 @@ static int vesa_probe(void)
102 106
103static int vesa_set_mode(struct mode_info *mode) 107static int vesa_set_mode(struct mode_info *mode)
104{ 108{
105 u16 ax; 109 u16 ax, bx, cx, di;
106 int is_graphic; 110 int is_graphic;
107 u16 vesa_mode = mode->mode - VIDEO_FIRST_VESA; 111 u16 vesa_mode = mode->mode - VIDEO_FIRST_VESA;
108 112
109 memset(&vminfo, 0, sizeof vminfo); /* Just in case... */ 113 memset(&vminfo, 0, sizeof vminfo); /* Just in case... */
110 114
111 ax = 0x4f01; 115 ax = 0x4f01;
112 asm("int $0x10" 116 cx = vesa_mode;
113 : "+a" (ax), "=m" (vminfo) 117 di = (size_t)&vminfo;
114 : "c" (vesa_mode), "D" (&vminfo)); 118 asm(INT10
119 : "+a" (ax), "+c" (cx), "+D" (di), "=m" (vminfo)
120 : : "ebx", "edx", "esi");
115 121
116 if (ax != 0x004f) 122 if (ax != 0x004f)
117 return -1; 123 return -1;
@@ -129,9 +135,11 @@ static int vesa_set_mode(struct mode_info *mode)
129 135
130 136
131 ax = 0x4f02; 137 ax = 0x4f02;
132 asm volatile("int $0x10" 138 bx = vesa_mode;
133 : "+a" (ax) 139 di = 0;
134 : "b" (vesa_mode), "D" (0)); 140 asm volatile(INT10
141 : "+a" (ax), "+b" (bx), "+D" (di)
142 : : "ecx", "edx", "esi");
135 143
136 if (ax != 0x004f) 144 if (ax != 0x004f)
137 return -1; 145 return -1;
diff --git a/arch/i386/kernel/alternative.c b/arch/i386/kernel/alternative.c
index 9f4ac8b02de4..bd72d94e713e 100644
--- a/arch/i386/kernel/alternative.c
+++ b/arch/i386/kernel/alternative.c
@@ -445,8 +445,6 @@ void __kprobes text_poke(void *addr, unsigned char *opcode, int len)
445{ 445{
446 memcpy(addr, opcode, len); 446 memcpy(addr, opcode, len);
447 sync_core(); 447 sync_core();
448 /* Not strictly needed, but can speed CPU recovery up. Ignore cross cacheline 448 /* Could also do a CLFLUSH here to speed up CPU recovery; but
449 case. */ 449 that causes hangs on some VIA CPUs. */
450 if (cpu_has_clflush)
451 asm("clflush (%0) " :: "r" (addr) : "memory");
452} 450}
diff --git a/arch/i386/kernel/cpu/intel_cacheinfo.c b/arch/i386/kernel/cpu/intel_cacheinfo.c
index d5a456d27d82..db6c25aa5776 100644
--- a/arch/i386/kernel/cpu/intel_cacheinfo.c
+++ b/arch/i386/kernel/cpu/intel_cacheinfo.c
@@ -515,7 +515,7 @@ static int __cpuinit detect_cache_attributes(unsigned int cpu)
515 515
516 cpuid4_info[cpu] = kzalloc( 516 cpuid4_info[cpu] = kzalloc(
517 sizeof(struct _cpuid4_info) * num_cache_leaves, GFP_KERNEL); 517 sizeof(struct _cpuid4_info) * num_cache_leaves, GFP_KERNEL);
518 if (unlikely(cpuid4_info[cpu] == NULL)) 518 if (cpuid4_info[cpu] == NULL)
519 return -ENOMEM; 519 return -ENOMEM;
520 520
521 oldmask = current->cpus_allowed; 521 oldmask = current->cpus_allowed;
@@ -748,6 +748,8 @@ static void __cpuinit cache_remove_dev(struct sys_device * sys_dev)
748 unsigned int cpu = sys_dev->id; 748 unsigned int cpu = sys_dev->id;
749 unsigned long i; 749 unsigned long i;
750 750
751 if (cpuid4_info[cpu] == NULL)
752 return;
751 for (i = 0; i < num_cache_leaves; i++) { 753 for (i = 0; i < num_cache_leaves; i++) {
752 cache_remove_shared_cpu_map(cpu, i); 754 cache_remove_shared_cpu_map(cpu, i);
753 kobject_unregister(&(INDEX_KOBJECT_PTR(cpu,i)->kobj)); 755 kobject_unregister(&(INDEX_KOBJECT_PTR(cpu,i)->kobj));
diff --git a/arch/i386/kernel/cpu/perfctr-watchdog.c b/arch/i386/kernel/cpu/perfctr-watchdog.c
index 4be488e73bee..93fecd4b03de 100644
--- a/arch/i386/kernel/cpu/perfctr-watchdog.c
+++ b/arch/i386/kernel/cpu/perfctr-watchdog.c
@@ -263,8 +263,8 @@ static int setup_k7_watchdog(unsigned nmi_hz)
263 unsigned int evntsel; 263 unsigned int evntsel;
264 struct nmi_watchdog_ctlblk *wd = &__get_cpu_var(nmi_watchdog_ctlblk); 264 struct nmi_watchdog_ctlblk *wd = &__get_cpu_var(nmi_watchdog_ctlblk);
265 265
266 perfctr_msr = MSR_K7_PERFCTR0; 266 perfctr_msr = wd_ops->perfctr;
267 evntsel_msr = MSR_K7_EVNTSEL0; 267 evntsel_msr = wd_ops->evntsel;
268 268
269 wrmsrl(perfctr_msr, 0UL); 269 wrmsrl(perfctr_msr, 0UL);
270 270
@@ -343,8 +343,8 @@ static int setup_p6_watchdog(unsigned nmi_hz)
343 unsigned int evntsel; 343 unsigned int evntsel;
344 struct nmi_watchdog_ctlblk *wd = &__get_cpu_var(nmi_watchdog_ctlblk); 344 struct nmi_watchdog_ctlblk *wd = &__get_cpu_var(nmi_watchdog_ctlblk);
345 345
346 perfctr_msr = MSR_P6_PERFCTR0; 346 perfctr_msr = wd_ops->perfctr;
347 evntsel_msr = MSR_P6_EVNTSEL0; 347 evntsel_msr = wd_ops->evntsel;
348 348
349 /* KVM doesn't implement this MSR */ 349 /* KVM doesn't implement this MSR */
350 if (wrmsr_safe(perfctr_msr, 0, 0) < 0) 350 if (wrmsr_safe(perfctr_msr, 0, 0) < 0)
@@ -569,8 +569,8 @@ static int setup_intel_arch_watchdog(unsigned nmi_hz)
569 (ebx & ARCH_PERFMON_UNHALTED_CORE_CYCLES_PRESENT)) 569 (ebx & ARCH_PERFMON_UNHALTED_CORE_CYCLES_PRESENT))
570 return 0; 570 return 0;
571 571
572 perfctr_msr = MSR_ARCH_PERFMON_PERFCTR1; 572 perfctr_msr = wd_ops->perfctr;
573 evntsel_msr = MSR_ARCH_PERFMON_EVENTSEL1; 573 evntsel_msr = wd_ops->evntsel;
574 574
575 wrmsrl(perfctr_msr, 0UL); 575 wrmsrl(perfctr_msr, 0UL);
576 576
@@ -605,6 +605,16 @@ static struct wd_ops intel_arch_wd_ops = {
605 .evntsel = MSR_ARCH_PERFMON_EVENTSEL1, 605 .evntsel = MSR_ARCH_PERFMON_EVENTSEL1,
606}; 606};
607 607
608static struct wd_ops coreduo_wd_ops = {
609 .reserve = single_msr_reserve,
610 .unreserve = single_msr_unreserve,
611 .setup = setup_intel_arch_watchdog,
612 .rearm = p6_rearm,
613 .stop = single_msr_stop_watchdog,
614 .perfctr = MSR_ARCH_PERFMON_PERFCTR0,
615 .evntsel = MSR_ARCH_PERFMON_EVENTSEL0,
616};
617
608static void probe_nmi_watchdog(void) 618static void probe_nmi_watchdog(void)
609{ 619{
610 switch (boot_cpu_data.x86_vendor) { 620 switch (boot_cpu_data.x86_vendor) {
@@ -615,6 +625,12 @@ static void probe_nmi_watchdog(void)
615 wd_ops = &k7_wd_ops; 625 wd_ops = &k7_wd_ops;
616 break; 626 break;
617 case X86_VENDOR_INTEL: 627 case X86_VENDOR_INTEL:
628 /* Work around Core Duo (Yonah) errata AE49 where perfctr1
629 doesn't have a working enable bit. */
630 if (boot_cpu_data.x86 == 6 && boot_cpu_data.x86_model == 14) {
631 wd_ops = &coreduo_wd_ops;
632 break;
633 }
618 if (cpu_has(&boot_cpu_data, X86_FEATURE_ARCH_PERFMON)) { 634 if (cpu_has(&boot_cpu_data, X86_FEATURE_ARCH_PERFMON)) {
619 wd_ops = &intel_arch_wd_ops; 635 wd_ops = &intel_arch_wd_ops;
620 break; 636 break;
diff --git a/arch/i386/kernel/nmi.c b/arch/i386/kernel/nmi.c
index 8c1c965eb2a8..c7227e2180f8 100644
--- a/arch/i386/kernel/nmi.c
+++ b/arch/i386/kernel/nmi.c
@@ -115,12 +115,12 @@ static int __init check_nmi_watchdog(void)
115 atomic_dec(&nmi_active); 115 atomic_dec(&nmi_active);
116 } 116 }
117 } 117 }
118 endflag = 1;
118 if (!atomic_read(&nmi_active)) { 119 if (!atomic_read(&nmi_active)) {
119 kfree(prev_nmi_count); 120 kfree(prev_nmi_count);
120 atomic_set(&nmi_active, -1); 121 atomic_set(&nmi_active, -1);
121 return -1; 122 return -1;
122 } 123 }
123 endflag = 1;
124 printk("OK.\n"); 124 printk("OK.\n");
125 125
126 /* now that we know it works we can reduce NMI frequency to 126 /* now that we know it works we can reduce NMI frequency to
diff --git a/arch/i386/kernel/ptrace.c b/arch/i386/kernel/ptrace.c
index 0c8f00e69c4d..7c1b92522e95 100644
--- a/arch/i386/kernel/ptrace.c
+++ b/arch/i386/kernel/ptrace.c
@@ -274,7 +274,6 @@ static void clear_singlestep(struct task_struct *child)
274void ptrace_disable(struct task_struct *child) 274void ptrace_disable(struct task_struct *child)
275{ 275{
276 clear_singlestep(child); 276 clear_singlestep(child);
277 clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
278 clear_tsk_thread_flag(child, TIF_SYSCALL_EMU); 277 clear_tsk_thread_flag(child, TIF_SYSCALL_EMU);
279} 278}
280 279
diff --git a/arch/i386/kernel/traps.c b/arch/i386/kernel/traps.c
index cfffe3dd9e83..47b0bef335bd 100644
--- a/arch/i386/kernel/traps.c
+++ b/arch/i386/kernel/traps.c
@@ -100,36 +100,45 @@ asmlinkage void machine_check(void);
100int kstack_depth_to_print = 24; 100int kstack_depth_to_print = 24;
101static unsigned int code_bytes = 64; 101static unsigned int code_bytes = 64;
102 102
103static inline int valid_stack_ptr(struct thread_info *tinfo, void *p) 103static inline int valid_stack_ptr(struct thread_info *tinfo, void *p, unsigned size)
104{ 104{
105 return p > (void *)tinfo && 105 return p > (void *)tinfo &&
106 p < (void *)tinfo + THREAD_SIZE - 3; 106 p <= (void *)tinfo + THREAD_SIZE - size;
107} 107}
108 108
109/* The form of the top of the frame on the stack */
110struct stack_frame {
111 struct stack_frame *next_frame;
112 unsigned long return_address;
113};
114
109static inline unsigned long print_context_stack(struct thread_info *tinfo, 115static inline unsigned long print_context_stack(struct thread_info *tinfo,
110 unsigned long *stack, unsigned long ebp, 116 unsigned long *stack, unsigned long ebp,
111 struct stacktrace_ops *ops, void *data) 117 struct stacktrace_ops *ops, void *data)
112{ 118{
113 unsigned long addr;
114
115#ifdef CONFIG_FRAME_POINTER 119#ifdef CONFIG_FRAME_POINTER
116 while (valid_stack_ptr(tinfo, (void *)ebp)) { 120 struct stack_frame *frame = (struct stack_frame *)ebp;
117 unsigned long new_ebp; 121 while (valid_stack_ptr(tinfo, frame, sizeof(*frame))) {
118 addr = *(unsigned long *)(ebp + 4); 122 struct stack_frame *next;
123 unsigned long addr;
124
125 addr = frame->return_address;
119 ops->address(data, addr); 126 ops->address(data, addr);
120 /* 127 /*
121 * break out of recursive entries (such as 128 * break out of recursive entries (such as
122 * end_of_stack_stop_unwind_function). Also, 129 * end_of_stack_stop_unwind_function). Also,
123 * we can never allow a frame pointer to 130 * we can never allow a frame pointer to
124 * move downwards! 131 * move downwards!
125 */ 132 */
126 new_ebp = *(unsigned long *)ebp; 133 next = frame->next_frame;
127 if (new_ebp <= ebp) 134 if (next <= frame)
128 break; 135 break;
129 ebp = new_ebp; 136 frame = next;
130 } 137 }
131#else 138#else
132 while (valid_stack_ptr(tinfo, stack)) { 139 while (valid_stack_ptr(tinfo, stack, sizeof(*stack))) {
140 unsigned long addr;
141
133 addr = *stack++; 142 addr = *stack++;
134 if (__kernel_text_address(addr)) 143 if (__kernel_text_address(addr))
135 ops->address(data, addr); 144 ops->address(data, addr);
diff --git a/arch/i386/mach-generic/Makefile b/arch/i386/mach-generic/Makefile
index 77fbc9f64fbc..6914485c0d85 100644
--- a/arch/i386/mach-generic/Makefile
+++ b/arch/i386/mach-generic/Makefile
@@ -2,6 +2,6 @@
2# Makefile for the generic architecture 2# Makefile for the generic architecture
3# 3#
4 4
5EXTRA_CFLAGS += -I../kernel 5EXTRA_CFLAGS := -Iarch/i386/kernel
6 6
7obj-y := probe.o summit.o bigsmp.o es7000.o default.o ../mach-es7000/ 7obj-y := probe.o summit.o bigsmp.o es7000.o default.o ../mach-es7000/
diff --git a/arch/i386/mach-voyager/Makefile b/arch/i386/mach-voyager/Makefile
index f24d29651318..33b74cf0dd22 100644
--- a/arch/i386/mach-voyager/Makefile
+++ b/arch/i386/mach-voyager/Makefile
@@ -2,7 +2,7 @@
2# Makefile for the linux kernel. 2# Makefile for the linux kernel.
3# 3#
4 4
5EXTRA_CFLAGS += -I../kernel 5EXTRA_CFLAGS := -Iarch/i386/kernel
6obj-y := setup.o voyager_basic.o voyager_thread.o 6obj-y := setup.o voyager_basic.o voyager_thread.o
7 7
8obj-$(CONFIG_SMP) += voyager_smp.o voyager_cat.o 8obj-$(CONFIG_SMP) += voyager_smp.o voyager_cat.o
diff --git a/arch/i386/mm/highmem.c b/arch/i386/mm/highmem.c
index ad8d86cc683e..1c3bf95f7356 100644
--- a/arch/i386/mm/highmem.c
+++ b/arch/i386/mm/highmem.c
@@ -34,17 +34,16 @@ void *kmap_atomic_prot(struct page *page, enum km_type type, pgprot_t prot)
34 /* even !CONFIG_PREEMPT needs this, for in_atomic in do_page_fault */ 34 /* even !CONFIG_PREEMPT needs this, for in_atomic in do_page_fault */
35 pagefault_disable(); 35 pagefault_disable();
36 36
37 idx = type + KM_TYPE_NR*smp_processor_id();
38 BUG_ON(!pte_none(*(kmap_pte-idx)));
39
40 if (!PageHighMem(page)) 37 if (!PageHighMem(page))
41 return page_address(page); 38 return page_address(page);
42 39
40 idx = type + KM_TYPE_NR*smp_processor_id();
43 vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx); 41 vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx);
42 BUG_ON(!pte_none(*(kmap_pte-idx)));
44 set_pte(kmap_pte-idx, mk_pte(page, prot)); 43 set_pte(kmap_pte-idx, mk_pte(page, prot));
45 arch_flush_lazy_mmu_mode(); 44 arch_flush_lazy_mmu_mode();
46 45
47 return (void*) vaddr; 46 return (void *)vaddr;
48} 47}
49 48
50void *kmap_atomic(struct page *page, enum km_type type) 49void *kmap_atomic(struct page *page, enum km_type type)
diff --git a/arch/i386/mm/hugetlbpage.c b/arch/i386/mm/hugetlbpage.c
index efdf95ac8031..6c06d9c0488e 100644
--- a/arch/i386/mm/hugetlbpage.c
+++ b/arch/i386/mm/hugetlbpage.c
@@ -367,7 +367,7 @@ hugetlb_get_unmapped_area(struct file *file, unsigned long addr,
367 return -ENOMEM; 367 return -ENOMEM;
368 368
369 if (flags & MAP_FIXED) { 369 if (flags & MAP_FIXED) {
370 if (prepare_hugepage_range(addr, len, pgoff)) 370 if (prepare_hugepage_range(addr, len))
371 return -EINVAL; 371 return -EINVAL;
372 return addr; 372 return addr;
373 } 373 }
diff --git a/arch/i386/pci/irq.c b/arch/i386/pci/irq.c
index 665db063a40a..8434f2323b87 100644
--- a/arch/i386/pci/irq.c
+++ b/arch/i386/pci/irq.c
@@ -550,6 +550,7 @@ static __init int intel_router_probe(struct irq_router *r, struct pci_dev *route
550 case PCI_DEVICE_ID_INTEL_ICH9_3: 550 case PCI_DEVICE_ID_INTEL_ICH9_3:
551 case PCI_DEVICE_ID_INTEL_ICH9_4: 551 case PCI_DEVICE_ID_INTEL_ICH9_4:
552 case PCI_DEVICE_ID_INTEL_ICH9_5: 552 case PCI_DEVICE_ID_INTEL_ICH9_5:
553 case PCI_DEVICE_ID_INTEL_TOLAPAI_0:
553 r->name = "PIIX/ICH"; 554 r->name = "PIIX/ICH";
554 r->get = pirq_piix_get; 555 r->get = pirq_piix_get;
555 r->set = pirq_piix_set; 556 r->set = pirq_piix_set;
diff --git a/arch/i386/pci/pcbios.c b/arch/i386/pci/pcbios.c
index 5f5193401bea..10ac8c316c46 100644
--- a/arch/i386/pci/pcbios.c
+++ b/arch/i386/pci/pcbios.c
@@ -412,7 +412,7 @@ struct irq_routing_options {
412 u16 segment; 412 u16 segment;
413} __attribute__((packed)); 413} __attribute__((packed));
414 414
415struct irq_routing_table * __devinit pcibios_get_irq_routing_table(void) 415struct irq_routing_table * pcibios_get_irq_routing_table(void)
416{ 416{
417 struct irq_routing_options opt; 417 struct irq_routing_options opt;
418 struct irq_routing_table *rt = NULL; 418 struct irq_routing_table *rt = NULL;