浏览代码

Merge branches 'x86-detect-hyper-for-linus', 'x86-fpu-for-linus', 'x86-kexec-for-linus', 'x86-platform-for-linus', 'x86-quirks-for-linus', 'x86-tsc-for-linus' and 'x86-smpboot-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip

* 'x86-detect-hyper-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
  x86, hyper: Change hypervisor detection order

* 'x86-fpu-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
  x86-32, fpu: Fix DNA exception during check_fpu()

* 'x86-kexec-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
  kexec, x86: Fix incorrect jump back address if not preserving context

* 'x86-platform-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
  x86, config: Introduce an INTEL_MID configuration

* 'x86-quirks-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
  x86, quirks: Use pci_dev->revision

* 'x86-tsc-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
  x86: tsc: Remove unneeded DMI-based blacklisting

* 'x86-smpboot-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
  x86, boot: Wait for boot cpu to show up if nr_cpus limit is about to hit
Linus Torvalds 14 年之前

+ 13 - 2
arch/x86/Kconfig

@@ -390,12 +390,21 @@ config X86_INTEL_CE
 	  This option compiles in support for the CE4100 SOC for settop
 	  This option compiles in support for the CE4100 SOC for settop
 	  boxes and media devices.
 	  boxes and media devices.
 
 
+config X86_INTEL_MID
+	bool "Intel MID platform support"
+	depends on X86_32
+	depends on X86_EXTENDED_PLATFORM
+	---help---
+	  Select to build a kernel capable of supporting Intel MID platform
+	  systems which do not have the PCI legacy interfaces (Moorestown,
+	  Medfield). If you are building for a PC class system say N here.
+
+if X86_INTEL_MID
+
 config X86_MRST
 config X86_MRST
        bool "Moorestown MID platform"
        bool "Moorestown MID platform"
 	depends on PCI
 	depends on PCI
 	depends on PCI_GOANY
 	depends on PCI_GOANY
-	depends on X86_32
-	depends on X86_EXTENDED_PLATFORM
 	depends on X86_IO_APIC
 	depends on X86_IO_APIC
 	select APB_TIMER
 	select APB_TIMER
 	select I2C
 	select I2C
@@ -410,6 +419,8 @@ config X86_MRST
 	  nor standard legacy replacement devices/features. e.g. Moorestown does
 	  nor standard legacy replacement devices/features. e.g. Moorestown does
 	  not contain i8259, i8254, HPET, legacy BIOS, most of the io ports.
 	  not contain i8259, i8254, HPET, legacy BIOS, most of the io ports.
 
 
+endif
+
 config X86_RDC321X
 config X86_RDC321X
 	bool "RDC R-321x SoC"
 	bool "RDC R-321x SoC"
 	depends on X86_32
 	depends on X86_32

+ 20 - 2
arch/x86/kernel/apic/apic.c

@@ -1944,10 +1944,28 @@ void disconnect_bsp_APIC(int virt_wire_setup)
 
 
 void __cpuinit generic_processor_info(int apicid, int version)
 void __cpuinit generic_processor_info(int apicid, int version)
 {
 {
-	int cpu;
+	int cpu, max = nr_cpu_ids;
+	bool boot_cpu_detected = physid_isset(boot_cpu_physical_apicid,
+				phys_cpu_present_map);
+
+	/*
+	 * If boot cpu has not been detected yet, then only allow upto
+	 * nr_cpu_ids - 1 processors and keep one slot free for boot cpu
+	 */
+	if (!boot_cpu_detected && num_processors >= nr_cpu_ids - 1 &&
+	    apicid != boot_cpu_physical_apicid) {
+		int thiscpu = max + disabled_cpus - 1;
+
+		pr_warning(
+			"ACPI: NR_CPUS/possible_cpus limit of %i almost"
+			" reached. Keeping one slot for boot cpu."
+			"  Processor %d/0x%x ignored.\n", max, thiscpu, apicid);
+
+		disabled_cpus++;
+		return;
+	}
 
 
 	if (num_processors >= nr_cpu_ids) {
 	if (num_processors >= nr_cpu_ids) {
-		int max = nr_cpu_ids;
 		int thiscpu = max + disabled_cpus;
 		int thiscpu = max + disabled_cpus;
 
 
 		pr_warning(
 		pr_warning(

+ 4 - 0
arch/x86/kernel/cpu/bugs.c

@@ -62,6 +62,8 @@ static void __init check_fpu(void)
 		return;
 		return;
 	}
 	}
 
 
+	kernel_fpu_begin();
+
 	/*
 	/*
 	 * trap_init() enabled FXSR and company _before_ testing for FP
 	 * trap_init() enabled FXSR and company _before_ testing for FP
 	 * problems here.
 	 * problems here.
@@ -80,6 +82,8 @@ static void __init check_fpu(void)
 		: "=m" (*&fdiv_bug)
 		: "=m" (*&fdiv_bug)
 		: "m" (*&x), "m" (*&y));
 		: "m" (*&x), "m" (*&y));
 
 
+	kernel_fpu_end();
+
 	boot_cpu_data.fdiv_bug = fdiv_bug;
 	boot_cpu_data.fdiv_bug = fdiv_bug;
 	if (boot_cpu_data.fdiv_bug)
 	if (boot_cpu_data.fdiv_bug)
 		printk(KERN_WARNING "Hmm, FPU with FDIV bug.\n");
 		printk(KERN_WARNING "Hmm, FPU with FDIV bug.\n");

+ 2 - 2
arch/x86/kernel/cpu/hypervisor.c

@@ -32,11 +32,11 @@
  */
  */
 static const __initconst struct hypervisor_x86 * const hypervisors[] =
 static const __initconst struct hypervisor_x86 * const hypervisors[] =
 {
 {
-	&x86_hyper_vmware,
-	&x86_hyper_ms_hyperv,
 #ifdef CONFIG_XEN_PVHVM
 #ifdef CONFIG_XEN_PVHVM
 	&x86_hyper_xen_hvm,
 	&x86_hyper_xen_hvm,
 #endif
 #endif
+	&x86_hyper_vmware,
+	&x86_hyper_ms_hyperv,
 };
 };
 
 
 const struct hypervisor_x86 *x86_hyper;
 const struct hypervisor_x86 *x86_hyper;

+ 2 - 3
arch/x86/kernel/quirks.c

@@ -10,7 +10,7 @@
 
 
 static void __devinit quirk_intel_irqbalance(struct pci_dev *dev)
 static void __devinit quirk_intel_irqbalance(struct pci_dev *dev)
 {
 {
-	u8 config, rev;
+	u8 config;
 	u16 word;
 	u16 word;
 
 
 	/* BIOS may enable hardware IRQ balancing for
 	/* BIOS may enable hardware IRQ balancing for
@@ -18,8 +18,7 @@ static void __devinit quirk_intel_irqbalance(struct pci_dev *dev)
 	 * based platforms.
 	 * based platforms.
 	 * Disable SW irqbalance/affinity on those platforms.
 	 * Disable SW irqbalance/affinity on those platforms.
 	 */
 	 */
-	pci_read_config_byte(dev, PCI_CLASS_REVISION, &rev);
-	if (rev > 0x9)
+	if (dev->revision > 0x9)
 		return;
 		return;
 
 
 	/* enable access to config space*/
 	/* enable access to config space*/

+ 2 - 0
arch/x86/kernel/relocate_kernel_32.S

@@ -97,6 +97,8 @@ relocate_kernel:
 	ret
 	ret
 
 
 identity_mapped:
 identity_mapped:
+	/* set return address to 0 if not preserving context */
+	pushl	$0
 	/* store the start address on the stack */
 	/* store the start address on the stack */
 	pushl   %edx
 	pushl   %edx
 
 

+ 2 - 0
arch/x86/kernel/relocate_kernel_64.S

@@ -100,6 +100,8 @@ relocate_kernel:
 	ret
 	ret
 
 
 identity_mapped:
 identity_mapped:
+	/* set return address to 0 if not preserving context */
+	pushq	$0
 	/* store the start address on the stack */
 	/* store the start address on the stack */
 	pushq   %rdx
 	pushq   %rdx
 
 

+ 0 - 24
arch/x86/kernel/tsc.c

@@ -5,7 +5,6 @@
 #include <linux/timer.h>
 #include <linux/timer.h>
 #include <linux/acpi_pmtmr.h>
 #include <linux/acpi_pmtmr.h>
 #include <linux/cpufreq.h>
 #include <linux/cpufreq.h>
-#include <linux/dmi.h>
 #include <linux/delay.h>
 #include <linux/delay.h>
 #include <linux/clocksource.h>
 #include <linux/clocksource.h>
 #include <linux/percpu.h>
 #include <linux/percpu.h>
@@ -800,27 +799,6 @@ void mark_tsc_unstable(char *reason)
 
 
 EXPORT_SYMBOL_GPL(mark_tsc_unstable);
 EXPORT_SYMBOL_GPL(mark_tsc_unstable);
 
 
-static int __init dmi_mark_tsc_unstable(const struct dmi_system_id *d)
-{
-	printk(KERN_NOTICE "%s detected: marking TSC unstable.\n",
-			d->ident);
-	tsc_unstable = 1;
-	return 0;
-}
-
-/* List of systems that have known TSC problems */
-static struct dmi_system_id __initdata bad_tsc_dmi_table[] = {
-	{
-		.callback = dmi_mark_tsc_unstable,
-		.ident = "IBM Thinkpad 380XD",
-		.matches = {
-			DMI_MATCH(DMI_BOARD_VENDOR, "IBM"),
-			DMI_MATCH(DMI_BOARD_NAME, "2635FA0"),
-		},
-	},
-	{}
-};
-
 static void __init check_system_tsc_reliable(void)
 static void __init check_system_tsc_reliable(void)
 {
 {
 #ifdef CONFIG_MGEODE_LX
 #ifdef CONFIG_MGEODE_LX
@@ -1010,8 +988,6 @@ void __init tsc_init(void)
 	lpj_fine = lpj;
 	lpj_fine = lpj;
 
 
 	use_tsc_delay();
 	use_tsc_delay();
-	/* Check and install the TSC clocksource */
-	dmi_check_system(bad_tsc_dmi_table);
 
 
 	if (unsynchronized_tsc())
 	if (unsynchronized_tsc())
 		mark_tsc_unstable("TSCs unsynchronized");
 		mark_tsc_unstable("TSCs unsynchronized");