static void __init microcode_scan_module(
unsigned long *module_map,
- const multiboot_info_t *mbi)
+ const multiboot_info_t *mbi,
+ const module_t mod[])
{
- module_t *mod = (module_t *)__va(mbi->mods_addr);
uint64_t *_blob_start;
unsigned long _blob_size;
struct cpio_data cd;
static void __init microcode_grab_module(
unsigned long *module_map,
- const multiboot_info_t *mbi)
+ const multiboot_info_t *mbi,
+ const module_t mod[])
{
- module_t *mod = (module_t *)__va(mbi->mods_addr);
-
if ( ucode_mod_idx < 0 )
ucode_mod_idx += mbi->mods_count;
if ( ucode_mod_idx <= 0 || ucode_mod_idx >= mbi->mods_count ||
ucode_mod = mod[ucode_mod_idx];
scan:
if ( ucode_scan )
- microcode_scan_module(module_map, mbi);
+ microcode_scan_module(module_map, mbi, mod);
}
static struct microcode_ops __ro_after_init ucode_ops;
}
int __init microcode_init_cache(unsigned long *module_map,
- const struct multiboot_info *mbi)
+ const struct multiboot_info *mbi,
+ const module_t mods[])
{
int rc = 0;
if ( ucode_scan )
/* Need to rescan the modules because they might have been relocated */
- microcode_scan_module(module_map, mbi);
+ microcode_scan_module(module_map, mbi, mods);
if ( ucode_mod.mod_end )
rc = early_update_cache(bootstrap_map(&ucode_mod),
}
int __init early_microcode_init(unsigned long *module_map,
- const struct multiboot_info *mbi)
+ const struct multiboot_info *mbi,
+ const module_t mods[])
{
const struct cpuinfo_x86 *c = &boot_cpu_data;
int rc = 0;
return -ENODEV;
}
- microcode_grab_module(module_map, mbi);
+ microcode_grab_module(module_map, mbi, mods);
if ( ucode_mod.mod_end || ucode_blob.size )
rc = early_microcode_update_cpu();
#include <xen/types.h>
#include <xen/percpu.h>
+#include <xen/multiboot.h>
#include <public/xen.h>
void microcode_set_module(unsigned int idx);
int microcode_update(XEN_GUEST_HANDLE(const_void) buf, unsigned long len);
int early_microcode_init(unsigned long *module_map,
- const struct multiboot_info *mbi);
+ const struct multiboot_info *mbi,
+ const module_t mods[]);
int microcode_init_cache(unsigned long *module_map,
- const struct multiboot_info *mbi);
+ const struct multiboot_info *mbi,
+ const module_t mods[]);
int microcode_update_one(void);
#endif /* ASM_X86__MICROCODE_H */
* TODO: load ucode earlier once multiboot modules become accessible
* at an earlier stage.
*/
- early_microcode_init(module_map, mbi);
+ early_microcode_init(module_map, mbi, mod);
if ( xen_phys_start )
{
timer_init();
- microcode_init_cache(module_map, mbi); /* Needs xmalloc() */
+ microcode_init_cache(module_map, mbi, mod); /* Needs xmalloc() */
tsx_init(); /* Needs microcode. May change HLE/RTM feature bits. */