diff options
Diffstat (limited to 'arch/x86/kernel')
| -rw-r--r-- | arch/x86/kernel/acpi/boot.c | 27 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/mkcapflags.pl | 25 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/scattered.c | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/kgdb.c | 8 | ||||
| -rw-r--r-- | arch/x86/kernel/reboot.c | 8 | ||||
| -rw-r--r-- | arch/x86/kernel/vsyscall_64.c | 39 | 
6 files changed, 83 insertions, 26 deletions
| diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c index 8afb69319815..b2297e58c6ed 100644 --- a/arch/x86/kernel/acpi/boot.c +++ b/arch/x86/kernel/acpi/boot.c @@ -422,12 +422,14 @@ acpi_parse_int_src_ovr(struct acpi_subtable_header * header,  		return 0;  	} -	if (intsrc->source_irq == 0 && intsrc->global_irq == 2) { +	if (intsrc->source_irq == 0) {  		if (acpi_skip_timer_override) { -			printk(PREFIX "BIOS IRQ0 pin2 override ignored.\n"); +			printk(PREFIX "BIOS IRQ0 override ignored.\n");  			return 0;  		} -		if (acpi_fix_pin2_polarity && (intsrc->inti_flags & ACPI_MADT_POLARITY_MASK)) { + +		if ((intsrc->global_irq == 2) && acpi_fix_pin2_polarity +			&& (intsrc->inti_flags & ACPI_MADT_POLARITY_MASK)) {  			intsrc->inti_flags &= ~ACPI_MADT_POLARITY_MASK;  			printk(PREFIX "BIOS IRQ0 pin2 override: forcing polarity to high active.\n");  		} @@ -1334,17 +1336,12 @@ static int __init dmi_disable_acpi(const struct dmi_system_id *d)  }  /* - * Force ignoring BIOS IRQ0 pin2 override + * Force ignoring BIOS IRQ0 override   */  static int __init dmi_ignore_irq0_timer_override(const struct dmi_system_id *d)  { -	/* -	 * The ati_ixp4x0_rev() early PCI quirk should have set -	 * the acpi_skip_timer_override flag already: -	 */  	if (!acpi_skip_timer_override) { -		WARN(1, KERN_ERR "ati_ixp4x0 quirk not complete.\n"); -		pr_notice("%s detected: Ignoring BIOS IRQ0 pin2 override\n", +		pr_notice("%s detected: Ignoring BIOS IRQ0 override\n",  			d->ident);  		acpi_skip_timer_override = 1;  	} @@ -1438,7 +1435,7 @@ static struct dmi_system_id __initdata acpi_dmi_table_late[] = {  	 * is enabled.  This input is incorrectly designated the  	 * ISA IRQ 0 via an interrupt source override even though  	 * it is wired to the output of the master 8259A and INTIN0 -	 * is not connected at all.  Force ignoring BIOS IRQ0 pin2 +	 * is not connected at all.  Force ignoring BIOS IRQ0  	 * override in that cases.  	 */  	{ @@ -1473,6 +1470,14 @@ static struct dmi_system_id __initdata acpi_dmi_table_late[] = {  		     DMI_MATCH(DMI_PRODUCT_NAME, "HP Compaq 6715b"),  		     },  	 }, +	{ +	 .callback = dmi_ignore_irq0_timer_override, +	 .ident = "FUJITSU SIEMENS", +	 .matches = { +		     DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), +		     DMI_MATCH(DMI_PRODUCT_NAME, "AMILO PRO V2030"), +		     }, +	 },  	{}  }; diff --git a/arch/x86/kernel/cpu/mkcapflags.pl b/arch/x86/kernel/cpu/mkcapflags.pl index dfea390e1608..c7b3fe2d72e0 100644 --- a/arch/x86/kernel/cpu/mkcapflags.pl +++ b/arch/x86/kernel/cpu/mkcapflags.pl @@ -1,4 +1,4 @@ -#!/usr/bin/perl +#!/usr/bin/perl -w  #  # Generate the x86_cap_flags[] array from include/asm-x86/cpufeature.h  # @@ -11,22 +11,35 @@ open(OUT, "> $out\0") or die "$0: cannot create: $out: $!\n";  print OUT "#include <asm/cpufeature.h>\n\n";  print OUT "const char * const x86_cap_flags[NCAPINTS*32] = {\n"; +%features = (); +$err = 0; +  while (defined($line = <IN>)) {  	if ($line =~ /^\s*\#\s*define\s+(X86_FEATURE_(\S+))\s+(.*)$/) {  		$macro = $1; -		$feature = $2; +		$feature = "\L$2";  		$tail = $3;  		if ($tail =~ /\/\*\s*\"([^"]*)\".*\*\//) { -			$feature = $1; +			$feature = "\L$1";  		} -		if ($feature ne '') { -			printf OUT "\t%-32s = \"%s\",\n", -				"[$macro]", "\L$feature"; +		next if ($feature eq ''); + +		if ($features{$feature}++) { +			print STDERR "$in: duplicate feature name: $feature\n"; +			$err++;  		} +		printf OUT "\t%-32s = \"%s\",\n", "[$macro]", $feature;  	}  }  print OUT "};\n";  close(IN);  close(OUT); + +if ($err) { +	unlink($out); +	exit(1); +} + +exit(0); diff --git a/arch/x86/kernel/cpu/scattered.c b/arch/x86/kernel/cpu/scattered.c index addf9e82a7f2..ee8e9abc859f 100644 --- a/arch/x86/kernel/cpu/scattered.c +++ b/arch/x86/kernel/cpu/scattered.c @@ -31,7 +31,7 @@ void __cpuinit init_scattered_cpuid_features(struct cpuinfo_x86 *c)  	const struct cpuid_bit *cb;  	static const struct cpuid_bit __cpuinitconst cpuid_bits[] = { -		{ X86_FEATURE_DTS,		CR_EAX, 0, 0x00000006, 0 }, +		{ X86_FEATURE_DTHERM,		CR_EAX, 0, 0x00000006, 0 },  		{ X86_FEATURE_IDA,		CR_EAX, 1, 0x00000006, 0 },  		{ X86_FEATURE_ARAT,		CR_EAX, 2, 0x00000006, 0 },  		{ X86_FEATURE_PLN,		CR_EAX, 4, 0x00000006, 0 }, diff --git a/arch/x86/kernel/kgdb.c b/arch/x86/kernel/kgdb.c index 8bfb6146f753..3f61904365cf 100644 --- a/arch/x86/kernel/kgdb.c +++ b/arch/x86/kernel/kgdb.c @@ -444,12 +444,12 @@ void kgdb_roundup_cpus(unsigned long flags)  /**   *	kgdb_arch_handle_exception - Handle architecture specific GDB packets. - *	@vector: The error vector of the exception that happened. + *	@e_vector: The error vector of the exception that happened.   *	@signo: The signal number of the exception that happened.   *	@err_code: The error code of the exception that happened. - *	@remcom_in_buffer: The buffer of the packet we have read. - *	@remcom_out_buffer: The buffer of %BUFMAX bytes to write a packet into. - *	@regs: The &struct pt_regs of the current process. + *	@remcomInBuffer: The buffer of the packet we have read. + *	@remcomOutBuffer: The buffer of %BUFMAX bytes to write a packet into. + *	@linux_regs: The &struct pt_regs of the current process.   *   *	This function MUST handle the 'c' and 's' command packets,   *	as well packets to set / remove a hardware breakpoint, if used. diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c index 25b48edb847c..5de92f1abd76 100644 --- a/arch/x86/kernel/reboot.c +++ b/arch/x86/kernel/reboot.c @@ -451,6 +451,14 @@ static struct dmi_system_id __initdata reboot_dmi_table[] = {  			DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex 990"),  		},  	}, +	{	/* Handle problems with rebooting on the Precision M6600. */ +		.callback = set_pci_reboot, +		.ident = "Dell OptiPlex 990", +		.matches = { +			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), +			DMI_MATCH(DMI_PRODUCT_NAME, "Precision M6600"), +		}, +	},  	{ }  }; diff --git a/arch/x86/kernel/vsyscall_64.c b/arch/x86/kernel/vsyscall_64.c index 7515cf0e1805..5db36caf4289 100644 --- a/arch/x86/kernel/vsyscall_64.c +++ b/arch/x86/kernel/vsyscall_64.c @@ -139,6 +139,19 @@ static int addr_to_vsyscall_nr(unsigned long addr)  	return nr;  } +#ifdef CONFIG_SECCOMP +static int vsyscall_seccomp(struct task_struct *tsk, int syscall_nr) +{ +	if (!seccomp_mode(&tsk->seccomp)) +		return 0; +	task_pt_regs(tsk)->orig_ax = syscall_nr; +	task_pt_regs(tsk)->ax = syscall_nr; +	return __secure_computing(syscall_nr); +} +#else +#define vsyscall_seccomp(_tsk, _nr) 0 +#endif +  static bool write_ok_or_segv(unsigned long ptr, size_t size)  {  	/* @@ -174,6 +187,7 @@ bool emulate_vsyscall(struct pt_regs *regs, unsigned long address)  	int vsyscall_nr;  	int prev_sig_on_uaccess_error;  	long ret; +	int skip;  	/*  	 * No point in checking CS -- the only way to get here is a user mode @@ -205,9 +219,6 @@ bool emulate_vsyscall(struct pt_regs *regs, unsigned long address)  	}  	tsk = current; -	if (seccomp_mode(&tsk->seccomp)) -		do_exit(SIGKILL); -  	/*  	 * With a real vsyscall, page faults cause SIGSEGV.  We want to  	 * preserve that behavior to make writing exploits harder. @@ -222,8 +233,13 @@ bool emulate_vsyscall(struct pt_regs *regs, unsigned long address)  	 * address 0".  	 */  	ret = -EFAULT; +	skip = 0;  	switch (vsyscall_nr) {  	case 0: +		skip = vsyscall_seccomp(tsk, __NR_gettimeofday); +		if (skip) +			break; +  		if (!write_ok_or_segv(regs->di, sizeof(struct timeval)) ||  		    !write_ok_or_segv(regs->si, sizeof(struct timezone)))  			break; @@ -234,6 +250,10 @@ bool emulate_vsyscall(struct pt_regs *regs, unsigned long address)  		break;  	case 1: +		skip = vsyscall_seccomp(tsk, __NR_time); +		if (skip) +			break; +  		if (!write_ok_or_segv(regs->di, sizeof(time_t)))  			break; @@ -241,6 +261,10 @@ bool emulate_vsyscall(struct pt_regs *regs, unsigned long address)  		break;  	case 2: +		skip = vsyscall_seccomp(tsk, __NR_getcpu); +		if (skip) +			break; +  		if (!write_ok_or_segv(regs->di, sizeof(unsigned)) ||  		    !write_ok_or_segv(regs->si, sizeof(unsigned)))  			break; @@ -253,6 +277,12 @@ bool emulate_vsyscall(struct pt_regs *regs, unsigned long address)  	current_thread_info()->sig_on_uaccess_error = prev_sig_on_uaccess_error; +	if (skip) { +		if ((long)regs->ax <= 0L) /* seccomp errno emulation */ +			goto do_ret; +		goto done; /* seccomp trace/trap */ +	} +  	if (ret == -EFAULT) {  		/* Bad news -- userspace fed a bad pointer to a vsyscall. */  		warn_bad_vsyscall(KERN_INFO, regs, @@ -271,10 +301,11 @@ bool emulate_vsyscall(struct pt_regs *regs, unsigned long address)  	regs->ax = ret; +do_ret:  	/* Emulate a ret instruction. */  	regs->ip = caller;  	regs->sp += 8; - +done:  	return true;  sigsegv: | 
