Message ID | 20170418211711.10190.30861.stgit@tlendack-t1.amdoffice.net (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Tue, Apr 18, 2017 at 04:17:11PM -0500, Tom Lendacky wrote: > When System Memory Encryption (SME) is enabled, the physical address > space is reduced. Adjust the x86_phys_bits value to reflect this > reduction. > > Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com> > --- > arch/x86/kernel/cpu/amd.c | 14 +++++++++++--- > 1 file changed, 11 insertions(+), 3 deletions(-) ... > @@ -622,8 +624,14 @@ static void early_init_amd(struct cpuinfo_x86 *c) > > /* Check if SME is enabled */ > rdmsrl(MSR_K8_SYSCFG, msr); > - if (!(msr & MSR_K8_SYSCFG_MEM_ENCRYPT)) > + if (msr & MSR_K8_SYSCFG_MEM_ENCRYPT) { > + unsigned int ebx; > + > + ebx = cpuid_ebx(0x8000001f); > + c->x86_phys_bits -= (ebx >> 6) & 0x3f; > + } else { > clear_cpu_cap(c, X86_FEATURE_SME); > + } Lemme do some simplifying to save an indent level, get rid of local var ebx and kill some { }-brackets for a bit better readability: if (c->extended_cpuid_level >= 0x8000001f) { u64 msr; if (!cpu_has(c, X86_FEATURE_SME)) return; /* Check if SME is enabled */ rdmsrl(MSR_K8_SYSCFG, msr); if (msr & MSR_K8_SYSCFG_MEM_ENCRYPT) c->x86_phys_bits -= (cpuid_ebx(0x8000001f) >> 6) & 0x3f; else clear_cpu_cap(c, X86_FEATURE_SME); }
On 4/20/2017 11:59 AM, Borislav Petkov wrote: > On Tue, Apr 18, 2017 at 04:17:11PM -0500, Tom Lendacky wrote: >> When System Memory Encryption (SME) is enabled, the physical address >> space is reduced. Adjust the x86_phys_bits value to reflect this >> reduction. >> >> Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com> >> --- >> arch/x86/kernel/cpu/amd.c | 14 +++++++++++--- >> 1 file changed, 11 insertions(+), 3 deletions(-) > > ... > >> @@ -622,8 +624,14 @@ static void early_init_amd(struct cpuinfo_x86 *c) >> >> /* Check if SME is enabled */ >> rdmsrl(MSR_K8_SYSCFG, msr); >> - if (!(msr & MSR_K8_SYSCFG_MEM_ENCRYPT)) >> + if (msr & MSR_K8_SYSCFG_MEM_ENCRYPT) { >> + unsigned int ebx; >> + >> + ebx = cpuid_ebx(0x8000001f); >> + c->x86_phys_bits -= (ebx >> 6) & 0x3f; >> + } else { >> clear_cpu_cap(c, X86_FEATURE_SME); >> + } > > Lemme do some simplifying to save an indent level, get rid of local var > ebx and kill some { }-brackets for a bit better readability: > > if (c->extended_cpuid_level >= 0x8000001f) { > u64 msr; > > if (!cpu_has(c, X86_FEATURE_SME)) > return; > > /* Check if SME is enabled */ > rdmsrl(MSR_K8_SYSCFG, msr); > if (msr & MSR_K8_SYSCFG_MEM_ENCRYPT) > c->x86_phys_bits -= (cpuid_ebx(0x8000001f) >> 6) & 0x3f; > else > clear_cpu_cap(c, X86_FEATURE_SME); > } > Hmmm... and actually if cpu_has(X86_FEATURE_SME) is true then it's a given that extended_cpuid_level >= 0x8000001f. So this can be simplified to just: if (cpu_has(c, X86_FEATURE_SME)) { ... the rest of your suggestion (minus cpu_has()) ... } Thanks, Tom
On Thu, Apr 20, 2017 at 12:29:20PM -0500, Tom Lendacky wrote: > Hmmm... and actually if cpu_has(X86_FEATURE_SME) is true then it's a > given that extended_cpuid_level >= 0x8000001f. So this can be > simplified to just: > > if (cpu_has(c, X86_FEATURE_SME)) { > ... the rest of your suggestion (minus cpu_has()) ... Cool, even better! :)
diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c index 5fc5232..35eeeb1 100644 --- a/arch/x86/kernel/cpu/amd.c +++ b/arch/x86/kernel/cpu/amd.c @@ -613,8 +613,10 @@ static void early_init_amd(struct cpuinfo_x86 *c) set_cpu_bug(c, X86_BUG_AMD_E400); /* - * BIOS support is required for SME. If BIOS has not enabled SME - * then don't advertise the feature (set in scattered.c) + * BIOS support is required for SME. If BIOS has enabld SME then + * adjust x86_phys_bits by the SME physical address space reduction + * value. If BIOS has not enabled SME then don't advertise the + * feature (set in scattered.c). */ if (c->extended_cpuid_level >= 0x8000001f) { if (cpu_has(c, X86_FEATURE_SME)) { @@ -622,8 +624,14 @@ static void early_init_amd(struct cpuinfo_x86 *c) /* Check if SME is enabled */ rdmsrl(MSR_K8_SYSCFG, msr); - if (!(msr & MSR_K8_SYSCFG_MEM_ENCRYPT)) + if (msr & MSR_K8_SYSCFG_MEM_ENCRYPT) { + unsigned int ebx; + + ebx = cpuid_ebx(0x8000001f); + c->x86_phys_bits -= (ebx >> 6) & 0x3f; + } else { clear_cpu_cap(c, X86_FEATURE_SME); + } } } }
When System Memory Encryption (SME) is enabled, the physical address space is reduced. Adjust the x86_phys_bits value to reflect this reduction. Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com> --- arch/x86/kernel/cpu/amd.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-)