Re: [PATCH v6 10/90] x86/cpu: Rescan CPUID table after disabling PSN

"Ahmed S. Darwish" <[email protected]> Tue, 12 May 2026 09:12:25 +0200
Newsgroups dev.linux.lists.x86-cpuid,org.kernel.vger.linux-kernel
Message-ID <agLS2Y7smYRHyiHf@lx-t490>
Hi Boris,

On Mon, 11 May 2026, Borislav Petkov wrote:
>
> Except that those changes do not belong in this set. So I zapped them, see
> below.
>

Yeah, fair enough.

> Also, why are you doing this min_t thing?
>
> +       rescan_from = min_t(int, l0->max_std_leaf, c->cpuid_level) + 1;
> +       cpuid_refresh_range(c, rescan_from, CPUID_BASE_END);
> +       c->cpuid_level = l0->max_std_leaf;
>

The min_t() logic is meant to handle both max-CPUID-level increases and
decreases after the MSR write.

Assuming a machine with PSN and CPUID(0x3) as the max standard level:

	c->cpuid_level == 3

	-> MSR write, disable PSN
	-> hardware: Max CPUID level becomes 2

	Refresh CPUID(0x0)
	l0->max_std_leaf == 2
	cpuid_refresh_range(c, min(2, 3) + 1, CPUID_BASE_END)

Then, the CPUID parser will avoid touching CPUID(0x1) and CPUID(0x2) and
zero the table from CPUID(0x3) upwards.

Similarly, at patch (13/90), "x86/cpu/intel: Rescan CPUID table after leaf
unlock":

	c->cpuid_level == 2

	-> MSR write, disable BIOS limiting all leafs > CPUID(0x2)
	-> hardware: Max CPUID level becomes 8

	Refresh CPUID(0x0)
	l0->max_std_leaf == 8
	cpuid_refresh_range(c, min(2, 8) + 1, CPUID_BASE_END)

Then the CPUID parser will zero and refresh all leaves from CPUID(0x3)
upwards.

So the min_t()'s intent is just to be defensive against hardware surprises.

If you think this is superfulous, then ACK, removing it will not harm.

Thanks!
Ahmed