@@ -21,6 +21,7 @@ enum bootmod_type {
BOOTMOD_KERNEL,
BOOTMOD_RAMDISK,
BOOTMOD_MICROCODE,
+ BOOTMOD_XSM_POLICY,
};
struct boot_module {
@@ -1863,7 +1863,7 @@ void asmlinkage __init noreturn __start_xen(unsigned long mbi_p)
mmio_ro_ranges = rangeset_new(NULL, "r/o mmio ranges",
RANGESETF_prettyprint_hex);
- xsm_multiboot_init(module_map, mbi);
+ xsm_multiboot_init(module_map, bi);
/*
* IOMMU-related ACPI table parsing may require some of the system domains
@@ -17,7 +17,10 @@
#include <xen/alternative-call.h>
#include <xen/sched.h>
-#include <xen/multiboot.h>
+
+#ifdef CONFIG_MULTIBOOT
+#include <asm/bootinfo.h>
+#endif
/* policy magic number (defined by XSM_MAGIC) */
typedef uint32_t xsm_magic_t;
@@ -779,9 +782,9 @@ static inline int xsm_argo_send(const struct domain *d, const struct domain *t)
#ifdef CONFIG_MULTIBOOT
int xsm_multiboot_init(
- unsigned long *module_map, const multiboot_info_t *mbi);
+ unsigned long *module_map, struct boot_info *bi);
int xsm_multiboot_policy_init(
- unsigned long *module_map, const multiboot_info_t *mbi,
+ unsigned long *module_map, struct boot_info *bi,
void **policy_buffer, size_t *policy_size);
#endif
@@ -829,7 +832,7 @@ static const inline struct xsm_ops *silo_init(void)
#ifdef CONFIG_MULTIBOOT
static inline int xsm_multiboot_init (
- unsigned long *module_map, const multiboot_info_t *mbi)
+ unsigned long *module_map, struct boot_info *bi)
{
return 0;
}
@@ -21,6 +21,7 @@
#ifdef CONFIG_XSM
#ifdef CONFIG_MULTIBOOT
+#include <asm/bootinfo.h>
#include <asm/setup.h>
#endif
@@ -140,7 +141,7 @@ static int __init xsm_core_init(const void *policy_buffer, size_t policy_size)
#ifdef CONFIG_MULTIBOOT
int __init xsm_multiboot_init(
- unsigned long *module_map, const multiboot_info_t *mbi)
+ unsigned long *module_map, struct boot_info *bi)
{
int ret = 0;
void *policy_buffer = NULL;
@@ -150,18 +151,26 @@ int __init xsm_multiboot_init(
if ( XSM_MAGIC )
{
- ret = xsm_multiboot_policy_init(module_map, mbi, &policy_buffer,
+ ret = xsm_multiboot_policy_init(module_map, bi, &policy_buffer,
&policy_size);
if ( ret )
{
- bootstrap_map(NULL);
+ bootstrap_map_bm(NULL);
printk(XENLOG_ERR "Error %d initializing XSM policy\n", ret);
return -EINVAL;
}
}
ret = xsm_core_init(policy_buffer, policy_size);
- bootstrap_map(NULL);
+ if ( ret == 0 )
+ {
+ int idx = first_boot_module_index(bi, BOOTMOD_XSM_POLICY);
+
+ /* If the policy was loaded from a boot module, mark it consumed */
+ if ( idx >= 0 )
+ bi->mods[idx].flags |= BOOTMOD_FLAG_X86_CONSUMED;
+ }
+ bootstrap_map_bm(NULL);
return 0;
}
@@ -21,6 +21,7 @@
#include <xsm/xsm.h>
#ifdef CONFIG_MULTIBOOT
#include <xen/multiboot.h>
+#include <asm/bootinfo.h>
#include <asm/setup.h>
#endif
#include <xen/bitops.h>
@@ -31,11 +32,10 @@
#ifdef CONFIG_MULTIBOOT
int __init xsm_multiboot_policy_init(
- unsigned long *module_map, const multiboot_info_t *mbi,
+ unsigned long *module_map, struct boot_info *bi,
void **policy_buffer, size_t *policy_size)
{
int i;
- module_t *mod = (module_t *)__va(mbi->mods_addr);
int rc = 0;
u32 *_policy_start;
unsigned long _policy_len;
@@ -44,13 +44,13 @@ int __init xsm_multiboot_policy_init(
* Try all modules and see whichever could be the binary policy.
* Adjust module_map for the module that is the binary policy.
*/
- for ( i = mbi->mods_count-1; i >= 1; i-- )
+ for ( i = bi->nr_modules-1; i >= 1; i-- )
{
- if ( !test_bit(i, module_map) )
+ if ( bi->mods[i].type != BOOTMOD_UNKNOWN )
continue;
- _policy_start = bootstrap_map(mod + i);
- _policy_len = mod[i].mod_end;
+ _policy_start = bootstrap_map_bm(&bi->mods[i]);
+ _policy_len = bi->mods[i].size;
if ( (xsm_magic_t)(*_policy_start) == XSM_MAGIC )
{
@@ -61,11 +61,12 @@ int __init xsm_multiboot_policy_init(
_policy_len,_policy_start);
__clear_bit(i, module_map);
+ bi->mods[i].type = BOOTMOD_XSM_POLICY;
break;
}
- bootstrap_map(NULL);
+ bootstrap_map_bm(NULL);
}
return rc;