On 08/12/2022 13:26, Sergey Dyasli wrote:
> diff --git a/xen/arch/x86/cpu/microcode/core.c
> b/xen/arch/x86/cpu/microcode/core.c
> index 452a7ca773..924a2bd7b5 100644
> --- a/xen/arch/x86/cpu/microcode/core.c
> +++ b/xen/arch/x86/cpu/microcode/core.c
> @@ -99,7 +99,7 @@ static bool ucode_in_nmi = true;
> bool __read_mostly opt_ucode_allow_same;
>
> /* Protected by microcode_mutex */
> -static struct microcode_patch *microcode_cache;
> +static const struct microcode_patch *microcode_cache;
>
> void __init microcode_set_module(unsigned int idx)
> {
> @@ -240,20 +240,20 @@ static const struct microcode_patch *nmi_patch =
> ZERO_BLOCK_PTR;
> * patch is found and an error occurs during the parsing process. Otherwise
> * return NULL.
> */
> -static struct microcode_patch *parse_blob(const char *buf, size_t len)
> +static const struct microcode_patch *parse_blob(const char *buf, size_t len)
> {
> alternative_vcall(ucode_ops.collect_cpu_info);
>
> - return alternative_call(ucode_ops.cpu_request_microcode, buf, len);
> + return alternative_call(ucode_ops.cpu_request_microcode, buf, len, true);
> }
>
> -static void microcode_free_patch(struct microcode_patch *patch)
> +static void microcode_free_patch(const struct microcode_patch *patch)
> {
> - xfree(patch);
> + xfree((void *)patch);
This hunk demonstrates why the hook wants to return a non-const
pointer. Keeping it non-const will shrink this patch quite a bit.
Given that make_copy=false is a special case for the BSP, it can cope
with knowing that it shouldn't mutate the pointer it gets given back.
I do have a plan for the future to reduce the complexity here, but it
depends on getting a few more details out of AMD first. (All of this
mess is because their ucode doesn't have an embedded length field.)
In the short term, handing the BSP a non-const pointer to a const buffer
for early loading is going to be a lesser evil than in the common case
giving the caller a const pointer that they're expected to call xfree() on.
If this is the only issue, then I'm happy to adjust on commit.
~Andrew