[PATCH] x86/microcode/AMD: Fix loading of builtin microcode with CONFIG_RANDOMIZE_MEMORY

From: Borislav Petkov
Date: Sun Sep 04 2016 - 05:46:50 EST


Hi guys,

here's one more fix for builtin microcode with CONFIG_RANDOMIZE_MEMORY
for tip/x86/urgent. In the builtin case, we don't need to add the
randomization offset because the builtin address gets relocated
automatically.

I know Ingo is not a big fan of all that adding of offsets and
admittedly, the nature of those fixes are more of the brown-paper-baggy
nature probably due to vacation and other preventing circumstances.

I'd like to fix the whole deal properly but it will require more
involved changes - stuff like re-getting the initrd offset on the APs
too instead of caching it, etc, etc,

However, doing that would require changes which are not suitable for the
current rc4-rc5 timeframe and it would need extensive testing too and
since it is too late for 4.8, I'd like to apply this last one so that
4.8 ships fixed and tackle the issue properly for 4.9.

Hope this all makes sense to you.

I've tested this in all possible configurations I can think of so that
we can be sure it is a good fix.

Thanks.

---

We do not need to add the randomization offset when the microcode is
built in.

Reported-and-tested-by: Emanuel Czirai <icanrealizeum@xxxxxxxxx>
Signed-off-by: Borislav Petkov <bp@xxxxxxx>
---
arch/x86/kernel/cpu/microcode/amd.c | 13 ++++++++++---
1 file changed, 10 insertions(+), 3 deletions(-)

diff --git a/arch/x86/kernel/cpu/microcode/amd.c b/arch/x86/kernel/cpu/microcode/amd.c
index b816971f5da4..620ab06bcf45 100644
--- a/arch/x86/kernel/cpu/microcode/amd.c
+++ b/arch/x86/kernel/cpu/microcode/amd.c
@@ -54,6 +54,7 @@ static LIST_HEAD(pcache);
*/
static u8 *container;
static size_t container_size;
+static bool ucode_builtin;

static u32 ucode_new_rev;
static u8 amd_ucode_patch[PATCH_MAX_SIZE];
@@ -281,18 +282,22 @@ static bool __init load_builtin_amd_microcode(struct cpio_data *cp,
void __init load_ucode_amd_bsp(unsigned int family)
{
struct cpio_data cp;
+ bool *builtin;
void **data;
size_t *size;

#ifdef CONFIG_X86_32
data = (void **)__pa_nodebug(&ucode_cpio.data);
size = (size_t *)__pa_nodebug(&ucode_cpio.size);
+ builtin = (bool *)__pa_nodebug(&ucode_builtin);
#else
data = &ucode_cpio.data;
size = &ucode_cpio.size;
+ builtin = &ucode_builtin;
#endif

- if (!load_builtin_amd_microcode(&cp, family))
+ *builtin = load_builtin_amd_microcode(&cp, family);
+ if (!*builtin)
cp = find_ucode_in_initrd();

if (!(cp.data && cp.size))
@@ -373,7 +378,8 @@ void load_ucode_amd_ap(void)
return;

/* Add CONFIG_RANDOMIZE_MEMORY offset. */
- cont += PAGE_OFFSET - __PAGE_OFFSET_BASE;
+ if (!ucode_builtin)
+ cont += PAGE_OFFSET - __PAGE_OFFSET_BASE;

eax = cpuid_eax(0x00000001);
eq = (struct equiv_cpu_entry *)(cont + CONTAINER_HDR_SZ);
@@ -439,7 +445,8 @@ int __init save_microcode_in_initrd_amd(void)
container = cont_va;

/* Add CONFIG_RANDOMIZE_MEMORY offset. */
- container += PAGE_OFFSET - __PAGE_OFFSET_BASE;
+ if (!ucode_builtin)
+ container += PAGE_OFFSET - __PAGE_OFFSET_BASE;

eax = cpuid_eax(0x00000001);
eax = ((eax >> 8) & 0xf) + ((eax >> 20) & 0xff);
--
2.10.0


--
Regards/Gruss,
Boris.

ECO tip #101: Trim your mails when you reply.