Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f2a025de authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge branch 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull x86 fixes from Ingo Molnar:
 "Misc fixes:

   - revert a broken PAT commit that broke a number of systems

   - fix two preemptability warnings/bugs that can trigger under certain
     circumstances, in the debug code and in the microcode loader"

* 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  Revert "x86/PAT: Fix Xorg regression on CPUs that don't support PAT"
  x86/debug/32: Convert a smp_processor_id() call to raw to avoid DEBUG_PREEMPT warning
  x86/microcode/AMD: Change load_microcode_amd()'s param to bool to fix preemptibility bug
parents f56f88ee c08d5174
Loading
Loading
Loading
Loading
+8 −8
Original line number Diff line number Diff line
@@ -320,7 +320,7 @@ void load_ucode_amd_ap(unsigned int cpuid_1_eax)
}

static enum ucode_state
load_microcode_amd(int cpu, u8 family, const u8 *data, size_t size);
load_microcode_amd(bool save, u8 family, const u8 *data, size_t size);

int __init save_microcode_in_initrd_amd(unsigned int cpuid_1_eax)
{
@@ -338,8 +338,7 @@ int __init save_microcode_in_initrd_amd(unsigned int cpuid_1_eax)
	if (!desc.mc)
		return -EINVAL;

	ret = load_microcode_amd(smp_processor_id(), x86_family(cpuid_1_eax),
				 desc.data, desc.size);
	ret = load_microcode_amd(true, x86_family(cpuid_1_eax), desc.data, desc.size);
	if (ret != UCODE_OK)
		return -EINVAL;

@@ -675,7 +674,7 @@ static enum ucode_state __load_microcode_amd(u8 family, const u8 *data,
}

static enum ucode_state
load_microcode_amd(int cpu, u8 family, const u8 *data, size_t size)
load_microcode_amd(bool save, u8 family, const u8 *data, size_t size)
{
	enum ucode_state ret;

@@ -689,8 +688,8 @@ load_microcode_amd(int cpu, u8 family, const u8 *data, size_t size)

#ifdef CONFIG_X86_32
	/* save BSP's matching patch for early load */
	if (cpu_data(cpu).cpu_index == boot_cpu_data.cpu_index) {
		struct ucode_patch *p = find_patch(cpu);
	if (save) {
		struct ucode_patch *p = find_patch(0);
		if (p) {
			memset(amd_ucode_patch, 0, PATCH_MAX_SIZE);
			memcpy(amd_ucode_patch, p->data, min_t(u32, ksize(p->data),
@@ -722,11 +721,12 @@ static enum ucode_state request_microcode_amd(int cpu, struct device *device,
{
	char fw_name[36] = "amd-ucode/microcode_amd.bin";
	struct cpuinfo_x86 *c = &cpu_data(cpu);
	bool bsp = c->cpu_index == boot_cpu_data.cpu_index;
	enum ucode_state ret = UCODE_NFOUND;
	const struct firmware *fw;

	/* reload ucode container only on the boot cpu */
	if (!refresh_fw || c->cpu_index != boot_cpu_data.cpu_index)
	if (!refresh_fw || !bsp)
		return UCODE_OK;

	if (c->x86 >= 0x15)
@@ -743,7 +743,7 @@ static enum ucode_state request_microcode_amd(int cpu, struct device *device,
		goto fw_release;
	}

	ret = load_microcode_amd(cpu, c->x86, fw->data, fw->size);
	ret = load_microcode_amd(bsp, c->x86, fw->data, fw->size);

 fw_release:
	release_firmware(fw);
+1 −1
Original line number Diff line number Diff line
@@ -78,7 +78,7 @@ void __show_regs(struct pt_regs *regs, int all)

	printk(KERN_DEFAULT "EIP: %pS\n", (void *)regs->ip);
	printk(KERN_DEFAULT "EFLAGS: %08lx CPU: %d\n", regs->flags,
		smp_processor_id());
		raw_smp_processor_id());

	printk(KERN_DEFAULT "EAX: %08lx EBX: %08lx ECX: %08lx EDX: %08lx\n",
		regs->ax, regs->bx, regs->cx, regs->dx);
+3 −6
Original line number Diff line number Diff line
@@ -65,11 +65,9 @@ static int __init nopat(char *str)
}
early_param("nopat", nopat);

static bool __read_mostly __pat_initialized = false;

bool pat_enabled(void)
{
	return __pat_initialized;
	return !!__pat_enabled;
}
EXPORT_SYMBOL_GPL(pat_enabled);

@@ -227,14 +225,13 @@ static void pat_bsp_init(u64 pat)
	}

	wrmsrl(MSR_IA32_CR_PAT, pat);
	__pat_initialized = true;

	__init_cache_modes(pat);
}

static void pat_ap_init(u64 pat)
{
	if (!this_cpu_has(X86_FEATURE_PAT)) {
	if (!boot_cpu_has(X86_FEATURE_PAT)) {
		/*
		 * If this happens we are on a secondary CPU, but switched to
		 * PAT on the boot CPU. We have no way to undo PAT.
@@ -309,7 +306,7 @@ void pat_init(void)
	u64 pat;
	struct cpuinfo_x86 *c = &boot_cpu_data;

	if (!__pat_enabled) {
	if (!pat_enabled()) {
		init_cache_modes();
		return;
	}