From: Borislav Petkov <bp@alien8.de>
To: LKML <linux-kernel@vger.kernel.org>
Cc: Aravind Gopalakrishnan <Aravind.Gopalakrishnan@amd.com>,
X86 ML <x86@kernel.org>
Subject: [PATCH 1/2] x86/microcode/amd: Extract current patch level read to a function
Date: Wed, 1 Jul 2015 22:14:15 +0200 [thread overview]
Message-ID: <1435781656-1890-2-git-send-email-bp@alien8.de> (raw)
In-Reply-To: <1435781656-1890-1-git-send-email-bp@alien8.de>
From: Borislav Petkov <bp@suse.de>
Pave the way for checking the current patch level of the microcode in a
core. We want to be able to do stuff depending on the patch level - in
this case decide whether to update or not. But that will be added in a
later patch; here we do not introduce any functionality change.
Drop unused local var uci assignment, while at it.
Signed-off-by: Borislav Petkov <bp@suse.de>
---
arch/x86/include/asm/microcode_amd.h | 1 +
arch/x86/kernel/cpu/microcode/amd.c | 24 ++++++++++++++++++++++--
arch/x86/kernel/cpu/microcode/amd_early.c | 17 +++++++----------
3 files changed, 30 insertions(+), 12 deletions(-)
diff --git a/arch/x86/include/asm/microcode_amd.h b/arch/x86/include/asm/microcode_amd.h
index ac6d328977a6..9b214e10d499 100644
--- a/arch/x86/include/asm/microcode_amd.h
+++ b/arch/x86/include/asm/microcode_amd.h
@@ -76,4 +76,5 @@ static inline int __init save_microcode_in_initrd_amd(void) { return -EINVAL; }
void reload_ucode_amd(void) {}
#endif
+extern bool check_current_patch_level(u32 *rev);
#endif /* _ASM_X86_MICROCODE_AMD_H */
diff --git a/arch/x86/kernel/cpu/microcode/amd.c b/arch/x86/kernel/cpu/microcode/amd.c
index 12829c3ced3c..59a36125bf7f 100644
--- a/arch/x86/kernel/cpu/microcode/amd.c
+++ b/arch/x86/kernel/cpu/microcode/amd.c
@@ -177,6 +177,25 @@ static unsigned int verify_patch_size(u8 family, u32 patch_size,
return patch_size;
}
+/*
+ * Check the current patch level on this CPU.
+ *
+ * @rev: Use it to return the patch level. It is set to 0 in the case of
+ * error.
+ *
+ * Returns:
+ * - true: if update should stop
+ * - false: otherwise
+ */
+bool check_current_patch_level(u32 *rev)
+{
+ u32 dummy;
+
+ rdmsr(MSR_AMD64_PATCH_LEVEL, *rev, dummy);
+
+ return false;
+}
+
int __apply_microcode_amd(struct microcode_amd *mc_amd)
{
u32 rev, dummy;
@@ -197,7 +216,7 @@ int apply_microcode_amd(int cpu)
struct microcode_amd *mc_amd;
struct ucode_cpu_info *uci;
struct ucode_patch *p;
- u32 rev, dummy;
+ u32 rev;
BUG_ON(raw_smp_processor_id() != cpu);
@@ -210,7 +229,8 @@ int apply_microcode_amd(int cpu)
mc_amd = p->data;
uci->mc = p->data;
- rdmsr(MSR_AMD64_PATCH_LEVEL, rev, dummy);
+ if (check_current_patch_level(&rev))
+ return -1;
/* need to apply patch? */
if (rev >= mc_amd->hdr.patch_id) {
diff --git a/arch/x86/kernel/cpu/microcode/amd_early.c b/arch/x86/kernel/cpu/microcode/amd_early.c
index e8a215a9a345..abb90097582f 100644
--- a/arch/x86/kernel/cpu/microcode/amd_early.c
+++ b/arch/x86/kernel/cpu/microcode/amd_early.c
@@ -196,9 +196,8 @@ static void apply_ucode_in_initrd(void *ucode, size_t size, bool save_patch)
return;
}
- /* find ucode and update if needed */
-
- native_rdmsr(MSR_AMD64_PATCH_LEVEL, rev, eax);
+ if (check_current_patch_level(&rev))
+ return;
while (left > 0) {
struct microcode_amd *mc;
@@ -319,7 +318,6 @@ static void __init get_bsp_sig(void)
void load_ucode_amd_ap(void)
{
unsigned int cpu = smp_processor_id();
- struct ucode_cpu_info *uci = ucode_cpu_info + cpu;
struct equiv_cpu_entry *eq;
struct microcode_amd *mc;
u32 rev, eax;
@@ -332,10 +330,8 @@ void load_ucode_amd_ap(void)
if (!container)
return;
- rdmsr(MSR_AMD64_PATCH_LEVEL, rev, eax);
-
- uci->cpu_sig.rev = rev;
- uci->cpu_sig.sig = eax;
+ if (check_current_patch_level(&rev))
+ return;
eax = cpuid_eax(0x00000001);
eq = (struct equiv_cpu_entry *)(container + CONTAINER_HDR_SZ);
@@ -424,9 +420,10 @@ int __init save_microcode_in_initrd_amd(void)
void reload_ucode_amd(void)
{
struct microcode_amd *mc;
- u32 rev, eax;
+ u32 rev;
- rdmsr(MSR_AMD64_PATCH_LEVEL, rev, eax);
+ if (check_current_patch_level(&rev))
+ return;
mc = (struct microcode_amd *)amd_ucode_patch;
--
2.3.5
next prev parent reply other threads:[~2015-07-01 20:14 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-07-01 20:14 [PATCH 0/2] x86/microcode/amd: Do not overwrite specific patch levels Borislav Petkov
2015-07-01 20:14 ` Borislav Petkov [this message]
2015-07-01 20:14 ` [PATCH 2/2] x86/microcode/amd: Do not overwrite final " Borislav Petkov
2015-07-09 15:03 ` [PATCH 0/2] x86/microcode/amd: Do not overwrite specific " Henrique de Moraes Holschuh
2015-07-10 10:11 ` Borislav Petkov
2015-07-10 15:12 ` Henrique de Moraes Holschuh
2016-03-26 23:31 ` Henrique de Moraes Holschuh
2016-03-27 8:31 ` Borislav Petkov
2016-03-27 12:32 ` Henrique de Moraes Holschuh
2016-03-27 15:47 ` Borislav Petkov
2016-05-02 15:30 ` Borislav Petkov
2016-05-06 12:43 ` Henrique de Moraes Holschuh
2016-05-06 13:23 ` Borislav Petkov
-- strict thread matches above, loose matches on Subject: below --
2015-07-16 8:05 [PATCH 0/2] tip-queue 2015-07-16 Borislav Petkov
2015-07-16 8:05 ` [PATCH 1/2] x86/microcode/amd: Extract current patch level read to a function Borislav Petkov
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1435781656-1890-2-git-send-email-bp@alien8.de \
--to=bp@alien8.de \
--cc=Aravind.Gopalakrishnan@amd.com \
--cc=linux-kernel@vger.kernel.org \
--cc=x86@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.